From ea222f8e80ef5f7addf67fbcd083ed03f913ac0b Mon Sep 17 00:00:00 2001 From: Craig Dean Date: Thu, 4 Nov 2021 18:07:37 +0000 Subject: [PATCH 01/42] feat: Initial working sample * Created class library with 3 chainable structs * Added `IChainable` interface hierarchy * Added chaining methods `Chain`, `CreateNext`, `SetNext` and `End` * Added tests --- .gitignore | 341 +++++++++ .../.idea/.gitignore | 13 + .../.idea/encodings.xml | 4 + .../.idea/indexLayout.xml | 8 + .../.idea/vcs.xml | 6 + .../PrototypeStructChaining.Test.csproj | 29 + .../UnitTestChains.cs | 57 ++ PrototypeStructChaining.sln | 22 + PrototypeStructChaining/Bool32.cs | 62 ++ PrototypeStructChaining/IChainable.cs | 13 + ...lDeviceAccelerationStructureFeaturesKHR.cs | 60 ++ ...hysicalDeviceDescriptorIndexingFeatures.cs | 60 ++ .../PhysicalDeviceFeatures.cs | 19 + .../PhysicalDeviceFeatures2.cs | 53 ++ .../PrototypeStructChaining.csproj | 11 + PrototypeStructChaining/StructureType.cs | 704 ++++++++++++++++++ 16 files changed, 1462 insertions(+) create mode 100644 .gitignore create mode 100644 .idea/.idea.PrototypeStructChaining/.idea/.gitignore create mode 100644 .idea/.idea.PrototypeStructChaining/.idea/encodings.xml create mode 100644 .idea/.idea.PrototypeStructChaining/.idea/indexLayout.xml create mode 100644 .idea/.idea.PrototypeStructChaining/.idea/vcs.xml create mode 100644 PrototypeStructChaining.Test/PrototypeStructChaining.Test.csproj create mode 100644 PrototypeStructChaining.Test/UnitTestChains.cs create mode 100644 PrototypeStructChaining.sln create mode 100644 PrototypeStructChaining/Bool32.cs create mode 100644 PrototypeStructChaining/IChainable.cs create mode 100644 PrototypeStructChaining/PhysicalDeviceAccelerationStructureFeaturesKHR.cs create mode 100644 PrototypeStructChaining/PhysicalDeviceDescriptorIndexingFeatures.cs create mode 100644 PrototypeStructChaining/PhysicalDeviceFeatures.cs create mode 100644 PrototypeStructChaining/PhysicalDeviceFeatures2.cs create mode 100644 PrototypeStructChaining/PrototypeStructChaining.csproj create mode 100644 PrototypeStructChaining/StructureType.cs diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000..a83c78113b --- /dev/null +++ b/.gitignore @@ -0,0 +1,341 @@ +## Ignore Visual Studio temporary files, build results, and +## files generated by popular Visual Studio add-ons. +## +## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore + +# User-specific files +*.rsuser +*.suo +*.user +*.userosscache +*.sln.docstates + +# User-specific files (MonoDevelop/Xamarin Studio) +*.userprefs + +# Build results +[Dd]ebug/ +[Dd]ebugPublic/ +[Rr]elease/ +[Rr]eleases/ +x64/ +x86/ +[Aa][Rr][Mm]/ +[Aa][Rr][Mm]64/ +bld/ +[Bb]in/ +[Oo]bj/ +[Ll]og/ + +# Visual Studio 2015/2017 cache/options directory +.vs/ +# Uncomment if you have tasks that create the project's static files in wwwroot +#wwwroot/ + +# Visual Studio 2017 auto generated files +Generated\ Files/ + +# MSTest test Results +[Tt]est[Rr]esult*/ +[Bb]uild[Ll]og.* + +# NUNIT +*.VisualState.xml +TestResult.xml + +# Build Results of an ATL Project +[Dd]ebugPS/ +[Rr]eleasePS/ +dlldata.c + +# Benchmark Results +BenchmarkDotNet.Artifacts/ + +# .NET Core +project.lock.json +project.fragment.lock.json +artifacts/ + +# StyleCop +StyleCopReport.xml + +# Files built by Visual Studio +*_i.c +*_p.c +*_h.h +*.ilk +*.meta +*.obj +*.iobj +*.pch +*.pdb +*.ipdb +*.pgc +*.pgd +*.rsp +*.sbr +*.tlb +*.tli +*.tlh +*.tmp +*.tmp_proj +*_wpftmp.csproj +*.log +*.vspscc +*.vssscc +.builds +*.pidb +*.svclog +*.scc + +# Chutzpah Test files +_Chutzpah* + +# Visual C++ cache files +ipch/ +*.aps +*.ncb +*.opendb +*.opensdf +*.sdf +*.cachefile +*.VC.db +*.VC.VC.opendb + +# Visual Studio profiler +*.psess +*.vsp +*.vspx +*.sap + +# Visual Studio Trace Files +*.e2e + +# TFS 2012 Local Workspace +$tf/ + +# Guidance Automation Toolkit +*.gpState + +# ReSharper is a .NET coding add-in +_ReSharper*/ +*.[Rr]e[Ss]harper +*.DotSettings.user + +# JustCode is a .NET coding add-in +.JustCode + +# TeamCity is a build add-in +_TeamCity* + +# DotCover is a Code Coverage Tool +*.dotCover + +# AxoCover is a Code Coverage Tool +.axoCover/* +!.axoCover/settings.json + +# Visual Studio code coverage results +*.coverage +*.coveragexml + +# NCrunch +_NCrunch_* +.*crunch*.local.xml +nCrunchTemp_* + +# MightyMoose +*.mm.* +AutoTest.Net/ + +# Web workbench (sass) +.sass-cache/ + +# Installshield output folder +[Ee]xpress/ + +# DocProject is a documentation generator add-in +DocProject/buildhelp/ +DocProject/Help/*.HxT +DocProject/Help/*.HxC +DocProject/Help/*.hhc +DocProject/Help/*.hhk +DocProject/Help/*.hhp +DocProject/Help/Html2 +DocProject/Help/html + +# Click-Once directory +publish/ + +# Publish Web Output +*.[Pp]ublish.xml +*.azurePubxml +# Note: Comment the next line if you want to checkin your web deploy settings, +# but database connection strings (with potential passwords) will be unencrypted +*.pubxml +*.publishproj + +# Microsoft Azure Web App publish settings. Comment the next line if you want to +# checkin your Azure Web App publish settings, but sensitive information contained +# in these scripts will be unencrypted +PublishScripts/ + +# NuGet Packages +*.nupkg +# The packages folder can be ignored because of Package Restore +**/[Pp]ackages/* +# except build/, which is used as an MSBuild target. +!**/[Pp]ackages/build/ +# Uncomment if necessary however generally it will be regenerated when needed +#!**/[Pp]ackages/repositories.config +# NuGet v3's project.json files produces more ignorable files +*.nuget.props +*.nuget.targets + +# Microsoft Azure Build Output +csx/ +*.build.csdef + +# Microsoft Azure Emulator +ecf/ +rcf/ + +# Windows Store app package directories and files +AppPackages/ +BundleArtifacts/ +Package.StoreAssociation.xml +_pkginfo.txt +*.appx + +# Visual Studio cache files +# files ending in .cache can be ignored +*.[Cc]ache +# but keep track of directories ending in .cache +!?*.[Cc]ache/ + +# Others +ClientBin/ +~$* +*~ +*.dbmdl +*.dbproj.schemaview +*.jfm +*.pfx +*.publishsettings +orleans.codegen.cs + +# Including strong name files can present a security risk +# (https://github.com/github/gitignore/pull/2483#issue-259490424) +#*.snk + +# Since there are multiple workflows, uncomment next line to ignore bower_components +# (https://github.com/github/gitignore/pull/1529#issuecomment-104372622) +#bower_components/ + +# RIA/Silverlight projects +Generated_Code/ + +# Backup & report files from converting an old project file +# to a newer Visual Studio version. Backup files are not needed, +# because we have git ;-) +_UpgradeReport_Files/ +Backup*/ +UpgradeLog*.XML +UpgradeLog*.htm +ServiceFabricBackup/ +*.rptproj.bak + +# SQL Server files +*.mdf +*.ldf +*.ndf + +# Business Intelligence projects +*.rdl.data +*.bim.layout +*.bim_*.settings +*.rptproj.rsuser +*- Backup*.rdl + +# Microsoft Fakes +FakesAssemblies/ + +# GhostDoc plugin setting file +*.GhostDoc.xml + +# Node.js Tools for Visual Studio +.ntvs_analysis.dat +node_modules/ + +# Visual Studio 6 build log +*.plg + +# Visual Studio 6 workspace options file +*.opt + +# Visual Studio 6 auto-generated workspace file (contains which files were open etc.) +*.vbw + +# Visual Studio LightSwitch build output +**/*.HTMLClient/GeneratedArtifacts +**/*.DesktopClient/GeneratedArtifacts +**/*.DesktopClient/ModelManifest.xml +**/*.Server/GeneratedArtifacts +**/*.Server/ModelManifest.xml +_Pvt_Extensions + +# Paket dependency manager +.paket/paket.exe +paket-files/ + +# FAKE - F# Make +.fake/ + +# JetBrains Rider +.idea/**/workspace.xml +.idea/**/usage.statistics.xml +.idea/**/shelf/ + +# CodeRush personal settings +.cr/personal + +# Python Tools for Visual Studio (PTVS) +__pycache__/ +*.pyc + +# Cake - Uncomment if you are using it +# tools/** +# !tools/packages.config + +# Tabs Studio +*.tss + +# Telerik's JustMock configuration file +*.jmconfig + +# BizTalk build output +*.btp.cs +*.btm.cs +*.odx.cs +*.xsd.cs + +# OpenCover UI analysis results +OpenCover/ + +# Azure Stream Analytics local run output +ASALocalRun/ + +# MSBuild Binary and Structured Log +*.binlog + +# NVidia Nsight GPU debugger configuration file +*.nvuser + +# MFractors (Xamarin productivity tool) working folder +.mfractor/ + +# Local History for Visual Studio +.localhistory/ + +# BeatPulse healthcheck temp database +healthchecksdb \ No newline at end of file diff --git a/.idea/.idea.PrototypeStructChaining/.idea/.gitignore b/.idea/.idea.PrototypeStructChaining/.idea/.gitignore new file mode 100644 index 0000000000..009550ae99 --- /dev/null +++ b/.idea/.idea.PrototypeStructChaining/.idea/.gitignore @@ -0,0 +1,13 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Rider ignored files +/modules.xml +/contentModel.xml +/.idea.PrototypeStructChaining.iml +/projectSettingsUpdater.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/.idea.PrototypeStructChaining/.idea/encodings.xml b/.idea/.idea.PrototypeStructChaining/.idea/encodings.xml new file mode 100644 index 0000000000..df87cf951f --- /dev/null +++ b/.idea/.idea.PrototypeStructChaining/.idea/encodings.xml @@ -0,0 +1,4 @@ + + + + \ No newline at end of file diff --git a/.idea/.idea.PrototypeStructChaining/.idea/indexLayout.xml b/.idea/.idea.PrototypeStructChaining/.idea/indexLayout.xml new file mode 100644 index 0000000000..7b08163ceb --- /dev/null +++ b/.idea/.idea.PrototypeStructChaining/.idea/indexLayout.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/.idea.PrototypeStructChaining/.idea/vcs.xml b/.idea/.idea.PrototypeStructChaining/.idea/vcs.xml new file mode 100644 index 0000000000..94a25f7f4c --- /dev/null +++ b/.idea/.idea.PrototypeStructChaining/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/PrototypeStructChaining.Test/PrototypeStructChaining.Test.csproj b/PrototypeStructChaining.Test/PrototypeStructChaining.Test.csproj new file mode 100644 index 0000000000..f3281ada30 --- /dev/null +++ b/PrototypeStructChaining.Test/PrototypeStructChaining.Test.csproj @@ -0,0 +1,29 @@ + + + + net6.0 + enable + + false + + true + + + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + + + + + diff --git a/PrototypeStructChaining.Test/UnitTestChains.cs b/PrototypeStructChaining.Test/UnitTestChains.cs new file mode 100644 index 0000000000..0ed4f5ca5a --- /dev/null +++ b/PrototypeStructChaining.Test/UnitTestChains.cs @@ -0,0 +1,57 @@ +using Silk.Net.Vulkan; +using Xunit; + +namespace PrototypeStructChaining.Test; + +public class UnitTestChains +{ + [Fact] + public unsafe void TestCreateNext() + { + PhysicalDeviceFeatures2 + .Chain(out var features2) + .CreateNext(out var indexingFeatures) + .CreateNext(out var accelerationStructureFeaturesKhr) + .End(); + + Assert.Equal((nint) (&indexingFeatures), (nint) features2.PNext); + Assert.Equal((nint) (&accelerationStructureFeaturesKhr), (nint) indexingFeatures.PNext); + Assert.Equal((nint) 0, (nint) accelerationStructureFeaturesKhr.PNext); + + Assert.Equal(StructureType.PhysicalDeviceFeatures2, features2.SType); + Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, indexingFeatures.SType); + Assert.Equal(StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr, + accelerationStructureFeaturesKhr.SType); + } + + [Fact] + public unsafe void TestSetNext() + { + var indexingFeatures = new PhysicalDeviceDescriptorIndexingFeatures + { + ShaderInputAttachmentArrayDynamicIndexing = true + }; + var accelerationStructureFeaturesKhr = new PhysicalDeviceAccelerationStructureFeaturesKHR + { + AccelerationStructure = true + }; + + PhysicalDeviceFeatures2 + .Chain(out var features2) + .SetNext(ref indexingFeatures) + .SetNext(ref accelerationStructureFeaturesKhr) + .End(); + + Assert.Equal((nint) (&indexingFeatures), (nint) features2.PNext); + Assert.Equal((nint) (&accelerationStructureFeaturesKhr), (nint) indexingFeatures.PNext); + Assert.Equal((nint) 0, (nint) accelerationStructureFeaturesKhr.PNext); + + Assert.Equal(StructureType.PhysicalDeviceFeatures2, features2.SType); + Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, indexingFeatures.SType); + Assert.Equal(StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr, + accelerationStructureFeaturesKhr.SType); + + Assert.True(indexingFeatures.ShaderInputAttachmentArrayDynamicIndexing); + Assert.True(accelerationStructureFeaturesKhr.AccelerationStructure); + } +} \ No newline at end of file diff --git a/PrototypeStructChaining.sln b/PrototypeStructChaining.sln new file mode 100644 index 0000000000..5ffbdc6a72 --- /dev/null +++ b/PrototypeStructChaining.sln @@ -0,0 +1,22 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PrototypeStructChaining", "PrototypeStructChaining\PrototypeStructChaining.csproj", "{6EF16790-8E4E-44F1-87D6-272A85B4ACA5}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PrototypeStructChaining.Test", "PrototypeStructChaining.Test\PrototypeStructChaining.Test.csproj", "{29BBBD86-81DD-4A28-BABD-0B2BD37F928B}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Release|Any CPU = Release|Any CPU + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {6EF16790-8E4E-44F1-87D6-272A85B4ACA5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {6EF16790-8E4E-44F1-87D6-272A85B4ACA5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {6EF16790-8E4E-44F1-87D6-272A85B4ACA5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {6EF16790-8E4E-44F1-87D6-272A85B4ACA5}.Release|Any CPU.Build.0 = Release|Any CPU + {29BBBD86-81DD-4A28-BABD-0B2BD37F928B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {29BBBD86-81DD-4A28-BABD-0B2BD37F928B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {29BBBD86-81DD-4A28-BABD-0B2BD37F928B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {29BBBD86-81DD-4A28-BABD-0B2BD37F928B}.Release|Any CPU.Build.0 = Release|Any CPU + EndGlobalSection +EndGlobal diff --git a/PrototypeStructChaining/Bool32.cs b/PrototypeStructChaining/Bool32.cs new file mode 100644 index 0000000000..8d86edd14b --- /dev/null +++ b/PrototypeStructChaining/Bool32.cs @@ -0,0 +1,62 @@ +namespace Silk.Net.Vulkan; + +/// A 32-bit boolean. +public readonly struct Bool32 +{ + /// Gets the 32-bit value for this boolean. + public uint Value { get; } + + /// + /// Creates a 32-bit boolean from the given 32-bit unsigned integer. + /// + /// The 32-bit unsigned integer value. + public Bool32(uint val) + { + Value = val; + } + + /// + /// Creates a 32-bit boolean from the given managed boolean. + /// + /// The boolean value. + public Bool32(bool val) + { + Value = val ? 1U : 0U; + } + + /// Converts this 32-bit boolean to a managed boolean. + /// The 32-bit boolean. + /// The managed boolean. + public static implicit operator bool(Bool32 val) + { + return val.Value == 1U; + } + + /// + /// Converts this 32-bit boolean to a 32-bit unsigned integer. + /// + /// The 32-bit boolean. + /// The 32-bit unsigned integer. + public static implicit operator uint(Bool32 val) + { + return val.Value; + } + + /// + /// Creates a 32-bit boolean from the given managed boolean. + /// + /// The boolean value. + public static implicit operator Bool32(bool val) + { + return new Bool32(val); + } + + /// + /// Creates a 32-bit boolean from the given 32-bit unsigned integer. + /// + /// The 32-bit unsigned integer value. + public static implicit operator Bool32(uint val) + { + return new Bool32(val); + } +} \ No newline at end of file diff --git a/PrototypeStructChaining/IChainable.cs b/PrototypeStructChaining/IChainable.cs new file mode 100644 index 0000000000..3a3d44100b --- /dev/null +++ b/PrototypeStructChaining/IChainable.cs @@ -0,0 +1,13 @@ +namespace Silk.Net.Vulkan; + +public interface IChainable +{ +} + +public interface IExtendsDeviceCreateInfoChain : IChainable +{ +} + +public interface IExtendsPhysicalDeviceFeatures2Chain : IChainable +{ +} \ No newline at end of file diff --git a/PrototypeStructChaining/PhysicalDeviceAccelerationStructureFeaturesKHR.cs b/PrototypeStructChaining/PhysicalDeviceAccelerationStructureFeaturesKHR.cs new file mode 100644 index 0000000000..74876ce5f7 --- /dev/null +++ b/PrototypeStructChaining/PhysicalDeviceAccelerationStructureFeaturesKHR.cs @@ -0,0 +1,60 @@ +namespace Silk.Net.Vulkan; + +public struct PhysicalDeviceAccelerationStructureFeaturesKHR : IExtendsDeviceCreateInfoChain, + IExtendsPhysicalDeviceFeatures2Chain +{ + /// + public StructureType SType; + + /// + public unsafe void* PNext; + + /// + public Bool32 AccelerationStructure; + + // NOTE Truncated for example + + public unsafe PhysicalDeviceAccelerationStructureFeaturesKHR( + StructureType? sType = StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr, + void* pNext = null, + Bool32? accelerationStructure = null) + : this() + { + if (sType.HasValue) + SType = sType.Value; + if ((IntPtr) pNext != IntPtr.Zero) + PNext = pNext; + if (accelerationStructure.HasValue) + AccelerationStructure = accelerationStructure.Value; + + // NOTE Truncated for example + } + + #region Chaining Support + public static unsafe ref PhysicalDeviceAccelerationStructureFeaturesKHR Chain(out PhysicalDeviceAccelerationStructureFeaturesKHR capture) + { + capture = new PhysicalDeviceAccelerationStructureFeaturesKHR(StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr); + return ref capture; + } + + public void End() => SType = StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr; + + public unsafe ref T SetNext(ref T capture) where T : struct, IExtendsPhysicalDeviceFeatures2Chain + { + SType = StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr; + var reference = __makeref(capture); + PNext = (void*) *(IntPtr*) &reference; + return ref capture; + } + + public unsafe ref T CreateNext(out T capture) where T : struct, IExtendsPhysicalDeviceFeatures2Chain + { + SType = StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr; + capture = default; + var reference = __makeref(capture); + PNext = (void*) *(IntPtr*) &reference; + return ref capture; + } + + #endregion +} \ No newline at end of file diff --git a/PrototypeStructChaining/PhysicalDeviceDescriptorIndexingFeatures.cs b/PrototypeStructChaining/PhysicalDeviceDescriptorIndexingFeatures.cs new file mode 100644 index 0000000000..8d5f5d9238 --- /dev/null +++ b/PrototypeStructChaining/PhysicalDeviceDescriptorIndexingFeatures.cs @@ -0,0 +1,60 @@ +namespace Silk.Net.Vulkan; + +public struct PhysicalDeviceDescriptorIndexingFeatures : IExtendsDeviceCreateInfoChain, + IExtendsPhysicalDeviceFeatures2Chain +{ + /// + public StructureType SType; + + /// + public unsafe void* PNext; + + /// + public Bool32 ShaderInputAttachmentArrayDynamicIndexing; + + // NOTE Truncated for example + + public unsafe PhysicalDeviceDescriptorIndexingFeatures( + StructureType? sType = StructureType.PhysicalDeviceDescriptorIndexingFeaturesExt, + void* pNext = null, + Bool32? shaderInputAttachmentArrayDynamicIndexing = null) + : this() + { + if (sType.HasValue) + SType = sType.Value; + if ((IntPtr) pNext != IntPtr.Zero) + PNext = pNext; + if (shaderInputAttachmentArrayDynamicIndexing.HasValue) + ShaderInputAttachmentArrayDynamicIndexing = shaderInputAttachmentArrayDynamicIndexing.Value; + + // NOTE Truncated for example + } + + #region Chaining Support + public static unsafe ref PhysicalDeviceDescriptorIndexingFeatures Chain(out PhysicalDeviceDescriptorIndexingFeatures capture) + { + capture = new PhysicalDeviceDescriptorIndexingFeatures(StructureType.PhysicalDeviceDescriptorIndexingFeatures); + return ref capture; + } + + public void End() => SType = StructureType.PhysicalDeviceDescriptorIndexingFeatures; + + public unsafe ref T SetNext(ref T capture) where T : struct, IExtendsPhysicalDeviceFeatures2Chain + { + SType = StructureType.PhysicalDeviceDescriptorIndexingFeatures; + var reference = __makeref(capture); + PNext = (void*) *(IntPtr*) &reference; + return ref capture; + } + + public unsafe ref T CreateNext(out T capture) where T : struct, IExtendsPhysicalDeviceFeatures2Chain + { + SType = StructureType.PhysicalDeviceDescriptorIndexingFeatures; + capture = default; + var reference = __makeref(capture); + PNext = (void*) *(IntPtr*) &reference; + return ref capture; + } + + #endregion +} \ No newline at end of file diff --git a/PrototypeStructChaining/PhysicalDeviceFeatures.cs b/PrototypeStructChaining/PhysicalDeviceFeatures.cs new file mode 100644 index 0000000000..f20a4d8c8c --- /dev/null +++ b/PrototypeStructChaining/PhysicalDeviceFeatures.cs @@ -0,0 +1,19 @@ +namespace Silk.Net.Vulkan; + +public struct PhysicalDeviceFeatures +{ + /// + public Bool32 RobustBufferAccess; + + // NOTE Truncated for example + + public PhysicalDeviceFeatures( + Bool32? robustBufferAccess = null) + : this() + { + if (robustBufferAccess.HasValue) + RobustBufferAccess = robustBufferAccess.Value; + + // NOTE Truncated for example + } +} \ No newline at end of file diff --git a/PrototypeStructChaining/PhysicalDeviceFeatures2.cs b/PrototypeStructChaining/PhysicalDeviceFeatures2.cs new file mode 100644 index 0000000000..069b5c0faf --- /dev/null +++ b/PrototypeStructChaining/PhysicalDeviceFeatures2.cs @@ -0,0 +1,53 @@ +using System.Runtime.InteropServices; + +namespace Silk.Net.Vulkan; + +public struct PhysicalDeviceFeatures2 : IExtendsDeviceCreateInfoChain +{ + public StructureType SType; + public unsafe void* PNext; + public PhysicalDeviceFeatures Features; + + public unsafe PhysicalDeviceFeatures2( + StructureType? sType = StructureType.PhysicalDeviceFeatures2Khr, + void* pNext = null, + PhysicalDeviceFeatures? features = null) + : this() + { + if (sType.HasValue) + SType = sType.Value; + if ((IntPtr) pNext != IntPtr.Zero) + PNext = pNext; + if (!features.HasValue) + return; + Features = features.Value; + } + + #region Chaining Support + public static unsafe ref PhysicalDeviceFeatures2 Chain(out PhysicalDeviceFeatures2 capture) + { + capture = new PhysicalDeviceFeatures2(StructureType.PhysicalDeviceFeatures2); + return ref capture; + } + + public void End() => SType = StructureType.PhysicalDeviceFeatures2; + + public unsafe ref T SetNext(ref T capture) where T : struct, IExtendsPhysicalDeviceFeatures2Chain + { + SType = StructureType.PhysicalDeviceFeatures2; + var reference = __makeref(capture); + PNext = (void*) *(IntPtr*) &reference; + return ref capture; + } + + public unsafe ref T CreateNext(out T capture) where T : struct, IExtendsPhysicalDeviceFeatures2Chain + { + SType = StructureType.PhysicalDeviceFeatures2; + capture = default; + var reference = __makeref(capture); + PNext = (void*) *(IntPtr*) &reference; + return ref capture; + } + + #endregion +} \ No newline at end of file diff --git a/PrototypeStructChaining/PrototypeStructChaining.csproj b/PrototypeStructChaining/PrototypeStructChaining.csproj new file mode 100644 index 0000000000..211c366972 --- /dev/null +++ b/PrototypeStructChaining/PrototypeStructChaining.csproj @@ -0,0 +1,11 @@ + + + + net6.0 + enable + enable + true + Silk.Net.Vulkan + + + diff --git a/PrototypeStructChaining/StructureType.cs b/PrototypeStructChaining/StructureType.cs new file mode 100644 index 0000000000..28a3e988f7 --- /dev/null +++ b/PrototypeStructChaining/StructureType.cs @@ -0,0 +1,704 @@ +namespace Silk.Net.Vulkan; + +public enum StructureType +{ + ApplicationInfo = 0, + InstanceCreateInfo = 1, + DeviceQueueCreateInfo = 2, + DeviceCreateInfo = 3, + SubmitInfo = 4, + MemoryAllocateInfo = 5, + MappedMemoryRange = 6, + BindSparseInfo = 7, + FenceCreateInfo = 8, + SemaphoreCreateInfo = 9, + EventCreateInfo = 10, // 0x0000000A + QueryPoolCreateInfo = 11, // 0x0000000B + BufferCreateInfo = 12, // 0x0000000C + BufferViewCreateInfo = 13, // 0x0000000D + ImageCreateInfo = 14, // 0x0000000E + ImageViewCreateInfo = 15, // 0x0000000F + ShaderModuleCreateInfo = 16, // 0x00000010 + PipelineCacheCreateInfo = 17, // 0x00000011 + PipelineShaderStageCreateInfo = 18, // 0x00000012 + PipelineVertexInputStateCreateInfo = 19, // 0x00000013 + PipelineInputAssemblyStateCreateInfo = 20, // 0x00000014 + PipelineTessellationStateCreateInfo = 21, // 0x00000015 + PipelineViewportStateCreateInfo = 22, // 0x00000016 + PipelineRasterizationStateCreateInfo = 23, // 0x00000017 + PipelineMultisampleStateCreateInfo = 24, // 0x00000018 + PipelineDepthStencilStateCreateInfo = 25, // 0x00000019 + PipelineColorBlendStateCreateInfo = 26, // 0x0000001A + PipelineDynamicStateCreateInfo = 27, // 0x0000001B + GraphicsPipelineCreateInfo = 28, // 0x0000001C + ComputePipelineCreateInfo = 29, // 0x0000001D + PipelineLayoutCreateInfo = 30, // 0x0000001E + SamplerCreateInfo = 31, // 0x0000001F + DescriptorSetLayoutCreateInfo = 32, // 0x00000020 + DescriptorPoolCreateInfo = 33, // 0x00000021 + DescriptorSetAllocateInfo = 34, // 0x00000022 + WriteDescriptorSet = 35, // 0x00000023 + CopyDescriptorSet = 36, // 0x00000024 + FramebufferCreateInfo = 37, // 0x00000025 + RenderPassCreateInfo = 38, // 0x00000026 + CommandPoolCreateInfo = 39, // 0x00000027 + CommandBufferAllocateInfo = 40, // 0x00000028 + CommandBufferInheritanceInfo = 41, // 0x00000029 + CommandBufferBeginInfo = 42, // 0x0000002A + RenderPassBeginInfo = 43, // 0x0000002B + BufferMemoryBarrier = 44, // 0x0000002C + ImageMemoryBarrier = 45, // 0x0000002D + MemoryBarrier = 46, // 0x0000002E + LoaderInstanceCreateInfo = 47, // 0x0000002F + LoaderDeviceCreateInfo = 48, // 0x00000030 + PhysicalDeviceVulkan11Features = 49, // 0x00000031 + PhysicalDeviceVulkan11Properties = 50, // 0x00000032 + PhysicalDeviceVulkan12Features = 51, // 0x00000033 + PhysicalDeviceVulkan12Properties = 52, // 0x00000034 + SwapchainCreateInfoKhr = 1000001000, // 0x3B9ACDE8 + PresentInfoKhr = 1000001001, // 0x3B9ACDE9 + DisplayModeCreateInfoKhr = 1000002000, // 0x3B9AD1D0 + DisplaySurfaceCreateInfoKhr = 1000002001, // 0x3B9AD1D1 + DisplayPresentInfoKhr = 1000003000, // 0x3B9AD5B8 + XlibSurfaceCreateInfoKhr = 1000004000, // 0x3B9AD9A0 + XcbSurfaceCreateInfoKhr = 1000005000, // 0x3B9ADD88 + WaylandSurfaceCreateInfoKhr = 1000006000, // 0x3B9AE170 + AndroidSurfaceCreateInfoKhr = 1000008000, // 0x3B9AE940 + Win32SurfaceCreateInfoKhr = 1000009000, // 0x3B9AED28 + NativeBufferAndroid = 1000010000, // 0x3B9AF110 + SwapchainImageCreateInfoAndroid = 1000010001, // 0x3B9AF111 + PhysicalDevicePresentationPropertiesAndroid = 1000010002, // 0x3B9AF112 + DebugReportCallbackCreateInfoExt = 1000011000, // 0x3B9AF4F8 + DebugReportCreateInfoExt = 1000011000, // 0x3B9AF4F8 + PipelineRasterizationStateRasterizationOrderAmd = 1000018000, // 0x3B9B1050 + DebugMarkerObjectNameInfoExt = 1000022000, // 0x3B9B1FF0 + DebugMarkerObjectTagInfoExt = 1000022001, // 0x3B9B1FF1 + DebugMarkerMarkerInfoExt = 1000022002, // 0x3B9B1FF2 + VideoProfileKhr = 1000023000, // 0x3B9B23D8 + VideoCapabilitiesKhr = 1000023001, // 0x3B9B23D9 + VideoPictureResourceKhr = 1000023002, // 0x3B9B23DA + VideoGetMemoryPropertiesKhr = 1000023003, // 0x3B9B23DB + VideoBindMemoryKhr = 1000023004, // 0x3B9B23DC + VideoSessionCreateInfoKhr = 1000023005, // 0x3B9B23DD + VideoSessionParametersCreateInfoKhr = 1000023006, // 0x3B9B23DE + VideoSessionParametersUpdateInfoKhr = 1000023007, // 0x3B9B23DF + VideoBeginCodingInfoKhr = 1000023008, // 0x3B9B23E0 + VideoEndCodingInfoKhr = 1000023009, // 0x3B9B23E1 + VideoCodingControlInfoKhr = 1000023010, // 0x3B9B23E2 + VideoReferenceSlotKhr = 1000023011, // 0x3B9B23E3 + VideoQueueFamilyProperties2Khr = 1000023012, // 0x3B9B23E4 + VideoProfilesKhr = 1000023013, // 0x3B9B23E5 + PhysicalDeviceVideoFormatInfoKhr = 1000023014, // 0x3B9B23E6 + VideoFormatPropertiesKhr = 1000023015, // 0x3B9B23E7 + VideoDecodeInfoKhr = 1000024000, // 0x3B9B27C0 + DedicatedAllocationImageCreateInfoNV = 1000026000, // 0x3B9B2F90 + DedicatedAllocationBufferCreateInfoNV = 1000026001, // 0x3B9B2F91 + DedicatedAllocationMemoryAllocateInfoNV = 1000026002, // 0x3B9B2F92 + PhysicalDeviceTransformFeedbackFeaturesExt = 1000028000, // 0x3B9B3760 + PhysicalDeviceTransformFeedbackPropertiesExt = 1000028001, // 0x3B9B3761 + PipelineRasterizationStateStreamCreateInfoExt = 1000028002, // 0x3B9B3762 + CUModuleCreateInfoNvx = 1000029000, // 0x3B9B3B48 + CUFunctionCreateInfoNvx = 1000029001, // 0x3B9B3B49 + CULaunchInfoNvx = 1000029002, // 0x3B9B3B4A + ImageViewHandleInfoNvx = 1000030000, // 0x3B9B3F30 + ImageViewAddressPropertiesNvx = 1000030001, // 0x3B9B3F31 + VideoEncodeH264CapabilitiesExt = 1000038000, // 0x3B9B5E70 + VideoEncodeH264SessionCreateInfoExt = 1000038001, // 0x3B9B5E71 + VideoEncodeH264SessionParametersCreateInfoExt = 1000038002, // 0x3B9B5E72 + VideoEncodeH264SessionParametersAddInfoExt = 1000038003, // 0x3B9B5E73 + VideoEncodeH264VclFrameInfoExt = 1000038004, // 0x3B9B5E74 + VideoEncodeH264DpbSlotInfoExt = 1000038005, // 0x3B9B5E75 + VideoEncodeH264NaluSliceExt = 1000038006, // 0x3B9B5E76 + VideoEncodeH264EmitPictureParametersExt = 1000038007, // 0x3B9B5E77 + VideoEncodeH264ProfileExt = 1000038008, // 0x3B9B5E78 + VideoDecodeH264CapabilitiesExt = 1000040000, // 0x3B9B6640 + VideoDecodeH264SessionCreateInfoExt = 1000040001, // 0x3B9B6641 + VideoDecodeH264PictureInfoExt = 1000040002, // 0x3B9B6642 + VideoDecodeH264MvcExt = 1000040003, // 0x3B9B6643 + VideoDecodeH264ProfileExt = 1000040004, // 0x3B9B6644 + VideoDecodeH264SessionParametersCreateInfoExt = 1000040005, // 0x3B9B6645 + VideoDecodeH264SessionParametersAddInfoExt = 1000040006, // 0x3B9B6646 + VideoDecodeH264DpbSlotInfoExt = 1000040007, // 0x3B9B6647 + TextureLodGatherFormatPropertiesAmd = 1000041000, // 0x3B9B6A28 + StreamDescriptorSurfaceCreateInfoGgp = 1000049000, // 0x3B9B8968 + PhysicalDeviceCornerSampledImageFeaturesNV = 1000050000, // 0x3B9B8D50 + RenderPassMultiviewCreateInfo = 1000053000, // 0x3B9B9908 + RenderPassMultiviewCreateInfoKhr = 1000053000, // 0x3B9B9908 + PhysicalDeviceMultiviewFeatures = 1000053001, // 0x3B9B9909 + PhysicalDeviceMultiviewFeaturesKhr = 1000053001, // 0x3B9B9909 + PhysicalDeviceMultiviewProperties = 1000053002, // 0x3B9B990A + PhysicalDeviceMultiviewPropertiesKhr = 1000053002, // 0x3B9B990A + ExternalMemoryImageCreateInfoNV = 1000056000, // 0x3B9BA4C0 + ExportMemoryAllocateInfoNV = 1000056001, // 0x3B9BA4C1 + ImportMemoryWin32HandleInfoNV = 1000057000, // 0x3B9BA8A8 + ExportMemoryWin32HandleInfoNV = 1000057001, // 0x3B9BA8A9 + Win32KeyedMutexAcquireReleaseInfoNV = 1000058000, // 0x3B9BAC90 + PhysicalDeviceFeatures2 = 1000059000, // 0x3B9BB078 + PhysicalDeviceFeatures2Khr = 1000059000, // 0x3B9BB078 + PhysicalDeviceProperties2 = 1000059001, // 0x3B9BB079 + PhysicalDeviceProperties2Khr = 1000059001, // 0x3B9BB079 + FormatProperties2 = 1000059002, // 0x3B9BB07A + FormatProperties2Khr = 1000059002, // 0x3B9BB07A + ImageFormatProperties2 = 1000059003, // 0x3B9BB07B + ImageFormatProperties2Khr = 1000059003, // 0x3B9BB07B + PhysicalDeviceImageFormatInfo2 = 1000059004, // 0x3B9BB07C + PhysicalDeviceImageFormatInfo2Khr = 1000059004, // 0x3B9BB07C + QueueFamilyProperties2 = 1000059005, // 0x3B9BB07D + QueueFamilyProperties2Khr = 1000059005, // 0x3B9BB07D + PhysicalDeviceMemoryProperties2 = 1000059006, // 0x3B9BB07E + PhysicalDeviceMemoryProperties2Khr = 1000059006, // 0x3B9BB07E + SparseImageFormatProperties2 = 1000059007, // 0x3B9BB07F + SparseImageFormatProperties2Khr = 1000059007, // 0x3B9BB07F + PhysicalDeviceSparseImageFormatInfo2 = 1000059008, // 0x3B9BB080 + PhysicalDeviceSparseImageFormatInfo2Khr = 1000059008, // 0x3B9BB080 + MemoryAllocateFlagsInfo = 1000060000, // 0x3B9BB460 + MemoryAllocateFlagsInfoKhr = 1000060000, // 0x3B9BB460 + DeviceGroupRenderPassBeginInfo = 1000060003, // 0x3B9BB463 + DeviceGroupRenderPassBeginInfoKhr = 1000060003, // 0x3B9BB463 + DeviceGroupCommandBufferBeginInfo = 1000060004, // 0x3B9BB464 + DeviceGroupCommandBufferBeginInfoKhr = 1000060004, // 0x3B9BB464 + DeviceGroupSubmitInfo = 1000060005, // 0x3B9BB465 + DeviceGroupSubmitInfoKhr = 1000060005, // 0x3B9BB465 + DeviceGroupBindSparseInfo = 1000060006, // 0x3B9BB466 + DeviceGroupBindSparseInfoKhr = 1000060006, // 0x3B9BB466 + DeviceGroupPresentCapabilitiesKhr = 1000060007, // 0x3B9BB467 + ImageSwapchainCreateInfoKhr = 1000060008, // 0x3B9BB468 + BindImageMemorySwapchainInfoKhr = 1000060009, // 0x3B9BB469 + AcquireNextImageInfoKhr = 1000060010, // 0x3B9BB46A + DeviceGroupPresentInfoKhr = 1000060011, // 0x3B9BB46B + DeviceGroupSwapchainCreateInfoKhr = 1000060012, // 0x3B9BB46C + BindBufferMemoryDeviceGroupInfo = 1000060013, // 0x3B9BB46D + BindBufferMemoryDeviceGroupInfoKhr = 1000060013, // 0x3B9BB46D + BindImageMemoryDeviceGroupInfo = 1000060014, // 0x3B9BB46E + BindImageMemoryDeviceGroupInfoKhr = 1000060014, // 0x3B9BB46E + ValidationFlagsExt = 1000061000, // 0x3B9BB848 + VISurfaceCreateInfoNN = 1000062000, // 0x3B9BBC30 + PhysicalDeviceShaderDrawParameterFeatures = 1000063000, // 0x3B9BC018 + PhysicalDeviceShaderDrawParametersFeatures = 1000063000, // 0x3B9BC018 + PhysicalDeviceTextureCompressionAstcHdrFeaturesExt = 1000066000, // 0x3B9BCBD0 + ImageViewAstcDecodeModeExt = 1000067000, // 0x3B9BCFB8 + PhysicalDeviceAstcDecodeFeaturesExt = 1000067001, // 0x3B9BCFB9 + PhysicalDeviceGroupProperties = 1000070000, // 0x3B9BDB70 + PhysicalDeviceGroupPropertiesKhr = 1000070000, // 0x3B9BDB70 + DeviceGroupDeviceCreateInfo = 1000070001, // 0x3B9BDB71 + DeviceGroupDeviceCreateInfoKhr = 1000070001, // 0x3B9BDB71 + PhysicalDeviceExternalImageFormatInfo = 1000071000, // 0x3B9BDF58 + PhysicalDeviceExternalImageFormatInfoKhr = 1000071000, // 0x3B9BDF58 + ExternalImageFormatProperties = 1000071001, // 0x3B9BDF59 + ExternalImageFormatPropertiesKhr = 1000071001, // 0x3B9BDF59 + PhysicalDeviceExternalBufferInfo = 1000071002, // 0x3B9BDF5A + PhysicalDeviceExternalBufferInfoKhr = 1000071002, // 0x3B9BDF5A + ExternalBufferProperties = 1000071003, // 0x3B9BDF5B + ExternalBufferPropertiesKhr = 1000071003, // 0x3B9BDF5B + PhysicalDeviceIDProperties = 1000071004, // 0x3B9BDF5C + PhysicalDeviceIDPropertiesKhr = 1000071004, // 0x3B9BDF5C + ExternalMemoryBufferCreateInfo = 1000072000, // 0x3B9BE340 + ExternalMemoryBufferCreateInfoKhr = 1000072000, // 0x3B9BE340 + ExternalMemoryImageCreateInfo = 1000072001, // 0x3B9BE341 + ExternalMemoryImageCreateInfoKhr = 1000072001, // 0x3B9BE341 + ExportMemoryAllocateInfo = 1000072002, // 0x3B9BE342 + ExportMemoryAllocateInfoKhr = 1000072002, // 0x3B9BE342 + ImportMemoryWin32HandleInfoKhr = 1000073000, // 0x3B9BE728 + ExportMemoryWin32HandleInfoKhr = 1000073001, // 0x3B9BE729 + MemoryWin32HandlePropertiesKhr = 1000073002, // 0x3B9BE72A + MemoryGetWin32HandleInfoKhr = 1000073003, // 0x3B9BE72B + ImportMemoryFDInfoKhr = 1000074000, // 0x3B9BEB10 + MemoryFDPropertiesKhr = 1000074001, // 0x3B9BEB11 + MemoryGetFDInfoKhr = 1000074002, // 0x3B9BEB12 + Win32KeyedMutexAcquireReleaseInfoKhr = 1000075000, // 0x3B9BEEF8 + PhysicalDeviceExternalSemaphoreInfo = 1000076000, // 0x3B9BF2E0 + PhysicalDeviceExternalSemaphoreInfoKhr = 1000076000, // 0x3B9BF2E0 + ExternalSemaphoreProperties = 1000076001, // 0x3B9BF2E1 + ExternalSemaphorePropertiesKhr = 1000076001, // 0x3B9BF2E1 + ExportSemaphoreCreateInfo = 1000077000, // 0x3B9BF6C8 + ExportSemaphoreCreateInfoKhr = 1000077000, // 0x3B9BF6C8 + ImportSemaphoreWin32HandleInfoKhr = 1000078000, // 0x3B9BFAB0 + ExportSemaphoreWin32HandleInfoKhr = 1000078001, // 0x3B9BFAB1 + D3D12FenceSubmitInfoKhr = 1000078002, // 0x3B9BFAB2 + SemaphoreGetWin32HandleInfoKhr = 1000078003, // 0x3B9BFAB3 + ImportSemaphoreFDInfoKhr = 1000079000, // 0x3B9BFE98 + SemaphoreGetFDInfoKhr = 1000079001, // 0x3B9BFE99 + PhysicalDevicePushDescriptorPropertiesKhr = 1000080000, // 0x3B9C0280 + CommandBufferInheritanceConditionalRenderingInfoExt = 1000081000, // 0x3B9C0668 + PhysicalDeviceConditionalRenderingFeaturesExt = 1000081001, // 0x3B9C0669 + ConditionalRenderingBeginInfoExt = 1000081002, // 0x3B9C066A + PhysicalDeviceFloat16Int8FeaturesKhr = 1000082000, // 0x3B9C0A50 + PhysicalDeviceShaderFloat16Int8Features = 1000082000, // 0x3B9C0A50 + PhysicalDeviceShaderFloat16Int8FeaturesKhr = 1000082000, // 0x3B9C0A50 + PhysicalDevice16BitStorageFeatures = 1000083000, // 0x3B9C0E38 + PhysicalDevice16BitStorageFeaturesKhr = 1000083000, // 0x3B9C0E38 + PresentRegionsKhr = 1000084000, // 0x3B9C1220 + DescriptorUpdateTemplateCreateInfo = 1000085000, // 0x3B9C1608 + DescriptorUpdateTemplateCreateInfoKhr = 1000085000, // 0x3B9C1608 + PipelineViewportWScalingStateCreateInfoNV = 1000087000, // 0x3B9C1DD8 + SurfaceCapabilities2Ext = 1000090000, // 0x3B9C2990 + DisplayPowerInfoExt = 1000091000, // 0x3B9C2D78 + DeviceEventInfoExt = 1000091001, // 0x3B9C2D79 + DisplayEventInfoExt = 1000091002, // 0x3B9C2D7A + SwapchainCounterCreateInfoExt = 1000091003, // 0x3B9C2D7B + PresentTimesInfoGoogle = 1000092000, // 0x3B9C3160 + PhysicalDeviceSubgroupProperties = 1000094000, // 0x3B9C3930 + PhysicalDeviceMultiviewPerViewAttributesPropertiesNvx = 1000097000, // 0x3B9C44E8 + PipelineViewportSwizzleStateCreateInfoNV = 1000098000, // 0x3B9C48D0 + PhysicalDeviceDiscardRectanglePropertiesExt = 1000099000, // 0x3B9C4CB8 + PipelineDiscardRectangleStateCreateInfoExt = 1000099001, // 0x3B9C4CB9 + PhysicalDeviceConservativeRasterizationPropertiesExt = 1000101000, // 0x3B9C5488 + PipelineRasterizationConservativeStateCreateInfoExt = 1000101001, // 0x3B9C5489 + PhysicalDeviceDepthClipEnableFeaturesExt = 1000102000, // 0x3B9C5870 + PipelineRasterizationDepthClipStateCreateInfoExt = 1000102001, // 0x3B9C5871 + HdrMetadataExt = 1000105000, // 0x3B9C6428 + PhysicalDeviceImagelessFramebufferFeatures = 1000108000, // 0x3B9C6FE0 + PhysicalDeviceImagelessFramebufferFeaturesKhr = 1000108000, // 0x3B9C6FE0 + FramebufferAttachmentsCreateInfo = 1000108001, // 0x3B9C6FE1 + FramebufferAttachmentsCreateInfoKhr = 1000108001, // 0x3B9C6FE1 + FramebufferAttachmentImageInfo = 1000108002, // 0x3B9C6FE2 + FramebufferAttachmentImageInfoKhr = 1000108002, // 0x3B9C6FE2 + RenderPassAttachmentBeginInfo = 1000108003, // 0x3B9C6FE3 + RenderPassAttachmentBeginInfoKhr = 1000108003, // 0x3B9C6FE3 + AttachmentDescription2 = 1000109000, // 0x3B9C73C8 + AttachmentDescription2Khr = 1000109000, // 0x3B9C73C8 + AttachmentReference2 = 1000109001, // 0x3B9C73C9 + AttachmentReference2Khr = 1000109001, // 0x3B9C73C9 + SubpassDescription2 = 1000109002, // 0x3B9C73CA + SubpassDescription2Khr = 1000109002, // 0x3B9C73CA + SubpassDependency2 = 1000109003, // 0x3B9C73CB + SubpassDependency2Khr = 1000109003, // 0x3B9C73CB + RenderPassCreateInfo2 = 1000109004, // 0x3B9C73CC + RenderPassCreateInfo2Khr = 1000109004, // 0x3B9C73CC + SubpassBeginInfo = 1000109005, // 0x3B9C73CD + SubpassBeginInfoKhr = 1000109005, // 0x3B9C73CD + SubpassEndInfo = 1000109006, // 0x3B9C73CE + SubpassEndInfoKhr = 1000109006, // 0x3B9C73CE + SharedPresentSurfaceCapabilitiesKhr = 1000111000, // 0x3B9C7B98 + PhysicalDeviceExternalFenceInfo = 1000112000, // 0x3B9C7F80 + PhysicalDeviceExternalFenceInfoKhr = 1000112000, // 0x3B9C7F80 + ExternalFenceProperties = 1000112001, // 0x3B9C7F81 + ExternalFencePropertiesKhr = 1000112001, // 0x3B9C7F81 + ExportFenceCreateInfo = 1000113000, // 0x3B9C8368 + ExportFenceCreateInfoKhr = 1000113000, // 0x3B9C8368 + ImportFenceWin32HandleInfoKhr = 1000114000, // 0x3B9C8750 + ExportFenceWin32HandleInfoKhr = 1000114001, // 0x3B9C8751 + FenceGetWin32HandleInfoKhr = 1000114002, // 0x3B9C8752 + ImportFenceFDInfoKhr = 1000115000, // 0x3B9C8B38 + FenceGetFDInfoKhr = 1000115001, // 0x3B9C8B39 + PhysicalDevicePerformanceQueryFeaturesKhr = 1000116000, // 0x3B9C8F20 + PhysicalDevicePerformanceQueryPropertiesKhr = 1000116001, // 0x3B9C8F21 + QueryPoolPerformanceCreateInfoKhr = 1000116002, // 0x3B9C8F22 + PerformanceQuerySubmitInfoKhr = 1000116003, // 0x3B9C8F23 + AcquireProfilingLockInfoKhr = 1000116004, // 0x3B9C8F24 + PerformanceCounterKhr = 1000116005, // 0x3B9C8F25 + PerformanceCounterDescriptionKhr = 1000116006, // 0x3B9C8F26 + PhysicalDevicePointClippingProperties = 1000117000, // 0x3B9C9308 + PhysicalDevicePointClippingPropertiesKhr = 1000117000, // 0x3B9C9308 + RenderPassInputAttachmentAspectCreateInfo = 1000117001, // 0x3B9C9309 + RenderPassInputAttachmentAspectCreateInfoKhr = 1000117001, // 0x3B9C9309 + ImageViewUsageCreateInfo = 1000117002, // 0x3B9C930A + ImageViewUsageCreateInfoKhr = 1000117002, // 0x3B9C930A + PipelineTessellationDomainOriginStateCreateInfo = 1000117003, // 0x3B9C930B + PipelineTessellationDomainOriginStateCreateInfoKhr = 1000117003, // 0x3B9C930B + PhysicalDeviceSurfaceInfo2Khr = 1000119000, // 0x3B9C9AD8 + SurfaceCapabilities2Khr = 1000119001, // 0x3B9C9AD9 + SurfaceFormat2Khr = 1000119002, // 0x3B9C9ADA + PhysicalDeviceVariablePointerFeatures = 1000120000, // 0x3B9C9EC0 + PhysicalDeviceVariablePointerFeaturesKhr = 1000120000, // 0x3B9C9EC0 + PhysicalDeviceVariablePointersFeatures = 1000120000, // 0x3B9C9EC0 + PhysicalDeviceVariablePointersFeaturesKhr = 1000120000, // 0x3B9C9EC0 + DisplayProperties2Khr = 1000121000, // 0x3B9CA2A8 + DisplayPlaneProperties2Khr = 1000121001, // 0x3B9CA2A9 + DisplayModeProperties2Khr = 1000121002, // 0x3B9CA2AA + DisplayPlaneInfo2Khr = 1000121003, // 0x3B9CA2AB + DisplayPlaneCapabilities2Khr = 1000121004, // 0x3B9CA2AC + IosSurfaceCreateInfoMvk = 1000122000, // 0x3B9CA690 + MacosSurfaceCreateInfoMvk = 1000123000, // 0x3B9CAA78 + MemoryDedicatedRequirements = 1000127000, // 0x3B9CBA18 + MemoryDedicatedRequirementsKhr = 1000127000, // 0x3B9CBA18 + MemoryDedicatedAllocateInfo = 1000127001, // 0x3B9CBA19 + MemoryDedicatedAllocateInfoKhr = 1000127001, // 0x3B9CBA19 + DebugUtilsObjectNameInfoExt = 1000128000, // 0x3B9CBE00 + DebugUtilsObjectTagInfoExt = 1000128001, // 0x3B9CBE01 + DebugUtilsLabelExt = 1000128002, // 0x3B9CBE02 + DebugUtilsMessengerCallbackDataExt = 1000128003, // 0x3B9CBE03 + DebugUtilsMessengerCreateInfoExt = 1000128004, // 0x3B9CBE04 + AndroidHardwareBufferUsageAndroid = 1000129000, // 0x3B9CC1E8 + AndroidHardwareBufferPropertiesAndroid = 1000129001, // 0x3B9CC1E9 + AndroidHardwareBufferFormatPropertiesAndroid = 1000129002, // 0x3B9CC1EA + ImportAndroidHardwareBufferInfoAndroid = 1000129003, // 0x3B9CC1EB + MemoryGetAndroidHardwareBufferInfoAndroid = 1000129004, // 0x3B9CC1EC + ExternalFormatAndroid = 1000129005, // 0x3B9CC1ED + PhysicalDeviceSamplerFilterMinmaxProperties = 1000130000, // 0x3B9CC5D0 + PhysicalDeviceSamplerFilterMinmaxPropertiesExt = 1000130000, // 0x3B9CC5D0 + SamplerReductionModeCreateInfo = 1000130001, // 0x3B9CC5D1 + SamplerReductionModeCreateInfoExt = 1000130001, // 0x3B9CC5D1 + PhysicalDeviceInlineUniformBlockFeaturesExt = 1000138000, // 0x3B9CE510 + PhysicalDeviceInlineUniformBlockPropertiesExt = 1000138001, // 0x3B9CE511 + WriteDescriptorSetInlineUniformBlockExt = 1000138002, // 0x3B9CE512 + DescriptorPoolInlineUniformBlockCreateInfoExt = 1000138003, // 0x3B9CE513 + SampleLocationsInfoExt = 1000143000, // 0x3B9CF898 + RenderPassSampleLocationsBeginInfoExt = 1000143001, // 0x3B9CF899 + PipelineSampleLocationsStateCreateInfoExt = 1000143002, // 0x3B9CF89A + PhysicalDeviceSampleLocationsPropertiesExt = 1000143003, // 0x3B9CF89B + MultisamplePropertiesExt = 1000143004, // 0x3B9CF89C + ProtectedSubmitInfo = 1000145000, // 0x3B9D0068 + PhysicalDeviceProtectedMemoryFeatures = 1000145001, // 0x3B9D0069 + PhysicalDeviceProtectedMemoryProperties = 1000145002, // 0x3B9D006A + DeviceQueueInfo2 = 1000145003, // 0x3B9D006B + BufferMemoryRequirementsInfo2 = 1000146000, // 0x3B9D0450 + BufferMemoryRequirementsInfo2Khr = 1000146000, // 0x3B9D0450 + ImageMemoryRequirementsInfo2 = 1000146001, // 0x3B9D0451 + ImageMemoryRequirementsInfo2Khr = 1000146001, // 0x3B9D0451 + ImageSparseMemoryRequirementsInfo2 = 1000146002, // 0x3B9D0452 + ImageSparseMemoryRequirementsInfo2Khr = 1000146002, // 0x3B9D0452 + MemoryRequirements2 = 1000146003, // 0x3B9D0453 + MemoryRequirements2Khr = 1000146003, // 0x3B9D0453 + SparseImageMemoryRequirements2 = 1000146004, // 0x3B9D0454 + SparseImageMemoryRequirements2Khr = 1000146004, // 0x3B9D0454 + ImageFormatListCreateInfo = 1000147000, // 0x3B9D0838 + ImageFormatListCreateInfoKhr = 1000147000, // 0x3B9D0838 + PhysicalDeviceBlendOperationAdvancedFeaturesExt = 1000148000, // 0x3B9D0C20 + PhysicalDeviceBlendOperationAdvancedPropertiesExt = 1000148001, // 0x3B9D0C21 + PipelineColorBlendAdvancedStateCreateInfoExt = 1000148002, // 0x3B9D0C22 + PipelineCoverageToColorStateCreateInfoNV = 1000149000, // 0x3B9D1008 + AccelerationStructureBuildGeometryInfoKhr = 1000150000, // 0x3B9D13F0 + AccelerationStructureDeviceAddressInfoKhr = 1000150002, // 0x3B9D13F2 + AccelerationStructureGeometryAabbsDataKhr = 1000150003, // 0x3B9D13F3 + AccelerationStructureGeometryInstancesDataKhr = 1000150004, // 0x3B9D13F4 + AccelerationStructureGeometryTrianglesDataKhr = 1000150005, // 0x3B9D13F5 + AccelerationStructureGeometryKhr = 1000150006, // 0x3B9D13F6 + WriteDescriptorSetAccelerationStructureKhr = 1000150007, // 0x3B9D13F7 + AccelerationStructureVersionInfoKhr = 1000150009, // 0x3B9D13F9 + CopyAccelerationStructureInfoKhr = 1000150010, // 0x3B9D13FA + CopyAccelerationStructureToMemoryInfoKhr = 1000150011, // 0x3B9D13FB + CopyMemoryToAccelerationStructureInfoKhr = 1000150012, // 0x3B9D13FC + PhysicalDeviceAccelerationStructureFeaturesKhr = 1000150013, // 0x3B9D13FD + PhysicalDeviceAccelerationStructurePropertiesKhr = 1000150014, // 0x3B9D13FE + RayTracingPipelineCreateInfoKhr = 1000150015, // 0x3B9D13FF + RayTracingShaderGroupCreateInfoKhr = 1000150016, // 0x3B9D1400 + AccelerationStructureCreateInfoKhr = 1000150017, // 0x3B9D1401 + RayTracingPipelineInterfaceCreateInfoKhr = 1000150018, // 0x3B9D1402 + AccelerationStructureBuildSizesInfoKhr = 1000150020, // 0x3B9D1404 + PipelineCoverageModulationStateCreateInfoNV = 1000152000, // 0x3B9D1BC0 + PhysicalDeviceShaderSMBuiltinsFeaturesNV = 1000154000, // 0x3B9D2390 + PhysicalDeviceShaderSMBuiltinsPropertiesNV = 1000154001, // 0x3B9D2391 + SamplerYcbcrConversionCreateInfo = 1000156000, // 0x3B9D2B60 + SamplerYcbcrConversionCreateInfoKhr = 1000156000, // 0x3B9D2B60 + SamplerYcbcrConversionInfo = 1000156001, // 0x3B9D2B61 + SamplerYcbcrConversionInfoKhr = 1000156001, // 0x3B9D2B61 + BindImagePlaneMemoryInfo = 1000156002, // 0x3B9D2B62 + BindImagePlaneMemoryInfoKhr = 1000156002, // 0x3B9D2B62 + ImagePlaneMemoryRequirementsInfo = 1000156003, // 0x3B9D2B63 + ImagePlaneMemoryRequirementsInfoKhr = 1000156003, // 0x3B9D2B63 + PhysicalDeviceSamplerYcbcrConversionFeatures = 1000156004, // 0x3B9D2B64 + PhysicalDeviceSamplerYcbcrConversionFeaturesKhr = 1000156004, // 0x3B9D2B64 + SamplerYcbcrConversionImageFormatProperties = 1000156005, // 0x3B9D2B65 + SamplerYcbcrConversionImageFormatPropertiesKhr = 1000156005, // 0x3B9D2B65 + BindBufferMemoryInfo = 1000157000, // 0x3B9D2F48 + BindBufferMemoryInfoKhr = 1000157000, // 0x3B9D2F48 + BindImageMemoryInfo = 1000157001, // 0x3B9D2F49 + BindImageMemoryInfoKhr = 1000157001, // 0x3B9D2F49 + DrmFormatModifierPropertiesListExt = 1000158000, // 0x3B9D3330 + PhysicalDeviceImageDrmFormatModifierInfoExt = 1000158002, // 0x3B9D3332 + ImageDrmFormatModifierListCreateInfoExt = 1000158003, // 0x3B9D3333 + ImageDrmFormatModifierExplicitCreateInfoExt = 1000158004, // 0x3B9D3334 + ImageDrmFormatModifierPropertiesExt = 1000158005, // 0x3B9D3335 + ValidationCacheCreateInfoExt = 1000160000, // 0x3B9D3B00 + ShaderModuleValidationCacheCreateInfoExt = 1000160001, // 0x3B9D3B01 + DescriptorSetLayoutBindingFlagsCreateInfo = 1000161000, // 0x3B9D3EE8 + DescriptorSetLayoutBindingFlagsCreateInfoExt = 1000161000, // 0x3B9D3EE8 + PhysicalDeviceDescriptorIndexingFeatures = 1000161001, // 0x3B9D3EE9 + PhysicalDeviceDescriptorIndexingFeaturesExt = 1000161001, // 0x3B9D3EE9 + PhysicalDeviceDescriptorIndexingProperties = 1000161002, // 0x3B9D3EEA + PhysicalDeviceDescriptorIndexingPropertiesExt = 1000161002, // 0x3B9D3EEA + DescriptorSetVariableDescriptorCountAllocateInfo = 1000161003, // 0x3B9D3EEB + DescriptorSetVariableDescriptorCountAllocateInfoExt = 1000161003, // 0x3B9D3EEB + DescriptorSetVariableDescriptorCountLayoutSupport = 1000161004, // 0x3B9D3EEC + DescriptorSetVariableDescriptorCountLayoutSupportExt = 1000161004, // 0x3B9D3EEC + PhysicalDevicePortabilitySubsetFeaturesKhr = 1000163000, // 0x3B9D46B8 + PhysicalDevicePortabilitySubsetPropertiesKhr = 1000163001, // 0x3B9D46B9 + PipelineViewportShadingRateImageStateCreateInfoNV = 1000164000, // 0x3B9D4AA0 + PhysicalDeviceShadingRateImageFeaturesNV = 1000164001, // 0x3B9D4AA1 + PhysicalDeviceShadingRateImagePropertiesNV = 1000164002, // 0x3B9D4AA2 + PipelineViewportCoarseSampleOrderStateCreateInfoNV = 1000164005, // 0x3B9D4AA5 + RayTracingPipelineCreateInfoNV = 1000165000, // 0x3B9D4E88 + AccelerationStructureCreateInfoNV = 1000165001, // 0x3B9D4E89 + GeometryNV = 1000165003, // 0x3B9D4E8B + GeometryTrianglesNV = 1000165004, // 0x3B9D4E8C + GeometryAabbNV = 1000165005, // 0x3B9D4E8D + BindAccelerationStructureMemoryInfoNV = 1000165006, // 0x3B9D4E8E + WriteDescriptorSetAccelerationStructureNV = 1000165007, // 0x3B9D4E8F + AccelerationStructureMemoryRequirementsInfoNV = 1000165008, // 0x3B9D4E90 + PhysicalDeviceRayTracingPropertiesNV = 1000165009, // 0x3B9D4E91 + RayTracingShaderGroupCreateInfoNV = 1000165011, // 0x3B9D4E93 + AccelerationStructureInfoNV = 1000165012, // 0x3B9D4E94 + PhysicalDeviceRepresentativeFragmentTestFeaturesNV = 1000166000, // 0x3B9D5270 + PipelineRepresentativeFragmentTestStateCreateInfoNV = 1000166001, // 0x3B9D5271 + PhysicalDeviceMaintenance3Properties = 1000168000, // 0x3B9D5A40 + PhysicalDeviceMaintenance3PropertiesKhr = 1000168000, // 0x3B9D5A40 + DescriptorSetLayoutSupport = 1000168001, // 0x3B9D5A41 + DescriptorSetLayoutSupportKhr = 1000168001, // 0x3B9D5A41 + PhysicalDeviceImageViewImageFormatInfoExt = 1000170000, // 0x3B9D6210 + FilterCubicImageViewImageFormatPropertiesExt = 1000170001, // 0x3B9D6211 + DeviceQueueGlobalPriorityCreateInfoExt = 1000174000, // 0x3B9D71B0 + PhysicalDeviceShaderSubgroupExtendedTypesFeatures = 1000175000, // 0x3B9D7598 + PhysicalDeviceShaderSubgroupExtendedTypesFeaturesKhr = 1000175000, // 0x3B9D7598 + PhysicalDevice8BitStorageFeatures = 1000177000, // 0x3B9D7D68 + PhysicalDevice8BitStorageFeaturesKhr = 1000177000, // 0x3B9D7D68 + ImportMemoryHostPointerInfoExt = 1000178000, // 0x3B9D8150 + MemoryHostPointerPropertiesExt = 1000178001, // 0x3B9D8151 + PhysicalDeviceExternalMemoryHostPropertiesExt = 1000178002, // 0x3B9D8152 + PhysicalDeviceShaderAtomicInt64Features = 1000180000, // 0x3B9D8920 + PhysicalDeviceShaderAtomicInt64FeaturesKhr = 1000180000, // 0x3B9D8920 + PhysicalDeviceShaderClockFeaturesKhr = 1000181000, // 0x3B9D8D08 + PipelineCompilerControlCreateInfoAmd = 1000183000, // 0x3B9D94D8 + CalibratedTimestampInfoExt = 1000184000, // 0x3B9D98C0 + PhysicalDeviceShaderCorePropertiesAmd = 1000185000, // 0x3B9D9CA8 + VideoDecodeH265CapabilitiesExt = 1000187000, // 0x3B9DA478 + VideoDecodeH265SessionCreateInfoExt = 1000187001, // 0x3B9DA479 + VideoDecodeH265SessionParametersCreateInfoExt = 1000187002, // 0x3B9DA47A + VideoDecodeH265SessionParametersAddInfoExt = 1000187003, // 0x3B9DA47B + VideoDecodeH265ProfileExt = 1000187004, // 0x3B9DA47C + VideoDecodeH265PictureInfoExt = 1000187005, // 0x3B9DA47D + VideoDecodeH265DpbSlotInfoExt = 1000187006, // 0x3B9DA47E + DeviceMemoryOverallocationCreateInfoAmd = 1000189000, // 0x3B9DAC48 + PhysicalDeviceVertexAttributeDivisorPropertiesExt = 1000190000, // 0x3B9DB030 + PipelineVertexInputDivisorStateCreateInfoExt = 1000190001, // 0x3B9DB031 + PhysicalDeviceVertexAttributeDivisorFeaturesExt = 1000190002, // 0x3B9DB032 + PresentFrameTokenGgp = 1000191000, // 0x3B9DB418 + PipelineCreationFeedbackCreateInfoExt = 1000192000, // 0x3B9DB800 + PhysicalDeviceDriverProperties = 1000196000, // 0x3B9DC7A0 + PhysicalDeviceDriverPropertiesKhr = 1000196000, // 0x3B9DC7A0 + PhysicalDeviceFloatControlsProperties = 1000197000, // 0x3B9DCB88 + PhysicalDeviceFloatControlsPropertiesKhr = 1000197000, // 0x3B9DCB88 + PhysicalDeviceDepthStencilResolveProperties = 1000199000, // 0x3B9DD358 + PhysicalDeviceDepthStencilResolvePropertiesKhr = 1000199000, // 0x3B9DD358 + SubpassDescriptionDepthStencilResolve = 1000199001, // 0x3B9DD359 + SubpassDescriptionDepthStencilResolveKhr = 1000199001, // 0x3B9DD359 + PhysicalDeviceComputeShaderDerivativesFeaturesNV = 1000201000, // 0x3B9DDB28 + PhysicalDeviceMeshShaderFeaturesNV = 1000202000, // 0x3B9DDF10 + PhysicalDeviceMeshShaderPropertiesNV = 1000202001, // 0x3B9DDF11 + PhysicalDeviceFragmentShaderBarycentricFeaturesNV = 1000203000, // 0x3B9DE2F8 + PhysicalDeviceShaderImageFootprintFeaturesNV = 1000204000, // 0x3B9DE6E0 + PipelineViewportExclusiveScissorStateCreateInfoNV = 1000205000, // 0x3B9DEAC8 + PhysicalDeviceExclusiveScissorFeaturesNV = 1000205002, // 0x3B9DEACA + CheckpointDataNV = 1000206000, // 0x3B9DEEB0 + QueueFamilyCheckpointPropertiesNV = 1000206001, // 0x3B9DEEB1 + PhysicalDeviceTimelineSemaphoreFeatures = 1000207000, // 0x3B9DF298 + PhysicalDeviceTimelineSemaphoreFeaturesKhr = 1000207000, // 0x3B9DF298 + PhysicalDeviceTimelineSemaphoreProperties = 1000207001, // 0x3B9DF299 + PhysicalDeviceTimelineSemaphorePropertiesKhr = 1000207001, // 0x3B9DF299 + SemaphoreTypeCreateInfo = 1000207002, // 0x3B9DF29A + SemaphoreTypeCreateInfoKhr = 1000207002, // 0x3B9DF29A + TimelineSemaphoreSubmitInfo = 1000207003, // 0x3B9DF29B + TimelineSemaphoreSubmitInfoKhr = 1000207003, // 0x3B9DF29B + SemaphoreWaitInfo = 1000207004, // 0x3B9DF29C + SemaphoreWaitInfoKhr = 1000207004, // 0x3B9DF29C + SemaphoreSignalInfo = 1000207005, // 0x3B9DF29D + SemaphoreSignalInfoKhr = 1000207005, // 0x3B9DF29D + PhysicalDeviceShaderIntegerFunctions2FeaturesIntel = 1000209000, // 0x3B9DFA68 + QueryPoolCreateInfoIntel = 1000210000, // 0x3B9DFE50 + QueryPoolPerformanceQueryCreateInfoIntel = 1000210000, // 0x3B9DFE50 + InitializePerformanceApiInfoIntel = 1000210001, // 0x3B9DFE51 + PerformanceMarkerInfoIntel = 1000210002, // 0x3B9DFE52 + PerformanceStreamMarkerInfoIntel = 1000210003, // 0x3B9DFE53 + PerformanceOverrideInfoIntel = 1000210004, // 0x3B9DFE54 + PerformanceConfigurationAcquireInfoIntel = 1000210005, // 0x3B9DFE55 + PhysicalDeviceVulkanMemoryModelFeatures = 1000211000, // 0x3B9E0238 + PhysicalDeviceVulkanMemoryModelFeaturesKhr = 1000211000, // 0x3B9E0238 + PhysicalDevicePciBusInfoPropertiesExt = 1000212000, // 0x3B9E0620 + DisplayNativeHdrSurfaceCapabilitiesAmd = 1000213000, // 0x3B9E0A08 + SwapchainDisplayNativeHdrCreateInfoAmd = 1000213001, // 0x3B9E0A09 + ImagepipeSurfaceCreateInfoFuchsia = 1000214000, // 0x3B9E0DF0 + PhysicalDeviceShaderTerminateInvocationFeaturesKhr = 1000215000, // 0x3B9E11D8 + MetalSurfaceCreateInfoExt = 1000217000, // 0x3B9E19A8 + PhysicalDeviceFragmentDensityMapFeaturesExt = 1000218000, // 0x3B9E1D90 + PhysicalDeviceFragmentDensityMapPropertiesExt = 1000218001, // 0x3B9E1D91 + RenderPassFragmentDensityMapCreateInfoExt = 1000218002, // 0x3B9E1D92 + PhysicalDeviceScalarBlockLayoutFeatures = 1000221000, // 0x3B9E2948 + PhysicalDeviceScalarBlockLayoutFeaturesExt = 1000221000, // 0x3B9E2948 + PhysicalDeviceSubgroupSizeControlPropertiesExt = 1000225000, // 0x3B9E38E8 + PipelineShaderStageRequiredSubgroupSizeCreateInfoExt = 1000225001, // 0x3B9E38E9 + PhysicalDeviceSubgroupSizeControlFeaturesExt = 1000225002, // 0x3B9E38EA + FragmentShadingRateAttachmentInfoKhr = 1000226000, // 0x3B9E3CD0 + PipelineFragmentShadingRateStateCreateInfoKhr = 1000226001, // 0x3B9E3CD1 + PhysicalDeviceFragmentShadingRatePropertiesKhr = 1000226002, // 0x3B9E3CD2 + PhysicalDeviceFragmentShadingRateFeaturesKhr = 1000226003, // 0x3B9E3CD3 + PhysicalDeviceFragmentShadingRateKhr = 1000226004, // 0x3B9E3CD4 + PhysicalDeviceShaderCoreProperties2Amd = 1000227000, // 0x3B9E40B8 + PhysicalDeviceCoherentMemoryFeaturesAmd = 1000229000, // 0x3B9E4888 + PhysicalDeviceShaderImageAtomicInt64FeaturesExt = 1000234000, // 0x3B9E5C10 + PhysicalDeviceMemoryBudgetPropertiesExt = 1000237000, // 0x3B9E67C8 + PhysicalDeviceMemoryPriorityFeaturesExt = 1000238000, // 0x3B9E6BB0 + MemoryPriorityAllocateInfoExt = 1000238001, // 0x3B9E6BB1 + SurfaceProtectedCapabilitiesKhr = 1000239000, // 0x3B9E6F98 + PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV = 1000240000, // 0x3B9E7380 + PhysicalDeviceSeparateDepthStencilLayoutsFeatures = 1000241000, // 0x3B9E7768 + PhysicalDeviceSeparateDepthStencilLayoutsFeaturesKhr = 1000241000, // 0x3B9E7768 + AttachmentReferenceStencilLayout = 1000241001, // 0x3B9E7769 + AttachmentReferenceStencilLayoutKhr = 1000241001, // 0x3B9E7769 + AttachmentDescriptionStencilLayout = 1000241002, // 0x3B9E776A + AttachmentDescriptionStencilLayoutKhr = 1000241002, // 0x3B9E776A + PhysicalDeviceBufferAddressFeaturesExt = 1000244000, // 0x3B9E8320 + PhysicalDeviceBufferDeviceAddressFeaturesExt = 1000244000, // 0x3B9E8320 + BufferDeviceAddressInfo = 1000244001, // 0x3B9E8321 + BufferDeviceAddressInfoExt = 1000244001, // 0x3B9E8321 + BufferDeviceAddressInfoKhr = 1000244001, // 0x3B9E8321 + BufferDeviceAddressCreateInfoExt = 1000244002, // 0x3B9E8322 + PhysicalDeviceToolPropertiesExt = 1000245000, // 0x3B9E8708 + ImageStencilUsageCreateInfo = 1000246000, // 0x3B9E8AF0 + ImageStencilUsageCreateInfoExt = 1000246000, // 0x3B9E8AF0 + ValidationFeaturesExt = 1000247000, // 0x3B9E8ED8 + PhysicalDevicePresentWaitFeaturesKhr = 1000248000, // 0x3B9E92C0 + PhysicalDeviceCooperativeMatrixFeaturesNV = 1000249000, // 0x3B9E96A8 + CooperativeMatrixPropertiesNV = 1000249001, // 0x3B9E96A9 + PhysicalDeviceCooperativeMatrixPropertiesNV = 1000249002, // 0x3B9E96AA + PhysicalDeviceCoverageReductionModeFeaturesNV = 1000250000, // 0x3B9E9A90 + PipelineCoverageReductionStateCreateInfoNV = 1000250001, // 0x3B9E9A91 + FramebufferMixedSamplesCombinationNV = 1000250002, // 0x3B9E9A92 + PhysicalDeviceFragmentShaderInterlockFeaturesExt = 1000251000, // 0x3B9E9E78 + PhysicalDeviceYcbcrImageArraysFeaturesExt = 1000252000, // 0x3B9EA260 + PhysicalDeviceUniformBufferStandardLayoutFeatures = 1000253000, // 0x3B9EA648 + PhysicalDeviceUniformBufferStandardLayoutFeaturesKhr = 1000253000, // 0x3B9EA648 + PhysicalDeviceProvokingVertexFeaturesExt = 1000254000, // 0x3B9EAA30 + PipelineRasterizationProvokingVertexStateCreateInfoExt = 1000254001, // 0x3B9EAA31 + PhysicalDeviceProvokingVertexPropertiesExt = 1000254002, // 0x3B9EAA32 + SurfaceFullScreenExclusiveInfoExt = 1000255000, // 0x3B9EAE18 + SurfaceFullScreenExclusiveWin32InfoExt = 1000255001, // 0x3B9EAE19 + SurfaceCapabilitiesFullScreenExclusiveExt = 1000255002, // 0x3B9EAE1A + HeadlessSurfaceCreateInfoExt = 1000256000, // 0x3B9EB200 + PhysicalDeviceBufferDeviceAddressFeatures = 1000257000, // 0x3B9EB5E8 + PhysicalDeviceBufferDeviceAddressFeaturesKhr = 1000257000, // 0x3B9EB5E8 + BufferOpaqueCaptureAddressCreateInfo = 1000257002, // 0x3B9EB5EA + BufferOpaqueCaptureAddressCreateInfoKhr = 1000257002, // 0x3B9EB5EA + MemoryOpaqueCaptureAddressAllocateInfo = 1000257003, // 0x3B9EB5EB + MemoryOpaqueCaptureAddressAllocateInfoKhr = 1000257003, // 0x3B9EB5EB + DeviceMemoryOpaqueCaptureAddressInfo = 1000257004, // 0x3B9EB5EC + DeviceMemoryOpaqueCaptureAddressInfoKhr = 1000257004, // 0x3B9EB5EC + PhysicalDeviceLineRasterizationFeaturesExt = 1000259000, // 0x3B9EBDB8 + PipelineRasterizationLineStateCreateInfoExt = 1000259001, // 0x3B9EBDB9 + PhysicalDeviceLineRasterizationPropertiesExt = 1000259002, // 0x3B9EBDBA + PhysicalDeviceShaderAtomicFloatFeaturesExt = 1000260000, // 0x3B9EC1A0 + PhysicalDeviceHostQueryResetFeatures = 1000261000, // 0x3B9EC588 + PhysicalDeviceHostQueryResetFeaturesExt = 1000261000, // 0x3B9EC588 + PhysicalDeviceIndexTypeUint8FeaturesExt = 1000265000, // 0x3B9ED528 + PhysicalDeviceExtendedDynamicStateFeaturesExt = 1000267000, // 0x3B9EDCF8 + PhysicalDevicePipelineExecutablePropertiesFeaturesKhr = 1000269000, // 0x3B9EE4C8 + PipelineInfoKhr = 1000269001, // 0x3B9EE4C9 + PipelineExecutablePropertiesKhr = 1000269002, // 0x3B9EE4CA + PipelineExecutableInfoKhr = 1000269003, // 0x3B9EE4CB + PipelineExecutableStatisticKhr = 1000269004, // 0x3B9EE4CC + PipelineExecutableInternalRepresentationKhr = 1000269005, // 0x3B9EE4CD + PhysicalDeviceShaderAtomicFloat2FeaturesExt = 1000273000, // 0x3B9EF468 + PhysicalDeviceShaderDemoteToHelperInvocationFeaturesExt = 1000276000, // 0x3B9F0020 + PhysicalDeviceDeviceGeneratedCommandsPropertiesNV = 1000277000, // 0x3B9F0408 + GraphicsShaderGroupCreateInfoNV = 1000277001, // 0x3B9F0409 + GraphicsPipelineShaderGroupsCreateInfoNV = 1000277002, // 0x3B9F040A + IndirectCommandsLayoutTokenNV = 1000277003, // 0x3B9F040B + IndirectCommandsLayoutCreateInfoNV = 1000277004, // 0x3B9F040C + GeneratedCommandsInfoNV = 1000277005, // 0x3B9F040D + GeneratedCommandsMemoryRequirementsInfoNV = 1000277006, // 0x3B9F040E + PhysicalDeviceDeviceGeneratedCommandsFeaturesNV = 1000277007, // 0x3B9F040F + PhysicalDeviceInheritedViewportScissorFeaturesNV = 1000278000, // 0x3B9F07F0 + CommandBufferInheritanceViewportScissorInfoNV = 1000278001, // 0x3B9F07F1 + PhysicalDeviceShaderIntegerDotProductFeaturesKhr = 1000280000, // 0x3B9F0FC0 + PhysicalDeviceShaderIntegerDotProductPropertiesKhr = 1000280001, // 0x3B9F0FC1 + PhysicalDeviceTexelBufferAlignmentFeaturesExt = 1000281000, // 0x3B9F13A8 + PhysicalDeviceTexelBufferAlignmentPropertiesExt = 1000281001, // 0x3B9F13A9 + CommandBufferInheritanceRenderPassTransformInfoQCom = 1000282000, // 0x3B9F1790 + RenderPassTransformBeginInfoQCom = 1000282001, // 0x3B9F1791 + PhysicalDeviceDeviceMemoryReportFeaturesExt = 1000284000, // 0x3B9F1F60 + DeviceDeviceMemoryReportCreateInfoExt = 1000284001, // 0x3B9F1F61 + DeviceMemoryReportCallbackDataExt = 1000284002, // 0x3B9F1F62 + PhysicalDeviceRobustness2FeaturesExt = 1000286000, // 0x3B9F2730 + PhysicalDeviceRobustness2PropertiesExt = 1000286001, // 0x3B9F2731 + SamplerCustomBorderColorCreateInfoExt = 1000287000, // 0x3B9F2B18 + PhysicalDeviceCustomBorderColorPropertiesExt = 1000287001, // 0x3B9F2B19 + PhysicalDeviceCustomBorderColorFeaturesExt = 1000287002, // 0x3B9F2B1A + PipelineLibraryCreateInfoKhr = 1000290000, // 0x3B9F36D0 + PresentIDKhr = 1000294000, // 0x3B9F4670 + PhysicalDevicePresentIDFeaturesKhr = 1000294001, // 0x3B9F4671 + PhysicalDevicePrivateDataFeaturesExt = 1000295000, // 0x3B9F4A58 + DevicePrivateDataCreateInfoExt = 1000295001, // 0x3B9F4A59 + PrivateDataSlotCreateInfoExt = 1000295002, // 0x3B9F4A5A + PhysicalDevicePipelineCreationCacheControlFeaturesExt = 1000297000, // 0x3B9F5228 + VideoEncodeInfoKhr = 1000299000, // 0x3B9F59F8 + VideoEncodeRateControlInfoKhr = 1000299001, // 0x3B9F59F9 + PhysicalDeviceDiagnosticsConfigFeaturesNV = 1000300000, // 0x3B9F5DE0 + DeviceDiagnosticsConfigCreateInfoNV = 1000300001, // 0x3B9F5DE1 + ReservedQCom = 1000309000, // 0x3B9F8108 + MemoryBarrier2Khr = 1000314000, // 0x3B9F9490 + BufferMemoryBarrier2Khr = 1000314001, // 0x3B9F9491 + ImageMemoryBarrier2Khr = 1000314002, // 0x3B9F9492 + DependencyInfoKhr = 1000314003, // 0x3B9F9493 + SubmitInfo2Khr = 1000314004, // 0x3B9F9494 + SemaphoreSubmitInfoKhr = 1000314005, // 0x3B9F9495 + CommandBufferSubmitInfoKhr = 1000314006, // 0x3B9F9496 + PhysicalDeviceSynchronization2FeaturesKhr = 1000314007, // 0x3B9F9497 + QueueFamilyCheckpointProperties2NV = 1000314008, // 0x3B9F9498 + CheckpointData2NV = 1000314009, // 0x3B9F9499 + PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKhr = 1000323000, // 0x3B9FB7B8 + PhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKhr = 1000325000, // 0x3B9FBF88 + PhysicalDeviceFragmentShadingRateEnumsPropertiesNV = 1000326000, // 0x3B9FC370 + PhysicalDeviceFragmentShadingRateEnumsFeaturesNV = 1000326001, // 0x3B9FC371 + PipelineFragmentShadingRateEnumStateCreateInfoNV = 1000326002, // 0x3B9FC372 + AccelerationStructureGeometryMotionTrianglesDataNV = 1000327000, // 0x3B9FC758 + PhysicalDeviceRayTracingMotionBlurFeaturesNV = 1000327001, // 0x3B9FC759 + AccelerationStructureMotionInfoNV = 1000327002, // 0x3B9FC75A + PhysicalDeviceYcbcr2Plane444FormatsFeaturesExt = 1000330000, // 0x3B9FD310 + PhysicalDeviceFragmentDensityMap2FeaturesExt = 1000332000, // 0x3B9FDAE0 + PhysicalDeviceFragmentDensityMap2PropertiesExt = 1000332001, // 0x3B9FDAE1 + CopyCommandTransformInfoQCom = 1000333000, // 0x3B9FDEC8 + PhysicalDeviceImageRobustnessFeaturesExt = 1000335000, // 0x3B9FE698 + PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKhr = 1000336000, // 0x3B9FEA80 + CopyBufferInfo2Khr = 1000337000, // 0x3B9FEE68 + CopyImageInfo2Khr = 1000337001, // 0x3B9FEE69 + CopyBufferToImageInfo2Khr = 1000337002, // 0x3B9FEE6A + CopyImageToBufferInfo2Khr = 1000337003, // 0x3B9FEE6B + BlitImageInfo2Khr = 1000337004, // 0x3B9FEE6C + ResolveImageInfo2Khr = 1000337005, // 0x3B9FEE6D + BufferCopy2Khr = 1000337006, // 0x3B9FEE6E + ImageCopy2Khr = 1000337007, // 0x3B9FEE6F + ImageBlit2Khr = 1000337008, // 0x3B9FEE70 + BufferImageCopy2Khr = 1000337009, // 0x3B9FEE71 + ImageResolve2Khr = 1000337010, // 0x3B9FEE72 + PhysicalDevice4444FormatsFeaturesExt = 1000340000, // 0x3B9FFA20 + DirectfbSurfaceCreateInfoExt = 1000346000, // 0x3BA01190 + PhysicalDeviceRayTracingPipelineFeaturesKhr = 1000347000, // 0x3BA01578 + PhysicalDeviceRayTracingPipelinePropertiesKhr = 1000347001, // 0x3BA01579 + PhysicalDeviceRayQueryFeaturesKhr = 1000348013, // 0x3BA0196D + PhysicalDeviceMutableDescriptorTypeFeaturesValve = 1000351000, // 0x3BA02518 + MutableDescriptorTypeCreateInfoValve = 1000351002, // 0x3BA0251A + PhysicalDeviceVertexInputDynamicStateFeaturesExt = 1000352000, // 0x3BA02900 + VertexInputBindingDescription2Ext = 1000352001, // 0x3BA02901 + VertexInputAttributeDescription2Ext = 1000352002, // 0x3BA02902 + PhysicalDeviceDrmPropertiesExt = 1000353000, // 0x3BA02CE8 + PhysicalDevicePrimitiveTopologyListRestartFeaturesExt = 1000356000, // 0x3BA038A0 + ImportMemoryZirconHandleInfoFuchsia = 1000364000, // 0x3BA057E0 + MemoryZirconHandlePropertiesFuchsia = 1000364001, // 0x3BA057E1 + MemoryGetZirconHandleInfoFuchsia = 1000364002, // 0x3BA057E2 + ImportSemaphoreZirconHandleInfoFuchsia = 1000365000, // 0x3BA05BC8 + SemaphoreGetZirconHandleInfoFuchsia = 1000365001, // 0x3BA05BC9 + BufferCollectionCreateInfoFuchsia = 1000366000, // 0x3BA05FB0 + ImportMemoryBufferCollectionFuchsia = 1000366001, // 0x3BA05FB1 + BufferCollectionImageCreateInfoFuchsia = 1000366002, // 0x3BA05FB2 + BufferCollectionPropertiesFuchsia = 1000366003, // 0x3BA05FB3 + BufferConstraintsInfoFuchsia = 1000366004, // 0x3BA05FB4 + BufferCollectionBufferCreateInfoFuchsia = 1000366005, // 0x3BA05FB5 + ImageConstraintsInfoFuchsia = 1000366006, // 0x3BA05FB6 + ImageFormatConstraintsInfoFuchsia = 1000366007, // 0x3BA05FB7 + SysmemColorSpaceFuchsia = 1000366008, // 0x3BA05FB8 + BufferCollectionConstraintsInfoFuchsia = 1000366009, // 0x3BA05FB9 + SubpassShadingPipelineCreateInfoHuawei = 1000369000, // 0x3BA06B68 + PhysicalDeviceSubpassShadingFeaturesHuawei = 1000369001, // 0x3BA06B69 + PhysicalDeviceSubpassShadingPropertiesHuawei = 1000369002, // 0x3BA06B6A + PhysicalDeviceInvocationMaskFeaturesHuawei = 1000370000, // 0x3BA06F50 + MemoryGetRemoteAddressInfoNV = 1000371000, // 0x3BA07338 + PhysicalDeviceExternalMemoryRdmaFeaturesNV = 1000371001, // 0x3BA07339 + PhysicalDeviceExtendedDynamicState2FeaturesExt = 1000377000, // 0x3BA08AA8 + ScreenSurfaceCreateInfoQnx = 1000378000, // 0x3BA08E90 + PhysicalDeviceColorWriteEnableFeaturesExt = 1000381000, // 0x3BA09A48 + PipelineColorWriteCreateInfoExt = 1000381001, // 0x3BA09A49 + PhysicalDeviceGlobalPriorityQueryFeaturesExt = 1000388000, // 0x3BA0B5A0 + QueueFamilyGlobalPriorityPropertiesExt = 1000388001, // 0x3BA0B5A1 + PhysicalDeviceMultiDrawFeaturesExt = 1000392000, // 0x3BA0C540 + PhysicalDeviceMultiDrawPropertiesExt = 1000392001, // 0x3BA0C541 + PhysicalDevicePageableDeviceLocalMemoryFeaturesExt = 1000412000 // 0x3BA11360 +} \ No newline at end of file From 7863b1d490f4f20551e71dd98bb7e5a7fe54ff90 Mon Sep 17 00:00:00 2001 From: Craig Dean Date: Thu, 4 Nov 2021 21:36:23 +0000 Subject: [PATCH 02/42] feat: Now supports limiting allowed structs. * Added tests to check that invalid structs don't compile * Minimal additional code required per struct - just add an interface for each allowed `PNext` struct; and, - add a short static method `Chain` (technically optional), and a short instance method `SetNext`. --- .../PrototypeStructChaining.Test.csproj | 7 +- .../{UnitTestChains.cs => TestChains.cs} | 37 ++++++--- .../TestCompilation.cs | 81 +++++++++++++++++++ PrototypeStructChaining/Bool32.cs | 62 -------------- PrototypeStructChaining/ChainExtensions.cs | 71 ++++++++++++++++ PrototypeStructChaining/DeviceCreateInfo.cs | 51 ++++++++++++ PrototypeStructChaining/IChainable.cs | 15 ++-- ...lDeviceAccelerationStructureFeaturesKHR.cs | 32 +++----- ...hysicalDeviceDescriptorIndexingFeatures.cs | 32 +++----- .../PhysicalDeviceFeatures.cs | 4 +- .../PhysicalDeviceFeatures2.cs | 22 ++--- 11 files changed, 275 insertions(+), 139 deletions(-) rename PrototypeStructChaining.Test/{UnitTestChains.cs => TestChains.cs} (56%) create mode 100644 PrototypeStructChaining.Test/TestCompilation.cs delete mode 100644 PrototypeStructChaining/Bool32.cs create mode 100644 PrototypeStructChaining/ChainExtensions.cs create mode 100644 PrototypeStructChaining/DeviceCreateInfo.cs diff --git a/PrototypeStructChaining.Test/PrototypeStructChaining.Test.csproj b/PrototypeStructChaining.Test/PrototypeStructChaining.Test.csproj index f3281ada30..50c8497523 100644 --- a/PrototypeStructChaining.Test/PrototypeStructChaining.Test.csproj +++ b/PrototypeStructChaining.Test/PrototypeStructChaining.Test.csproj @@ -10,8 +10,9 @@ - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all @@ -23,7 +24,7 @@ - + diff --git a/PrototypeStructChaining.Test/UnitTestChains.cs b/PrototypeStructChaining.Test/TestChains.cs similarity index 56% rename from PrototypeStructChaining.Test/UnitTestChains.cs rename to PrototypeStructChaining.Test/TestChains.cs index 0ed4f5ca5a..19d47caa19 100644 --- a/PrototypeStructChaining.Test/UnitTestChains.cs +++ b/PrototypeStructChaining.Test/TestChains.cs @@ -3,21 +3,25 @@ namespace PrototypeStructChaining.Test; -public class UnitTestChains +public class TestChains { [Fact] public unsafe void TestCreateNext() { PhysicalDeviceFeatures2 + // The Chain method, is a convenient static, to provide a consistent syntax. .Chain(out var features2) - .CreateNext(out var indexingFeatures) - .CreateNext(out var accelerationStructureFeaturesKhr) - .End(); + // CreateNext will create an empty struct, with the correct SType (as well as ensuring the + // caller SType is coerced correctly. + .CreateNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures) + .CreateNext(out PhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeaturesKhr); + // Ensure all pointers set correctly Assert.Equal((nint) (&indexingFeatures), (nint) features2.PNext); Assert.Equal((nint) (&accelerationStructureFeaturesKhr), (nint) indexingFeatures.PNext); Assert.Equal((nint) 0, (nint) accelerationStructureFeaturesKhr.PNext); + // Ensure all STypes set correctly Assert.Equal(StructureType.PhysicalDeviceFeatures2, features2.SType); Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, indexingFeatures.SType); Assert.Equal(StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr, @@ -35,12 +39,12 @@ public unsafe void TestSetNext() { AccelerationStructure = true }; - + PhysicalDeviceFeatures2 .Chain(out var features2) - .SetNext(ref indexingFeatures) - .SetNext(ref accelerationStructureFeaturesKhr) - .End(); + // SetNext accepts an existing struct, note, it will coerce the SType and blank the PNext + .SetNext(ref indexingFeatures) + .SetNext(ref accelerationStructureFeaturesKhr); Assert.Equal((nint) (&indexingFeatures), (nint) features2.PNext); Assert.Equal((nint) (&accelerationStructureFeaturesKhr), (nint) indexingFeatures.PNext); @@ -50,8 +54,23 @@ public unsafe void TestSetNext() Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, indexingFeatures.SType); Assert.Equal(StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr, accelerationStructureFeaturesKhr.SType); - + Assert.True(indexingFeatures.ShaderInputAttachmentArrayDynamicIndexing); Assert.True(accelerationStructureFeaturesKhr.AccelerationStructure); } + + [Fact] + public unsafe void TestWithoutChain() + { + // We don't have to use the Chain() pattern, as we can pass start with an existing struct + var createInfo = new DeviceCreateInfo(); + // However, note that CreateNext will still coerce the SType of createInfo. + createInfo.CreateNext(out PhysicalDeviceFeatures2 features2); + Assert.Equal((nint) (&features2), (nint) createInfo.PNext); + Assert.Equal((nint) 0, (nint) features2.PNext); + + // Note, even though we didn't use chain, we have still coerced the SType + Assert.Equal(StructureType.DeviceCreateInfo, createInfo.SType); + Assert.Equal(StructureType.PhysicalDeviceFeatures2, features2.SType); + } } \ No newline at end of file diff --git a/PrototypeStructChaining.Test/TestCompilation.cs b/PrototypeStructChaining.Test/TestCompilation.cs new file mode 100644 index 0000000000..3087b90824 --- /dev/null +++ b/PrototypeStructChaining.Test/TestCompilation.cs @@ -0,0 +1,81 @@ +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using Microsoft.CodeAnalysis; +using Microsoft.CodeAnalysis.CSharp; +using Microsoft.CodeAnalysis.Emit; +using Silk.Net.Vulkan; +using Xunit; + +namespace PrototypeStructChaining.Test; + +public class TestCompilation +{ + private static readonly Lazy> References = new(() => + ((string?) AppContext.GetData("TRUSTED_PLATFORM_ASSEMBLIES") ?? string.Empty) + .Split(Path.PathSeparator) + .Select(r => MetadataReference.CreateFromFile(r)) + .Concat(new[] {MetadataReference.CreateFromFile(typeof(StructureType).Assembly.Location)}) + .ToArray() + ); + + private static readonly string CodeTemplate = @" +using System; +using Silk.Net.Vulkan; + +public class Test +{{ + public void DoTest() + {{ + {0} + }} +}}"; + + private IReadOnlyList CheckCompile(string code) + { + var assemblyName = Path.GetRandomFileName(); + var compilation = CSharpCompilation.Create( + assemblyName, + new[] {CSharpSyntaxTree.ParseText(string.Format(CodeTemplate, code))}, + References.Value, + new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)); + + using var ms = new MemoryStream(); + var result = compilation.Emit(ms); + + if (result.Success) + return Array.Empty(); + + return result.Diagnostics.Where(diagnostic => + diagnostic.IsWarningAsError || + diagnostic.Severity == DiagnosticSeverity.Error) + .ToArray(); + } + + [Fact] + public unsafe void TestCantAddUnsupportedNext() + { + var diagnostics = CheckCompile( + @"PhysicalDeviceFeatures2 + .Chain(out var features2) + .CreateNext(out DeviceCreateInfo createInfo);"); + + Assert.Single(diagnostics); + var error = diagnostics.First(); + // error CS0315: The type 'Silk.Net.Vulkan.PhysicalDeviceFeatures2' cannot be used as type parameter 'TChain' in the generic type or method 'ChainExtensions.CreateNext(ref TChain, out TNext)'. There is no boxing conversion from 'Silk.Net.Vulkan.PhysicalDeviceFeatures2' to 'Silk.Net.Vulkan.IChainable'. + Assert.Equal("CS0315", error.Id); + } + + [Fact] + public unsafe void TestCanAddSupportedNext() + { + var diagnostics = CheckCompile( + @"DeviceCreateInfo + .Chain(out var createInfo) + .CreateNext(out PhysicalDeviceFeatures2 features2);"); + + Assert.Empty(diagnostics); + } +} \ No newline at end of file diff --git a/PrototypeStructChaining/Bool32.cs b/PrototypeStructChaining/Bool32.cs deleted file mode 100644 index 8d86edd14b..0000000000 --- a/PrototypeStructChaining/Bool32.cs +++ /dev/null @@ -1,62 +0,0 @@ -namespace Silk.Net.Vulkan; - -/// A 32-bit boolean. -public readonly struct Bool32 -{ - /// Gets the 32-bit value for this boolean. - public uint Value { get; } - - /// - /// Creates a 32-bit boolean from the given 32-bit unsigned integer. - /// - /// The 32-bit unsigned integer value. - public Bool32(uint val) - { - Value = val; - } - - /// - /// Creates a 32-bit boolean from the given managed boolean. - /// - /// The boolean value. - public Bool32(bool val) - { - Value = val ? 1U : 0U; - } - - /// Converts this 32-bit boolean to a managed boolean. - /// The 32-bit boolean. - /// The managed boolean. - public static implicit operator bool(Bool32 val) - { - return val.Value == 1U; - } - - /// - /// Converts this 32-bit boolean to a 32-bit unsigned integer. - /// - /// The 32-bit boolean. - /// The 32-bit unsigned integer. - public static implicit operator uint(Bool32 val) - { - return val.Value; - } - - /// - /// Creates a 32-bit boolean from the given managed boolean. - /// - /// The boolean value. - public static implicit operator Bool32(bool val) - { - return new Bool32(val); - } - - /// - /// Creates a 32-bit boolean from the given 32-bit unsigned integer. - /// - /// The 32-bit unsigned integer value. - public static implicit operator Bool32(uint val) - { - return new Bool32(val); - } -} \ No newline at end of file diff --git a/PrototypeStructChaining/ChainExtensions.cs b/PrototypeStructChaining/ChainExtensions.cs new file mode 100644 index 0000000000..9957409569 --- /dev/null +++ b/PrototypeStructChaining/ChainExtensions.cs @@ -0,0 +1,71 @@ +namespace Silk.Net.Vulkan; + +public static class ChainExtensions +{ + /// + /// Sets the next structure in a chain. + /// + /// The current chain + /// The next value in the chain + /// The type of the current chain + /// The type of the next value + /// A reference to the next value in the chain + /// + /// WARNING: The supplied value will have it's own next ptr nulled. + /// Note that both the supplied chain, and the next value will have their `SType` correctly set. + /// To use + /// + /// var indexingFeatures = new PhysicalDeviceDescriptorIndexingFeatures + /// { + /// ShaderInputAttachmentArrayDynamicIndexing = true + /// }; + /// var accelerationStructureFeaturesKhr = new PhysicalDeviceAccelerationStructureFeaturesKHR + /// { + /// AccelerationStructure = true + /// }; + /// + /// PhysicalDeviceFeatures2 + /// .Chain(out var features2) + /// .SetNext(ref indexingFeatures) + /// .SetNext(ref accelerationStructureFeaturesKhr); + /// + /// + public static unsafe ref TNext SetNext(this ref TChain chain, ref TNext capture) + where TChain : struct, IChainable + where TNext : struct, IChainable + { + capture.SetNext(); + var reference = __makeref(capture); + chain.SetNext((void*) *(IntPtr*) &reference); + return ref capture; + } + + /// + /// Creates the next structure in a chain. + /// + /// The current chain + /// The next value created in the chain + /// The type of the current chain + /// The type of the next value + /// A reference to the newly created next value in the chain + /// + /// Note that both the supplied chain, and the newly created next value will have their `SType` correctly set + /// To use specify the output type required, e.g.: + /// + /// PhysicalDeviceFeatures2 + /// .Chain(out var features2) + /// .CreateNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures) + /// .CreateNext(out PhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeaturesKhr); + /// + /// + public static unsafe ref TNext CreateNext(this ref TChain chain, out TNext capture) + where TChain : struct, IChainable + where TNext : struct, IChainable + { + capture = default; + capture.SetNext(); + var reference = __makeref(capture); + chain.SetNext((void*) *(IntPtr*) &reference); + return ref capture; + } +} \ No newline at end of file diff --git a/PrototypeStructChaining/DeviceCreateInfo.cs b/PrototypeStructChaining/DeviceCreateInfo.cs new file mode 100644 index 0000000000..a38c141c22 --- /dev/null +++ b/PrototypeStructChaining/DeviceCreateInfo.cs @@ -0,0 +1,51 @@ +namespace Silk.Net.Vulkan; + +public struct DeviceCreateInfo : + IChainable, + IChainable, + IChainable +{ + /// + public StructureType SType; + + /// + public unsafe void* PNext; + + /// + public uint Flags; + + // NOTE Truncated for example + + + public unsafe DeviceCreateInfo( + StructureType? sType = StructureType.DeviceCreateInfo, + void* pNext = null, + uint? flags = null) + : this() + { + if (sType.HasValue) + SType = sType.Value; + if ((IntPtr) pNext != IntPtr.Zero) + PNext = pNext; + if (flags.HasValue) + Flags = flags.Value; + // NOTE Truncated for example + } + + + #region Chaining Support + + public static unsafe ref DeviceCreateInfo Chain(out DeviceCreateInfo capture) + { + capture = new DeviceCreateInfo(StructureType.DeviceCreateInfo); + return ref capture; + } + + public unsafe void SetNext(void* next = default) + { + SType = StructureType.DeviceCreateInfo; + PNext = next; + } + + #endregion +} \ No newline at end of file diff --git a/PrototypeStructChaining/IChainable.cs b/PrototypeStructChaining/IChainable.cs index 3a3d44100b..72d6093f9a 100644 --- a/PrototypeStructChaining/IChainable.cs +++ b/PrototypeStructChaining/IChainable.cs @@ -1,13 +1,18 @@ namespace Silk.Net.Vulkan; +/// +/// Base interface for any struct that has can set the next value. +/// public interface IChainable { + unsafe void SetNext(void* next = default); } -public interface IExtendsDeviceCreateInfoChain : IChainable -{ -} - -public interface IExtendsPhysicalDeviceFeatures2Chain : IChainable +/// +/// Generic interface indicating which structs can be set in the `PNext` value. +/// +/// A valid next structure +public interface IChainable : IChainable + where TNext : IChainable { } \ No newline at end of file diff --git a/PrototypeStructChaining/PhysicalDeviceAccelerationStructureFeaturesKHR.cs b/PrototypeStructChaining/PhysicalDeviceAccelerationStructureFeaturesKHR.cs index 74876ce5f7..05ec4692d4 100644 --- a/PrototypeStructChaining/PhysicalDeviceAccelerationStructureFeaturesKHR.cs +++ b/PrototypeStructChaining/PhysicalDeviceAccelerationStructureFeaturesKHR.cs @@ -1,7 +1,7 @@ namespace Silk.Net.Vulkan; -public struct PhysicalDeviceAccelerationStructureFeaturesKHR : IExtendsDeviceCreateInfoChain, - IExtendsPhysicalDeviceFeatures2Chain +public struct PhysicalDeviceAccelerationStructureFeaturesKHR : + IChainable { /// public StructureType SType; @@ -10,14 +10,14 @@ public struct PhysicalDeviceAccelerationStructureFeaturesKHR : IExtendsDeviceCre public unsafe void* PNext; /// - public Bool32 AccelerationStructure; + public bool AccelerationStructure; // NOTE Truncated for example public unsafe PhysicalDeviceAccelerationStructureFeaturesKHR( StructureType? sType = StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr, void* pNext = null, - Bool32? accelerationStructure = null) + bool? accelerationStructure = null) : this() { if (sType.HasValue) @@ -29,31 +29,21 @@ public unsafe PhysicalDeviceAccelerationStructureFeaturesKHR( // NOTE Truncated for example } - - #region Chaining Support - public static unsafe ref PhysicalDeviceAccelerationStructureFeaturesKHR Chain(out PhysicalDeviceAccelerationStructureFeaturesKHR capture) - { - capture = new PhysicalDeviceAccelerationStructureFeaturesKHR(StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr); - return ref capture; - } - public void End() => SType = StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr; + #region Chaining Support - public unsafe ref T SetNext(ref T capture) where T : struct, IExtendsPhysicalDeviceFeatures2Chain + public static unsafe ref PhysicalDeviceAccelerationStructureFeaturesKHR Chain( + out PhysicalDeviceAccelerationStructureFeaturesKHR capture) { - SType = StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr; - var reference = __makeref(capture); - PNext = (void*) *(IntPtr*) &reference; + capture = new PhysicalDeviceAccelerationStructureFeaturesKHR(StructureType + .PhysicalDeviceAccelerationStructureFeaturesKhr); return ref capture; } - public unsafe ref T CreateNext(out T capture) where T : struct, IExtendsPhysicalDeviceFeatures2Chain + public unsafe void SetNext(void* next = default) { SType = StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr; - capture = default; - var reference = __makeref(capture); - PNext = (void*) *(IntPtr*) &reference; - return ref capture; + PNext = next; } #endregion diff --git a/PrototypeStructChaining/PhysicalDeviceDescriptorIndexingFeatures.cs b/PrototypeStructChaining/PhysicalDeviceDescriptorIndexingFeatures.cs index 8d5f5d9238..ebeeadf515 100644 --- a/PrototypeStructChaining/PhysicalDeviceDescriptorIndexingFeatures.cs +++ b/PrototypeStructChaining/PhysicalDeviceDescriptorIndexingFeatures.cs @@ -1,7 +1,7 @@ namespace Silk.Net.Vulkan; -public struct PhysicalDeviceDescriptorIndexingFeatures : IExtendsDeviceCreateInfoChain, - IExtendsPhysicalDeviceFeatures2Chain +public struct PhysicalDeviceDescriptorIndexingFeatures : + IChainable { /// public StructureType SType; @@ -10,14 +10,14 @@ public struct PhysicalDeviceDescriptorIndexingFeatures : IExtendsDeviceCreateInf public unsafe void* PNext; /// - public Bool32 ShaderInputAttachmentArrayDynamicIndexing; + public bool ShaderInputAttachmentArrayDynamicIndexing; // NOTE Truncated for example public unsafe PhysicalDeviceDescriptorIndexingFeatures( StructureType? sType = StructureType.PhysicalDeviceDescriptorIndexingFeaturesExt, void* pNext = null, - Bool32? shaderInputAttachmentArrayDynamicIndexing = null) + bool? shaderInputAttachmentArrayDynamicIndexing = null) : this() { if (sType.HasValue) @@ -31,29 +31,19 @@ public unsafe PhysicalDeviceDescriptorIndexingFeatures( } #region Chaining Support - public static unsafe ref PhysicalDeviceDescriptorIndexingFeatures Chain(out PhysicalDeviceDescriptorIndexingFeatures capture) - { - capture = new PhysicalDeviceDescriptorIndexingFeatures(StructureType.PhysicalDeviceDescriptorIndexingFeatures); - return ref capture; - } - public void End() => SType = StructureType.PhysicalDeviceDescriptorIndexingFeatures; - - public unsafe ref T SetNext(ref T capture) where T : struct, IExtendsPhysicalDeviceFeatures2Chain + public static unsafe ref PhysicalDeviceDescriptorIndexingFeatures Chain( + out PhysicalDeviceDescriptorIndexingFeatures capture) { - SType = StructureType.PhysicalDeviceDescriptorIndexingFeatures; - var reference = __makeref(capture); - PNext = (void*) *(IntPtr*) &reference; + capture = new PhysicalDeviceDescriptorIndexingFeatures( + StructureType.PhysicalDeviceDescriptorIndexingFeaturesExt); return ref capture; } - public unsafe ref T CreateNext(out T capture) where T : struct, IExtendsPhysicalDeviceFeatures2Chain + public unsafe void SetNext(void* next = default) { - SType = StructureType.PhysicalDeviceDescriptorIndexingFeatures; - capture = default; - var reference = __makeref(capture); - PNext = (void*) *(IntPtr*) &reference; - return ref capture; + SType = StructureType.PhysicalDeviceDescriptorIndexingFeaturesExt; + PNext = next; } #endregion diff --git a/PrototypeStructChaining/PhysicalDeviceFeatures.cs b/PrototypeStructChaining/PhysicalDeviceFeatures.cs index f20a4d8c8c..d38a0d2e30 100644 --- a/PrototypeStructChaining/PhysicalDeviceFeatures.cs +++ b/PrototypeStructChaining/PhysicalDeviceFeatures.cs @@ -3,12 +3,12 @@ public struct PhysicalDeviceFeatures { /// - public Bool32 RobustBufferAccess; + public bool RobustBufferAccess; // NOTE Truncated for example public PhysicalDeviceFeatures( - Bool32? robustBufferAccess = null) + bool? robustBufferAccess = null) : this() { if (robustBufferAccess.HasValue) diff --git a/PrototypeStructChaining/PhysicalDeviceFeatures2.cs b/PrototypeStructChaining/PhysicalDeviceFeatures2.cs index 069b5c0faf..8857e32c4e 100644 --- a/PrototypeStructChaining/PhysicalDeviceFeatures2.cs +++ b/PrototypeStructChaining/PhysicalDeviceFeatures2.cs @@ -2,7 +2,9 @@ namespace Silk.Net.Vulkan; -public struct PhysicalDeviceFeatures2 : IExtendsDeviceCreateInfoChain +public struct PhysicalDeviceFeatures2 : + IChainable, + IChainable { public StructureType SType; public unsafe void* PNext; @@ -24,29 +26,17 @@ public unsafe PhysicalDeviceFeatures2( } #region Chaining Support + public static unsafe ref PhysicalDeviceFeatures2 Chain(out PhysicalDeviceFeatures2 capture) { capture = new PhysicalDeviceFeatures2(StructureType.PhysicalDeviceFeatures2); return ref capture; } - public void End() => SType = StructureType.PhysicalDeviceFeatures2; - - public unsafe ref T SetNext(ref T capture) where T : struct, IExtendsPhysicalDeviceFeatures2Chain - { - SType = StructureType.PhysicalDeviceFeatures2; - var reference = __makeref(capture); - PNext = (void*) *(IntPtr*) &reference; - return ref capture; - } - - public unsafe ref T CreateNext(out T capture) where T : struct, IExtendsPhysicalDeviceFeatures2Chain + public unsafe void SetNext(void* next = default) { SType = StructureType.PhysicalDeviceFeatures2; - capture = default; - var reference = __makeref(capture); - PNext = (void*) *(IntPtr*) &reference; - return ref capture; + PNext = next; } #endregion From babe08f5bbd3a4d9119dae502f77bea988fe1622 Mon Sep 17 00:00:00 2001 From: Craig Dean Date: Thu, 4 Nov 2021 21:57:26 +0000 Subject: [PATCH 03/42] docs: Added Readme.md --- PrototypeStructChaining.Test/TestChains.cs | 9 ++- Readme.md | 90 ++++++++++++++++++++++ 2 files changed, 97 insertions(+), 2 deletions(-) create mode 100644 Readme.md diff --git a/PrototypeStructChaining.Test/TestChains.cs b/PrototypeStructChaining.Test/TestChains.cs index 19d47caa19..2da49c64ea 100644 --- a/PrototypeStructChaining.Test/TestChains.cs +++ b/PrototypeStructChaining.Test/TestChains.cs @@ -62,8 +62,11 @@ public unsafe void TestSetNext() [Fact] public unsafe void TestWithoutChain() { - // We don't have to use the Chain() pattern, as we can pass start with an existing struct - var createInfo = new DeviceCreateInfo(); + // We don't have to use the Chain() pattern, as we can start with an existing struct + var createInfo = new DeviceCreateInfo + { + Flags = 1U + }; // However, note that CreateNext will still coerce the SType of createInfo. createInfo.CreateNext(out PhysicalDeviceFeatures2 features2); Assert.Equal((nint) (&features2), (nint) createInfo.PNext); @@ -72,5 +75,7 @@ public unsafe void TestWithoutChain() // Note, even though we didn't use chain, we have still coerced the SType Assert.Equal(StructureType.DeviceCreateInfo, createInfo.SType); Assert.Equal(StructureType.PhysicalDeviceFeatures2, features2.SType); + + Assert.Equal(1U, createInfo.Flags); } } \ No newline at end of file diff --git a/Readme.md b/Readme.md new file mode 100644 index 0000000000..45f379db20 --- /dev/null +++ b/Readme.md @@ -0,0 +1,90 @@ +# Prototype Struct Chaining + +This repository implements a prototype solution for Struct Chaining in [Silk.Net](https://github.com/dotnet/Silk.NET) + +## Design Goals + +* **Backward compatibility** - the chaining system should not change the existing structs, but add functionality. +* **Minimal bloat** - the minimum amount of new generated code was sought. +* **Discoverability** - it should be as easy as possible for a new user to discover +* **Compile-time Validation** - it should prevent chaining invalid structures (as much as possible) during compilation +* **Type coercion** - it should set the SType of chained structures. +* **Compact usage** - it should reduce copy-pasta code. +* **Avoid the heap** - boxing should be avoided +* **Well Tested** - tests were added to ensure pointers are correctly set, and compilation failures occur. + +All of these goals were met. + +## Usage + +The proposal provides for the following usage patterns: + +### CreateNext + +The most common use case is to create an empty structure to be populated by the Vulkan API, this can now be done like so: + +```csharp +PhysicalDeviceFeatures2 + // The Chain method, is a convenient static, to provide a consistent syntax. + .Chain(out var features2) + // CreateNext will create an empty struct, with the correct SType (as well as ensuring the + // caller SType is coerced correctly. + .CreateNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures) + .CreateNext(out PhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeaturesKhr); +``` + +We start by using the static `Chain` method, this is a convenience method that is not required, but it provides a more readable style. + +Each method `out`puts a struct into the local stackframe for querying once populated. Despite generics and interface being used, boxing doesn't not occur. + +### SetNext + +Sometimes we may wish to set the initial state of a structure, we can do this with `SetNext`: + +```csharp +var indexingFeatures = new PhysicalDeviceDescriptorIndexingFeatures +{ + ShaderInputAttachmentArrayDynamicIndexing = true +}; +var accelerationStructureFeaturesKhr = new PhysicalDeviceAccelerationStructureFeaturesKHR +{ + AccelerationStructure = true +}; + +PhysicalDeviceFeatures2 + .Chain(out var features2) + // SetNext accepts an existing struct, note, it will coerce the SType and blank the PNext + .SetNext(ref indexingFeatures) + .SetNext(ref accelerationStructureFeaturesKhr); +``` + +*NOTE* you can mix and match `CreateNext` and `SetNext` in the same chain. + +### Without Chain + +The use of the `Chain` method is entirely optional, for example if we wish to + +```csharp +// We don't have to use the Chain() pattern, as we can start with an existing struct +var createInfo = new DeviceCreateInfo +{ + Flags = 1U +}; +// However, note that CreateNext will still coerce the SType of createInfo. +createInfo.CreateNext(out PhysicalDeviceFeatures2 features2); +``` + +## Changes required + +* Add the `IChainable` and `IChainable` interfaces. +* Add the `ChainExtensions` extension methods `SetNext` and `CreateNext`. +* Add the small instance `void SetNext(void*)` method to each structure (this is required). +* Add the small static `Chain` method to each structure (note, this is optional sugar, allowing for 'single statement' building). +* Add `IChainable` interfaces to every chainable struct to indicate each valid structure accepted by `PNext`, eg.: +```csharp +public struct DeviceCreateInfo : + IChainable, + IChainable, + IChainable ... +``` + From 58865bfb14be8436dd2315a9db9a91866e263773 Mon Sep 17 00:00:00 2001 From: Craig Dean Date: Thu, 4 Nov 2021 22:04:26 +0000 Subject: [PATCH 04/42] fix: Change __makeref to Unsafe.AsPointer --- PrototypeStructChaining/ChainExtensions.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/PrototypeStructChaining/ChainExtensions.cs b/PrototypeStructChaining/ChainExtensions.cs index 9957409569..2621933697 100644 --- a/PrototypeStructChaining/ChainExtensions.cs +++ b/PrototypeStructChaining/ChainExtensions.cs @@ -1,3 +1,5 @@ +using System.Runtime.CompilerServices; + namespace Silk.Net.Vulkan; public static class ChainExtensions @@ -35,7 +37,7 @@ public static unsafe ref TNext SetNext(this ref TChain chain, ref where TNext : struct, IChainable { capture.SetNext(); - var reference = __makeref(capture); + var reference = Unsafe.AsPointer(ref capture); chain.SetNext((void*) *(IntPtr*) &reference); return ref capture; } @@ -64,7 +66,7 @@ public static unsafe ref TNext CreateNext(this ref TChain chain, { capture = default; capture.SetNext(); - var reference = __makeref(capture); + var reference = Unsafe.AsPointer(ref capture); chain.SetNext((void*) *(IntPtr*) &reference); return ref capture; } From 73763e6bc6579ce33bb5d6367709aece7382c3eb Mon Sep 17 00:00:00 2001 From: Craig Dean Date: Fri, 5 Nov 2021 09:31:17 +0000 Subject: [PATCH 05/42] chore: Retargeting Retargeted project to ensure that it only targets the same includes, etc. as `Silk.Next.Core` and `Silk.Net.Vulkan` --- .idea/.idea.PrototypeStructChaining/.idea/vcs.xml | 7 +++++++ .../PrototypeStructChaining.Test.csproj | 12 ++++++++---- PrototypeStructChaining/IChainable.cs | 2 +- .../PrototypeStructChaining.csproj | 14 +++++++++++++- 4 files changed, 29 insertions(+), 6 deletions(-) diff --git a/.idea/.idea.PrototypeStructChaining/.idea/vcs.xml b/.idea/.idea.PrototypeStructChaining/.idea/vcs.xml index 94a25f7f4c..029a1a823f 100644 --- a/.idea/.idea.PrototypeStructChaining/.idea/vcs.xml +++ b/.idea/.idea.PrototypeStructChaining/.idea/vcs.xml @@ -1,5 +1,12 @@ + + + + + + + diff --git a/PrototypeStructChaining.Test/PrototypeStructChaining.Test.csproj b/PrototypeStructChaining.Test/PrototypeStructChaining.Test.csproj index 50c8497523..16f0649673 100644 --- a/PrototypeStructChaining.Test/PrototypeStructChaining.Test.csproj +++ b/PrototypeStructChaining.Test/PrototypeStructChaining.Test.csproj @@ -10,9 +10,9 @@ - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all @@ -24,7 +24,11 @@ - + + + + + diff --git a/PrototypeStructChaining/IChainable.cs b/PrototypeStructChaining/IChainable.cs index 72d6093f9a..1528c142bd 100644 --- a/PrototypeStructChaining/IChainable.cs +++ b/PrototypeStructChaining/IChainable.cs @@ -12,7 +12,7 @@ public interface IChainable /// Generic interface indicating which structs can be set in the `PNext` value. /// /// A valid next structure -public interface IChainable : IChainable +public interface IChainable : IChainable where TNext : IChainable { } \ No newline at end of file diff --git a/PrototypeStructChaining/PrototypeStructChaining.csproj b/PrototypeStructChaining/PrototypeStructChaining.csproj index 211c366972..9ba92105d5 100644 --- a/PrototypeStructChaining/PrototypeStructChaining.csproj +++ b/PrototypeStructChaining/PrototypeStructChaining.csproj @@ -1,11 +1,23 @@ - net6.0 + netstandard2.0;netstandard2.1;netcoreapp3.1;net5.0 + 10 enable enable true Silk.Net.Vulkan + + + + + + + + + + + From 81cc29c8e6955074b63cceafe0c7c1f1bf72ff8e Mon Sep 17 00:00:00 2001 From: Craig Dean Date: Fri, 5 Nov 2021 13:28:58 +0000 Subject: [PATCH 06/42] refactor: Various changes * Added `IStructureType` for any struct that has a `StructureType SType` field. This is usually added automatically by one of the other interfaces; and allows the structure type to be automatically corrected and retrieved using the `StructureType IStructuredType.StructureType()` method. * Added `IChainStart` to indicate a type that can form the start of a chain. * `IChainable<...>` was replaced with `IExtendsChain` which matches the Vulkan specification more readily. * The chaining methods now all accept, and return, a reference to an `IChainStart`, making it easier to scan a chain for existing items, and making use of the auto-generated `IExtendsChain` to validate types at compile time. * `SetNext`, by default, will now replace existing chain entries if they match the supplied `SType`. This behaviour can be overriden with the optional `alwaysAdd` parameter. * `CreateNext` is now called `AddNext` to indicate it always adds to the end of a Chain.cs * `TryAddNext` added to only create a new structure if it is not already there. * `IndexOf` added to return the index of a structure in a chain. * Updated Readme.md. --- .../PrototypeStructChaining.Test.csproj | 10 +- PrototypeStructChaining.Test/TestChains.cs | 112 +++++++++++- .../TestCompilation.cs | 6 +- PrototypeStructChaining/Chain.cs | 17 ++ PrototypeStructChaining/ChainExtensions.cs | 171 +++++++++++++++--- PrototypeStructChaining/DeviceCreateInfo.cs | 23 ++- PrototypeStructChaining/IChainStart.cs | 10 + PrototypeStructChaining/IChainable.cs | 15 +- PrototypeStructChaining/IExtendsChain.cs | 10 + PrototypeStructChaining/IStructuredType.cs | 12 ++ ...lDeviceAccelerationStructureFeaturesKHR.cs | 17 +- ...hysicalDeviceDescriptorIndexingFeatures.cs | 17 +- .../PhysicalDeviceFeatures2.cs | 27 +-- .../PrototypeStructChaining.csproj | 14 +- Readme.md | 110 +++++++++-- 15 files changed, 444 insertions(+), 127 deletions(-) create mode 100644 PrototypeStructChaining/Chain.cs create mode 100644 PrototypeStructChaining/IChainStart.cs create mode 100644 PrototypeStructChaining/IExtendsChain.cs create mode 100644 PrototypeStructChaining/IStructuredType.cs diff --git a/PrototypeStructChaining.Test/PrototypeStructChaining.Test.csproj b/PrototypeStructChaining.Test/PrototypeStructChaining.Test.csproj index 16f0649673..9353923378 100644 --- a/PrototypeStructChaining.Test/PrototypeStructChaining.Test.csproj +++ b/PrototypeStructChaining.Test/PrototypeStructChaining.Test.csproj @@ -10,9 +10,9 @@ - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all @@ -24,11 +24,11 @@ - + - + diff --git a/PrototypeStructChaining.Test/TestChains.cs b/PrototypeStructChaining.Test/TestChains.cs index 2da49c64ea..5d5080c6ff 100644 --- a/PrototypeStructChaining.Test/TestChains.cs +++ b/PrototypeStructChaining.Test/TestChains.cs @@ -6,15 +6,15 @@ namespace PrototypeStructChaining.Test; public class TestChains { [Fact] - public unsafe void TestCreateNext() + public unsafe void TestAddNext() { PhysicalDeviceFeatures2 // The Chain method, is a convenient static, to provide a consistent syntax. .Chain(out var features2) - // CreateNext will create an empty struct, with the correct SType (as well as ensuring the - // caller SType is coerced correctly. - .CreateNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures) - .CreateNext(out PhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeaturesKhr); + // AddNext will create an empty struct, with the correct SType (as well as ensuring the + // chain's SType is coerced correctly. + .AddNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures) + .AddNext(out PhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeaturesKhr); // Ensure all pointers set correctly Assert.Equal((nint) (&indexingFeatures), (nint) features2.PNext); @@ -26,6 +26,31 @@ public unsafe void TestCreateNext() Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, indexingFeatures.SType); Assert.Equal(StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr, accelerationStructureFeaturesKhr.SType); + + // Check indices + Assert.Equal(1, features2.IndexOf(ref indexingFeatures)); + Assert.Equal(2, features2.IndexOf(ref accelerationStructureFeaturesKhr)); + } + + [Fact] + public unsafe void TestTryAddNext() + { + PhysicalDeviceFeatures2 + // The Chain method, is a convenient static, to provide a consistent syntax. + .Chain(out var features2) + // AddNext will create an empty struct, with the correct SType (as well as ensuring the + // chain's SType is coerced correctly. + .AddNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures); + + // Ensure all pointers set correctly + Assert.Equal((nint) (&indexingFeatures), (nint) features2.PNext); + + // Ensure all STypes set correctly + Assert.Equal(StructureType.PhysicalDeviceFeatures2, features2.SType); + Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, indexingFeatures.SType); + + features2.TryAddNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures2, out var added); + Assert.False(added); } [Fact] @@ -59,6 +84,77 @@ public unsafe void TestSetNext() Assert.True(accelerationStructureFeaturesKhr.AccelerationStructure); } + [Fact] + public unsafe void TestSetNextUpdates() + { + var indexingFeatures = new PhysicalDeviceDescriptorIndexingFeatures + { + ShaderInputAttachmentArrayDynamicIndexing = true + }; + + PhysicalDeviceFeatures2 + .Chain(out var features2) + // SetNext accepts an existing struct, note, it will coerce the SType and blank the PNext + .SetNext(ref indexingFeatures); + + Assert.Equal((nint) (&indexingFeatures), (nint) features2.PNext); + Assert.Equal((nint) 0, (nint) indexingFeatures.PNext); + + Assert.Equal(StructureType.PhysicalDeviceFeatures2, features2.SType); + Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, indexingFeatures.SType); + + // Update indexing features + var indexingFeatures2 = new PhysicalDeviceDescriptorIndexingFeatures + { + ShaderInputAttachmentArrayDynamicIndexing = false + }; + features2.SetNext(ref indexingFeatures2); + + Assert.Equal((nint) (&indexingFeatures2), (nint) features2.PNext); + Assert.Equal((nint) 0, (nint) indexingFeatures2.PNext); + + Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, indexingFeatures2.SType); + + Assert.Equal(1, features2.IndexOf(ref indexingFeatures2)); + Assert.True(features2.IndexOf(ref indexingFeatures) < 0); + } + + [Fact] + public unsafe void TestSetNextAlwaysAdd() + { + var indexingFeatures = new PhysicalDeviceDescriptorIndexingFeatures + { + ShaderInputAttachmentArrayDynamicIndexing = true + }; + + PhysicalDeviceFeatures2 + .Chain(out var features2) + // SetNext accepts an existing struct, note, it will coerce the SType and blank the PNext + .SetNext(ref indexingFeatures); + + Assert.Equal((nint) (&indexingFeatures), (nint) features2.PNext); + Assert.Equal((nint) 0, (nint) indexingFeatures.PNext); + + Assert.Equal(StructureType.PhysicalDeviceFeatures2, features2.SType); + Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, indexingFeatures.SType); + + // Update indexing features + var indexingFeatures2 = new PhysicalDeviceDescriptorIndexingFeatures + { + ShaderInputAttachmentArrayDynamicIndexing = false + }; + features2.SetNext(ref indexingFeatures2, true); + + Assert.Equal((nint) (&indexingFeatures), (nint) features2.PNext); + Assert.Equal((nint) (&indexingFeatures2), (nint) indexingFeatures.PNext); + Assert.Equal((nint) 0, (nint) indexingFeatures2.PNext); + + Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, indexingFeatures2.SType); + + Assert.Equal(1, features2.IndexOf(ref indexingFeatures)); + Assert.Equal(2, features2.IndexOf(ref indexingFeatures2)); + } + [Fact] public unsafe void TestWithoutChain() { @@ -67,15 +163,15 @@ public unsafe void TestWithoutChain() { Flags = 1U }; - // However, note that CreateNext will still coerce the SType of createInfo. - createInfo.CreateNext(out PhysicalDeviceFeatures2 features2); + // However, note that AddNext will still coerce the SType of createInfo. + createInfo.AddNext(out PhysicalDeviceFeatures2 features2); Assert.Equal((nint) (&features2), (nint) createInfo.PNext); Assert.Equal((nint) 0, (nint) features2.PNext); // Note, even though we didn't use chain, we have still coerced the SType Assert.Equal(StructureType.DeviceCreateInfo, createInfo.SType); Assert.Equal(StructureType.PhysicalDeviceFeatures2, features2.SType); - + Assert.Equal(1U, createInfo.Flags); } } \ No newline at end of file diff --git a/PrototypeStructChaining.Test/TestCompilation.cs b/PrototypeStructChaining.Test/TestCompilation.cs index 3087b90824..21ab41240c 100644 --- a/PrototypeStructChaining.Test/TestCompilation.cs +++ b/PrototypeStructChaining.Test/TestCompilation.cs @@ -60,11 +60,11 @@ public unsafe void TestCantAddUnsupportedNext() var diagnostics = CheckCompile( @"PhysicalDeviceFeatures2 .Chain(out var features2) - .CreateNext(out DeviceCreateInfo createInfo);"); + .AddNext(out DeviceCreateInfo createInfo);"); Assert.Single(diagnostics); var error = diagnostics.First(); - // error CS0315: The type 'Silk.Net.Vulkan.PhysicalDeviceFeatures2' cannot be used as type parameter 'TChain' in the generic type or method 'ChainExtensions.CreateNext(ref TChain, out TNext)'. There is no boxing conversion from 'Silk.Net.Vulkan.PhysicalDeviceFeatures2' to 'Silk.Net.Vulkan.IChainable'. + // error CS0315: The type 'Silk.Net.Vulkan.PhysicalDeviceFeatures2' cannot be used as type parameter 'TChain' in the generic type or method 'ChainExtensions.AddNext(ref TChain, out TNext)'. There is no boxing conversion from 'Silk.Net.Vulkan.PhysicalDeviceFeatures2' to 'Silk.Net.Vulkan.IChainable'. Assert.Equal("CS0315", error.Id); } @@ -74,7 +74,7 @@ public unsafe void TestCanAddSupportedNext() var diagnostics = CheckCompile( @"DeviceCreateInfo .Chain(out var createInfo) - .CreateNext(out PhysicalDeviceFeatures2 features2);"); + .AddNext(out PhysicalDeviceFeatures2 features2);"); Assert.Empty(diagnostics); } diff --git a/PrototypeStructChaining/Chain.cs b/PrototypeStructChaining/Chain.cs new file mode 100644 index 0000000000..5f0ff03b0f --- /dev/null +++ b/PrototypeStructChaining/Chain.cs @@ -0,0 +1,17 @@ +namespace Silk.Net.Vulkan; + +/// +/// Header struct of all chainable structs. +/// +public struct Chain : IChainable +{ + public StructureType SType; + public unsafe Chain* PNext; + + /// + /// Note, this doesn't coerce the type. + StructureType IStructuredType.StructureType() + { + return SType; + } +} \ No newline at end of file diff --git a/PrototypeStructChaining/ChainExtensions.cs b/PrototypeStructChaining/ChainExtensions.cs index 2621933697..d0b5d95fef 100644 --- a/PrototypeStructChaining/ChainExtensions.cs +++ b/PrototypeStructChaining/ChainExtensions.cs @@ -5,16 +5,17 @@ namespace Silk.Net.Vulkan; public static class ChainExtensions { /// - /// Sets the next structure in a chain. + /// Replaces a structure in the chain (if present, and is false), or adds it to the end. /// /// The current chain - /// The next value in the chain + /// A reference to the structure to update + /// Always adds to the end of the chain, even if an equivalent structure is present. /// The type of the current chain - /// The type of the next value - /// A reference to the next value in the chain + /// The type of the value + /// A reference to the value value in the chain /// - /// WARNING: The supplied value will have it's own next ptr nulled. - /// Note that both the supplied chain, and the next value will have their `SType` correctly set. + /// Note that both the supplied chain, and the supplied value will have their `SType` correctly set. Further, + /// the supplied structure's will be overwritten. /// To use /// /// var indexingFeatures = new PhysicalDeviceDescriptorIndexingFeatures @@ -32,42 +33,156 @@ public static class ChainExtensions /// .SetNext(ref accelerationStructureFeaturesKhr); /// /// - public static unsafe ref TNext SetNext(this ref TChain chain, ref TNext capture) - where TChain : struct, IChainable - where TNext : struct, IChainable + public static unsafe ref TChain SetNext(this ref TChain chain, ref TNext value, + bool alwaysAdd = false) + where TChain : struct, IChainStart + where TNext : struct, IExtendsChain { - capture.SetNext(); - var reference = Unsafe.AsPointer(ref capture); - chain.SetNext((void*) *(IntPtr*) &reference); - return ref capture; + // Ensure structure type of chain and value are set. + chain.StructureType(); + var structureType = value.StructureType(); + + // Find end of chain + var previousPtr = (Chain*) null; + var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); + var valuePtr = (Chain*) Unsafe.AsPointer(ref value); + do + { + var nextPtr = currentPtr->PNext; + if (!alwaysAdd && currentPtr->SType == structureType) + { + // We have an existing structure, replace it. + if (previousPtr is not null) previousPtr->PNext = valuePtr; + valuePtr->PNext = nextPtr; + + return ref chain; + } + + previousPtr = currentPtr; + currentPtr = nextPtr; + } while (currentPtr is not null); + + // Add value to end of chain + previousPtr->PNext = valuePtr; + valuePtr->PNext = null; + + return ref chain; } /// - /// Creates the next structure in a chain. + /// Returns the index of the in the , if present. + /// + /// The chain + /// The structure value + /// The type of the current chain + /// The type of the value + /// The zero-indexed index if found; otherwise -1. + public static unsafe int IndexOf(this ref TChain chain, ref TNext value) + where TChain : struct, IChainStart + where TNext : struct, IExtendsChain + { + // Ensure structure type of chain is set. + chain.StructureType(); + + var index = 0; + var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); + var valuePtr = (Chain*) Unsafe.AsPointer(ref value); + // Follow chain + do + { + if (currentPtr == valuePtr) + return index; + currentPtr = currentPtr->PNext; + index++; + } while (currentPtr is not null); + + return -1; + } + + /// + /// Adds a structure to the end of the chain. /// /// The current chain - /// The next value created in the chain + /// The structure added to the end of the chain /// The type of the current chain - /// The type of the next value - /// A reference to the newly created next value in the chain + /// The type of the structure to add + /// The reference to the chain. /// - /// Note that both the supplied chain, and the newly created next value will have their `SType` correctly set + /// Note that both the supplied chain, and the added structure will have their `SType` correctly set /// To use specify the output type required, e.g.: /// /// PhysicalDeviceFeatures2 /// .Chain(out var features2) - /// .CreateNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures) - /// .CreateNext(out PhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeaturesKhr); + /// .AddNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures) + /// .AddNext(out PhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeaturesKhr); /// + /// Note, the value is always added, even if an equivalent value is added in the chain already. Use + /// to only add if not already present. /// - public static unsafe ref TNext CreateNext(this ref TChain chain, out TNext capture) - where TChain : struct, IChainable - where TNext : struct, IChainable + public static unsafe ref TChain AddNext(this ref TChain chain, out TNext next) + where TChain : struct, IChainStart + where TNext : struct, IExtendsChain { - capture = default; - capture.SetNext(); - var reference = Unsafe.AsPointer(ref capture); - chain.SetNext((void*) *(IntPtr*) &reference); - return ref capture; + // Ensure structure type of chain is set. + chain.StructureType(); + + // Find end of chain + var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); + while (currentPtr->PNext is not null) currentPtr = currentPtr->PNext; + + // Create new entry and set it's structure type + next = default; + next.StructureType(); + currentPtr->PNext = (Chain*) Unsafe.AsPointer(ref next); + return ref chain; + } + + /// + /// Tries to add a structure to the end of the chain. + /// + /// The current chain + /// The structure added to the end of the chain + /// Whether the structure was actually added + /// The type of the current chain + /// The type of the structure to add + /// The reference to the chain. + /// + /// Note that both the supplied chain, and the added structure will have their `SType` correctly set + /// To use specify the output type required, e.g.: + /// + /// PhysicalDeviceFeatures2 + /// .Chain(out var features2) + /// .TryAddNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures, out var added); + /// + /// + public static unsafe ref TChain TryAddNext(this ref TChain chain, out TNext next, out bool added) + where TChain : struct, IChainStart + where TNext : struct, IExtendsChain + { + // Ensure structure type of chain is set. + chain.StructureType(); + + // Create new entry and get it's structure type + next = default; + var structureType = next.StructureType(); + + // Follow chain + var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); + do + { + if (currentPtr->SType == structureType) + { + added = false; + return ref chain; + } + + var nextPtr = currentPtr->PNext; + if (nextPtr is null) break; + currentPtr = nextPtr; + } while (true); + + currentPtr->PNext = (Chain*) Unsafe.AsPointer(ref next); + added = true; + return ref chain; } } \ No newline at end of file diff --git a/PrototypeStructChaining/DeviceCreateInfo.cs b/PrototypeStructChaining/DeviceCreateInfo.cs index a38c141c22..4f7712d6e6 100644 --- a/PrototypeStructChaining/DeviceCreateInfo.cs +++ b/PrototypeStructChaining/DeviceCreateInfo.cs @@ -1,9 +1,6 @@ namespace Silk.Net.Vulkan; -public struct DeviceCreateInfo : - IChainable, - IChainable, - IChainable +public struct DeviceCreateInfo : IChainStart { /// public StructureType SType; @@ -32,19 +29,25 @@ public unsafe DeviceCreateInfo( // NOTE Truncated for example } - #region Chaining Support - public static unsafe ref DeviceCreateInfo Chain(out DeviceCreateInfo capture) + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref DeviceCreateInfo Chain( + out DeviceCreateInfo capture) { - capture = new DeviceCreateInfo(StructureType.DeviceCreateInfo); + capture = new DeviceCreateInfo( + StructureType.DeviceCreateInfo); return ref capture; } - public unsafe void SetNext(void* next = default) + /// + StructureType IStructuredType.StructureType() { - SType = StructureType.DeviceCreateInfo; - PNext = next; + return SType = StructureType.DeviceCreateInfo; } #endregion diff --git a/PrototypeStructChaining/IChainStart.cs b/PrototypeStructChaining/IChainStart.cs new file mode 100644 index 0000000000..a86e8db5ea --- /dev/null +++ b/PrototypeStructChaining/IChainStart.cs @@ -0,0 +1,10 @@ +namespace Silk.Net.Vulkan; + +/// +/// Marks a chainable struct as being allowed at the start of a chain. +/// +/// Any will have a corresponding static `Chain(out var chain)` +/// convenience method. +public interface IChainStart : IChainable +{ +} \ No newline at end of file diff --git a/PrototypeStructChaining/IChainable.cs b/PrototypeStructChaining/IChainable.cs index 1528c142bd..f33553d72c 100644 --- a/PrototypeStructChaining/IChainable.cs +++ b/PrototypeStructChaining/IChainable.cs @@ -3,16 +3,9 @@ namespace Silk.Net.Vulkan; /// /// Base interface for any struct that has can set the next value. /// -public interface IChainable -{ - unsafe void SetNext(void* next = default); -} - -/// -/// Generic interface indicating which structs can be set in the `PNext` value. -/// -/// A valid next structure -public interface IChainable : IChainable - where TNext : IChainable +/// Note that any structure marked must start with a +/// and a void* field. So that a pointer to it can be coerced +/// to a pointer to a . +public interface IChainable : IStructuredType { } \ No newline at end of file diff --git a/PrototypeStructChaining/IExtendsChain.cs b/PrototypeStructChaining/IExtendsChain.cs new file mode 100644 index 0000000000..360c2063c8 --- /dev/null +++ b/PrototypeStructChaining/IExtendsChain.cs @@ -0,0 +1,10 @@ +namespace Silk.Net.Vulkan; + +/// +/// Generic interface indicating which chain this type can be added to. +/// +/// A chain start structure. +public interface IExtendsChain : IChainable + where TChain : IChainable +{ +} \ No newline at end of file diff --git a/PrototypeStructChaining/IStructuredType.cs b/PrototypeStructChaining/IStructuredType.cs new file mode 100644 index 0000000000..79d9385017 --- /dev/null +++ b/PrototypeStructChaining/IStructuredType.cs @@ -0,0 +1,12 @@ +namespace Silk.Net.Vulkan; + +public interface IStructuredType +{ + /// + /// Gets the structured type's enum value. + /// + /// + /// Retrieving the also coerces it to the correct value. + /// + StructureType StructureType(); +} \ No newline at end of file diff --git a/PrototypeStructChaining/PhysicalDeviceAccelerationStructureFeaturesKHR.cs b/PrototypeStructChaining/PhysicalDeviceAccelerationStructureFeaturesKHR.cs index 05ec4692d4..9a2fa6ecf8 100644 --- a/PrototypeStructChaining/PhysicalDeviceAccelerationStructureFeaturesKHR.cs +++ b/PrototypeStructChaining/PhysicalDeviceAccelerationStructureFeaturesKHR.cs @@ -1,7 +1,8 @@ namespace Silk.Net.Vulkan; public struct PhysicalDeviceAccelerationStructureFeaturesKHR : - IChainable + IExtendsChain, + IExtendsChain { /// public StructureType SType; @@ -32,18 +33,10 @@ public unsafe PhysicalDeviceAccelerationStructureFeaturesKHR( #region Chaining Support - public static unsafe ref PhysicalDeviceAccelerationStructureFeaturesKHR Chain( - out PhysicalDeviceAccelerationStructureFeaturesKHR capture) + /// + StructureType IStructuredType.StructureType() { - capture = new PhysicalDeviceAccelerationStructureFeaturesKHR(StructureType - .PhysicalDeviceAccelerationStructureFeaturesKhr); - return ref capture; - } - - public unsafe void SetNext(void* next = default) - { - SType = StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr; - PNext = next; + return SType = StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr; } #endregion diff --git a/PrototypeStructChaining/PhysicalDeviceDescriptorIndexingFeatures.cs b/PrototypeStructChaining/PhysicalDeviceDescriptorIndexingFeatures.cs index ebeeadf515..5f30fcd144 100644 --- a/PrototypeStructChaining/PhysicalDeviceDescriptorIndexingFeatures.cs +++ b/PrototypeStructChaining/PhysicalDeviceDescriptorIndexingFeatures.cs @@ -1,7 +1,8 @@ namespace Silk.Net.Vulkan; public struct PhysicalDeviceDescriptorIndexingFeatures : - IChainable + IExtendsChain, + IExtendsChain { /// public StructureType SType; @@ -32,18 +33,10 @@ public unsafe PhysicalDeviceDescriptorIndexingFeatures( #region Chaining Support - public static unsafe ref PhysicalDeviceDescriptorIndexingFeatures Chain( - out PhysicalDeviceDescriptorIndexingFeatures capture) + /// + StructureType IStructuredType.StructureType() { - capture = new PhysicalDeviceDescriptorIndexingFeatures( - StructureType.PhysicalDeviceDescriptorIndexingFeaturesExt); - return ref capture; - } - - public unsafe void SetNext(void* next = default) - { - SType = StructureType.PhysicalDeviceDescriptorIndexingFeaturesExt; - PNext = next; + return SType = StructureType.PhysicalDeviceDescriptorIndexingFeaturesExt; } #endregion diff --git a/PrototypeStructChaining/PhysicalDeviceFeatures2.cs b/PrototypeStructChaining/PhysicalDeviceFeatures2.cs index 8857e32c4e..8db163f074 100644 --- a/PrototypeStructChaining/PhysicalDeviceFeatures2.cs +++ b/PrototypeStructChaining/PhysicalDeviceFeatures2.cs @@ -1,17 +1,15 @@ -using System.Runtime.InteropServices; - -namespace Silk.Net.Vulkan; +namespace Silk.Net.Vulkan; public struct PhysicalDeviceFeatures2 : - IChainable, - IChainable + IChainStart, + IExtendsChain { public StructureType SType; public unsafe void* PNext; public PhysicalDeviceFeatures Features; public unsafe PhysicalDeviceFeatures2( - StructureType? sType = StructureType.PhysicalDeviceFeatures2Khr, + StructureType? sType = StructureType.PhysicalDeviceFeatures2, void* pNext = null, PhysicalDeviceFeatures? features = null) : this() @@ -27,16 +25,23 @@ public unsafe PhysicalDeviceFeatures2( #region Chaining Support - public static unsafe ref PhysicalDeviceFeatures2 Chain(out PhysicalDeviceFeatures2 capture) + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref PhysicalDeviceFeatures2 Chain( + out PhysicalDeviceFeatures2 capture) { - capture = new PhysicalDeviceFeatures2(StructureType.PhysicalDeviceFeatures2); + capture = new PhysicalDeviceFeatures2( + StructureType.PhysicalDeviceFeatures2); return ref capture; } - public unsafe void SetNext(void* next = default) + /// + StructureType IStructuredType.StructureType() { - SType = StructureType.PhysicalDeviceFeatures2; - PNext = next; + return SType = StructureType.PhysicalDeviceFeatures2; } #endregion diff --git a/PrototypeStructChaining/PrototypeStructChaining.csproj b/PrototypeStructChaining/PrototypeStructChaining.csproj index 9ba92105d5..cbc2a9595c 100644 --- a/PrototypeStructChaining/PrototypeStructChaining.csproj +++ b/PrototypeStructChaining/PrototypeStructChaining.csproj @@ -10,14 +10,12 @@ - - - - - - - - + + + + + + diff --git a/Readme.md b/Readme.md index 45f379db20..6830c7cab7 100644 --- a/Readme.md +++ b/Readme.md @@ -19,23 +19,58 @@ All of these goals were met. The proposal provides for the following usage patterns: -### CreateNext +### Chain Building -The most common use case is to create an empty structure to be populated by the Vulkan API, this can now be done like so: +You can happily create the start of a chain as usual, and it's `SType` will be coerced when you start using it as a chain: +```csharp +var createInfo = new DeviceCreateInfo +{ + Flags = 1U +}; +// When you call any chaining method it will set the chain's SType automatically. +createinfo.AddNext... +``` + +-in many cases, we only want to create a default structure for population by the API. To do so, we use the static `Chain` +method like so: +```csharp +PhysicalDeviceFeatures2.Chain(out var features2) +``` + +This has several advantages: +- The method is only available for structures that are valid at the start of a chain; providing compile-time validation. +- The structure's `SType` will be correctly set immediately. +- The syntax is fluent, and creates more readable code when used with the other chaining methods (see below). + +### AddNext + +The most common use case is to add an empty structure to the end of a chain for it to be populated by the Vulkan API, +this can now be done like so: ```csharp PhysicalDeviceFeatures2 - // The Chain method, is a convenient static, to provide a consistent syntax. .Chain(out var features2) // CreateNext will create an empty struct, with the correct SType (as well as ensuring the - // caller SType is coerced correctly. - .CreateNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures) - .CreateNext(out PhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeaturesKhr); + // chain's SType is set correctly). + .AddNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures) + .AddNext(out PhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeaturesKhr); ``` -We start by using the static `Chain` method, this is a convenience method that is not required, but it provides a more readable style. +Each method `out` puts a struct into the local stackframe for querying once populated, and the pointers point to this +local variable. Despite generics and interfaces being used, the chain methods avoid the heap entirely. + +### TryAddNext -Each method `out`puts a struct into the local stackframe for querying once populated. Despite generics and interface being used, boxing doesn't not occur. +You may only want to add a structure if it doesn't already exist in the chain, this can be done with `TryAddNext`, e.g.: + +```csharp +PhysicalDeviceFeatures2 + .Chain(out var features2) + .AddNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures) + // As there is already a PhysicalDeviceDescriptorIndexingFeatures structure the following + // will not add anything to the chain and `added` will be `false`. + .TryAddNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures2, out bool added); +``` ### SetNext @@ -58,29 +93,66 @@ PhysicalDeviceFeatures2 .SetNext(ref accelerationStructureFeaturesKhr); ``` -*NOTE* you can mix and match `CreateNext` and `SetNext` in the same chain. - -### Without Chain +*NOTE* you can mix and match `AddNext` and `SetNext` (and any chaining method) in the same method chain. -The use of the `Chain` method is entirely optional, for example if we wish to +By default, `SetNext` will replace any item in the chain with a matching `SType`, this behaviour can be changed by setting the optional +`alwaysAdd` parameter to `true`; ```csharp -// We don't have to use the Chain() pattern, as we can start with an existing struct -var createInfo = new DeviceCreateInfo +var indexingFeatures = new PhysicalDeviceDescriptorIndexingFeatures { - Flags = 1U + ShaderInputAttachmentArrayDynamicIndexing = true +}; +var indexingFeatures2 = new PhysicalDeviceDescriptorIndexingFeatures +{ + ShaderInputAttachmentArrayDynamicIndexing = false }; -// However, note that CreateNext will still coerce the SType of createInfo. -createInfo.CreateNext(out PhysicalDeviceFeatures2 features2); +var accelerationStructureFeaturesKhr = new PhysicalDeviceAccelerationStructureFeaturesKHR +{ + AccelerationStructure = true +}; + +PhysicalDeviceFeatures2 + .Chain(out var features2) + .SetNext(ref indexingFeatures) + // This will add the second 'indexingFeatures' struct, even though one is already present in the chain. + .SetNext(ref indexingFeatures2, true); ``` +### IndexOf + +Sometimes it's useful to know if a structure you previously supplied is still in a chain, this can be done with `IndexOf`, +which returns a non-negative index (zero-indexed) if the structure is found, eg.: + +```csharp +PhysicalDeviceFeatures2 + .Chain(out var features2) + .AddNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures) + .AddNext(out PhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeaturesKhr); + +// Check indices +Assert.Equal(1, features2.IndexOf(ref indexingFeatures)); +Assert.Equal(2, features2.IndexOf(ref accelerationStructureFeaturesKhr)); +``` + +## Features + +* All the chaining methods are only available on the structures that implement `IChainStart`, i.e. the structures that the +Vulkan specification says can start a chain. +* All the chaining methods ensure the chain, and any supplied structures, have their `SType` correctly set. +* All the chaining methods will only accept a structure that is valid in the chain being extended, as per the Vulkan specification. +* The chaining methods do not box structures, or add anything to the heap. + ## Changes required * Add the `IChainable` and `IChainable` interfaces. * Add the `ChainExtensions` extension methods `SetNext` and `CreateNext`. * Add the small instance `void SetNext(void*)` method to each structure (this is required). -* Add the small static `Chain` method to each structure (note, this is optional sugar, allowing for 'single statement' building). -* Add `IChainable` interfaces to every chainable struct to indicate each valid structure accepted by `PNext`, eg.: +* Add the small static `Chain` method to each structure (note, this is optional sugar, allowing for 'single statement' + building). +* Add `IChainable` interfaces to every chainable struct to indicate each valid structure accepted by `PNext` + , eg.: + ```csharp public struct DeviceCreateInfo : IChainable, From aea15c9ced82ccd8dc7d1309bda1b04e22e0520c Mon Sep 17 00:00:00 2001 From: Craig Dean Date: Fri, 5 Nov 2021 13:41:24 +0000 Subject: [PATCH 07/42] chore: Updated readme.md Updated `Changes Required` section. --- Readme.md | 54 +++++++++++++++++++++++++++++++++--------------------- 1 file changed, 33 insertions(+), 21 deletions(-) diff --git a/Readme.md b/Readme.md index 6830c7cab7..631d78c0e7 100644 --- a/Readme.md +++ b/Readme.md @@ -21,7 +21,9 @@ The proposal provides for the following usage patterns: ### Chain Building -You can happily create the start of a chain as usual, and it's `SType` will be coerced when you start using it as a chain: +You can happily create the start of a chain as usual, and it's `SType` will be coerced when you start using it as a +chain: + ```csharp var createInfo = new DeviceCreateInfo { @@ -31,13 +33,16 @@ var createInfo = new DeviceCreateInfo createinfo.AddNext... ``` --in many cases, we only want to create a default structure for population by the API. To do so, we use the static `Chain` +-in many cases, we only want to create a default structure for population by the API. To do so, we use the +static `Chain` method like so: + ```csharp PhysicalDeviceFeatures2.Chain(out var features2) ``` This has several advantages: + - The method is only available for structures that are valid at the start of a chain; providing compile-time validation. - The structure's `SType` will be correctly set immediately. - The syntax is fluent, and creates more readable code when used with the other chaining methods (see below). @@ -95,7 +100,8 @@ PhysicalDeviceFeatures2 *NOTE* you can mix and match `AddNext` and `SetNext` (and any chaining method) in the same method chain. -By default, `SetNext` will replace any item in the chain with a matching `SType`, this behaviour can be changed by setting the optional +By default, `SetNext` will replace any item in the chain with a matching `SType`, this behaviour can be changed by +setting the optional `alwaysAdd` parameter to `true`; ```csharp @@ -121,8 +127,8 @@ PhysicalDeviceFeatures2 ### IndexOf -Sometimes it's useful to know if a structure you previously supplied is still in a chain, this can be done with `IndexOf`, -which returns a non-negative index (zero-indexed) if the structure is found, eg.: +Sometimes it's useful to know if a structure you previously supplied is still in a chain, this can be done +with `IndexOf`, which returns a non-negative index (zero-indexed) if the structure is found, eg.: ```csharp PhysicalDeviceFeatures2 @@ -137,26 +143,32 @@ Assert.Equal(2, features2.IndexOf(ref accelerationStructureFeaturesKhr)); ## Features -* All the chaining methods are only available on the structures that implement `IChainStart`, i.e. the structures that the -Vulkan specification says can start a chain. +* All the chaining methods are only available on the structures that implement `IChainStart`, i.e. the structures that + the Vulkan specification says can start a chain. * All the chaining methods ensure the chain, and any supplied structures, have their `SType` correctly set. -* All the chaining methods will only accept a structure that is valid in the chain being extended, as per the Vulkan specification. +* All the chaining methods will only accept a structure that is valid in the chain being extended, as per the Vulkan + specification. * The chaining methods do not box structures, or add anything to the heap. ## Changes required -* Add the `IChainable` and `IChainable` interfaces. -* Add the `ChainExtensions` extension methods `SetNext` and `CreateNext`. -* Add the small instance `void SetNext(void*)` method to each structure (this is required). -* Add the small static `Chain` method to each structure (note, this is optional sugar, allowing for 'single statement' - building). -* Add `IChainable` interfaces to every chainable struct to indicate each valid structure accepted by `PNext` - , eg.: +* Add the new `IStructureType`, `IChainable`, `IChainStart`, `IExtendChain` interfaces. +* Add the new `Chain` structure. +* Add the `ChainExtensions` extension methods `SetNext`, `AddNew`, `IndexOf`, `AddNext` and `TryAddNext`. +* Add the small instance `StructureType IStructuredType.StructureType()` method to `IChainable` structure. +* Add the `IChainStart` interface and the small static `Chain` method to any structure that can be used as the start of + a chain. +* Add `IExtendsChain` interfaces to any structures that can extend a chain. -```csharp -public struct DeviceCreateInfo : - IChainable, - IChainable, - IChainable ... -``` +Note that the [Vulkan XML](https://raw.githubusercontent.com/KhronosGroup/Vulkan-Headers/master/registry/vk.xml) does +include the `structextends` attribute on each structure that directly maps to the `IExtendsChain` interfaces that +need to be added. However, to add the `IChainStart` interface (and it's associated method), these structures have to be +marked as a chain start whenever we see a structure extending them. + +Although it is possible to not use a design that does not make use of `IChainStart` the following functionality is lost: + +* The `Chain` method will appear on all chainable structures, even when they don't represent the start of a chain. +* All extension methods will appear on all chainable structures, even when they are not the start. +* Indexing, adding, etc. can't be guaranteed to be scanning from the start of the chain. +As adding `IChainStart` requires relatively simple logic I believe it's worth including. \ No newline at end of file From eca1dd218f06687cb84ae711de7e9f9f4e23663a Mon Sep 17 00:00:00 2001 From: Craig Dean Date: Fri, 5 Nov 2021 19:38:19 +0000 Subject: [PATCH 08/42] feat: Added ManagedChain * ManagedChain holds structures in unmanaged memory, preventing their movement, and it can be safely held on the heap itself. * It allows for easy modification and manipulation of the chain. --- .../PrototypeStructChaining.Test.csproj | 10 +- .../TestManagedChains.cs | 104 ++++++++++++++++ PrototypeStructChaining/ManagedChain.cs | 116 ++++++++++++++++++ .../PrototypeStructChaining.csproj | 13 +- Readme.md | 77 +++++++++++- 5 files changed, 308 insertions(+), 12 deletions(-) create mode 100644 PrototypeStructChaining.Test/TestManagedChains.cs create mode 100644 PrototypeStructChaining/ManagedChain.cs diff --git a/PrototypeStructChaining.Test/PrototypeStructChaining.Test.csproj b/PrototypeStructChaining.Test/PrototypeStructChaining.Test.csproj index 9353923378..c61c1205b8 100644 --- a/PrototypeStructChaining.Test/PrototypeStructChaining.Test.csproj +++ b/PrototypeStructChaining.Test/PrototypeStructChaining.Test.csproj @@ -10,9 +10,9 @@ - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all @@ -24,11 +24,11 @@ - + - + diff --git a/PrototypeStructChaining.Test/TestManagedChains.cs b/PrototypeStructChaining.Test/TestManagedChains.cs new file mode 100644 index 0000000000..9274586934 --- /dev/null +++ b/PrototypeStructChaining.Test/TestManagedChains.cs @@ -0,0 +1,104 @@ +using Silk.Net.Vulkan; +using Xunit; + +namespace PrototypeStructChaining.Test; + +public class TestManagedChains +{ + [Fact] + public unsafe void TestManagedChain() + { + using var chain = new ManagedChain(); + + // Ensure all STypes set correctly + Assert.Equal(StructureType.PhysicalDeviceFeatures2, chain.Head.SType); + Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, chain.Item1.SType); + Assert.Equal(StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr, chain.Item2.SType); + + // Ensure pointers set correctly + Assert.Equal((nint) chain.Item1Ptr, (nint) chain.Head.PNext); + Assert.Equal((nint) chain.Item2Ptr, (nint) chain.Item1.PNext); + Assert.Equal((nint) 0, (nint) chain.Item2.PNext); + } + + [Fact] + public unsafe void TestManagedChainReplaceHead() + { + using var chain = + new ManagedChain(); + + // Ensure all STypes set correctly + Assert.Equal(StructureType.DeviceCreateInfo, chain.Head.SType); + Assert.Equal(StructureType.PhysicalDeviceFeatures2, chain.Item1.SType); + Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, chain.Item2.SType); + + // Ensure pointers set correctly + Assert.Equal((nint) chain.Item1Ptr, (nint) chain.Head.PNext); + Assert.Equal((nint) chain.Item2Ptr, (nint) chain.Item1.PNext); + Assert.Equal((nint) 0, (nint) chain.Item2.PNext); + + Assert.Equal(0U, chain.Head.Flags); + + var headPtr = chain.HeadPtr; + + // Get the current head + var head = chain.Head; + // Update the flags + head.Flags = 1U; + // Update the chain + chain.Head = head; + + Assert.Equal(1U, chain.Head.Flags); + + // The head ptr should not change, we overwrite it with the new value + Assert.Equal((nint) headPtr, (nint) chain.HeadPtr); + // But the next pointer should not change + Assert.Equal((nint) chain.Item1Ptr, (nint) chain.Head.PNext); + } + + [Fact] + public unsafe void TestManagedChainReplaceMiddle() + { + using var chain = new ManagedChain(item1: new PhysicalDeviceDescriptorIndexingFeatures + { + // We can set any non-default values, note we do not need to set SType or PNext + // indeed they will be overwritten. + ShaderInputAttachmentArrayDynamicIndexing = true + }); + + // Ensure all STypes set correctly + Assert.Equal(StructureType.PhysicalDeviceFeatures2, chain.Head.SType); + Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, chain.Item1.SType); + Assert.Equal(StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr, chain.Item2.SType); + + // Ensure pointers set correctly + Assert.Equal((nint) chain.Item1Ptr, (nint) chain.Head.PNext); + Assert.Equal((nint) chain.Item2Ptr, (nint) chain.Item1.PNext); + Assert.Equal((nint) 0, (nint) chain.Item2.PNext); + + // Check our value was set + Assert.True(chain.Item1.ShaderInputAttachmentArrayDynamicIndexing); + + var item1Ptr = chain.Item1Ptr; + + // Overwrite Item1 + chain.Item1 = new PhysicalDeviceDescriptorIndexingFeatures + { + // Again we do not need to set SType or PNext, which will be set to the correct values + ShaderInputAttachmentArrayDynamicIndexing = false + }; + + // Check our value was cleared + Assert.False(chain.Item1.ShaderInputAttachmentArrayDynamicIndexing); + + // Note all the pointers are still correct (and have not changed) + Assert.Equal((nint) chain.Item1Ptr, (nint) chain.Head.PNext); + Assert.Equal((nint) chain.Item2Ptr, (nint) chain.Item1.PNext); + Assert.Equal((nint) 0, (nint) chain.Item2.PNext); + + // As is the SType + Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, chain.Item1.SType); + } +} \ No newline at end of file diff --git a/PrototypeStructChaining/ManagedChain.cs b/PrototypeStructChaining/ManagedChain.cs new file mode 100644 index 0000000000..f679b82189 --- /dev/null +++ b/PrototypeStructChaining/ManagedChain.cs @@ -0,0 +1,116 @@ +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; +using Silk.NET.Core.Native; + +namespace Silk.Net.Vulkan; + +// This should be autogenerated like Tuple<...>, only showing 3 arg type... + +public unsafe class ManagedChain : IDisposable +where TChain : struct, IChainStart +where T1 : struct, IExtendsChain +where T2 : struct, IExtendsChain +{ + private IntPtr _headPtr; + /// + /// Gets a pointer to the current head. + /// + public Chain* HeadPtr => (Chain*) _headPtr; + + /// + /// Gets or sets the head of the chain. + /// + public TChain Head + { + get => Unsafe.AsRef((Chain*) _headPtr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _headPtr)->PNext; + Marshal.StructureToPtr(value, _headPtr, true); + ((Chain*) _headPtr)->PNext = nextPtr; + } + } + + private IntPtr _item1Ptr; + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item1Ptr => (Chain*) _item1Ptr; + + /// + /// Gets or sets the second item in the chain. + /// + public T1 Item1 + { + get => Unsafe.AsRef((Chain*) _item1Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item1Ptr)->PNext; + Marshal.StructureToPtr(value, _item1Ptr, true); + ((Chain*) _item1Ptr)->PNext = nextPtr; + } + } + + private IntPtr _item2Ptr; + /// + /// Gets a pointer to the third item in the chain. + /// + public Chain* Item2Ptr => (Chain*) _item2Ptr; + + /// + /// Gets or sets the third item in the chain. + /// + public T2 Item2 + { + get => Unsafe.AsRef((Chain*) _item2Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item2Ptr)->PNext; + Marshal.StructureToPtr(value, _item2Ptr, true); + ((Chain*) _item2Ptr)->PNext = nextPtr; + } + } + + /// + /// Creates a new with 3 items. + /// + /// The first item. + /// The second item. + /// The third item. + public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default) + { + _headPtr = Marshal.AllocHGlobal(Marshal.SizeOf()); + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = Marshal.AllocHGlobal(Marshal.SizeOf()); + item1.StructureType(); + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*)_headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = Marshal.AllocHGlobal(Marshal.SizeOf()); + item2.StructureType(); + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*)_item1Ptr)->PNext = (Chain*) _item2Ptr; + } + + /// + public void Dispose() + { + var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); + if (headPtr == IntPtr.Zero) return; + Marshal.DestroyStructure((IntPtr)headPtr); + Marshal.FreeHGlobal(headPtr); + + var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); + Marshal.DestroyStructure((IntPtr)item1Ptr); + Marshal.FreeHGlobal(item1Ptr); + + var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); + Marshal.DestroyStructure((IntPtr)item2Ptr); + Marshal.FreeHGlobal(item2Ptr); + } +} \ No newline at end of file diff --git a/PrototypeStructChaining/PrototypeStructChaining.csproj b/PrototypeStructChaining/PrototypeStructChaining.csproj index cbc2a9595c..a9a068a1b9 100644 --- a/PrototypeStructChaining/PrototypeStructChaining.csproj +++ b/PrototypeStructChaining/PrototypeStructChaining.csproj @@ -10,12 +10,13 @@ - - - - - - + + + + + + + diff --git a/Readme.md b/Readme.md index 631d78c0e7..4bfa96c781 100644 --- a/Readme.md +++ b/Readme.md @@ -171,4 +171,79 @@ Although it is possible to not use a design that does not make use of `IChainSta * All extension methods will appear on all chainable structures, even when they are not the start. * Indexing, adding, etc. can't be guaranteed to be scanning from the start of the chain. -As adding `IChainStart` requires relatively simple logic I believe it's worth including. \ No newline at end of file +As adding `IChainStart` requires relatively simple logic I believe it's worth including. + +# Extension + +## ManagedChain + +Sometimes it is desirable to keep the structures around on the heap. To facilitate that you can use +the `ManagedChain` +types. Like `Tuple` et al, these support up to chain size 16. They should be disposed when finished with. + +Example: + +```csharp +using var chain = new ManagedChain(); + +// Ensure all STypes set correctly +Assert.Equal(StructureType.PhysicalDeviceFeatures2, chain.Head.SType); +Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, chain.Item1.SType); +Assert.Equal(StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr, chain.Item2.SType); + +// Ensure pointers set correctly +Assert.Equal((nint) chain.Item1Ptr, (nint) chain.Head.PNext); +Assert.Equal((nint) chain.Item2Ptr, (nint) chain.Item1.PNext); +Assert.Equal((nint) 0, (nint) chain.Item2.PNext); +``` + +The structures are held in unmanaged memory, preventing movement by the GC, and ensuring that the ptrs remain fixed. + +We can easily modify any value in the `ManagedChain`, and it will maintain the ptrs automatically, e.g.: + +```csharp +using var chain = new ManagedChain(item1: new PhysicalDeviceDescriptorIndexingFeatures +{ + // We can set any non-default values, note we do not need to set SType or PNext + // indeed they will be overwritten. + ShaderInputAttachmentArrayDynamicIndexing = true +}); + +// Ensure all STypes set correctly +Assert.Equal(StructureType.PhysicalDeviceFeatures2, chain.Head.SType); +Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, chain.Item1.SType); +Assert.Equal(StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr, chain.Item2.SType); + +// Ensure pointers set correctly +Assert.Equal((nint) chain.Item1Ptr, (nint) chain.Head.PNext); +Assert.Equal((nint) chain.Item2Ptr, (nint) chain.Item1.PNext); +Assert.Equal((nint) 0, (nint) chain.Item2.PNext); + +// Check our value was set +Assert.True(chain.Item1.ShaderInputAttachmentArrayDynamicIndexing); + +var item1Ptr = chain.Item1Ptr; + +// Overwrite Item1 +chain.Item1 = new PhysicalDeviceDescriptorIndexingFeatures +{ + // Again we do not need to set SType or PNext, which will be set to the correct values + ShaderInputAttachmentArrayDynamicIndexing = false +}; + +// Check our value was cleared +Assert.False(chain.Item1.ShaderInputAttachmentArrayDynamicIndexing); + +// Note all the pointers are still correct (and have not changed) +Assert.Equal((nint) chain.Item1Ptr, (nint) chain.Head.PNext); +Assert.Equal((nint) chain.Item2Ptr, (nint) chain.Item1.PNext); +Assert.Equal((nint) 0, (nint) chain.Item2.PNext); + +// As is the SType +Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, chain.Item1.SType); +``` + +**Note** When we update any item in the chain it overwrites the existing memory, so the ptrs remain fixed. It also +ensures the PNext value is maintained. \ No newline at end of file From 389c1f997098fb55401e25d861ddfe69ff619a72 Mon Sep 17 00:00:00 2001 From: Craig Dean Date: Fri, 5 Nov 2021 19:48:03 +0000 Subject: [PATCH 09/42] feat: Added static `ManagedChain.Create` example --- PrototypeStructChaining/ManagedChain.cs | 23 +++++++++++++++++++++++ Readme.md | 4 +++- 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/PrototypeStructChaining/ManagedChain.cs b/PrototypeStructChaining/ManagedChain.cs index f679b82189..b04198a201 100644 --- a/PrototypeStructChaining/ManagedChain.cs +++ b/PrototypeStructChaining/ManagedChain.cs @@ -4,6 +4,29 @@ namespace Silk.Net.Vulkan; +/// +/// Static class for creating Managed Chains. +/// +public static class ManagedChain +{ + /// + /// Creates a new with 3 items. + /// + /// The first item. + /// The second item. + /// The third item. + /// The chain type + /// Type of the second item. + /// Type of the third item. + /// + public static ManagedChain Create(TChain head = default, T1 item1 = default, + T2 item2 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + => new ManagedChain(head, item1, item2); +} + // This should be autogenerated like Tuple<...>, only showing 3 arg type... public unsafe class ManagedChain : IDisposable diff --git a/Readme.md b/Readme.md index 4bfa96c781..a2e8f5b431 100644 --- a/Readme.md +++ b/Readme.md @@ -246,4 +246,6 @@ Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, chain.Item1 ``` **Note** When we update any item in the chain it overwrites the existing memory, so the ptrs remain fixed. It also -ensures the PNext value is maintained. \ No newline at end of file +ensures the PNext value is maintained. + +You can also use the `ManagedChain.Create(...)` static methods to create `ManagedChain`s. \ No newline at end of file From e7f047d5a14cd97951223b92a7f54170edcac8ae Mon Sep 17 00:00:00 2001 From: Craig Dean Date: Fri, 5 Nov 2021 19:56:16 +0000 Subject: [PATCH 10/42] feat: ManagedChain uses a single memory block. --- PrototypeStructChaining/ManagedChain.cs | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/PrototypeStructChaining/ManagedChain.cs b/PrototypeStructChaining/ManagedChain.cs index b04198a201..00f6bac530 100644 --- a/PrototypeStructChaining/ManagedChain.cs +++ b/PrototypeStructChaining/ManagedChain.cs @@ -105,16 +105,21 @@ public T2 Item2 /// The third item. public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default) { - _headPtr = Marshal.AllocHGlobal(Marshal.SizeOf()); + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size); head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = Marshal.AllocHGlobal(Marshal.SizeOf()); + + _item1Ptr = _headPtr + headSize; item1.StructureType(); Marshal.StructureToPtr(item1, _item1Ptr, false); ((Chain*)_headPtr)->PNext = (Chain*) _item1Ptr; - _item2Ptr = Marshal.AllocHGlobal(Marshal.SizeOf()); + _item2Ptr = _item1Ptr + item1Size; item2.StructureType(); Marshal.StructureToPtr(item2, _item2Ptr, false); ((Chain*)_item1Ptr)->PNext = (Chain*) _item2Ptr; @@ -126,14 +131,10 @@ public void Dispose() var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); if (headPtr == IntPtr.Zero) return; Marshal.DestroyStructure((IntPtr)headPtr); - Marshal.FreeHGlobal(headPtr); - var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); Marshal.DestroyStructure((IntPtr)item1Ptr); - Marshal.FreeHGlobal(item1Ptr); - var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); Marshal.DestroyStructure((IntPtr)item2Ptr); - Marshal.FreeHGlobal(item2Ptr); + Marshal.FreeHGlobal(headPtr); } } \ No newline at end of file From ff031f66fb1ec615339a241cf441fcc04334b443 Mon Sep 17 00:00:00 2001 From: Craig Dean Date: Fri, 5 Nov 2021 20:56:25 +0000 Subject: [PATCH 11/42] feat: Added T4 template. `ManagedChain` now supports 2-16 chain items. --- .../PrototypeStructChaining.Test.csproj | 10 +- .../TestManagedChains.cs | 8 +- PrototypeStructChaining/ManagedChain.cs | 5173 ++++++++++++++++- PrototypeStructChaining/ManagedChain.tt | 259 + .../PrototypeStructChaining.csproj | 15 + 5 files changed, 5423 insertions(+), 42 deletions(-) create mode 100644 PrototypeStructChaining/ManagedChain.tt diff --git a/PrototypeStructChaining.Test/PrototypeStructChaining.Test.csproj b/PrototypeStructChaining.Test/PrototypeStructChaining.Test.csproj index c61c1205b8..9353923378 100644 --- a/PrototypeStructChaining.Test/PrototypeStructChaining.Test.csproj +++ b/PrototypeStructChaining.Test/PrototypeStructChaining.Test.csproj @@ -10,9 +10,9 @@ - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all @@ -24,11 +24,11 @@ - + - + diff --git a/PrototypeStructChaining.Test/TestManagedChains.cs b/PrototypeStructChaining.Test/TestManagedChains.cs index 9274586934..0456d6e642 100644 --- a/PrototypeStructChaining.Test/TestManagedChains.cs +++ b/PrototypeStructChaining.Test/TestManagedChains.cs @@ -82,22 +82,22 @@ public unsafe void TestManagedChainReplaceMiddle() Assert.True(chain.Item1.ShaderInputAttachmentArrayDynamicIndexing); var item1Ptr = chain.Item1Ptr; - + // Overwrite Item1 chain.Item1 = new PhysicalDeviceDescriptorIndexingFeatures { // Again we do not need to set SType or PNext, which will be set to the correct values ShaderInputAttachmentArrayDynamicIndexing = false }; - + // Check our value was cleared Assert.False(chain.Item1.ShaderInputAttachmentArrayDynamicIndexing); - + // Note all the pointers are still correct (and have not changed) Assert.Equal((nint) chain.Item1Ptr, (nint) chain.Head.PNext); Assert.Equal((nint) chain.Item2Ptr, (nint) chain.Item1.PNext); Assert.Equal((nint) 0, (nint) chain.Item2.PNext); - + // As is the SType Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, chain.Item1.SType); } diff --git a/PrototypeStructChaining/ManagedChain.cs b/PrototypeStructChaining/ManagedChain.cs index 00f6bac530..b98c22090c 100644 --- a/PrototypeStructChaining/ManagedChain.cs +++ b/PrototypeStructChaining/ManagedChain.cs @@ -1,6 +1,5 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; -using Silk.NET.Core.Native; namespace Silk.Net.Vulkan; @@ -10,36 +9,654 @@ namespace Silk.Net.Vulkan; public static class ManagedChain { /// - /// Creates a new with 3 items. + /// Creates a new with 2 items. + /// + /// The head of the chain. + /// Item 1. + /// The chain type + /// Type of Item 1. + /// A new with 2 items. + public static ManagedChain Create(TChain head = default, T1 item1 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + { + return new(head, item1); + } + + /// + /// Creates a new with 3 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// A new with 3 items. + public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + { + return new(head, item1, item2); + } + + /// + /// Creates a new with 4 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// A new with 4 items. + public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + { + return new(head, item1, item2, item3); + } + + /// + /// Creates a new with 5 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// A new with 5 items. + public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + { + return new(head, item1, item2, item3, item4); + } + + /// + /// Creates a new with 6 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// A new with 6 items. + public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + { + return new(head, item1, item2, item3, item4, item5); + } + + /// + /// Creates a new with 7 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// A new with 7 items. + public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + { + return new(head, item1, item2, item3, item4, item5, item6); + } + + /// + /// Creates a new with 8 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// A new with 8 items. + public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + { + return new(head, item1, item2, item3, item4, item5, item6, item7); + } + + /// + /// Creates a new with 9 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// A new with 9 items. + public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + { + return new(head, item1, item2, item3, item4, item5, item6, item7, item8); + } + + /// + /// Creates a new with 10 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// A new with 10 items. + public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + { + return new(head, item1, item2, item3, item4, item5, item6, item7, item8, item9); + } + + /// + /// Creates a new with 11 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// A new with 11 items. + public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + { + return new(head, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10); + } + + /// + /// Creates a new with 12 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// Item 11. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// A new with 12 items. + public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + { + return new(head, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11); + } + + /// + /// Creates a new with 13 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// Item 11. + /// Item 12. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// A new with 13 items. + public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + { + return new(head, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12); + } + + /// + /// Creates a new with 14 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// Item 11. + /// Item 12. + /// Item 13. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// Type of Item 13. + /// A new with 14 items. + public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default, T13 item13 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + where T13 : struct, IExtendsChain + { + return new(head, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13); + } + + /// + /// Creates a new with 15 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// Item 11. + /// Item 12. + /// Item 13. + /// Item 14. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// Type of Item 13. + /// Type of Item 14. + /// A new with 15 items. + public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default, T13 item13 = default, T14 item14 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + where T13 : struct, IExtendsChain + where T14 : struct, IExtendsChain + { + return new(head, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13, item14); + } + + /// + /// Creates a new with 16 items. /// - /// The first item. - /// The second item. - /// The third item. + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// Item 11. + /// Item 12. + /// Item 13. + /// Item 14. + /// Item 15. /// The chain type - /// Type of the second item. - /// Type of the third item. - /// - public static ManagedChain Create(TChain head = default, T1 item1 = default, - T2 item2 = default) + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// Type of Item 13. + /// Type of Item 14. + /// Type of Item 15. + /// A new with 16 items. + public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default, T13 item13 = default, T14 item14 = default, T15 item15 = default) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain - => new ManagedChain(head, item1, item2); + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + where T13 : struct, IExtendsChain + where T14 : struct, IExtendsChain + where T15 : struct, IExtendsChain + { + return new(head, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13, item14, item15); + } + } -// This should be autogenerated like Tuple<...>, only showing 3 arg type... +/// +/// A safely manages the pointers of a managed structure chain. +/// +/// The chain type +/// Type of Item 1. +public unsafe class ManagedChain : IDisposable + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain +{ + private IntPtr _headPtr; + + /// + /// Gets a pointer to the current head. + /// + public Chain* HeadPtr => (Chain*) _headPtr; + + /// + /// Gets or sets the head of the chain. + /// + public TChain Head + { + get => Unsafe.AsRef((Chain*) _headPtr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _headPtr)->PNext; + Marshal.StructureToPtr(value, _headPtr, true); + ((Chain*) _headPtr)->PNext = nextPtr; + } + } + + private IntPtr _item1Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item1Ptr => (Chain*) _item1Ptr; + + /// + /// Gets or sets item #1 in the chain. + /// + public T1 Item1 + { + get => Unsafe.AsRef((Chain*) _item1Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item1Ptr)->PNext; + Marshal.StructureToPtr(value, _item1Ptr, true); + ((Chain*) _item1Ptr)->PNext = nextPtr; + } + } + + /// + /// Creates a new with 3 items. + /// + /// The head of the chain. + /// Item 1. + public ManagedChain(TChain head = default, T1 item1 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size); + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + item1.StructureType(); + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + } + + /// + public void Dispose() + { + var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); + if (headPtr == IntPtr.Zero) return; + + // Destroy all structures + Marshal.DestroyStructure(headPtr); + var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item1Ptr); + // Free memory block + Marshal.FreeHGlobal(headPtr); + } +} +/// +/// A safely manages the pointers of a managed structure chain. +/// +/// The chain type +/// Type of Item 1. +/// Type of Item 2. public unsafe class ManagedChain : IDisposable -where TChain : struct, IChainStart -where T1 : struct, IExtendsChain -where T2 : struct, IExtendsChain + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain { private IntPtr _headPtr; + /// /// Gets a pointer to the current head. /// public Chain* HeadPtr => (Chain*) _headPtr; - + /// /// Gets or sets the head of the chain. /// @@ -56,15 +673,16 @@ public TChain Head } private IntPtr _item1Ptr; + /// /// Gets a pointer to the second item in the chain. /// public Chain* Item1Ptr => (Chain*) _item1Ptr; - + /// - /// Gets or sets the second item in the chain. + /// Gets or sets item #1 in the chain. /// - public T1 Item1 + public T1 Item1 { get => Unsafe.AsRef((Chain*) _item1Ptr); set @@ -75,15 +693,15 @@ public T1 Item1 ((Chain*) _item1Ptr)->PNext = nextPtr; } } - private IntPtr _item2Ptr; + /// - /// Gets a pointer to the third item in the chain. + /// Gets a pointer to the second item in the chain. /// public Chain* Item2Ptr => (Chain*) _item2Ptr; - + /// - /// Gets or sets the third item in the chain. + /// Gets or sets item #2 in the chain. /// public T2 Item2 { @@ -100,9 +718,9 @@ public T2 Item2 /// /// Creates a new with 3 items. /// - /// The first item. - /// The second item. - /// The third item. + /// The head of the chain. + /// Item 1. + /// Item 2. public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default) { // Calculate memory requirements @@ -117,12 +735,12 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul _item1Ptr = _headPtr + headSize; item1.StructureType(); Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*)_headPtr)->PNext = (Chain*) _item1Ptr; - + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + _item2Ptr = _item1Ptr + item1Size; item2.StructureType(); Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*)_item1Ptr)->PNext = (Chain*) _item2Ptr; + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; } /// @@ -130,11 +748,4500 @@ public void Dispose() { var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); if (headPtr == IntPtr.Zero) return; - Marshal.DestroyStructure((IntPtr)headPtr); + + // Destroy all structures + Marshal.DestroyStructure(headPtr); var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); - Marshal.DestroyStructure((IntPtr)item1Ptr); + Marshal.DestroyStructure(item1Ptr); var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); - Marshal.DestroyStructure((IntPtr)item2Ptr); + Marshal.DestroyStructure(item2Ptr); + + // Free memory block Marshal.FreeHGlobal(headPtr); } -} \ No newline at end of file +} +/// +/// A safely manages the pointers of a managed structure chain. +/// +/// The chain type +/// Type of Item 1. +/// Type of Item 2. +/// Type of Item 3. +public unsafe class ManagedChain : IDisposable + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain +{ + private IntPtr _headPtr; + + /// + /// Gets a pointer to the current head. + /// + public Chain* HeadPtr => (Chain*) _headPtr; + + /// + /// Gets or sets the head of the chain. + /// + public TChain Head + { + get => Unsafe.AsRef((Chain*) _headPtr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _headPtr)->PNext; + Marshal.StructureToPtr(value, _headPtr, true); + ((Chain*) _headPtr)->PNext = nextPtr; + } + } + + private IntPtr _item1Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item1Ptr => (Chain*) _item1Ptr; + + /// + /// Gets or sets item #1 in the chain. + /// + public T1 Item1 + { + get => Unsafe.AsRef((Chain*) _item1Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item1Ptr)->PNext; + Marshal.StructureToPtr(value, _item1Ptr, true); + ((Chain*) _item1Ptr)->PNext = nextPtr; + } + } + private IntPtr _item2Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item2Ptr => (Chain*) _item2Ptr; + + /// + /// Gets or sets item #2 in the chain. + /// + public T2 Item2 + { + get => Unsafe.AsRef((Chain*) _item2Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item2Ptr)->PNext; + Marshal.StructureToPtr(value, _item2Ptr, true); + ((Chain*) _item2Ptr)->PNext = nextPtr; + } + } + private IntPtr _item3Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item3Ptr => (Chain*) _item3Ptr; + + /// + /// Gets or sets item #3 in the chain. + /// + public T3 Item3 + { + get => Unsafe.AsRef((Chain*) _item3Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item3Ptr)->PNext; + Marshal.StructureToPtr(value, _item3Ptr, true); + ((Chain*) _item3Ptr)->PNext = nextPtr; + } + } + + /// + /// Creates a new with 3 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size); + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + item1.StructureType(); + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + item2.StructureType(); + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + item3.StructureType(); + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + } + + /// + public void Dispose() + { + var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); + if (headPtr == IntPtr.Zero) return; + + // Destroy all structures + Marshal.DestroyStructure(headPtr); + var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item1Ptr); + var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item2Ptr); + var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item3Ptr); + + // Free memory block + Marshal.FreeHGlobal(headPtr); + } +} +/// +/// A safely manages the pointers of a managed structure chain. +/// +/// The chain type +/// Type of Item 1. +/// Type of Item 2. +/// Type of Item 3. +/// Type of Item 4. +public unsafe class ManagedChain : IDisposable + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain +{ + private IntPtr _headPtr; + + /// + /// Gets a pointer to the current head. + /// + public Chain* HeadPtr => (Chain*) _headPtr; + + /// + /// Gets or sets the head of the chain. + /// + public TChain Head + { + get => Unsafe.AsRef((Chain*) _headPtr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _headPtr)->PNext; + Marshal.StructureToPtr(value, _headPtr, true); + ((Chain*) _headPtr)->PNext = nextPtr; + } + } + + private IntPtr _item1Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item1Ptr => (Chain*) _item1Ptr; + + /// + /// Gets or sets item #1 in the chain. + /// + public T1 Item1 + { + get => Unsafe.AsRef((Chain*) _item1Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item1Ptr)->PNext; + Marshal.StructureToPtr(value, _item1Ptr, true); + ((Chain*) _item1Ptr)->PNext = nextPtr; + } + } + private IntPtr _item2Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item2Ptr => (Chain*) _item2Ptr; + + /// + /// Gets or sets item #2 in the chain. + /// + public T2 Item2 + { + get => Unsafe.AsRef((Chain*) _item2Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item2Ptr)->PNext; + Marshal.StructureToPtr(value, _item2Ptr, true); + ((Chain*) _item2Ptr)->PNext = nextPtr; + } + } + private IntPtr _item3Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item3Ptr => (Chain*) _item3Ptr; + + /// + /// Gets or sets item #3 in the chain. + /// + public T3 Item3 + { + get => Unsafe.AsRef((Chain*) _item3Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item3Ptr)->PNext; + Marshal.StructureToPtr(value, _item3Ptr, true); + ((Chain*) _item3Ptr)->PNext = nextPtr; + } + } + private IntPtr _item4Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item4Ptr => (Chain*) _item4Ptr; + + /// + /// Gets or sets item #4 in the chain. + /// + public T4 Item4 + { + get => Unsafe.AsRef((Chain*) _item4Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item4Ptr)->PNext; + Marshal.StructureToPtr(value, _item4Ptr, true); + ((Chain*) _item4Ptr)->PNext = nextPtr; + } + } + + /// + /// Creates a new with 3 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size); + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + item1.StructureType(); + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + item2.StructureType(); + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + item3.StructureType(); + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + item4.StructureType(); + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + } + + /// + public void Dispose() + { + var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); + if (headPtr == IntPtr.Zero) return; + + // Destroy all structures + Marshal.DestroyStructure(headPtr); + var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item1Ptr); + var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item2Ptr); + var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item3Ptr); + var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item4Ptr); + + // Free memory block + Marshal.FreeHGlobal(headPtr); + } +} +/// +/// A safely manages the pointers of a managed structure chain. +/// +/// The chain type +/// Type of Item 1. +/// Type of Item 2. +/// Type of Item 3. +/// Type of Item 4. +/// Type of Item 5. +public unsafe class ManagedChain : IDisposable + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain +{ + private IntPtr _headPtr; + + /// + /// Gets a pointer to the current head. + /// + public Chain* HeadPtr => (Chain*) _headPtr; + + /// + /// Gets or sets the head of the chain. + /// + public TChain Head + { + get => Unsafe.AsRef((Chain*) _headPtr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _headPtr)->PNext; + Marshal.StructureToPtr(value, _headPtr, true); + ((Chain*) _headPtr)->PNext = nextPtr; + } + } + + private IntPtr _item1Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item1Ptr => (Chain*) _item1Ptr; + + /// + /// Gets or sets item #1 in the chain. + /// + public T1 Item1 + { + get => Unsafe.AsRef((Chain*) _item1Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item1Ptr)->PNext; + Marshal.StructureToPtr(value, _item1Ptr, true); + ((Chain*) _item1Ptr)->PNext = nextPtr; + } + } + private IntPtr _item2Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item2Ptr => (Chain*) _item2Ptr; + + /// + /// Gets or sets item #2 in the chain. + /// + public T2 Item2 + { + get => Unsafe.AsRef((Chain*) _item2Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item2Ptr)->PNext; + Marshal.StructureToPtr(value, _item2Ptr, true); + ((Chain*) _item2Ptr)->PNext = nextPtr; + } + } + private IntPtr _item3Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item3Ptr => (Chain*) _item3Ptr; + + /// + /// Gets or sets item #3 in the chain. + /// + public T3 Item3 + { + get => Unsafe.AsRef((Chain*) _item3Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item3Ptr)->PNext; + Marshal.StructureToPtr(value, _item3Ptr, true); + ((Chain*) _item3Ptr)->PNext = nextPtr; + } + } + private IntPtr _item4Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item4Ptr => (Chain*) _item4Ptr; + + /// + /// Gets or sets item #4 in the chain. + /// + public T4 Item4 + { + get => Unsafe.AsRef((Chain*) _item4Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item4Ptr)->PNext; + Marshal.StructureToPtr(value, _item4Ptr, true); + ((Chain*) _item4Ptr)->PNext = nextPtr; + } + } + private IntPtr _item5Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item5Ptr => (Chain*) _item5Ptr; + + /// + /// Gets or sets item #5 in the chain. + /// + public T5 Item5 + { + get => Unsafe.AsRef((Chain*) _item5Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item5Ptr)->PNext; + Marshal.StructureToPtr(value, _item5Ptr, true); + ((Chain*) _item5Ptr)->PNext = nextPtr; + } + } + + /// + /// Creates a new with 3 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size); + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + item1.StructureType(); + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + item2.StructureType(); + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + item3.StructureType(); + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + item4.StructureType(); + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + item5.StructureType(); + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + } + + /// + public void Dispose() + { + var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); + if (headPtr == IntPtr.Zero) return; + + // Destroy all structures + Marshal.DestroyStructure(headPtr); + var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item1Ptr); + var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item2Ptr); + var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item3Ptr); + var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item4Ptr); + var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item5Ptr); + + // Free memory block + Marshal.FreeHGlobal(headPtr); + } +} +/// +/// A safely manages the pointers of a managed structure chain. +/// +/// The chain type +/// Type of Item 1. +/// Type of Item 2. +/// Type of Item 3. +/// Type of Item 4. +/// Type of Item 5. +/// Type of Item 6. +public unsafe class ManagedChain : IDisposable + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain +{ + private IntPtr _headPtr; + + /// + /// Gets a pointer to the current head. + /// + public Chain* HeadPtr => (Chain*) _headPtr; + + /// + /// Gets or sets the head of the chain. + /// + public TChain Head + { + get => Unsafe.AsRef((Chain*) _headPtr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _headPtr)->PNext; + Marshal.StructureToPtr(value, _headPtr, true); + ((Chain*) _headPtr)->PNext = nextPtr; + } + } + + private IntPtr _item1Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item1Ptr => (Chain*) _item1Ptr; + + /// + /// Gets or sets item #1 in the chain. + /// + public T1 Item1 + { + get => Unsafe.AsRef((Chain*) _item1Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item1Ptr)->PNext; + Marshal.StructureToPtr(value, _item1Ptr, true); + ((Chain*) _item1Ptr)->PNext = nextPtr; + } + } + private IntPtr _item2Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item2Ptr => (Chain*) _item2Ptr; + + /// + /// Gets or sets item #2 in the chain. + /// + public T2 Item2 + { + get => Unsafe.AsRef((Chain*) _item2Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item2Ptr)->PNext; + Marshal.StructureToPtr(value, _item2Ptr, true); + ((Chain*) _item2Ptr)->PNext = nextPtr; + } + } + private IntPtr _item3Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item3Ptr => (Chain*) _item3Ptr; + + /// + /// Gets or sets item #3 in the chain. + /// + public T3 Item3 + { + get => Unsafe.AsRef((Chain*) _item3Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item3Ptr)->PNext; + Marshal.StructureToPtr(value, _item3Ptr, true); + ((Chain*) _item3Ptr)->PNext = nextPtr; + } + } + private IntPtr _item4Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item4Ptr => (Chain*) _item4Ptr; + + /// + /// Gets or sets item #4 in the chain. + /// + public T4 Item4 + { + get => Unsafe.AsRef((Chain*) _item4Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item4Ptr)->PNext; + Marshal.StructureToPtr(value, _item4Ptr, true); + ((Chain*) _item4Ptr)->PNext = nextPtr; + } + } + private IntPtr _item5Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item5Ptr => (Chain*) _item5Ptr; + + /// + /// Gets or sets item #5 in the chain. + /// + public T5 Item5 + { + get => Unsafe.AsRef((Chain*) _item5Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item5Ptr)->PNext; + Marshal.StructureToPtr(value, _item5Ptr, true); + ((Chain*) _item5Ptr)->PNext = nextPtr; + } + } + private IntPtr _item6Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item6Ptr => (Chain*) _item6Ptr; + + /// + /// Gets or sets item #6 in the chain. + /// + public T6 Item6 + { + get => Unsafe.AsRef((Chain*) _item6Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item6Ptr)->PNext; + Marshal.StructureToPtr(value, _item6Ptr, true); + ((Chain*) _item6Ptr)->PNext = nextPtr; + } + } + + /// + /// Creates a new with 3 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + var item6Size = Marshal.SizeOf(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size); + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + item1.StructureType(); + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + item2.StructureType(); + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + item3.StructureType(); + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + item4.StructureType(); + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + item5.StructureType(); + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + item6.StructureType(); + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + } + + /// + public void Dispose() + { + var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); + if (headPtr == IntPtr.Zero) return; + + // Destroy all structures + Marshal.DestroyStructure(headPtr); + var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item1Ptr); + var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item2Ptr); + var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item3Ptr); + var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item4Ptr); + var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item5Ptr); + var item6Ptr = Interlocked.Exchange(ref _item6Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item6Ptr); + + // Free memory block + Marshal.FreeHGlobal(headPtr); + } +} +/// +/// A safely manages the pointers of a managed structure chain. +/// +/// The chain type +/// Type of Item 1. +/// Type of Item 2. +/// Type of Item 3. +/// Type of Item 4. +/// Type of Item 5. +/// Type of Item 6. +/// Type of Item 7. +public unsafe class ManagedChain : IDisposable + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain +{ + private IntPtr _headPtr; + + /// + /// Gets a pointer to the current head. + /// + public Chain* HeadPtr => (Chain*) _headPtr; + + /// + /// Gets or sets the head of the chain. + /// + public TChain Head + { + get => Unsafe.AsRef((Chain*) _headPtr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _headPtr)->PNext; + Marshal.StructureToPtr(value, _headPtr, true); + ((Chain*) _headPtr)->PNext = nextPtr; + } + } + + private IntPtr _item1Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item1Ptr => (Chain*) _item1Ptr; + + /// + /// Gets or sets item #1 in the chain. + /// + public T1 Item1 + { + get => Unsafe.AsRef((Chain*) _item1Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item1Ptr)->PNext; + Marshal.StructureToPtr(value, _item1Ptr, true); + ((Chain*) _item1Ptr)->PNext = nextPtr; + } + } + private IntPtr _item2Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item2Ptr => (Chain*) _item2Ptr; + + /// + /// Gets or sets item #2 in the chain. + /// + public T2 Item2 + { + get => Unsafe.AsRef((Chain*) _item2Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item2Ptr)->PNext; + Marshal.StructureToPtr(value, _item2Ptr, true); + ((Chain*) _item2Ptr)->PNext = nextPtr; + } + } + private IntPtr _item3Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item3Ptr => (Chain*) _item3Ptr; + + /// + /// Gets or sets item #3 in the chain. + /// + public T3 Item3 + { + get => Unsafe.AsRef((Chain*) _item3Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item3Ptr)->PNext; + Marshal.StructureToPtr(value, _item3Ptr, true); + ((Chain*) _item3Ptr)->PNext = nextPtr; + } + } + private IntPtr _item4Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item4Ptr => (Chain*) _item4Ptr; + + /// + /// Gets or sets item #4 in the chain. + /// + public T4 Item4 + { + get => Unsafe.AsRef((Chain*) _item4Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item4Ptr)->PNext; + Marshal.StructureToPtr(value, _item4Ptr, true); + ((Chain*) _item4Ptr)->PNext = nextPtr; + } + } + private IntPtr _item5Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item5Ptr => (Chain*) _item5Ptr; + + /// + /// Gets or sets item #5 in the chain. + /// + public T5 Item5 + { + get => Unsafe.AsRef((Chain*) _item5Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item5Ptr)->PNext; + Marshal.StructureToPtr(value, _item5Ptr, true); + ((Chain*) _item5Ptr)->PNext = nextPtr; + } + } + private IntPtr _item6Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item6Ptr => (Chain*) _item6Ptr; + + /// + /// Gets or sets item #6 in the chain. + /// + public T6 Item6 + { + get => Unsafe.AsRef((Chain*) _item6Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item6Ptr)->PNext; + Marshal.StructureToPtr(value, _item6Ptr, true); + ((Chain*) _item6Ptr)->PNext = nextPtr; + } + } + private IntPtr _item7Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item7Ptr => (Chain*) _item7Ptr; + + /// + /// Gets or sets item #7 in the chain. + /// + public T7 Item7 + { + get => Unsafe.AsRef((Chain*) _item7Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item7Ptr)->PNext; + Marshal.StructureToPtr(value, _item7Ptr, true); + ((Chain*) _item7Ptr)->PNext = nextPtr; + } + } + + /// + /// Creates a new with 3 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + var item6Size = Marshal.SizeOf(); + var item7Size = Marshal.SizeOf(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size); + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + item1.StructureType(); + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + item2.StructureType(); + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + item3.StructureType(); + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + item4.StructureType(); + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + item5.StructureType(); + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + item6.StructureType(); + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + item7.StructureType(); + Marshal.StructureToPtr(item7, _item7Ptr, false); + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + } + + /// + public void Dispose() + { + var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); + if (headPtr == IntPtr.Zero) return; + + // Destroy all structures + Marshal.DestroyStructure(headPtr); + var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item1Ptr); + var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item2Ptr); + var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item3Ptr); + var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item4Ptr); + var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item5Ptr); + var item6Ptr = Interlocked.Exchange(ref _item6Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item6Ptr); + var item7Ptr = Interlocked.Exchange(ref _item7Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item7Ptr); + + // Free memory block + Marshal.FreeHGlobal(headPtr); + } +} +/// +/// A safely manages the pointers of a managed structure chain. +/// +/// The chain type +/// Type of Item 1. +/// Type of Item 2. +/// Type of Item 3. +/// Type of Item 4. +/// Type of Item 5. +/// Type of Item 6. +/// Type of Item 7. +/// Type of Item 8. +public unsafe class ManagedChain : IDisposable + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain +{ + private IntPtr _headPtr; + + /// + /// Gets a pointer to the current head. + /// + public Chain* HeadPtr => (Chain*) _headPtr; + + /// + /// Gets or sets the head of the chain. + /// + public TChain Head + { + get => Unsafe.AsRef((Chain*) _headPtr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _headPtr)->PNext; + Marshal.StructureToPtr(value, _headPtr, true); + ((Chain*) _headPtr)->PNext = nextPtr; + } + } + + private IntPtr _item1Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item1Ptr => (Chain*) _item1Ptr; + + /// + /// Gets or sets item #1 in the chain. + /// + public T1 Item1 + { + get => Unsafe.AsRef((Chain*) _item1Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item1Ptr)->PNext; + Marshal.StructureToPtr(value, _item1Ptr, true); + ((Chain*) _item1Ptr)->PNext = nextPtr; + } + } + private IntPtr _item2Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item2Ptr => (Chain*) _item2Ptr; + + /// + /// Gets or sets item #2 in the chain. + /// + public T2 Item2 + { + get => Unsafe.AsRef((Chain*) _item2Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item2Ptr)->PNext; + Marshal.StructureToPtr(value, _item2Ptr, true); + ((Chain*) _item2Ptr)->PNext = nextPtr; + } + } + private IntPtr _item3Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item3Ptr => (Chain*) _item3Ptr; + + /// + /// Gets or sets item #3 in the chain. + /// + public T3 Item3 + { + get => Unsafe.AsRef((Chain*) _item3Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item3Ptr)->PNext; + Marshal.StructureToPtr(value, _item3Ptr, true); + ((Chain*) _item3Ptr)->PNext = nextPtr; + } + } + private IntPtr _item4Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item4Ptr => (Chain*) _item4Ptr; + + /// + /// Gets or sets item #4 in the chain. + /// + public T4 Item4 + { + get => Unsafe.AsRef((Chain*) _item4Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item4Ptr)->PNext; + Marshal.StructureToPtr(value, _item4Ptr, true); + ((Chain*) _item4Ptr)->PNext = nextPtr; + } + } + private IntPtr _item5Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item5Ptr => (Chain*) _item5Ptr; + + /// + /// Gets or sets item #5 in the chain. + /// + public T5 Item5 + { + get => Unsafe.AsRef((Chain*) _item5Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item5Ptr)->PNext; + Marshal.StructureToPtr(value, _item5Ptr, true); + ((Chain*) _item5Ptr)->PNext = nextPtr; + } + } + private IntPtr _item6Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item6Ptr => (Chain*) _item6Ptr; + + /// + /// Gets or sets item #6 in the chain. + /// + public T6 Item6 + { + get => Unsafe.AsRef((Chain*) _item6Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item6Ptr)->PNext; + Marshal.StructureToPtr(value, _item6Ptr, true); + ((Chain*) _item6Ptr)->PNext = nextPtr; + } + } + private IntPtr _item7Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item7Ptr => (Chain*) _item7Ptr; + + /// + /// Gets or sets item #7 in the chain. + /// + public T7 Item7 + { + get => Unsafe.AsRef((Chain*) _item7Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item7Ptr)->PNext; + Marshal.StructureToPtr(value, _item7Ptr, true); + ((Chain*) _item7Ptr)->PNext = nextPtr; + } + } + private IntPtr _item8Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item8Ptr => (Chain*) _item8Ptr; + + /// + /// Gets or sets item #8 in the chain. + /// + public T8 Item8 + { + get => Unsafe.AsRef((Chain*) _item8Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item8Ptr)->PNext; + Marshal.StructureToPtr(value, _item8Ptr, true); + ((Chain*) _item8Ptr)->PNext = nextPtr; + } + } + + /// + /// Creates a new with 3 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + var item6Size = Marshal.SizeOf(); + var item7Size = Marshal.SizeOf(); + var item8Size = Marshal.SizeOf(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size); + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + item1.StructureType(); + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + item2.StructureType(); + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + item3.StructureType(); + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + item4.StructureType(); + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + item5.StructureType(); + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + item6.StructureType(); + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + item7.StructureType(); + Marshal.StructureToPtr(item7, _item7Ptr, false); + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + item8.StructureType(); + Marshal.StructureToPtr(item8, _item8Ptr, false); + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + } + + /// + public void Dispose() + { + var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); + if (headPtr == IntPtr.Zero) return; + + // Destroy all structures + Marshal.DestroyStructure(headPtr); + var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item1Ptr); + var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item2Ptr); + var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item3Ptr); + var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item4Ptr); + var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item5Ptr); + var item6Ptr = Interlocked.Exchange(ref _item6Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item6Ptr); + var item7Ptr = Interlocked.Exchange(ref _item7Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item7Ptr); + var item8Ptr = Interlocked.Exchange(ref _item8Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item8Ptr); + + // Free memory block + Marshal.FreeHGlobal(headPtr); + } +} +/// +/// A safely manages the pointers of a managed structure chain. +/// +/// The chain type +/// Type of Item 1. +/// Type of Item 2. +/// Type of Item 3. +/// Type of Item 4. +/// Type of Item 5. +/// Type of Item 6. +/// Type of Item 7. +/// Type of Item 8. +/// Type of Item 9. +public unsafe class ManagedChain : IDisposable + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain +{ + private IntPtr _headPtr; + + /// + /// Gets a pointer to the current head. + /// + public Chain* HeadPtr => (Chain*) _headPtr; + + /// + /// Gets or sets the head of the chain. + /// + public TChain Head + { + get => Unsafe.AsRef((Chain*) _headPtr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _headPtr)->PNext; + Marshal.StructureToPtr(value, _headPtr, true); + ((Chain*) _headPtr)->PNext = nextPtr; + } + } + + private IntPtr _item1Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item1Ptr => (Chain*) _item1Ptr; + + /// + /// Gets or sets item #1 in the chain. + /// + public T1 Item1 + { + get => Unsafe.AsRef((Chain*) _item1Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item1Ptr)->PNext; + Marshal.StructureToPtr(value, _item1Ptr, true); + ((Chain*) _item1Ptr)->PNext = nextPtr; + } + } + private IntPtr _item2Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item2Ptr => (Chain*) _item2Ptr; + + /// + /// Gets or sets item #2 in the chain. + /// + public T2 Item2 + { + get => Unsafe.AsRef((Chain*) _item2Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item2Ptr)->PNext; + Marshal.StructureToPtr(value, _item2Ptr, true); + ((Chain*) _item2Ptr)->PNext = nextPtr; + } + } + private IntPtr _item3Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item3Ptr => (Chain*) _item3Ptr; + + /// + /// Gets or sets item #3 in the chain. + /// + public T3 Item3 + { + get => Unsafe.AsRef((Chain*) _item3Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item3Ptr)->PNext; + Marshal.StructureToPtr(value, _item3Ptr, true); + ((Chain*) _item3Ptr)->PNext = nextPtr; + } + } + private IntPtr _item4Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item4Ptr => (Chain*) _item4Ptr; + + /// + /// Gets or sets item #4 in the chain. + /// + public T4 Item4 + { + get => Unsafe.AsRef((Chain*) _item4Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item4Ptr)->PNext; + Marshal.StructureToPtr(value, _item4Ptr, true); + ((Chain*) _item4Ptr)->PNext = nextPtr; + } + } + private IntPtr _item5Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item5Ptr => (Chain*) _item5Ptr; + + /// + /// Gets or sets item #5 in the chain. + /// + public T5 Item5 + { + get => Unsafe.AsRef((Chain*) _item5Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item5Ptr)->PNext; + Marshal.StructureToPtr(value, _item5Ptr, true); + ((Chain*) _item5Ptr)->PNext = nextPtr; + } + } + private IntPtr _item6Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item6Ptr => (Chain*) _item6Ptr; + + /// + /// Gets or sets item #6 in the chain. + /// + public T6 Item6 + { + get => Unsafe.AsRef((Chain*) _item6Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item6Ptr)->PNext; + Marshal.StructureToPtr(value, _item6Ptr, true); + ((Chain*) _item6Ptr)->PNext = nextPtr; + } + } + private IntPtr _item7Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item7Ptr => (Chain*) _item7Ptr; + + /// + /// Gets or sets item #7 in the chain. + /// + public T7 Item7 + { + get => Unsafe.AsRef((Chain*) _item7Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item7Ptr)->PNext; + Marshal.StructureToPtr(value, _item7Ptr, true); + ((Chain*) _item7Ptr)->PNext = nextPtr; + } + } + private IntPtr _item8Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item8Ptr => (Chain*) _item8Ptr; + + /// + /// Gets or sets item #8 in the chain. + /// + public T8 Item8 + { + get => Unsafe.AsRef((Chain*) _item8Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item8Ptr)->PNext; + Marshal.StructureToPtr(value, _item8Ptr, true); + ((Chain*) _item8Ptr)->PNext = nextPtr; + } + } + private IntPtr _item9Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item9Ptr => (Chain*) _item9Ptr; + + /// + /// Gets or sets item #9 in the chain. + /// + public T9 Item9 + { + get => Unsafe.AsRef((Chain*) _item9Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item9Ptr)->PNext; + Marshal.StructureToPtr(value, _item9Ptr, true); + ((Chain*) _item9Ptr)->PNext = nextPtr; + } + } + + /// + /// Creates a new with 3 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + var item6Size = Marshal.SizeOf(); + var item7Size = Marshal.SizeOf(); + var item8Size = Marshal.SizeOf(); + var item9Size = Marshal.SizeOf(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size); + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + item1.StructureType(); + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + item2.StructureType(); + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + item3.StructureType(); + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + item4.StructureType(); + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + item5.StructureType(); + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + item6.StructureType(); + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + item7.StructureType(); + Marshal.StructureToPtr(item7, _item7Ptr, false); + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + item8.StructureType(); + Marshal.StructureToPtr(item8, _item8Ptr, false); + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + + _item9Ptr = _item8Ptr + item8Size; + item9.StructureType(); + Marshal.StructureToPtr(item9, _item9Ptr, false); + ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + } + + /// + public void Dispose() + { + var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); + if (headPtr == IntPtr.Zero) return; + + // Destroy all structures + Marshal.DestroyStructure(headPtr); + var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item1Ptr); + var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item2Ptr); + var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item3Ptr); + var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item4Ptr); + var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item5Ptr); + var item6Ptr = Interlocked.Exchange(ref _item6Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item6Ptr); + var item7Ptr = Interlocked.Exchange(ref _item7Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item7Ptr); + var item8Ptr = Interlocked.Exchange(ref _item8Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item8Ptr); + var item9Ptr = Interlocked.Exchange(ref _item9Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item9Ptr); + + // Free memory block + Marshal.FreeHGlobal(headPtr); + } +} +/// +/// A safely manages the pointers of a managed structure chain. +/// +/// The chain type +/// Type of Item 1. +/// Type of Item 2. +/// Type of Item 3. +/// Type of Item 4. +/// Type of Item 5. +/// Type of Item 6. +/// Type of Item 7. +/// Type of Item 8. +/// Type of Item 9. +/// Type of Item 10. +public unsafe class ManagedChain : IDisposable + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain +{ + private IntPtr _headPtr; + + /// + /// Gets a pointer to the current head. + /// + public Chain* HeadPtr => (Chain*) _headPtr; + + /// + /// Gets or sets the head of the chain. + /// + public TChain Head + { + get => Unsafe.AsRef((Chain*) _headPtr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _headPtr)->PNext; + Marshal.StructureToPtr(value, _headPtr, true); + ((Chain*) _headPtr)->PNext = nextPtr; + } + } + + private IntPtr _item1Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item1Ptr => (Chain*) _item1Ptr; + + /// + /// Gets or sets item #1 in the chain. + /// + public T1 Item1 + { + get => Unsafe.AsRef((Chain*) _item1Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item1Ptr)->PNext; + Marshal.StructureToPtr(value, _item1Ptr, true); + ((Chain*) _item1Ptr)->PNext = nextPtr; + } + } + private IntPtr _item2Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item2Ptr => (Chain*) _item2Ptr; + + /// + /// Gets or sets item #2 in the chain. + /// + public T2 Item2 + { + get => Unsafe.AsRef((Chain*) _item2Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item2Ptr)->PNext; + Marshal.StructureToPtr(value, _item2Ptr, true); + ((Chain*) _item2Ptr)->PNext = nextPtr; + } + } + private IntPtr _item3Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item3Ptr => (Chain*) _item3Ptr; + + /// + /// Gets or sets item #3 in the chain. + /// + public T3 Item3 + { + get => Unsafe.AsRef((Chain*) _item3Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item3Ptr)->PNext; + Marshal.StructureToPtr(value, _item3Ptr, true); + ((Chain*) _item3Ptr)->PNext = nextPtr; + } + } + private IntPtr _item4Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item4Ptr => (Chain*) _item4Ptr; + + /// + /// Gets or sets item #4 in the chain. + /// + public T4 Item4 + { + get => Unsafe.AsRef((Chain*) _item4Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item4Ptr)->PNext; + Marshal.StructureToPtr(value, _item4Ptr, true); + ((Chain*) _item4Ptr)->PNext = nextPtr; + } + } + private IntPtr _item5Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item5Ptr => (Chain*) _item5Ptr; + + /// + /// Gets or sets item #5 in the chain. + /// + public T5 Item5 + { + get => Unsafe.AsRef((Chain*) _item5Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item5Ptr)->PNext; + Marshal.StructureToPtr(value, _item5Ptr, true); + ((Chain*) _item5Ptr)->PNext = nextPtr; + } + } + private IntPtr _item6Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item6Ptr => (Chain*) _item6Ptr; + + /// + /// Gets or sets item #6 in the chain. + /// + public T6 Item6 + { + get => Unsafe.AsRef((Chain*) _item6Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item6Ptr)->PNext; + Marshal.StructureToPtr(value, _item6Ptr, true); + ((Chain*) _item6Ptr)->PNext = nextPtr; + } + } + private IntPtr _item7Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item7Ptr => (Chain*) _item7Ptr; + + /// + /// Gets or sets item #7 in the chain. + /// + public T7 Item7 + { + get => Unsafe.AsRef((Chain*) _item7Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item7Ptr)->PNext; + Marshal.StructureToPtr(value, _item7Ptr, true); + ((Chain*) _item7Ptr)->PNext = nextPtr; + } + } + private IntPtr _item8Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item8Ptr => (Chain*) _item8Ptr; + + /// + /// Gets or sets item #8 in the chain. + /// + public T8 Item8 + { + get => Unsafe.AsRef((Chain*) _item8Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item8Ptr)->PNext; + Marshal.StructureToPtr(value, _item8Ptr, true); + ((Chain*) _item8Ptr)->PNext = nextPtr; + } + } + private IntPtr _item9Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item9Ptr => (Chain*) _item9Ptr; + + /// + /// Gets or sets item #9 in the chain. + /// + public T9 Item9 + { + get => Unsafe.AsRef((Chain*) _item9Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item9Ptr)->PNext; + Marshal.StructureToPtr(value, _item9Ptr, true); + ((Chain*) _item9Ptr)->PNext = nextPtr; + } + } + private IntPtr _item10Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item10Ptr => (Chain*) _item10Ptr; + + /// + /// Gets or sets item #10 in the chain. + /// + public T10 Item10 + { + get => Unsafe.AsRef((Chain*) _item10Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item10Ptr)->PNext; + Marshal.StructureToPtr(value, _item10Ptr, true); + ((Chain*) _item10Ptr)->PNext = nextPtr; + } + } + + /// + /// Creates a new with 3 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + var item6Size = Marshal.SizeOf(); + var item7Size = Marshal.SizeOf(); + var item8Size = Marshal.SizeOf(); + var item9Size = Marshal.SizeOf(); + var item10Size = Marshal.SizeOf(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size); + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + item1.StructureType(); + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + item2.StructureType(); + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + item3.StructureType(); + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + item4.StructureType(); + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + item5.StructureType(); + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + item6.StructureType(); + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + item7.StructureType(); + Marshal.StructureToPtr(item7, _item7Ptr, false); + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + item8.StructureType(); + Marshal.StructureToPtr(item8, _item8Ptr, false); + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + + _item9Ptr = _item8Ptr + item8Size; + item9.StructureType(); + Marshal.StructureToPtr(item9, _item9Ptr, false); + ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + + _item10Ptr = _item9Ptr + item9Size; + item10.StructureType(); + Marshal.StructureToPtr(item10, _item10Ptr, false); + ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; + } + + /// + public void Dispose() + { + var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); + if (headPtr == IntPtr.Zero) return; + + // Destroy all structures + Marshal.DestroyStructure(headPtr); + var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item1Ptr); + var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item2Ptr); + var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item3Ptr); + var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item4Ptr); + var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item5Ptr); + var item6Ptr = Interlocked.Exchange(ref _item6Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item6Ptr); + var item7Ptr = Interlocked.Exchange(ref _item7Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item7Ptr); + var item8Ptr = Interlocked.Exchange(ref _item8Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item8Ptr); + var item9Ptr = Interlocked.Exchange(ref _item9Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item9Ptr); + var item10Ptr = Interlocked.Exchange(ref _item10Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item10Ptr); + + // Free memory block + Marshal.FreeHGlobal(headPtr); + } +} +/// +/// A safely manages the pointers of a managed structure chain. +/// +/// The chain type +/// Type of Item 1. +/// Type of Item 2. +/// Type of Item 3. +/// Type of Item 4. +/// Type of Item 5. +/// Type of Item 6. +/// Type of Item 7. +/// Type of Item 8. +/// Type of Item 9. +/// Type of Item 10. +/// Type of Item 11. +public unsafe class ManagedChain : IDisposable + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain +{ + private IntPtr _headPtr; + + /// + /// Gets a pointer to the current head. + /// + public Chain* HeadPtr => (Chain*) _headPtr; + + /// + /// Gets or sets the head of the chain. + /// + public TChain Head + { + get => Unsafe.AsRef((Chain*) _headPtr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _headPtr)->PNext; + Marshal.StructureToPtr(value, _headPtr, true); + ((Chain*) _headPtr)->PNext = nextPtr; + } + } + + private IntPtr _item1Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item1Ptr => (Chain*) _item1Ptr; + + /// + /// Gets or sets item #1 in the chain. + /// + public T1 Item1 + { + get => Unsafe.AsRef((Chain*) _item1Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item1Ptr)->PNext; + Marshal.StructureToPtr(value, _item1Ptr, true); + ((Chain*) _item1Ptr)->PNext = nextPtr; + } + } + private IntPtr _item2Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item2Ptr => (Chain*) _item2Ptr; + + /// + /// Gets or sets item #2 in the chain. + /// + public T2 Item2 + { + get => Unsafe.AsRef((Chain*) _item2Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item2Ptr)->PNext; + Marshal.StructureToPtr(value, _item2Ptr, true); + ((Chain*) _item2Ptr)->PNext = nextPtr; + } + } + private IntPtr _item3Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item3Ptr => (Chain*) _item3Ptr; + + /// + /// Gets or sets item #3 in the chain. + /// + public T3 Item3 + { + get => Unsafe.AsRef((Chain*) _item3Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item3Ptr)->PNext; + Marshal.StructureToPtr(value, _item3Ptr, true); + ((Chain*) _item3Ptr)->PNext = nextPtr; + } + } + private IntPtr _item4Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item4Ptr => (Chain*) _item4Ptr; + + /// + /// Gets or sets item #4 in the chain. + /// + public T4 Item4 + { + get => Unsafe.AsRef((Chain*) _item4Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item4Ptr)->PNext; + Marshal.StructureToPtr(value, _item4Ptr, true); + ((Chain*) _item4Ptr)->PNext = nextPtr; + } + } + private IntPtr _item5Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item5Ptr => (Chain*) _item5Ptr; + + /// + /// Gets or sets item #5 in the chain. + /// + public T5 Item5 + { + get => Unsafe.AsRef((Chain*) _item5Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item5Ptr)->PNext; + Marshal.StructureToPtr(value, _item5Ptr, true); + ((Chain*) _item5Ptr)->PNext = nextPtr; + } + } + private IntPtr _item6Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item6Ptr => (Chain*) _item6Ptr; + + /// + /// Gets or sets item #6 in the chain. + /// + public T6 Item6 + { + get => Unsafe.AsRef((Chain*) _item6Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item6Ptr)->PNext; + Marshal.StructureToPtr(value, _item6Ptr, true); + ((Chain*) _item6Ptr)->PNext = nextPtr; + } + } + private IntPtr _item7Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item7Ptr => (Chain*) _item7Ptr; + + /// + /// Gets or sets item #7 in the chain. + /// + public T7 Item7 + { + get => Unsafe.AsRef((Chain*) _item7Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item7Ptr)->PNext; + Marshal.StructureToPtr(value, _item7Ptr, true); + ((Chain*) _item7Ptr)->PNext = nextPtr; + } + } + private IntPtr _item8Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item8Ptr => (Chain*) _item8Ptr; + + /// + /// Gets or sets item #8 in the chain. + /// + public T8 Item8 + { + get => Unsafe.AsRef((Chain*) _item8Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item8Ptr)->PNext; + Marshal.StructureToPtr(value, _item8Ptr, true); + ((Chain*) _item8Ptr)->PNext = nextPtr; + } + } + private IntPtr _item9Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item9Ptr => (Chain*) _item9Ptr; + + /// + /// Gets or sets item #9 in the chain. + /// + public T9 Item9 + { + get => Unsafe.AsRef((Chain*) _item9Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item9Ptr)->PNext; + Marshal.StructureToPtr(value, _item9Ptr, true); + ((Chain*) _item9Ptr)->PNext = nextPtr; + } + } + private IntPtr _item10Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item10Ptr => (Chain*) _item10Ptr; + + /// + /// Gets or sets item #10 in the chain. + /// + public T10 Item10 + { + get => Unsafe.AsRef((Chain*) _item10Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item10Ptr)->PNext; + Marshal.StructureToPtr(value, _item10Ptr, true); + ((Chain*) _item10Ptr)->PNext = nextPtr; + } + } + private IntPtr _item11Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item11Ptr => (Chain*) _item11Ptr; + + /// + /// Gets or sets item #11 in the chain. + /// + public T11 Item11 + { + get => Unsafe.AsRef((Chain*) _item11Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item11Ptr)->PNext; + Marshal.StructureToPtr(value, _item11Ptr, true); + ((Chain*) _item11Ptr)->PNext = nextPtr; + } + } + + /// + /// Creates a new with 3 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// Item 11. + public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + var item6Size = Marshal.SizeOf(); + var item7Size = Marshal.SizeOf(); + var item8Size = Marshal.SizeOf(); + var item9Size = Marshal.SizeOf(); + var item10Size = Marshal.SizeOf(); + var item11Size = Marshal.SizeOf(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size); + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + item1.StructureType(); + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + item2.StructureType(); + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + item3.StructureType(); + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + item4.StructureType(); + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + item5.StructureType(); + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + item6.StructureType(); + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + item7.StructureType(); + Marshal.StructureToPtr(item7, _item7Ptr, false); + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + item8.StructureType(); + Marshal.StructureToPtr(item8, _item8Ptr, false); + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + + _item9Ptr = _item8Ptr + item8Size; + item9.StructureType(); + Marshal.StructureToPtr(item9, _item9Ptr, false); + ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + + _item10Ptr = _item9Ptr + item9Size; + item10.StructureType(); + Marshal.StructureToPtr(item10, _item10Ptr, false); + ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; + + _item11Ptr = _item10Ptr + item10Size; + item11.StructureType(); + Marshal.StructureToPtr(item11, _item11Ptr, false); + ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; + } + + /// + public void Dispose() + { + var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); + if (headPtr == IntPtr.Zero) return; + + // Destroy all structures + Marshal.DestroyStructure(headPtr); + var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item1Ptr); + var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item2Ptr); + var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item3Ptr); + var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item4Ptr); + var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item5Ptr); + var item6Ptr = Interlocked.Exchange(ref _item6Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item6Ptr); + var item7Ptr = Interlocked.Exchange(ref _item7Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item7Ptr); + var item8Ptr = Interlocked.Exchange(ref _item8Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item8Ptr); + var item9Ptr = Interlocked.Exchange(ref _item9Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item9Ptr); + var item10Ptr = Interlocked.Exchange(ref _item10Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item10Ptr); + var item11Ptr = Interlocked.Exchange(ref _item11Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item11Ptr); + + // Free memory block + Marshal.FreeHGlobal(headPtr); + } +} +/// +/// A safely manages the pointers of a managed structure chain. +/// +/// The chain type +/// Type of Item 1. +/// Type of Item 2. +/// Type of Item 3. +/// Type of Item 4. +/// Type of Item 5. +/// Type of Item 6. +/// Type of Item 7. +/// Type of Item 8. +/// Type of Item 9. +/// Type of Item 10. +/// Type of Item 11. +/// Type of Item 12. +public unsafe class ManagedChain : IDisposable + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain +{ + private IntPtr _headPtr; + + /// + /// Gets a pointer to the current head. + /// + public Chain* HeadPtr => (Chain*) _headPtr; + + /// + /// Gets or sets the head of the chain. + /// + public TChain Head + { + get => Unsafe.AsRef((Chain*) _headPtr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _headPtr)->PNext; + Marshal.StructureToPtr(value, _headPtr, true); + ((Chain*) _headPtr)->PNext = nextPtr; + } + } + + private IntPtr _item1Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item1Ptr => (Chain*) _item1Ptr; + + /// + /// Gets or sets item #1 in the chain. + /// + public T1 Item1 + { + get => Unsafe.AsRef((Chain*) _item1Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item1Ptr)->PNext; + Marshal.StructureToPtr(value, _item1Ptr, true); + ((Chain*) _item1Ptr)->PNext = nextPtr; + } + } + private IntPtr _item2Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item2Ptr => (Chain*) _item2Ptr; + + /// + /// Gets or sets item #2 in the chain. + /// + public T2 Item2 + { + get => Unsafe.AsRef((Chain*) _item2Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item2Ptr)->PNext; + Marshal.StructureToPtr(value, _item2Ptr, true); + ((Chain*) _item2Ptr)->PNext = nextPtr; + } + } + private IntPtr _item3Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item3Ptr => (Chain*) _item3Ptr; + + /// + /// Gets or sets item #3 in the chain. + /// + public T3 Item3 + { + get => Unsafe.AsRef((Chain*) _item3Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item3Ptr)->PNext; + Marshal.StructureToPtr(value, _item3Ptr, true); + ((Chain*) _item3Ptr)->PNext = nextPtr; + } + } + private IntPtr _item4Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item4Ptr => (Chain*) _item4Ptr; + + /// + /// Gets or sets item #4 in the chain. + /// + public T4 Item4 + { + get => Unsafe.AsRef((Chain*) _item4Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item4Ptr)->PNext; + Marshal.StructureToPtr(value, _item4Ptr, true); + ((Chain*) _item4Ptr)->PNext = nextPtr; + } + } + private IntPtr _item5Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item5Ptr => (Chain*) _item5Ptr; + + /// + /// Gets or sets item #5 in the chain. + /// + public T5 Item5 + { + get => Unsafe.AsRef((Chain*) _item5Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item5Ptr)->PNext; + Marshal.StructureToPtr(value, _item5Ptr, true); + ((Chain*) _item5Ptr)->PNext = nextPtr; + } + } + private IntPtr _item6Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item6Ptr => (Chain*) _item6Ptr; + + /// + /// Gets or sets item #6 in the chain. + /// + public T6 Item6 + { + get => Unsafe.AsRef((Chain*) _item6Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item6Ptr)->PNext; + Marshal.StructureToPtr(value, _item6Ptr, true); + ((Chain*) _item6Ptr)->PNext = nextPtr; + } + } + private IntPtr _item7Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item7Ptr => (Chain*) _item7Ptr; + + /// + /// Gets or sets item #7 in the chain. + /// + public T7 Item7 + { + get => Unsafe.AsRef((Chain*) _item7Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item7Ptr)->PNext; + Marshal.StructureToPtr(value, _item7Ptr, true); + ((Chain*) _item7Ptr)->PNext = nextPtr; + } + } + private IntPtr _item8Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item8Ptr => (Chain*) _item8Ptr; + + /// + /// Gets or sets item #8 in the chain. + /// + public T8 Item8 + { + get => Unsafe.AsRef((Chain*) _item8Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item8Ptr)->PNext; + Marshal.StructureToPtr(value, _item8Ptr, true); + ((Chain*) _item8Ptr)->PNext = nextPtr; + } + } + private IntPtr _item9Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item9Ptr => (Chain*) _item9Ptr; + + /// + /// Gets or sets item #9 in the chain. + /// + public T9 Item9 + { + get => Unsafe.AsRef((Chain*) _item9Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item9Ptr)->PNext; + Marshal.StructureToPtr(value, _item9Ptr, true); + ((Chain*) _item9Ptr)->PNext = nextPtr; + } + } + private IntPtr _item10Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item10Ptr => (Chain*) _item10Ptr; + + /// + /// Gets or sets item #10 in the chain. + /// + public T10 Item10 + { + get => Unsafe.AsRef((Chain*) _item10Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item10Ptr)->PNext; + Marshal.StructureToPtr(value, _item10Ptr, true); + ((Chain*) _item10Ptr)->PNext = nextPtr; + } + } + private IntPtr _item11Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item11Ptr => (Chain*) _item11Ptr; + + /// + /// Gets or sets item #11 in the chain. + /// + public T11 Item11 + { + get => Unsafe.AsRef((Chain*) _item11Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item11Ptr)->PNext; + Marshal.StructureToPtr(value, _item11Ptr, true); + ((Chain*) _item11Ptr)->PNext = nextPtr; + } + } + private IntPtr _item12Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item12Ptr => (Chain*) _item12Ptr; + + /// + /// Gets or sets item #12 in the chain. + /// + public T12 Item12 + { + get => Unsafe.AsRef((Chain*) _item12Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item12Ptr)->PNext; + Marshal.StructureToPtr(value, _item12Ptr, true); + ((Chain*) _item12Ptr)->PNext = nextPtr; + } + } + + /// + /// Creates a new with 3 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// Item 11. + /// Item 12. + public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + var item6Size = Marshal.SizeOf(); + var item7Size = Marshal.SizeOf(); + var item8Size = Marshal.SizeOf(); + var item9Size = Marshal.SizeOf(); + var item10Size = Marshal.SizeOf(); + var item11Size = Marshal.SizeOf(); + var item12Size = Marshal.SizeOf(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + item12Size); + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + item1.StructureType(); + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + item2.StructureType(); + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + item3.StructureType(); + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + item4.StructureType(); + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + item5.StructureType(); + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + item6.StructureType(); + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + item7.StructureType(); + Marshal.StructureToPtr(item7, _item7Ptr, false); + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + item8.StructureType(); + Marshal.StructureToPtr(item8, _item8Ptr, false); + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + + _item9Ptr = _item8Ptr + item8Size; + item9.StructureType(); + Marshal.StructureToPtr(item9, _item9Ptr, false); + ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + + _item10Ptr = _item9Ptr + item9Size; + item10.StructureType(); + Marshal.StructureToPtr(item10, _item10Ptr, false); + ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; + + _item11Ptr = _item10Ptr + item10Size; + item11.StructureType(); + Marshal.StructureToPtr(item11, _item11Ptr, false); + ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; + + _item12Ptr = _item11Ptr + item11Size; + item12.StructureType(); + Marshal.StructureToPtr(item12, _item12Ptr, false); + ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; + } + + /// + public void Dispose() + { + var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); + if (headPtr == IntPtr.Zero) return; + + // Destroy all structures + Marshal.DestroyStructure(headPtr); + var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item1Ptr); + var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item2Ptr); + var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item3Ptr); + var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item4Ptr); + var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item5Ptr); + var item6Ptr = Interlocked.Exchange(ref _item6Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item6Ptr); + var item7Ptr = Interlocked.Exchange(ref _item7Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item7Ptr); + var item8Ptr = Interlocked.Exchange(ref _item8Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item8Ptr); + var item9Ptr = Interlocked.Exchange(ref _item9Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item9Ptr); + var item10Ptr = Interlocked.Exchange(ref _item10Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item10Ptr); + var item11Ptr = Interlocked.Exchange(ref _item11Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item11Ptr); + var item12Ptr = Interlocked.Exchange(ref _item12Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item12Ptr); + + // Free memory block + Marshal.FreeHGlobal(headPtr); + } +} +/// +/// A safely manages the pointers of a managed structure chain. +/// +/// The chain type +/// Type of Item 1. +/// Type of Item 2. +/// Type of Item 3. +/// Type of Item 4. +/// Type of Item 5. +/// Type of Item 6. +/// Type of Item 7. +/// Type of Item 8. +/// Type of Item 9. +/// Type of Item 10. +/// Type of Item 11. +/// Type of Item 12. +/// Type of Item 13. +public unsafe class ManagedChain : IDisposable + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + where T13 : struct, IExtendsChain +{ + private IntPtr _headPtr; + + /// + /// Gets a pointer to the current head. + /// + public Chain* HeadPtr => (Chain*) _headPtr; + + /// + /// Gets or sets the head of the chain. + /// + public TChain Head + { + get => Unsafe.AsRef((Chain*) _headPtr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _headPtr)->PNext; + Marshal.StructureToPtr(value, _headPtr, true); + ((Chain*) _headPtr)->PNext = nextPtr; + } + } + + private IntPtr _item1Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item1Ptr => (Chain*) _item1Ptr; + + /// + /// Gets or sets item #1 in the chain. + /// + public T1 Item1 + { + get => Unsafe.AsRef((Chain*) _item1Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item1Ptr)->PNext; + Marshal.StructureToPtr(value, _item1Ptr, true); + ((Chain*) _item1Ptr)->PNext = nextPtr; + } + } + private IntPtr _item2Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item2Ptr => (Chain*) _item2Ptr; + + /// + /// Gets or sets item #2 in the chain. + /// + public T2 Item2 + { + get => Unsafe.AsRef((Chain*) _item2Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item2Ptr)->PNext; + Marshal.StructureToPtr(value, _item2Ptr, true); + ((Chain*) _item2Ptr)->PNext = nextPtr; + } + } + private IntPtr _item3Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item3Ptr => (Chain*) _item3Ptr; + + /// + /// Gets or sets item #3 in the chain. + /// + public T3 Item3 + { + get => Unsafe.AsRef((Chain*) _item3Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item3Ptr)->PNext; + Marshal.StructureToPtr(value, _item3Ptr, true); + ((Chain*) _item3Ptr)->PNext = nextPtr; + } + } + private IntPtr _item4Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item4Ptr => (Chain*) _item4Ptr; + + /// + /// Gets or sets item #4 in the chain. + /// + public T4 Item4 + { + get => Unsafe.AsRef((Chain*) _item4Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item4Ptr)->PNext; + Marshal.StructureToPtr(value, _item4Ptr, true); + ((Chain*) _item4Ptr)->PNext = nextPtr; + } + } + private IntPtr _item5Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item5Ptr => (Chain*) _item5Ptr; + + /// + /// Gets or sets item #5 in the chain. + /// + public T5 Item5 + { + get => Unsafe.AsRef((Chain*) _item5Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item5Ptr)->PNext; + Marshal.StructureToPtr(value, _item5Ptr, true); + ((Chain*) _item5Ptr)->PNext = nextPtr; + } + } + private IntPtr _item6Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item6Ptr => (Chain*) _item6Ptr; + + /// + /// Gets or sets item #6 in the chain. + /// + public T6 Item6 + { + get => Unsafe.AsRef((Chain*) _item6Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item6Ptr)->PNext; + Marshal.StructureToPtr(value, _item6Ptr, true); + ((Chain*) _item6Ptr)->PNext = nextPtr; + } + } + private IntPtr _item7Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item7Ptr => (Chain*) _item7Ptr; + + /// + /// Gets or sets item #7 in the chain. + /// + public T7 Item7 + { + get => Unsafe.AsRef((Chain*) _item7Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item7Ptr)->PNext; + Marshal.StructureToPtr(value, _item7Ptr, true); + ((Chain*) _item7Ptr)->PNext = nextPtr; + } + } + private IntPtr _item8Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item8Ptr => (Chain*) _item8Ptr; + + /// + /// Gets or sets item #8 in the chain. + /// + public T8 Item8 + { + get => Unsafe.AsRef((Chain*) _item8Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item8Ptr)->PNext; + Marshal.StructureToPtr(value, _item8Ptr, true); + ((Chain*) _item8Ptr)->PNext = nextPtr; + } + } + private IntPtr _item9Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item9Ptr => (Chain*) _item9Ptr; + + /// + /// Gets or sets item #9 in the chain. + /// + public T9 Item9 + { + get => Unsafe.AsRef((Chain*) _item9Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item9Ptr)->PNext; + Marshal.StructureToPtr(value, _item9Ptr, true); + ((Chain*) _item9Ptr)->PNext = nextPtr; + } + } + private IntPtr _item10Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item10Ptr => (Chain*) _item10Ptr; + + /// + /// Gets or sets item #10 in the chain. + /// + public T10 Item10 + { + get => Unsafe.AsRef((Chain*) _item10Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item10Ptr)->PNext; + Marshal.StructureToPtr(value, _item10Ptr, true); + ((Chain*) _item10Ptr)->PNext = nextPtr; + } + } + private IntPtr _item11Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item11Ptr => (Chain*) _item11Ptr; + + /// + /// Gets or sets item #11 in the chain. + /// + public T11 Item11 + { + get => Unsafe.AsRef((Chain*) _item11Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item11Ptr)->PNext; + Marshal.StructureToPtr(value, _item11Ptr, true); + ((Chain*) _item11Ptr)->PNext = nextPtr; + } + } + private IntPtr _item12Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item12Ptr => (Chain*) _item12Ptr; + + /// + /// Gets or sets item #12 in the chain. + /// + public T12 Item12 + { + get => Unsafe.AsRef((Chain*) _item12Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item12Ptr)->PNext; + Marshal.StructureToPtr(value, _item12Ptr, true); + ((Chain*) _item12Ptr)->PNext = nextPtr; + } + } + private IntPtr _item13Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item13Ptr => (Chain*) _item13Ptr; + + /// + /// Gets or sets item #13 in the chain. + /// + public T13 Item13 + { + get => Unsafe.AsRef((Chain*) _item13Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item13Ptr)->PNext; + Marshal.StructureToPtr(value, _item13Ptr, true); + ((Chain*) _item13Ptr)->PNext = nextPtr; + } + } + + /// + /// Creates a new with 3 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// Item 11. + /// Item 12. + /// Item 13. + public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default, T13 item13 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + var item6Size = Marshal.SizeOf(); + var item7Size = Marshal.SizeOf(); + var item8Size = Marshal.SizeOf(); + var item9Size = Marshal.SizeOf(); + var item10Size = Marshal.SizeOf(); + var item11Size = Marshal.SizeOf(); + var item12Size = Marshal.SizeOf(); + var item13Size = Marshal.SizeOf(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + item12Size + item13Size); + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + item1.StructureType(); + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + item2.StructureType(); + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + item3.StructureType(); + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + item4.StructureType(); + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + item5.StructureType(); + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + item6.StructureType(); + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + item7.StructureType(); + Marshal.StructureToPtr(item7, _item7Ptr, false); + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + item8.StructureType(); + Marshal.StructureToPtr(item8, _item8Ptr, false); + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + + _item9Ptr = _item8Ptr + item8Size; + item9.StructureType(); + Marshal.StructureToPtr(item9, _item9Ptr, false); + ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + + _item10Ptr = _item9Ptr + item9Size; + item10.StructureType(); + Marshal.StructureToPtr(item10, _item10Ptr, false); + ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; + + _item11Ptr = _item10Ptr + item10Size; + item11.StructureType(); + Marshal.StructureToPtr(item11, _item11Ptr, false); + ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; + + _item12Ptr = _item11Ptr + item11Size; + item12.StructureType(); + Marshal.StructureToPtr(item12, _item12Ptr, false); + ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; + + _item13Ptr = _item12Ptr + item12Size; + item13.StructureType(); + Marshal.StructureToPtr(item13, _item13Ptr, false); + ((Chain*) _item12Ptr)->PNext = (Chain*) _item13Ptr; + } + + /// + public void Dispose() + { + var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); + if (headPtr == IntPtr.Zero) return; + + // Destroy all structures + Marshal.DestroyStructure(headPtr); + var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item1Ptr); + var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item2Ptr); + var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item3Ptr); + var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item4Ptr); + var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item5Ptr); + var item6Ptr = Interlocked.Exchange(ref _item6Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item6Ptr); + var item7Ptr = Interlocked.Exchange(ref _item7Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item7Ptr); + var item8Ptr = Interlocked.Exchange(ref _item8Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item8Ptr); + var item9Ptr = Interlocked.Exchange(ref _item9Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item9Ptr); + var item10Ptr = Interlocked.Exchange(ref _item10Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item10Ptr); + var item11Ptr = Interlocked.Exchange(ref _item11Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item11Ptr); + var item12Ptr = Interlocked.Exchange(ref _item12Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item12Ptr); + var item13Ptr = Interlocked.Exchange(ref _item13Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item13Ptr); + + // Free memory block + Marshal.FreeHGlobal(headPtr); + } +} +/// +/// A safely manages the pointers of a managed structure chain. +/// +/// The chain type +/// Type of Item 1. +/// Type of Item 2. +/// Type of Item 3. +/// Type of Item 4. +/// Type of Item 5. +/// Type of Item 6. +/// Type of Item 7. +/// Type of Item 8. +/// Type of Item 9. +/// Type of Item 10. +/// Type of Item 11. +/// Type of Item 12. +/// Type of Item 13. +/// Type of Item 14. +public unsafe class ManagedChain : IDisposable + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + where T13 : struct, IExtendsChain + where T14 : struct, IExtendsChain +{ + private IntPtr _headPtr; + + /// + /// Gets a pointer to the current head. + /// + public Chain* HeadPtr => (Chain*) _headPtr; + + /// + /// Gets or sets the head of the chain. + /// + public TChain Head + { + get => Unsafe.AsRef((Chain*) _headPtr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _headPtr)->PNext; + Marshal.StructureToPtr(value, _headPtr, true); + ((Chain*) _headPtr)->PNext = nextPtr; + } + } + + private IntPtr _item1Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item1Ptr => (Chain*) _item1Ptr; + + /// + /// Gets or sets item #1 in the chain. + /// + public T1 Item1 + { + get => Unsafe.AsRef((Chain*) _item1Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item1Ptr)->PNext; + Marshal.StructureToPtr(value, _item1Ptr, true); + ((Chain*) _item1Ptr)->PNext = nextPtr; + } + } + private IntPtr _item2Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item2Ptr => (Chain*) _item2Ptr; + + /// + /// Gets or sets item #2 in the chain. + /// + public T2 Item2 + { + get => Unsafe.AsRef((Chain*) _item2Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item2Ptr)->PNext; + Marshal.StructureToPtr(value, _item2Ptr, true); + ((Chain*) _item2Ptr)->PNext = nextPtr; + } + } + private IntPtr _item3Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item3Ptr => (Chain*) _item3Ptr; + + /// + /// Gets or sets item #3 in the chain. + /// + public T3 Item3 + { + get => Unsafe.AsRef((Chain*) _item3Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item3Ptr)->PNext; + Marshal.StructureToPtr(value, _item3Ptr, true); + ((Chain*) _item3Ptr)->PNext = nextPtr; + } + } + private IntPtr _item4Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item4Ptr => (Chain*) _item4Ptr; + + /// + /// Gets or sets item #4 in the chain. + /// + public T4 Item4 + { + get => Unsafe.AsRef((Chain*) _item4Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item4Ptr)->PNext; + Marshal.StructureToPtr(value, _item4Ptr, true); + ((Chain*) _item4Ptr)->PNext = nextPtr; + } + } + private IntPtr _item5Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item5Ptr => (Chain*) _item5Ptr; + + /// + /// Gets or sets item #5 in the chain. + /// + public T5 Item5 + { + get => Unsafe.AsRef((Chain*) _item5Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item5Ptr)->PNext; + Marshal.StructureToPtr(value, _item5Ptr, true); + ((Chain*) _item5Ptr)->PNext = nextPtr; + } + } + private IntPtr _item6Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item6Ptr => (Chain*) _item6Ptr; + + /// + /// Gets or sets item #6 in the chain. + /// + public T6 Item6 + { + get => Unsafe.AsRef((Chain*) _item6Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item6Ptr)->PNext; + Marshal.StructureToPtr(value, _item6Ptr, true); + ((Chain*) _item6Ptr)->PNext = nextPtr; + } + } + private IntPtr _item7Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item7Ptr => (Chain*) _item7Ptr; + + /// + /// Gets or sets item #7 in the chain. + /// + public T7 Item7 + { + get => Unsafe.AsRef((Chain*) _item7Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item7Ptr)->PNext; + Marshal.StructureToPtr(value, _item7Ptr, true); + ((Chain*) _item7Ptr)->PNext = nextPtr; + } + } + private IntPtr _item8Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item8Ptr => (Chain*) _item8Ptr; + + /// + /// Gets or sets item #8 in the chain. + /// + public T8 Item8 + { + get => Unsafe.AsRef((Chain*) _item8Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item8Ptr)->PNext; + Marshal.StructureToPtr(value, _item8Ptr, true); + ((Chain*) _item8Ptr)->PNext = nextPtr; + } + } + private IntPtr _item9Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item9Ptr => (Chain*) _item9Ptr; + + /// + /// Gets or sets item #9 in the chain. + /// + public T9 Item9 + { + get => Unsafe.AsRef((Chain*) _item9Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item9Ptr)->PNext; + Marshal.StructureToPtr(value, _item9Ptr, true); + ((Chain*) _item9Ptr)->PNext = nextPtr; + } + } + private IntPtr _item10Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item10Ptr => (Chain*) _item10Ptr; + + /// + /// Gets or sets item #10 in the chain. + /// + public T10 Item10 + { + get => Unsafe.AsRef((Chain*) _item10Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item10Ptr)->PNext; + Marshal.StructureToPtr(value, _item10Ptr, true); + ((Chain*) _item10Ptr)->PNext = nextPtr; + } + } + private IntPtr _item11Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item11Ptr => (Chain*) _item11Ptr; + + /// + /// Gets or sets item #11 in the chain. + /// + public T11 Item11 + { + get => Unsafe.AsRef((Chain*) _item11Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item11Ptr)->PNext; + Marshal.StructureToPtr(value, _item11Ptr, true); + ((Chain*) _item11Ptr)->PNext = nextPtr; + } + } + private IntPtr _item12Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item12Ptr => (Chain*) _item12Ptr; + + /// + /// Gets or sets item #12 in the chain. + /// + public T12 Item12 + { + get => Unsafe.AsRef((Chain*) _item12Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item12Ptr)->PNext; + Marshal.StructureToPtr(value, _item12Ptr, true); + ((Chain*) _item12Ptr)->PNext = nextPtr; + } + } + private IntPtr _item13Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item13Ptr => (Chain*) _item13Ptr; + + /// + /// Gets or sets item #13 in the chain. + /// + public T13 Item13 + { + get => Unsafe.AsRef((Chain*) _item13Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item13Ptr)->PNext; + Marshal.StructureToPtr(value, _item13Ptr, true); + ((Chain*) _item13Ptr)->PNext = nextPtr; + } + } + private IntPtr _item14Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item14Ptr => (Chain*) _item14Ptr; + + /// + /// Gets or sets item #14 in the chain. + /// + public T14 Item14 + { + get => Unsafe.AsRef((Chain*) _item14Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item14Ptr)->PNext; + Marshal.StructureToPtr(value, _item14Ptr, true); + ((Chain*) _item14Ptr)->PNext = nextPtr; + } + } + + /// + /// Creates a new with 3 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// Item 11. + /// Item 12. + /// Item 13. + /// Item 14. + public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default, T13 item13 = default, T14 item14 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + var item6Size = Marshal.SizeOf(); + var item7Size = Marshal.SizeOf(); + var item8Size = Marshal.SizeOf(); + var item9Size = Marshal.SizeOf(); + var item10Size = Marshal.SizeOf(); + var item11Size = Marshal.SizeOf(); + var item12Size = Marshal.SizeOf(); + var item13Size = Marshal.SizeOf(); + var item14Size = Marshal.SizeOf(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + item12Size + item13Size + item14Size); + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + item1.StructureType(); + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + item2.StructureType(); + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + item3.StructureType(); + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + item4.StructureType(); + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + item5.StructureType(); + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + item6.StructureType(); + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + item7.StructureType(); + Marshal.StructureToPtr(item7, _item7Ptr, false); + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + item8.StructureType(); + Marshal.StructureToPtr(item8, _item8Ptr, false); + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + + _item9Ptr = _item8Ptr + item8Size; + item9.StructureType(); + Marshal.StructureToPtr(item9, _item9Ptr, false); + ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + + _item10Ptr = _item9Ptr + item9Size; + item10.StructureType(); + Marshal.StructureToPtr(item10, _item10Ptr, false); + ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; + + _item11Ptr = _item10Ptr + item10Size; + item11.StructureType(); + Marshal.StructureToPtr(item11, _item11Ptr, false); + ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; + + _item12Ptr = _item11Ptr + item11Size; + item12.StructureType(); + Marshal.StructureToPtr(item12, _item12Ptr, false); + ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; + + _item13Ptr = _item12Ptr + item12Size; + item13.StructureType(); + Marshal.StructureToPtr(item13, _item13Ptr, false); + ((Chain*) _item12Ptr)->PNext = (Chain*) _item13Ptr; + + _item14Ptr = _item13Ptr + item13Size; + item14.StructureType(); + Marshal.StructureToPtr(item14, _item14Ptr, false); + ((Chain*) _item13Ptr)->PNext = (Chain*) _item14Ptr; + } + + /// + public void Dispose() + { + var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); + if (headPtr == IntPtr.Zero) return; + + // Destroy all structures + Marshal.DestroyStructure(headPtr); + var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item1Ptr); + var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item2Ptr); + var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item3Ptr); + var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item4Ptr); + var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item5Ptr); + var item6Ptr = Interlocked.Exchange(ref _item6Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item6Ptr); + var item7Ptr = Interlocked.Exchange(ref _item7Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item7Ptr); + var item8Ptr = Interlocked.Exchange(ref _item8Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item8Ptr); + var item9Ptr = Interlocked.Exchange(ref _item9Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item9Ptr); + var item10Ptr = Interlocked.Exchange(ref _item10Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item10Ptr); + var item11Ptr = Interlocked.Exchange(ref _item11Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item11Ptr); + var item12Ptr = Interlocked.Exchange(ref _item12Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item12Ptr); + var item13Ptr = Interlocked.Exchange(ref _item13Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item13Ptr); + var item14Ptr = Interlocked.Exchange(ref _item14Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item14Ptr); + + // Free memory block + Marshal.FreeHGlobal(headPtr); + } +} +/// +/// A safely manages the pointers of a managed structure chain. +/// +/// The chain type +/// Type of Item 1. +/// Type of Item 2. +/// Type of Item 3. +/// Type of Item 4. +/// Type of Item 5. +/// Type of Item 6. +/// Type of Item 7. +/// Type of Item 8. +/// Type of Item 9. +/// Type of Item 10. +/// Type of Item 11. +/// Type of Item 12. +/// Type of Item 13. +/// Type of Item 14. +/// Type of Item 15. +public unsafe class ManagedChain : IDisposable + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + where T13 : struct, IExtendsChain + where T14 : struct, IExtendsChain + where T15 : struct, IExtendsChain +{ + private IntPtr _headPtr; + + /// + /// Gets a pointer to the current head. + /// + public Chain* HeadPtr => (Chain*) _headPtr; + + /// + /// Gets or sets the head of the chain. + /// + public TChain Head + { + get => Unsafe.AsRef((Chain*) _headPtr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _headPtr)->PNext; + Marshal.StructureToPtr(value, _headPtr, true); + ((Chain*) _headPtr)->PNext = nextPtr; + } + } + + private IntPtr _item1Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item1Ptr => (Chain*) _item1Ptr; + + /// + /// Gets or sets item #1 in the chain. + /// + public T1 Item1 + { + get => Unsafe.AsRef((Chain*) _item1Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item1Ptr)->PNext; + Marshal.StructureToPtr(value, _item1Ptr, true); + ((Chain*) _item1Ptr)->PNext = nextPtr; + } + } + private IntPtr _item2Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item2Ptr => (Chain*) _item2Ptr; + + /// + /// Gets or sets item #2 in the chain. + /// + public T2 Item2 + { + get => Unsafe.AsRef((Chain*) _item2Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item2Ptr)->PNext; + Marshal.StructureToPtr(value, _item2Ptr, true); + ((Chain*) _item2Ptr)->PNext = nextPtr; + } + } + private IntPtr _item3Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item3Ptr => (Chain*) _item3Ptr; + + /// + /// Gets or sets item #3 in the chain. + /// + public T3 Item3 + { + get => Unsafe.AsRef((Chain*) _item3Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item3Ptr)->PNext; + Marshal.StructureToPtr(value, _item3Ptr, true); + ((Chain*) _item3Ptr)->PNext = nextPtr; + } + } + private IntPtr _item4Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item4Ptr => (Chain*) _item4Ptr; + + /// + /// Gets or sets item #4 in the chain. + /// + public T4 Item4 + { + get => Unsafe.AsRef((Chain*) _item4Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item4Ptr)->PNext; + Marshal.StructureToPtr(value, _item4Ptr, true); + ((Chain*) _item4Ptr)->PNext = nextPtr; + } + } + private IntPtr _item5Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item5Ptr => (Chain*) _item5Ptr; + + /// + /// Gets or sets item #5 in the chain. + /// + public T5 Item5 + { + get => Unsafe.AsRef((Chain*) _item5Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item5Ptr)->PNext; + Marshal.StructureToPtr(value, _item5Ptr, true); + ((Chain*) _item5Ptr)->PNext = nextPtr; + } + } + private IntPtr _item6Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item6Ptr => (Chain*) _item6Ptr; + + /// + /// Gets or sets item #6 in the chain. + /// + public T6 Item6 + { + get => Unsafe.AsRef((Chain*) _item6Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item6Ptr)->PNext; + Marshal.StructureToPtr(value, _item6Ptr, true); + ((Chain*) _item6Ptr)->PNext = nextPtr; + } + } + private IntPtr _item7Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item7Ptr => (Chain*) _item7Ptr; + + /// + /// Gets or sets item #7 in the chain. + /// + public T7 Item7 + { + get => Unsafe.AsRef((Chain*) _item7Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item7Ptr)->PNext; + Marshal.StructureToPtr(value, _item7Ptr, true); + ((Chain*) _item7Ptr)->PNext = nextPtr; + } + } + private IntPtr _item8Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item8Ptr => (Chain*) _item8Ptr; + + /// + /// Gets or sets item #8 in the chain. + /// + public T8 Item8 + { + get => Unsafe.AsRef((Chain*) _item8Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item8Ptr)->PNext; + Marshal.StructureToPtr(value, _item8Ptr, true); + ((Chain*) _item8Ptr)->PNext = nextPtr; + } + } + private IntPtr _item9Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item9Ptr => (Chain*) _item9Ptr; + + /// + /// Gets or sets item #9 in the chain. + /// + public T9 Item9 + { + get => Unsafe.AsRef((Chain*) _item9Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item9Ptr)->PNext; + Marshal.StructureToPtr(value, _item9Ptr, true); + ((Chain*) _item9Ptr)->PNext = nextPtr; + } + } + private IntPtr _item10Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item10Ptr => (Chain*) _item10Ptr; + + /// + /// Gets or sets item #10 in the chain. + /// + public T10 Item10 + { + get => Unsafe.AsRef((Chain*) _item10Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item10Ptr)->PNext; + Marshal.StructureToPtr(value, _item10Ptr, true); + ((Chain*) _item10Ptr)->PNext = nextPtr; + } + } + private IntPtr _item11Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item11Ptr => (Chain*) _item11Ptr; + + /// + /// Gets or sets item #11 in the chain. + /// + public T11 Item11 + { + get => Unsafe.AsRef((Chain*) _item11Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item11Ptr)->PNext; + Marshal.StructureToPtr(value, _item11Ptr, true); + ((Chain*) _item11Ptr)->PNext = nextPtr; + } + } + private IntPtr _item12Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item12Ptr => (Chain*) _item12Ptr; + + /// + /// Gets or sets item #12 in the chain. + /// + public T12 Item12 + { + get => Unsafe.AsRef((Chain*) _item12Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item12Ptr)->PNext; + Marshal.StructureToPtr(value, _item12Ptr, true); + ((Chain*) _item12Ptr)->PNext = nextPtr; + } + } + private IntPtr _item13Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item13Ptr => (Chain*) _item13Ptr; + + /// + /// Gets or sets item #13 in the chain. + /// + public T13 Item13 + { + get => Unsafe.AsRef((Chain*) _item13Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item13Ptr)->PNext; + Marshal.StructureToPtr(value, _item13Ptr, true); + ((Chain*) _item13Ptr)->PNext = nextPtr; + } + } + private IntPtr _item14Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item14Ptr => (Chain*) _item14Ptr; + + /// + /// Gets or sets item #14 in the chain. + /// + public T14 Item14 + { + get => Unsafe.AsRef((Chain*) _item14Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item14Ptr)->PNext; + Marshal.StructureToPtr(value, _item14Ptr, true); + ((Chain*) _item14Ptr)->PNext = nextPtr; + } + } + private IntPtr _item15Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item15Ptr => (Chain*) _item15Ptr; + + /// + /// Gets or sets item #15 in the chain. + /// + public T15 Item15 + { + get => Unsafe.AsRef((Chain*) _item15Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item15Ptr)->PNext; + Marshal.StructureToPtr(value, _item15Ptr, true); + ((Chain*) _item15Ptr)->PNext = nextPtr; + } + } + + /// + /// Creates a new with 3 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// Item 11. + /// Item 12. + /// Item 13. + /// Item 14. + /// Item 15. + public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default, T13 item13 = default, T14 item14 = default, T15 item15 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + var item6Size = Marshal.SizeOf(); + var item7Size = Marshal.SizeOf(); + var item8Size = Marshal.SizeOf(); + var item9Size = Marshal.SizeOf(); + var item10Size = Marshal.SizeOf(); + var item11Size = Marshal.SizeOf(); + var item12Size = Marshal.SizeOf(); + var item13Size = Marshal.SizeOf(); + var item14Size = Marshal.SizeOf(); + var item15Size = Marshal.SizeOf(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + item12Size + item13Size + item14Size + item15Size); + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + item1.StructureType(); + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + item2.StructureType(); + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + item3.StructureType(); + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + item4.StructureType(); + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + item5.StructureType(); + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + item6.StructureType(); + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + item7.StructureType(); + Marshal.StructureToPtr(item7, _item7Ptr, false); + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + item8.StructureType(); + Marshal.StructureToPtr(item8, _item8Ptr, false); + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + + _item9Ptr = _item8Ptr + item8Size; + item9.StructureType(); + Marshal.StructureToPtr(item9, _item9Ptr, false); + ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + + _item10Ptr = _item9Ptr + item9Size; + item10.StructureType(); + Marshal.StructureToPtr(item10, _item10Ptr, false); + ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; + + _item11Ptr = _item10Ptr + item10Size; + item11.StructureType(); + Marshal.StructureToPtr(item11, _item11Ptr, false); + ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; + + _item12Ptr = _item11Ptr + item11Size; + item12.StructureType(); + Marshal.StructureToPtr(item12, _item12Ptr, false); + ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; + + _item13Ptr = _item12Ptr + item12Size; + item13.StructureType(); + Marshal.StructureToPtr(item13, _item13Ptr, false); + ((Chain*) _item12Ptr)->PNext = (Chain*) _item13Ptr; + + _item14Ptr = _item13Ptr + item13Size; + item14.StructureType(); + Marshal.StructureToPtr(item14, _item14Ptr, false); + ((Chain*) _item13Ptr)->PNext = (Chain*) _item14Ptr; + + _item15Ptr = _item14Ptr + item14Size; + item15.StructureType(); + Marshal.StructureToPtr(item15, _item15Ptr, false); + ((Chain*) _item14Ptr)->PNext = (Chain*) _item15Ptr; + } + + /// + public void Dispose() + { + var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); + if (headPtr == IntPtr.Zero) return; + + // Destroy all structures + Marshal.DestroyStructure(headPtr); + var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item1Ptr); + var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item2Ptr); + var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item3Ptr); + var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item4Ptr); + var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item5Ptr); + var item6Ptr = Interlocked.Exchange(ref _item6Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item6Ptr); + var item7Ptr = Interlocked.Exchange(ref _item7Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item7Ptr); + var item8Ptr = Interlocked.Exchange(ref _item8Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item8Ptr); + var item9Ptr = Interlocked.Exchange(ref _item9Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item9Ptr); + var item10Ptr = Interlocked.Exchange(ref _item10Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item10Ptr); + var item11Ptr = Interlocked.Exchange(ref _item11Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item11Ptr); + var item12Ptr = Interlocked.Exchange(ref _item12Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item12Ptr); + var item13Ptr = Interlocked.Exchange(ref _item13Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item13Ptr); + var item14Ptr = Interlocked.Exchange(ref _item14Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item14Ptr); + var item15Ptr = Interlocked.Exchange(ref _item15Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item15Ptr); + + // Free memory block + Marshal.FreeHGlobal(headPtr); + } +} diff --git a/PrototypeStructChaining/ManagedChain.tt b/PrototypeStructChaining/ManagedChain.tt new file mode 100644 index 0000000000..ea244293d7 --- /dev/null +++ b/PrototypeStructChaining/ManagedChain.tt @@ -0,0 +1,259 @@ +<#@ template language="C#" #> +<#@ import namespace="System.Text" #> +<#@ import namespace="System.Collections.Generic" #> +<# + var maximumItems = 16; + + string parameterDocs(int index, string prefix) + { + var builder = new StringBuilder(prefix); + builder.Append("The head of the chain."); + for (var i = 1; i < index; i++) + { + builder + .AppendLine() + .Append(prefix) + .Append("Item ") + .Append(i) + .Append("."); + } + return builder.ToString(); + } + + string parameterTypeDocs(int index, string prefix) + { + var builder = new StringBuilder(prefix); + builder.Append("The chain type"); + for (var i = 1; i < index; i++) + { + builder + .AppendLine() + .Append(prefix) + .Append("Type of Item ") + .Append(i) + .Append("."); + } + return builder.ToString(); + } + + string typeList(int index) + { + var builder = new StringBuilder("TChain"); + for (var i = 1; i < index; i++) + { + builder + .Append(", T") + .Append(i); + } + return builder.ToString(); + } + + string paramList(int index) + { + var builder = new StringBuilder("TChain head = default"); + for (var i = 1; i < index; i++) + { + builder + .Append(", T") + .Append(i) + .Append(" item") + .Append(i) + .Append(" = default"); + } + return builder.ToString(); + } + + string argList(int index) + { + var builder = new StringBuilder("head"); + for (var i = 1; i < index; i++) + { + builder + .Append(", item") + .Append(i); + } + return builder.ToString(); + } + + string constraintList(int index, string prefix) + { + var builder = new StringBuilder(prefix); + builder.Append("where TChain : struct, IChainStart"); + for (var i = 1; i < index; i++) + { + builder + .AppendLine() + .Append(prefix) + .Append("where T") + .Append(i) + .Append(" : struct, IExtendsChain"); + } + return builder.ToString(); + } +#> +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +namespace Silk.Net.Vulkan; + +/// +/// Static class for creating Managed Chains. +/// +public static class ManagedChain +{ +<# + for (var i = 2; i <= maximumItems; i++) + { + var tList = typeList(i); +#> + /// + /// Creates a new with <#= i #> items. + /// +<#= parameterDocs(i, " /// ") #> +<#= parameterTypeDocs(i, " /// ") #> + /// A new with <#= i #> items. + public static ManagedChain<<#= tList #>> Create<<#= tList #>>(<#= paramList(i) #>) +<#= constraintList(i, " ") #> + { + return new(<#= argList(i) #>); + } + +<# + } // for (var 2 = 1; i <= maximumItems; i++) { +#> +} + +<# + for (var i = 2; i <= maximumItems; i++) + { + var tList = typeList(i); +#> +/// +/// A safely manages the pointers of a managed structure chain. +/// +<#= parameterTypeDocs(i, "/// ") #> +public unsafe class ManagedChain<<#= tList #>> : IDisposable +<#= constraintList(i, " ") #> +{ + private IntPtr _headPtr; + + /// + /// Gets a pointer to the current head. + /// + public Chain* HeadPtr => (Chain*) _headPtr; + + /// + /// Gets or sets the head of the chain. + /// + public TChain Head + { + get => Unsafe.AsRef((Chain*) _headPtr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _headPtr)->PNext; + Marshal.StructureToPtr(value, _headPtr, true); + ((Chain*) _headPtr)->PNext = nextPtr; + } + } + +<# + for (var j = 1; j < i; j++) + { +#> + private IntPtr _item<#= j #>Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item<#= j #>Ptr => (Chain*) _item<#= j #>Ptr; + + /// + /// Gets or sets item #<#= j #> in the chain. + /// + public T<#= j #> Item<#= j #> + { + get => Unsafe.AsRef>((Chain*) _item<#= j #>Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item<#= j #>Ptr)->PNext; + Marshal.StructureToPtr(value, _item<#= j #>Ptr, true); + ((Chain*) _item<#= j #>Ptr)->PNext = nextPtr; + } + } +<# + } // for (int j = 1; j < i; j++) { +#> + + /// + /// Creates a new with 3 items. + /// +<#= parameterDocs(i, " /// ") #> + public ManagedChain(<#= paramList(i) #>) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); +<# + for (var j = 1; j < i; j++) + { +#> + var item<#= j #>Size = Marshal.SizeOf>(); +<# + } // for (int j = 1; j < i; j++) { +#> + + _headPtr = Marshal.AllocHGlobal(headSize<# + for (var j = 1; j < i; j++) + { +#> + item<#= j #>Size<# + } // for (int j = 1; j < i; j++) { +#>); + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); +<# + for (var j = 1; j < i; j++) + { + var prevItem = j > 1 + ? $"item{j - 1}" + : "head"; +#> + + _item<#= j #>Ptr = _<#= prevItem #>Ptr + <#= prevItem #>Size; + item<#= j #>.StructureType(); + Marshal.StructureToPtr(item<#= j #>, _item<#= j #>Ptr, false); + ((Chain*) _<#= prevItem #>Ptr)->PNext = (Chain*) _item<#= j #>Ptr; +<# + } // for (int j = 1; j < i; j++) { +#> + } + + /// + public void Dispose() + { + var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); + if (headPtr == IntPtr.Zero) return; + + // Destroy all structures + Marshal.DestroyStructure(headPtr); +<# + for (var j = 1; j < i; j++) + { +#> + var item<#=j#>Ptr = Interlocked.Exchange(ref _item<#=j#>Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item<#=j#>Ptr); +<# + } // for (int j = 1; j < i; j++) { +#> + + // Free memory block + Marshal.FreeHGlobal(headPtr); + } +} +<# + } // for (var i = 2; i <= maximumItems; i++) { +#> \ No newline at end of file diff --git a/PrototypeStructChaining/PrototypeStructChaining.csproj b/PrototypeStructChaining/PrototypeStructChaining.csproj index a9a068a1b9..6de1a80a99 100644 --- a/PrototypeStructChaining/PrototypeStructChaining.csproj +++ b/PrototypeStructChaining/PrototypeStructChaining.csproj @@ -19,4 +19,19 @@ + + + TextTemplatingFileGenerator + ManagedChain.cs + + + + + + True + True + ManagedChain.tt + + + From dd2c1a8a716db11fe8d22639ed5ce0b5b3968743 Mon Sep 17 00:00:00 2001 From: Craig Dean Date: Fri, 5 Nov 2021 22:00:42 +0000 Subject: [PATCH 12/42] feat: Added `ManagedChain.Append` Can now easily append an item to an existing `ManagedChain` to efficiently create a new `ManagedChain`. --- .../TestManagedChains.cs | 37 + PrototypeStructChaining/ManagedChain.cs | 1134 ++++++++++++++++- PrototypeStructChaining/ManagedChain.tt | 92 +- Readme.md | 17 +- 4 files changed, 1226 insertions(+), 54 deletions(-) diff --git a/PrototypeStructChaining.Test/TestManagedChains.cs b/PrototypeStructChaining.Test/TestManagedChains.cs index 0456d6e642..e2dca905b8 100644 --- a/PrototypeStructChaining.Test/TestManagedChains.cs +++ b/PrototypeStructChaining.Test/TestManagedChains.cs @@ -101,4 +101,41 @@ public unsafe void TestManagedChainReplaceMiddle() // As is the SType Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, chain.Item1.SType); } + + [Fact] + public unsafe void TestManagedChainAppend() + { + using var chain = new ManagedChain( + item1: new PhysicalDeviceDescriptorIndexingFeatures {ShaderInputAttachmentArrayDynamicIndexing = true}); + + // Ensure all STypes set correctly + Assert.Equal(StructureType.PhysicalDeviceFeatures2, chain.Head.SType); + Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, chain.Item1.SType); + + // Ensure pointers set correctly + Assert.Equal((nint) chain.Item1Ptr, (nint) chain.Head.PNext); + Assert.Equal((nint) 0, (nint) chain.Item1.PNext); + + // Check flag set + Assert.True(chain.Item1.ShaderInputAttachmentArrayDynamicIndexing); + + using var newChain = chain.Append(); + + // Ensure all STypes set correctly + Assert.Equal(StructureType.PhysicalDeviceFeatures2, newChain.Head.SType); + Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, newChain.Item1.SType); + Assert.Equal(StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr, newChain.Item2.SType); + + // Ensure pointers set correctly + Assert.Equal((nint) newChain.Item1Ptr, (nint) newChain.Head.PNext); + Assert.Equal((nint) newChain.Item2Ptr, (nint) newChain.Item1.PNext); + Assert.Equal((nint) 0, (nint) newChain.Item2.PNext); + + // Check flag still set + Assert.True(newChain.Item1.ShaderInputAttachmentArrayDynamicIndexing); + + // Check we have new copies + Assert.NotEqual((nint) chain.HeadPtr, (nint) newChain.HeadPtr); + Assert.NotEqual((nint) chain.Item1Ptr, (nint) newChain.Item1Ptr); + } } \ No newline at end of file diff --git a/PrototypeStructChaining/ManagedChain.cs b/PrototypeStructChaining/ManagedChain.cs index b98c22090c..26c14b2aad 100644 --- a/PrototypeStructChaining/ManagedChain.cs +++ b/PrototypeStructChaining/ManagedChain.cs @@ -604,7 +604,7 @@ public T1 Item1 } /// - /// Creates a new with 3 items. + /// Creates a new with 2 items. /// /// The head of the chain. /// Item 1. @@ -624,6 +624,21 @@ public ManagedChain(TChain head = default, T1 item1 = default) ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; } + /// + /// Creates a new with 3 items, by appending to + /// the end of this chain. + /// + /// Item 2. + /// Type of Item 2 + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Append(T2 item2 = default) + where T2: struct, IExtendsChain + { + return new ManagedChain(this, item2); + } + /// public void Dispose() { @@ -639,6 +654,7 @@ public void Dispose() Marshal.FreeHGlobal(headPtr); } } + /// /// A safely manages the pointers of a managed structure chain. /// @@ -716,7 +732,7 @@ public T2 Item2 } /// - /// Creates a new with 3 items. + /// Creates a new with 3 items. /// /// The head of the chain. /// Item 1. @@ -743,6 +759,53 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; } + /// + /// Creates a new with 3 items. + /// + /// The chain to append to. + /// Item 2. + /// + /// Do not forget to dispose the chain if you are no longer using it. + /// + public ManagedChain(ManagedChain previous, T2 item2 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + + var originalSize = headSize + item1Size; + var newSize = originalSize + item2Size; + + _headPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + + _item1Ptr = _headPtr + headSize; + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + // Append the last structure + item2.StructureType(); + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + } + + /// + /// Creates a new with 4 items, by appending to + /// the end of this chain. + /// + /// Item 3. + /// Type of Item 3 + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Append(T3 item3 = default) + where T3: struct, IExtendsChain + { + return new ManagedChain(this, item3); + } + /// public void Dispose() { @@ -760,6 +823,7 @@ public void Dispose() Marshal.FreeHGlobal(headPtr); } } + /// /// A safely manages the pointers of a managed structure chain. /// @@ -860,7 +924,7 @@ public T3 Item3 } /// - /// Creates a new with 3 items. + /// Creates a new with 4 items. /// /// The head of the chain. /// Item 1. @@ -894,6 +958,57 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; } + /// + /// Creates a new with 4 items. + /// + /// The chain to append to. + /// Item 3. + /// + /// Do not forget to dispose the chain if you are no longer using it. + /// + public ManagedChain(ManagedChain previous, T3 item3 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + + var originalSize = headSize + item1Size + item2Size; + var newSize = originalSize + item3Size; + + _headPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + + _item1Ptr = _headPtr + headSize; + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + // Append the last structure + item3.StructureType(); + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + } + + /// + /// Creates a new with 5 items, by appending to + /// the end of this chain. + /// + /// Item 4. + /// Type of Item 4 + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Append(T4 item4 = default) + where T4: struct, IExtendsChain + { + return new ManagedChain(this, item4); + } + /// public void Dispose() { @@ -913,6 +1028,7 @@ public void Dispose() Marshal.FreeHGlobal(headPtr); } } + /// /// A safely manages the pointers of a managed structure chain. /// @@ -1036,7 +1152,7 @@ public T4 Item4 } /// - /// Creates a new with 3 items. + /// Creates a new with 5 items. /// /// The head of the chain. /// Item 1. @@ -1077,6 +1193,61 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; } + /// + /// Creates a new with 5 items. + /// + /// The chain to append to. + /// Item 4. + /// + /// Do not forget to dispose the chain if you are no longer using it. + /// + public ManagedChain(ManagedChain previous, T4 item4 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + + var originalSize = headSize + item1Size + item2Size + item3Size; + var newSize = originalSize + item4Size; + + _headPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + + _item1Ptr = _headPtr + headSize; + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + // Append the last structure + item4.StructureType(); + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + } + + /// + /// Creates a new with 6 items, by appending to + /// the end of this chain. + /// + /// Item 5. + /// Type of Item 5 + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Append(T5 item5 = default) + where T5: struct, IExtendsChain + { + return new ManagedChain(this, item5); + } + /// public void Dispose() { @@ -1098,6 +1269,7 @@ public void Dispose() Marshal.FreeHGlobal(headPtr); } } + /// /// A safely manages the pointers of a managed structure chain. /// @@ -1244,7 +1416,7 @@ public T5 Item5 } /// - /// Creates a new with 3 items. + /// Creates a new with 6 items. /// /// The head of the chain. /// Item 1. @@ -1292,6 +1464,65 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; } + /// + /// Creates a new with 6 items. + /// + /// The chain to append to. + /// Item 5. + /// + /// Do not forget to dispose the chain if you are no longer using it. + /// + public ManagedChain(ManagedChain previous, T5 item5 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + + var originalSize = headSize + item1Size + item2Size + item3Size + item4Size; + var newSize = originalSize + item5Size; + + _headPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + + _item1Ptr = _headPtr + headSize; + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + // Append the last structure + item5.StructureType(); + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + } + + /// + /// Creates a new with 7 items, by appending to + /// the end of this chain. + /// + /// Item 6. + /// Type of Item 6 + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Append(T6 item6 = default) + where T6: struct, IExtendsChain + { + return new ManagedChain(this, item6); + } + /// public void Dispose() { @@ -1315,6 +1546,7 @@ public void Dispose() Marshal.FreeHGlobal(headPtr); } } + /// /// A safely manages the pointers of a managed structure chain. /// @@ -1484,7 +1716,7 @@ public T6 Item6 } /// - /// Creates a new with 3 items. + /// Creates a new with 7 items. /// /// The head of the chain. /// Item 1. @@ -1539,6 +1771,69 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; } + /// + /// Creates a new with 7 items. + /// + /// The chain to append to. + /// Item 6. + /// + /// Do not forget to dispose the chain if you are no longer using it. + /// + public ManagedChain(ManagedChain previous, T6 item6 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + var item6Size = Marshal.SizeOf(); + + var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size; + var newSize = originalSize + item6Size; + + _headPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + + _item1Ptr = _headPtr + headSize; + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + // Append the last structure + item6.StructureType(); + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + } + + /// + /// Creates a new with 8 items, by appending to + /// the end of this chain. + /// + /// Item 7. + /// Type of Item 7 + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Append(T7 item7 = default) + where T7: struct, IExtendsChain + { + return new ManagedChain(this, item7); + } + /// public void Dispose() { @@ -1564,6 +1859,7 @@ public void Dispose() Marshal.FreeHGlobal(headPtr); } } + /// /// A safely manages the pointers of a managed structure chain. /// @@ -1756,7 +2052,7 @@ public T7 Item7 } /// - /// Creates a new with 3 items. + /// Creates a new with 8 items. /// /// The head of the chain. /// Item 1. @@ -1818,6 +2114,73 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; } + /// + /// Creates a new with 8 items. + /// + /// The chain to append to. + /// Item 7. + /// + /// Do not forget to dispose the chain if you are no longer using it. + /// + public ManagedChain(ManagedChain previous, T7 item7 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + var item6Size = Marshal.SizeOf(); + var item7Size = Marshal.SizeOf(); + + var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size; + var newSize = originalSize + item7Size; + + _headPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + + _item1Ptr = _headPtr + headSize; + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + // Append the last structure + item7.StructureType(); + Marshal.StructureToPtr(item7, _item7Ptr, false); + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + } + + /// + /// Creates a new with 9 items, by appending to + /// the end of this chain. + /// + /// Item 8. + /// Type of Item 8 + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Append(T8 item8 = default) + where T8: struct, IExtendsChain + { + return new ManagedChain(this, item8); + } + /// public void Dispose() { @@ -1845,6 +2208,7 @@ public void Dispose() Marshal.FreeHGlobal(headPtr); } } + /// /// A safely manages the pointers of a managed structure chain. /// @@ -2060,7 +2424,7 @@ public T8 Item8 } /// - /// Creates a new with 3 items. + /// Creates a new with 9 items. /// /// The head of the chain. /// Item 1. @@ -2129,16 +2493,87 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; } - /// - public void Dispose() + /// + /// Creates a new with 9 items. + /// + /// The chain to append to. + /// Item 8. + /// + /// Do not forget to dispose the chain if you are no longer using it. + /// + public ManagedChain(ManagedChain previous, T8 item8 = default) { - var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); - if (headPtr == IntPtr.Zero) return; - - // Destroy all structures - Marshal.DestroyStructure(headPtr); - var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item1Ptr); + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + var item6Size = Marshal.SizeOf(); + var item7Size = Marshal.SizeOf(); + var item8Size = Marshal.SizeOf(); + + var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size; + var newSize = originalSize + item8Size; + + _headPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + + _item1Ptr = _headPtr + headSize; + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + // Append the last structure + item8.StructureType(); + Marshal.StructureToPtr(item8, _item8Ptr, false); + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + } + + /// + /// Creates a new with 10 items, by appending to + /// the end of this chain. + /// + /// Item 9. + /// Type of Item 9 + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Append(T9 item9 = default) + where T9: struct, IExtendsChain + { + return new ManagedChain(this, item9); + } + + /// + public void Dispose() + { + var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); + if (headPtr == IntPtr.Zero) return; + + // Destroy all structures + Marshal.DestroyStructure(headPtr); + var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item1Ptr); var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); Marshal.DestroyStructure(item2Ptr); var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); @@ -2158,6 +2593,7 @@ public void Dispose() Marshal.FreeHGlobal(headPtr); } } + /// /// A safely manages the pointers of a managed structure chain. /// @@ -2396,7 +2832,7 @@ public T9 Item9 } /// - /// Creates a new with 3 items. + /// Creates a new with 10 items. /// /// The head of the chain. /// Item 1. @@ -2472,6 +2908,81 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; } + /// + /// Creates a new with 10 items. + /// + /// The chain to append to. + /// Item 9. + /// + /// Do not forget to dispose the chain if you are no longer using it. + /// + public ManagedChain(ManagedChain previous, T9 item9 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + var item6Size = Marshal.SizeOf(); + var item7Size = Marshal.SizeOf(); + var item8Size = Marshal.SizeOf(); + var item9Size = Marshal.SizeOf(); + + var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size; + var newSize = originalSize + item9Size; + + _headPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + + _item1Ptr = _headPtr + headSize; + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + + _item9Ptr = _item8Ptr + item8Size; + // Append the last structure + item9.StructureType(); + Marshal.StructureToPtr(item9, _item9Ptr, false); + ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + } + + /// + /// Creates a new with 11 items, by appending to + /// the end of this chain. + /// + /// Item 10. + /// Type of Item 10 + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Append(T10 item10 = default) + where T10: struct, IExtendsChain + { + return new ManagedChain(this, item10); + } + /// public void Dispose() { @@ -2503,6 +3014,7 @@ public void Dispose() Marshal.FreeHGlobal(headPtr); } } + /// /// A safely manages the pointers of a managed structure chain. /// @@ -2764,7 +3276,7 @@ public T10 Item10 } /// - /// Creates a new with 3 items. + /// Creates a new with 11 items. /// /// The head of the chain. /// Item 1. @@ -2847,6 +3359,85 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; } + /// + /// Creates a new with 11 items. + /// + /// The chain to append to. + /// Item 10. + /// + /// Do not forget to dispose the chain if you are no longer using it. + /// + public ManagedChain(ManagedChain previous, T10 item10 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + var item6Size = Marshal.SizeOf(); + var item7Size = Marshal.SizeOf(); + var item8Size = Marshal.SizeOf(); + var item9Size = Marshal.SizeOf(); + var item10Size = Marshal.SizeOf(); + + var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size; + var newSize = originalSize + item10Size; + + _headPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + + _item1Ptr = _headPtr + headSize; + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + + _item9Ptr = _item8Ptr + item8Size; + ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + + _item10Ptr = _item9Ptr + item9Size; + // Append the last structure + item10.StructureType(); + Marshal.StructureToPtr(item10, _item10Ptr, false); + ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; + } + + /// + /// Creates a new with 12 items, by appending to + /// the end of this chain. + /// + /// Item 11. + /// Type of Item 11 + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Append(T11 item11 = default) + where T11: struct, IExtendsChain + { + return new ManagedChain(this, item11); + } + /// public void Dispose() { @@ -2880,6 +3471,7 @@ public void Dispose() Marshal.FreeHGlobal(headPtr); } } + /// /// A safely manages the pointers of a managed structure chain. /// @@ -3164,7 +3756,7 @@ public T11 Item11 } /// - /// Creates a new with 3 items. + /// Creates a new with 12 items. /// /// The head of the chain. /// Item 1. @@ -3254,6 +3846,89 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; } + /// + /// Creates a new with 12 items. + /// + /// The chain to append to. + /// Item 11. + /// + /// Do not forget to dispose the chain if you are no longer using it. + /// + public ManagedChain(ManagedChain previous, T11 item11 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + var item6Size = Marshal.SizeOf(); + var item7Size = Marshal.SizeOf(); + var item8Size = Marshal.SizeOf(); + var item9Size = Marshal.SizeOf(); + var item10Size = Marshal.SizeOf(); + var item11Size = Marshal.SizeOf(); + + var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size; + var newSize = originalSize + item11Size; + + _headPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + + _item1Ptr = _headPtr + headSize; + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + + _item9Ptr = _item8Ptr + item8Size; + ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + + _item10Ptr = _item9Ptr + item9Size; + ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; + + _item11Ptr = _item10Ptr + item10Size; + // Append the last structure + item11.StructureType(); + Marshal.StructureToPtr(item11, _item11Ptr, false); + ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; + } + + /// + /// Creates a new with 13 items, by appending to + /// the end of this chain. + /// + /// Item 12. + /// Type of Item 12 + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Append(T12 item12 = default) + where T12: struct, IExtendsChain + { + return new ManagedChain(this, item12); + } + /// public void Dispose() { @@ -3289,6 +3964,7 @@ public void Dispose() Marshal.FreeHGlobal(headPtr); } } + /// /// A safely manages the pointers of a managed structure chain. /// @@ -3596,7 +4272,7 @@ public T12 Item12 } /// - /// Creates a new with 3 items. + /// Creates a new with 13 items. /// /// The head of the chain. /// Item 1. @@ -3628,71 +4304,158 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul var item11Size = Marshal.SizeOf(); var item12Size = Marshal.SizeOf(); - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + item12Size); - head.StructureType(); - Marshal.StructureToPtr(head, _headPtr, false); + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + item12Size); + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + item1.StructureType(); + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + item2.StructureType(); + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + item3.StructureType(); + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + item4.StructureType(); + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + item5.StructureType(); + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + item6.StructureType(); + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + item7.StructureType(); + Marshal.StructureToPtr(item7, _item7Ptr, false); + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + item8.StructureType(); + Marshal.StructureToPtr(item8, _item8Ptr, false); + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + + _item9Ptr = _item8Ptr + item8Size; + item9.StructureType(); + Marshal.StructureToPtr(item9, _item9Ptr, false); + ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + + _item10Ptr = _item9Ptr + item9Size; + item10.StructureType(); + Marshal.StructureToPtr(item10, _item10Ptr, false); + ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; + + _item11Ptr = _item10Ptr + item10Size; + item11.StructureType(); + Marshal.StructureToPtr(item11, _item11Ptr, false); + ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; + + _item12Ptr = _item11Ptr + item11Size; + item12.StructureType(); + Marshal.StructureToPtr(item12, _item12Ptr, false); + ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; + } + + /// + /// Creates a new with 13 items. + /// + /// The chain to append to. + /// Item 12. + /// + /// Do not forget to dispose the chain if you are no longer using it. + /// + public ManagedChain(ManagedChain previous, T12 item12 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + var item6Size = Marshal.SizeOf(); + var item7Size = Marshal.SizeOf(); + var item8Size = Marshal.SizeOf(); + var item9Size = Marshal.SizeOf(); + var item10Size = Marshal.SizeOf(); + var item11Size = Marshal.SizeOf(); + var item12Size = Marshal.SizeOf(); + + var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size; + var newSize = originalSize + item12Size; + + _headPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); _item1Ptr = _headPtr + headSize; - item1.StructureType(); - Marshal.StructureToPtr(item1, _item1Ptr, false); ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; _item2Ptr = _item1Ptr + item1Size; - item2.StructureType(); - Marshal.StructureToPtr(item2, _item2Ptr, false); ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; _item3Ptr = _item2Ptr + item2Size; - item3.StructureType(); - Marshal.StructureToPtr(item3, _item3Ptr, false); ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; _item4Ptr = _item3Ptr + item3Size; - item4.StructureType(); - Marshal.StructureToPtr(item4, _item4Ptr, false); ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; _item5Ptr = _item4Ptr + item4Size; - item5.StructureType(); - Marshal.StructureToPtr(item5, _item5Ptr, false); ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; _item6Ptr = _item5Ptr + item5Size; - item6.StructureType(); - Marshal.StructureToPtr(item6, _item6Ptr, false); ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; _item7Ptr = _item6Ptr + item6Size; - item7.StructureType(); - Marshal.StructureToPtr(item7, _item7Ptr, false); ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; _item8Ptr = _item7Ptr + item7Size; - item8.StructureType(); - Marshal.StructureToPtr(item8, _item8Ptr, false); ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; _item9Ptr = _item8Ptr + item8Size; - item9.StructureType(); - Marshal.StructureToPtr(item9, _item9Ptr, false); ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; _item10Ptr = _item9Ptr + item9Size; - item10.StructureType(); - Marshal.StructureToPtr(item10, _item10Ptr, false); ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; _item11Ptr = _item10Ptr + item10Size; - item11.StructureType(); - Marshal.StructureToPtr(item11, _item11Ptr, false); ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; _item12Ptr = _item11Ptr + item11Size; + // Append the last structure item12.StructureType(); Marshal.StructureToPtr(item12, _item12Ptr, false); ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; } + /// + /// Creates a new with 14 items, by appending to + /// the end of this chain. + /// + /// Item 13. + /// Type of Item 13 + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Append(T13 item13 = default) + where T13: struct, IExtendsChain + { + return new ManagedChain(this, item13); + } + /// public void Dispose() { @@ -3730,6 +4493,7 @@ public void Dispose() Marshal.FreeHGlobal(headPtr); } } + /// /// A safely manages the pointers of a managed structure chain. /// @@ -4060,7 +4824,7 @@ public T13 Item13 } /// - /// Creates a new with 3 items. + /// Creates a new with 14 items. /// /// The head of the chain. /// Item 1. @@ -4164,6 +4928,97 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul ((Chain*) _item12Ptr)->PNext = (Chain*) _item13Ptr; } + /// + /// Creates a new with 14 items. + /// + /// The chain to append to. + /// Item 13. + /// + /// Do not forget to dispose the chain if you are no longer using it. + /// + public ManagedChain(ManagedChain previous, T13 item13 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + var item6Size = Marshal.SizeOf(); + var item7Size = Marshal.SizeOf(); + var item8Size = Marshal.SizeOf(); + var item9Size = Marshal.SizeOf(); + var item10Size = Marshal.SizeOf(); + var item11Size = Marshal.SizeOf(); + var item12Size = Marshal.SizeOf(); + var item13Size = Marshal.SizeOf(); + + var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + item12Size; + var newSize = originalSize + item13Size; + + _headPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + + _item1Ptr = _headPtr + headSize; + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + + _item9Ptr = _item8Ptr + item8Size; + ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + + _item10Ptr = _item9Ptr + item9Size; + ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; + + _item11Ptr = _item10Ptr + item10Size; + ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; + + _item12Ptr = _item11Ptr + item11Size; + ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; + + _item13Ptr = _item12Ptr + item12Size; + // Append the last structure + item13.StructureType(); + Marshal.StructureToPtr(item13, _item13Ptr, false); + ((Chain*) _item12Ptr)->PNext = (Chain*) _item13Ptr; + } + + /// + /// Creates a new with 15 items, by appending to + /// the end of this chain. + /// + /// Item 14. + /// Type of Item 14 + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Append(T14 item14 = default) + where T14: struct, IExtendsChain + { + return new ManagedChain(this, item14); + } + /// public void Dispose() { @@ -4203,6 +5058,7 @@ public void Dispose() Marshal.FreeHGlobal(headPtr); } } + /// /// A safely manages the pointers of a managed structure chain. /// @@ -4556,7 +5412,7 @@ public T14 Item14 } /// - /// Creates a new with 3 items. + /// Creates a new with 15 items. /// /// The head of the chain. /// Item 1. @@ -4667,6 +5523,101 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul ((Chain*) _item13Ptr)->PNext = (Chain*) _item14Ptr; } + /// + /// Creates a new with 15 items. + /// + /// The chain to append to. + /// Item 14. + /// + /// Do not forget to dispose the chain if you are no longer using it. + /// + public ManagedChain(ManagedChain previous, T14 item14 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + var item6Size = Marshal.SizeOf(); + var item7Size = Marshal.SizeOf(); + var item8Size = Marshal.SizeOf(); + var item9Size = Marshal.SizeOf(); + var item10Size = Marshal.SizeOf(); + var item11Size = Marshal.SizeOf(); + var item12Size = Marshal.SizeOf(); + var item13Size = Marshal.SizeOf(); + var item14Size = Marshal.SizeOf(); + + var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + item12Size + item13Size; + var newSize = originalSize + item14Size; + + _headPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + + _item1Ptr = _headPtr + headSize; + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + + _item9Ptr = _item8Ptr + item8Size; + ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + + _item10Ptr = _item9Ptr + item9Size; + ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; + + _item11Ptr = _item10Ptr + item10Size; + ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; + + _item12Ptr = _item11Ptr + item11Size; + ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; + + _item13Ptr = _item12Ptr + item12Size; + ((Chain*) _item12Ptr)->PNext = (Chain*) _item13Ptr; + + _item14Ptr = _item13Ptr + item13Size; + // Append the last structure + item14.StructureType(); + Marshal.StructureToPtr(item14, _item14Ptr, false); + ((Chain*) _item13Ptr)->PNext = (Chain*) _item14Ptr; + } + + /// + /// Creates a new with 16 items, by appending to + /// the end of this chain. + /// + /// Item 15. + /// Type of Item 15 + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Append(T15 item15 = default) + where T15: struct, IExtendsChain + { + return new ManagedChain(this, item15); + } + /// public void Dispose() { @@ -4708,6 +5659,7 @@ public void Dispose() Marshal.FreeHGlobal(headPtr); } } + /// /// A safely manages the pointers of a managed structure chain. /// @@ -5084,7 +6036,7 @@ public T15 Item15 } /// - /// Creates a new with 3 items. + /// Creates a new with 16 items. /// /// The head of the chain. /// Item 1. @@ -5202,6 +6154,90 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul ((Chain*) _item14Ptr)->PNext = (Chain*) _item15Ptr; } + /// + /// Creates a new with 16 items. + /// + /// The chain to append to. + /// Item 15. + /// + /// Do not forget to dispose the chain if you are no longer using it. + /// + public ManagedChain(ManagedChain previous, T15 item15 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + var item6Size = Marshal.SizeOf(); + var item7Size = Marshal.SizeOf(); + var item8Size = Marshal.SizeOf(); + var item9Size = Marshal.SizeOf(); + var item10Size = Marshal.SizeOf(); + var item11Size = Marshal.SizeOf(); + var item12Size = Marshal.SizeOf(); + var item13Size = Marshal.SizeOf(); + var item14Size = Marshal.SizeOf(); + var item15Size = Marshal.SizeOf(); + + var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + item12Size + item13Size + item14Size; + var newSize = originalSize + item15Size; + + _headPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + + _item1Ptr = _headPtr + headSize; + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + + _item9Ptr = _item8Ptr + item8Size; + ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + + _item10Ptr = _item9Ptr + item9Size; + ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; + + _item11Ptr = _item10Ptr + item10Size; + ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; + + _item12Ptr = _item11Ptr + item11Size; + ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; + + _item13Ptr = _item12Ptr + item12Size; + ((Chain*) _item12Ptr)->PNext = (Chain*) _item13Ptr; + + _item14Ptr = _item13Ptr + item13Size; + ((Chain*) _item13Ptr)->PNext = (Chain*) _item14Ptr; + + _item15Ptr = _item14Ptr + item14Size; + // Append the last structure + item15.StructureType(); + Marshal.StructureToPtr(item15, _item15Ptr, false); + ((Chain*) _item14Ptr)->PNext = (Chain*) _item15Ptr; + } + /// public void Dispose() { diff --git a/PrototypeStructChaining/ManagedChain.tt b/PrototypeStructChaining/ManagedChain.tt index ea244293d7..89df1c60b2 100644 --- a/PrototypeStructChaining/ManagedChain.tt +++ b/PrototypeStructChaining/ManagedChain.tt @@ -126,12 +126,12 @@ public static class ManagedChain } // for (var 2 = 1; i <= maximumItems; i++) { #> } - <# for (var i = 2; i <= maximumItems; i++) { var tList = typeList(i); #> + /// /// A safely manages the pointers of a managed structure chain. /// @@ -191,7 +191,7 @@ public unsafe class ManagedChain<<#= tList #>> : IDisposable #> /// - /// Creates a new with 3 items. + /// Creates a new with <#= i #> items. /// <#= parameterDocs(i, " /// ") #> public ManagedChain(<#= paramList(i) #>) @@ -231,6 +231,90 @@ public unsafe class ManagedChain<<#= tList #>> : IDisposable } // for (int j = 1; j < i; j++) { #> } +<# + if (i > 2) + { +#> + + /// + /// Creates a new with <#= i #> items. + /// + /// The chain to append to. + /// Item <#= i - 1 #>. + /// + /// Do not forget to dispose the chain if you are no longer using it. + /// + public ManagedChain(ManagedChain<<#= typeList(i - 1) #>> previous, T<#= i - 1 #> item<#= i - 1 #> = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); +<# + for (var j = 1; j < i; j++) + { +#> + var item<#= j #>Size = Marshal.SizeOf>(); +<# + } // for (int j = 1; j < i; j++) { +#> + + var originalSize = headSize<# + for (var j = 1; j < i - 1; j++) + { +#> + item<#= j #>Size<# + } // for (int j = 1; j < i; j++) { +#>; + var newSize = originalSize + item<#= i - 1 #>Size; + + _headPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); +<# + for (var j = 1; j < i; j++) + { + var prevItem = j > 1 + ? $"item{j - 1}" + : "head"; +#> + + _item<#= j #>Ptr = _<#= prevItem #>Ptr + <#= prevItem #>Size; +<# + if (j == i - 1) + {#> + // Append the last structure + item<#= j #>.StructureType(); + Marshal.StructureToPtr(item<#= j #>, _item<#= j #>Ptr, false); +<# + } // if (j == i - 1) + #> + ((Chain*) _<#= prevItem #>Ptr)->PNext = (Chain*) _item<#= j #>Ptr; +<# + } // for (int j = 1; j < i; j++) { +#> + } +<# + } //if (i > 2) + + if (i < maximumItems) + { +#> + + /// + /// Creates a new with <#= i + 1 #> items, by appending to + /// the end of this chain. + /// + /// Item <#= i #>. + /// Type of Item <#= i #> + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain<<#= tList #>, T<#= i #>> Append>(T<#= i #> item<#= i #> = default) + where T<#= i #>: struct, IExtendsChain + { + return new ManagedChain<<#= tList #>, T<#= i #>>(this, item<#= i #>); + } +<# + } // if (i < maximumItems) +#> /// public void Dispose() @@ -244,8 +328,8 @@ public unsafe class ManagedChain<<#= tList #>> : IDisposable for (var j = 1; j < i; j++) { #> - var item<#=j#>Ptr = Interlocked.Exchange(ref _item<#=j#>Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item<#=j#>Ptr); + var item<#= j #>Ptr = Interlocked.Exchange(ref _item<#= j #>Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item<#= j #>Ptr); <# } // for (int j = 1; j < i; j++) { #> diff --git a/Readme.md b/Readme.md index a2e8f5b431..5efa2bc43f 100644 --- a/Readme.md +++ b/Readme.md @@ -248,4 +248,19 @@ Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, chain.Item1 **Note** When we update any item in the chain it overwrites the existing memory, so the ptrs remain fixed. It also ensures the PNext value is maintained. -You can also use the `ManagedChain.Create(...)` static methods to create `ManagedChain`s. \ No newline at end of file +You can also use the `ManagedChain.Create(...)` static methods to create `ManagedChain`s. + +Finally, you can call append on a `ManagedChain` to create a new, larger, `ManagedChain` with a new item appended to the +end, e.g: + +```csharp +using var chain = new ManagedChain( + item1: new PhysicalDeviceDescriptorIndexingFeatures {ShaderInputAttachmentArrayDynamicIndexing = true}); + +// The new chain, will efficiently copy the old chain and append a new structure to the end +using var newChain = chain.Append(); +// You will usualy wish to dispose the old chain here, the two chains are now independent of each other. + +// Check the flag from the first chain is still set in the new chain. +Assert.True(newChain.Item1.ShaderInputAttachmentArrayDynamicIndexing); +``` \ No newline at end of file From ea96e2a060d74861a2799f15e63a48a26e1965b0 Mon Sep 17 00:00:00 2001 From: Craig Dean Date: Fri, 5 Nov 2021 23:38:16 +0000 Subject: [PATCH 13/42] feat: Loading of unmanaged chains `ManagedChain` now has a constructor that will load an unmanaged chain allowing it to be safely stored on the heap. --- .../TestManagedChains.cs | 79 +- .../{ManagedChain.cs => ManagedChain.gen.cs} | 3776 ++++++++++++++++- .../{ManagedChain.tt => ManagedChain.gen.tt} | 71 +- .../PrototypeStructChaining.csproj | 33 +- Readme.md | 80 +- 5 files changed, 3898 insertions(+), 141 deletions(-) rename PrototypeStructChaining/{ManagedChain.cs => ManagedChain.gen.cs} (61%) rename PrototypeStructChaining/{ManagedChain.tt => ManagedChain.gen.tt} (80%) diff --git a/PrototypeStructChaining.Test/TestManagedChains.cs b/PrototypeStructChaining.Test/TestManagedChains.cs index e2dca905b8..6bbf0eb889 100644 --- a/PrototypeStructChaining.Test/TestManagedChains.cs +++ b/PrototypeStructChaining.Test/TestManagedChains.cs @@ -101,7 +101,7 @@ public unsafe void TestManagedChainReplaceMiddle() // As is the SType Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, chain.Item1.SType); } - + [Fact] public unsafe void TestManagedChainAppend() { @@ -115,12 +115,12 @@ public unsafe void TestManagedChainAppend() // Ensure pointers set correctly Assert.Equal((nint) chain.Item1Ptr, (nint) chain.Head.PNext); Assert.Equal((nint) 0, (nint) chain.Item1.PNext); - + // Check flag set Assert.True(chain.Item1.ShaderInputAttachmentArrayDynamicIndexing); using var newChain = chain.Append(); - + // Ensure all STypes set correctly Assert.Equal(StructureType.PhysicalDeviceFeatures2, newChain.Head.SType); Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, newChain.Item1.SType); @@ -130,12 +130,81 @@ public unsafe void TestManagedChainAppend() Assert.Equal((nint) newChain.Item1Ptr, (nint) newChain.Head.PNext); Assert.Equal((nint) newChain.Item2Ptr, (nint) newChain.Item1.PNext); Assert.Equal((nint) 0, (nint) newChain.Item2.PNext); - + // Check flag still set Assert.True(newChain.Item1.ShaderInputAttachmentArrayDynamicIndexing); - + // Check we have new copies Assert.NotEqual((nint) chain.HeadPtr, (nint) newChain.HeadPtr); Assert.NotEqual((nint) chain.Item1Ptr, (nint) newChain.Item1Ptr); } + + [Fact] + public unsafe void TestManagedChainLoad() + { + // Load an unmanaged chain + var indexingFeatures = new PhysicalDeviceDescriptorIndexingFeatures + { + ShaderInputAttachmentArrayDynamicIndexing = true + }; + PhysicalDeviceFeatures2 + .Chain(out var unmanagedChain) + .SetNext(ref indexingFeatures) + .AddNext(out PhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeaturesKhr); + + // Loads a new managed chain from an unmanaged chain + using var managedChain = + new ManagedChain(unmanagedChain, out var errors); + + // Check we had no loading errors + Assert.Equal("", errors); + + // Check the flag still set + Assert.True(managedChain.Item1.ShaderInputAttachmentArrayDynamicIndexing); + + // Ensure all STypes set correctly + Assert.Equal(StructureType.PhysicalDeviceFeatures2, managedChain.Head.SType); + Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, managedChain.Item1.SType); + Assert.Equal(StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr, managedChain.Item2.SType); + + // Ensure pointers set correctly + Assert.Equal((nint) managedChain.Item1Ptr, (nint) managedChain.Head.PNext); + Assert.Equal((nint) managedChain.Item2Ptr, (nint) managedChain.Item1.PNext); + Assert.Equal((nint) 0, (nint) managedChain.Item2.PNext); + } + + [Fact] + public unsafe void TestManagedChainLoadWithError() + { + var indexingFeatures = new PhysicalDeviceDescriptorIndexingFeatures + { + ShaderInputAttachmentArrayDynamicIndexing = true + }; + // Load an unmanaged chain + DeviceCreateInfo + .Chain(out var unmanagedChain) + .AddNext(out PhysicalDeviceFeatures2 features2) + .SetNext(ref indexingFeatures) + .AddNext(out PhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeaturesKhr); + + // Loads a new managed chain from an unmanaged chain + using var managedChain = + new ManagedChain< + DeviceCreateInfo, + // Note we are supplied a PhysicalDeviceFeatures2 here from the unmanaged chain + PhysicalDeviceAccelerationStructureFeaturesKHR, + PhysicalDeviceDescriptorIndexingFeatures, + PhysicalDeviceAccelerationStructureFeaturesKHR, + // Note that the unmanaged chain did not supply a 5th entry + PhysicalDeviceFeatures2>(unmanagedChain, out var errors); + + // Check for errors + Assert.Equal( + @"The unmanaged chain has a structure type PhysicalDeviceFeatures2Khr at position 2; expected PhysicalDeviceAccelerationStructureFeaturesKhr +The unmanaged chain was length 4, expected length 5", errors); + + // Despite the errors indexing features was at the right location so was loaded + Assert.True(managedChain.Item2.ShaderInputAttachmentArrayDynamicIndexing); + } } \ No newline at end of file diff --git a/PrototypeStructChaining/ManagedChain.cs b/PrototypeStructChaining/ManagedChain.gen.cs similarity index 61% rename from PrototypeStructChaining/ManagedChain.cs rename to PrototypeStructChaining/ManagedChain.gen.cs index 26c14b2aad..0a58ef2b0b 100644 --- a/PrototypeStructChaining/ManagedChain.cs +++ b/PrototypeStructChaining/ManagedChain.gen.cs @@ -1,5 +1,6 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; +using System.Text; namespace Silk.Net.Vulkan; @@ -20,7 +21,7 @@ public static ManagedChain Create(TChain head = default, where TChain : struct, IChainStart where T1 : struct, IExtendsChain { - return new(head, item1); + return new ManagedChain(head, item1); } /// @@ -33,12 +34,13 @@ public static ManagedChain Create(TChain head = default, /// Type of Item 1. /// Type of Item 2. /// A new with 3 items. - public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default) + public static ManagedChain Create(TChain head = default, T1 item1 = default, + T2 item2 = default) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain { - return new(head, item1, item2); + return new ManagedChain(head, item1, item2); } /// @@ -53,13 +55,14 @@ public static ManagedChain Create(TChain head = /// Type of Item 2. /// Type of Item 3. /// A new with 4 items. - public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default) + public static ManagedChain Create(TChain head = default, T1 item1 = default, + T2 item2 = default, T3 item3 = default) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain where T3 : struct, IExtendsChain { - return new(head, item1, item2, item3); + return new ManagedChain(head, item1, item2, item3); } /// @@ -76,14 +79,15 @@ public static ManagedChain Create(TChain /// Type of Item 3. /// Type of Item 4. /// A new with 5 items. - public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default) + public static ManagedChain Create(TChain head = default, + T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain where T3 : struct, IExtendsChain where T4 : struct, IExtendsChain { - return new(head, item1, item2, item3, item4); + return new ManagedChain(head, item1, item2, item3, item4); } /// @@ -102,7 +106,8 @@ public static ManagedChain CreateType of Item 4. /// Type of Item 5. /// A new with 6 items. - public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default) + public static ManagedChain Create(TChain head = default, + T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain @@ -110,7 +115,7 @@ public static ManagedChain Create where T5 : struct, IExtendsChain { - return new(head, item1, item2, item3, item4, item5); + return new ManagedChain(head, item1, item2, item3, item4, item5); } /// @@ -131,7 +136,9 @@ public static ManagedChain CreateType of Item 5. /// Type of Item 6. /// A new with 7 items. - public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default) + public static ManagedChain Create( + TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, + T5 item5 = default, T6 item6 = default) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain @@ -140,7 +147,7 @@ public static ManagedChain Create where T6 : struct, IExtendsChain { - return new(head, item1, item2, item3, item4, item5, item6); + return new ManagedChain(head, item1, item2, item3, item4, item5, item6); } /// @@ -163,7 +170,9 @@ public static ManagedChain CreateType of Item 6. /// Type of Item 7. /// A new with 8 items. - public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default) + public static ManagedChain Create( + TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, + T5 item5 = default, T6 item6 = default, T7 item7 = default) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain @@ -173,7 +182,8 @@ public static ManagedChain Create where T7 : struct, IExtendsChain { - return new(head, item1, item2, item3, item4, item5, item6, item7); + return new ManagedChain(head, item1, item2, item3, item4, item5, item6, + item7); } /// @@ -198,7 +208,9 @@ public static ManagedChain CreateType of Item 7. /// Type of Item 8. /// A new with 9 items. - public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default) + public static ManagedChain Create( + TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, + T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain @@ -209,7 +221,8 @@ public static ManagedChain Create where T8 : struct, IExtendsChain { - return new(head, item1, item2, item3, item4, item5, item6, item7, item8); + return new ManagedChain(head, item1, item2, item3, item4, item5, item6, + item7, item8); } /// @@ -236,7 +249,10 @@ public static ManagedChain CreateType of Item 8. /// Type of Item 9. /// A new with 10 items. - public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default) + public static ManagedChain + Create(TChain head = default, T1 item1 = default, + T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, + T7 item7 = default, T8 item8 = default, T9 item9 = default) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain @@ -248,7 +264,8 @@ public static ManagedChain Create where T9 : struct, IExtendsChain { - return new(head, item1, item2, item3, item4, item5, item6, item7, item8, item9); + return new ManagedChain(head, item1, item2, item3, item4, item5, + item6, item7, item8, item9); } /// @@ -277,7 +294,10 @@ public static ManagedChain CreateType of Item 9. /// Type of Item 10. /// A new with 11 items. - public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default) + public static ManagedChain + Create(TChain head = default, T1 item1 = default, + T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, + T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain @@ -290,7 +310,8 @@ public static ManagedChain Crea where T9 : struct, IExtendsChain where T10 : struct, IExtendsChain { - return new(head, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10); + return new ManagedChain(head, item1, item2, item3, item4, + item5, item6, item7, item8, item9, item10); } /// @@ -321,7 +342,10 @@ public static ManagedChain Crea /// Type of Item 10. /// Type of Item 11. /// A new with 12 items. - public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default) + public static ManagedChain + Create(TChain head = default, T1 item1 = default, + T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, + T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain @@ -335,7 +359,8 @@ public static ManagedChain where T10 : struct, IExtendsChain where T11 : struct, IExtendsChain { - return new(head, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11); + return new ManagedChain(head, item1, item2, item3, item4, + item5, item6, item7, item8, item9, item10, item11); } /// @@ -368,7 +393,11 @@ public static ManagedChain /// Type of Item 11. /// Type of Item 12. /// A new with 13 items. - public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default) + public static ManagedChain + Create(TChain head = default, T1 item1 = default, + T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, + T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, + T12 item12 = default) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain @@ -383,7 +412,8 @@ public static ManagedChain where T12 : struct, IExtendsChain { - return new(head, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12); + return new ManagedChain(head, item1, item2, item3, + item4, item5, item6, item7, item8, item9, item10, item11, item12); } /// @@ -418,7 +448,11 @@ public static ManagedChainType of Item 12. /// Type of Item 13. /// A new with 14 items. - public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default, T13 item13 = default) + public static ManagedChain + Create(TChain head = default, + T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, + T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, + T11 item11 = default, T12 item12 = default, T13 item13 = default) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain @@ -434,7 +468,8 @@ public static ManagedChain where T13 : struct, IExtendsChain { - return new(head, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13); + return new ManagedChain(head, item1, item2, + item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13); } /// @@ -471,7 +506,11 @@ public static ManagedChainType of Item 13. /// Type of Item 14. /// A new with 15 items. - public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default, T13 item13 = default, T14 item14 = default) + public static ManagedChain + Create(TChain head = default, + T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, + T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, + T11 item11 = default, T12 item12 = default, T13 item13 = default, T14 item14 = default) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain @@ -488,7 +527,8 @@ public static ManagedChain where T14 : struct, IExtendsChain { - return new(head, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13, item14); + return new ManagedChain(head, item1, item2, + item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13, item14); } /// @@ -527,7 +567,12 @@ public static ManagedChainType of Item 14. /// Type of Item 15. /// A new with 16 items. - public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default, T13 item13 = default, T14 item14 = default, T15 item15 = default) + public static ManagedChain + Create(TChain head = default, + T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, + T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, + T11 item11 = default, T12 item12 = default, T13 item13 = default, T14 item14 = default, + T15 item15 = default) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain @@ -545,9 +590,9 @@ public static ManagedChain where T15 : struct, IExtendsChain { - return new(head, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13, item14, item15); + return new ManagedChain(head, item1, + item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13, item14, item15); } - } /// @@ -624,6 +669,53 @@ public ManagedChain(TChain head = default, T1 item1 = default) ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; } + /// + /// Creates a new with 2 items from an existing unmanaged chain. + /// + /// The unmanaged chain to use as the basis of this chain. + /// Any errors loading the chain. + public ManagedChain(TChain chain, out string errors) + { + // Load existing chain first, so any errors occur before we allocate memory + var head = chain; + var headSize = Marshal.SizeOf(); + var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); + StructureType expectedStructureType; + var errorBuilder = new StringBuilder(); + + currentPtr = currentPtr->PNext; + T1 item1 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 2"); + else + { + expectedStructureType = item1.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 2; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item1 = Unsafe.AsRef(currentPtr); + } + + var item1Size = Marshal.SizeOf(); + + + // Create string of errors + errors = errorBuilder.ToString().Trim(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + } + /// /// Creates a new with 3 items, by appending to /// the end of this chain. @@ -634,7 +726,7 @@ public ManagedChain(TChain head = default, T1 item1 = default) /// Do not forget to dispose this chain if you are no longer using it. /// public ManagedChain Append(T2 item2 = default) - where T2: struct, IExtendsChain + where T2 : struct, IExtendsChain { return new ManagedChain(this, item2); } @@ -709,6 +801,7 @@ public T1 Item1 ((Chain*) _item1Ptr)->PNext = nextPtr; } } + private IntPtr _item2Ptr; /// @@ -759,6 +852,78 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; } + /// + /// Creates a new with 3 items from an existing unmanaged chain. + /// + /// The unmanaged chain to use as the basis of this chain. + /// Any errors loading the chain. + public ManagedChain(TChain chain, out string errors) + { + // Load existing chain first, so any errors occur before we allocate memory + var head = chain; + var headSize = Marshal.SizeOf(); + var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); + StructureType expectedStructureType; + var errorBuilder = new StringBuilder(); + + currentPtr = currentPtr->PNext; + T1 item1 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 3"); + else + { + expectedStructureType = item1.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 2; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item1 = Unsafe.AsRef(currentPtr); + } + + var item1Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T2 item2 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 3"); + else + { + expectedStructureType = item2.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 3; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item2 = Unsafe.AsRef(currentPtr); + } + + var item2Size = Marshal.SizeOf(); + + + // Create string of errors + errors = errorBuilder.ToString().Trim(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + } + /// /// Creates a new with 3 items. /// @@ -779,7 +944,7 @@ public ManagedChain(ManagedChain previous, T2 item2 = default) _headPtr = Marshal.AllocHGlobal(newSize); // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + Buffer.MemoryCopy(previous.HeadPtr, (void*) _headPtr, originalSize, originalSize); _item1Ptr = _headPtr + headSize; ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; @@ -801,7 +966,7 @@ public ManagedChain(ManagedChain previous, T2 item2 = default) /// Do not forget to dispose this chain if you are no longer using it. /// public ManagedChain Append(T3 item3 = default) - where T3: struct, IExtendsChain + where T3 : struct, IExtendsChain { return new ManagedChain(this, item3); } @@ -880,6 +1045,7 @@ public T1 Item1 ((Chain*) _item1Ptr)->PNext = nextPtr; } } + private IntPtr _item2Ptr; /// @@ -901,6 +1067,7 @@ public T2 Item2 ((Chain*) _item2Ptr)->PNext = nextPtr; } } + private IntPtr _item3Ptr; /// @@ -958,6 +1125,103 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; } + /// + /// Creates a new with 4 items from an existing unmanaged chain. + /// + /// The unmanaged chain to use as the basis of this chain. + /// Any errors loading the chain. + public ManagedChain(TChain chain, out string errors) + { + // Load existing chain first, so any errors occur before we allocate memory + var head = chain; + var headSize = Marshal.SizeOf(); + var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); + StructureType expectedStructureType; + var errorBuilder = new StringBuilder(); + + currentPtr = currentPtr->PNext; + T1 item1 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 4"); + else + { + expectedStructureType = item1.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 2; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item1 = Unsafe.AsRef(currentPtr); + } + + var item1Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T2 item2 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 4"); + else + { + expectedStructureType = item2.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 3; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item2 = Unsafe.AsRef(currentPtr); + } + + var item2Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T3 item3 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 4"); + else + { + expectedStructureType = item3.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 4; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item3 = Unsafe.AsRef(currentPtr); + } + + var item3Size = Marshal.SizeOf(); + + + // Create string of errors + errors = errorBuilder.ToString().Trim(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + } + /// /// Creates a new with 4 items. /// @@ -979,7 +1243,7 @@ public ManagedChain(ManagedChain previous, T3 item3 = default) _headPtr = Marshal.AllocHGlobal(newSize); // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + Buffer.MemoryCopy(previous.HeadPtr, (void*) _headPtr, originalSize, originalSize); _item1Ptr = _headPtr + headSize; ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; @@ -1004,7 +1268,7 @@ public ManagedChain(ManagedChain previous, T3 item3 = default) /// Do not forget to dispose this chain if you are no longer using it. /// public ManagedChain Append(T4 item4 = default) - where T4: struct, IExtendsChain + where T4 : struct, IExtendsChain { return new ManagedChain(this, item4); } @@ -1087,6 +1351,7 @@ public T1 Item1 ((Chain*) _item1Ptr)->PNext = nextPtr; } } + private IntPtr _item2Ptr; /// @@ -1108,6 +1373,7 @@ public T2 Item2 ((Chain*) _item2Ptr)->PNext = nextPtr; } } + private IntPtr _item3Ptr; /// @@ -1129,6 +1395,7 @@ public T3 Item3 ((Chain*) _item3Ptr)->PNext = nextPtr; } } + private IntPtr _item4Ptr; /// @@ -1159,7 +1426,8 @@ public T4 Item4 /// Item 2. /// Item 3. /// Item 4. - public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default) + public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, + T4 item4 = default) { // Calculate memory requirements var headSize = Marshal.SizeOf(); @@ -1193,6 +1461,128 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; } + /// + /// Creates a new with 5 items from an existing unmanaged chain. + /// + /// The unmanaged chain to use as the basis of this chain. + /// Any errors loading the chain. + public ManagedChain(TChain chain, out string errors) + { + // Load existing chain first, so any errors occur before we allocate memory + var head = chain; + var headSize = Marshal.SizeOf(); + var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); + StructureType expectedStructureType; + var errorBuilder = new StringBuilder(); + + currentPtr = currentPtr->PNext; + T1 item1 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 5"); + else + { + expectedStructureType = item1.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 2; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item1 = Unsafe.AsRef(currentPtr); + } + + var item1Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T2 item2 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 5"); + else + { + expectedStructureType = item2.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 3; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item2 = Unsafe.AsRef(currentPtr); + } + + var item2Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T3 item3 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 5"); + else + { + expectedStructureType = item3.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 4; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item3 = Unsafe.AsRef(currentPtr); + } + + var item3Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T4 item4 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 5"); + else + { + expectedStructureType = item4.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 5; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item4 = Unsafe.AsRef(currentPtr); + } + + var item4Size = Marshal.SizeOf(); + + + // Create string of errors + errors = errorBuilder.ToString().Trim(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + } + /// /// Creates a new with 5 items. /// @@ -1215,7 +1605,7 @@ public ManagedChain(ManagedChain previous, T4 item4 = defaul _headPtr = Marshal.AllocHGlobal(newSize); // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + Buffer.MemoryCopy(previous.HeadPtr, (void*) _headPtr, originalSize, originalSize); _item1Ptr = _headPtr + headSize; ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; @@ -1243,7 +1633,7 @@ public ManagedChain(ManagedChain previous, T4 item4 = defaul /// Do not forget to dispose this chain if you are no longer using it. /// public ManagedChain Append(T5 item5 = default) - where T5: struct, IExtendsChain + where T5 : struct, IExtendsChain { return new ManagedChain(this, item5); } @@ -1330,6 +1720,7 @@ public T1 Item1 ((Chain*) _item1Ptr)->PNext = nextPtr; } } + private IntPtr _item2Ptr; /// @@ -1351,6 +1742,7 @@ public T2 Item2 ((Chain*) _item2Ptr)->PNext = nextPtr; } } + private IntPtr _item3Ptr; /// @@ -1372,6 +1764,7 @@ public T3 Item3 ((Chain*) _item3Ptr)->PNext = nextPtr; } } + private IntPtr _item4Ptr; /// @@ -1393,6 +1786,7 @@ public T4 Item4 ((Chain*) _item4Ptr)->PNext = nextPtr; } } + private IntPtr _item5Ptr; /// @@ -1424,7 +1818,8 @@ public T5 Item5 /// Item 3. /// Item 4. /// Item 5. - public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default) + public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, + T4 item4 = default, T5 item5 = default) { // Calculate memory requirements var headSize = Marshal.SizeOf(); @@ -1464,6 +1859,153 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; } + /// + /// Creates a new with 6 items from an existing unmanaged chain. + /// + /// The unmanaged chain to use as the basis of this chain. + /// Any errors loading the chain. + public ManagedChain(TChain chain, out string errors) + { + // Load existing chain first, so any errors occur before we allocate memory + var head = chain; + var headSize = Marshal.SizeOf(); + var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); + StructureType expectedStructureType; + var errorBuilder = new StringBuilder(); + + currentPtr = currentPtr->PNext; + T1 item1 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 6"); + else + { + expectedStructureType = item1.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 2; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item1 = Unsafe.AsRef(currentPtr); + } + + var item1Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T2 item2 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 6"); + else + { + expectedStructureType = item2.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 3; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item2 = Unsafe.AsRef(currentPtr); + } + + var item2Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T3 item3 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 6"); + else + { + expectedStructureType = item3.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 4; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item3 = Unsafe.AsRef(currentPtr); + } + + var item3Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T4 item4 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 6"); + else + { + expectedStructureType = item4.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 5; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item4 = Unsafe.AsRef(currentPtr); + } + + var item4Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T5 item5 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 6"); + else + { + expectedStructureType = item5.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 6; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item5 = Unsafe.AsRef(currentPtr); + } + + var item5Size = Marshal.SizeOf(); + + + // Create string of errors + errors = errorBuilder.ToString().Trim(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + } + /// /// Creates a new with 6 items. /// @@ -1487,7 +2029,7 @@ public ManagedChain(ManagedChain previous, T5 item5 = de _headPtr = Marshal.AllocHGlobal(newSize); // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + Buffer.MemoryCopy(previous.HeadPtr, (void*) _headPtr, originalSize, originalSize); _item1Ptr = _headPtr + headSize; ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; @@ -1518,7 +2060,7 @@ public ManagedChain(ManagedChain previous, T5 item5 = de /// Do not forget to dispose this chain if you are no longer using it. /// public ManagedChain Append(T6 item6 = default) - where T6: struct, IExtendsChain + where T6 : struct, IExtendsChain { return new ManagedChain(this, item6); } @@ -1609,6 +2151,7 @@ public T1 Item1 ((Chain*) _item1Ptr)->PNext = nextPtr; } } + private IntPtr _item2Ptr; /// @@ -1630,6 +2173,7 @@ public T2 Item2 ((Chain*) _item2Ptr)->PNext = nextPtr; } } + private IntPtr _item3Ptr; /// @@ -1651,6 +2195,7 @@ public T3 Item3 ((Chain*) _item3Ptr)->PNext = nextPtr; } } + private IntPtr _item4Ptr; /// @@ -1672,6 +2217,7 @@ public T4 Item4 ((Chain*) _item4Ptr)->PNext = nextPtr; } } + private IntPtr _item5Ptr; /// @@ -1693,6 +2239,7 @@ public T5 Item5 ((Chain*) _item5Ptr)->PNext = nextPtr; } } + private IntPtr _item6Ptr; /// @@ -1725,7 +2272,8 @@ public T6 Item6 /// Item 4. /// Item 5. /// Item 6. - public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default) + public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, + T4 item4 = default, T5 item5 = default, T6 item6 = default) { // Calculate memory requirements var headSize = Marshal.SizeOf(); @@ -1736,7 +2284,8 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul var item5Size = Marshal.SizeOf(); var item6Size = Marshal.SizeOf(); - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size); + _headPtr = Marshal.AllocHGlobal( + headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size); head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); @@ -1771,6 +2320,179 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; } + /// + /// Creates a new with 7 items from an existing unmanaged chain. + /// + /// The unmanaged chain to use as the basis of this chain. + /// Any errors loading the chain. + public ManagedChain(TChain chain, out string errors) + { + // Load existing chain first, so any errors occur before we allocate memory + var head = chain; + var headSize = Marshal.SizeOf(); + var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); + StructureType expectedStructureType; + var errorBuilder = new StringBuilder(); + + currentPtr = currentPtr->PNext; + T1 item1 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 7"); + else + { + expectedStructureType = item1.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 2; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item1 = Unsafe.AsRef(currentPtr); + } + + var item1Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T2 item2 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 7"); + else + { + expectedStructureType = item2.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 3; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item2 = Unsafe.AsRef(currentPtr); + } + + var item2Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T3 item3 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 7"); + else + { + expectedStructureType = item3.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 4; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item3 = Unsafe.AsRef(currentPtr); + } + + var item3Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T4 item4 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 7"); + else + { + expectedStructureType = item4.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 5; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item4 = Unsafe.AsRef(currentPtr); + } + + var item4Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T5 item5 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 7"); + else + { + expectedStructureType = item5.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 6; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item5 = Unsafe.AsRef(currentPtr); + } + + var item5Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T6 item6 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 7"); + else + { + expectedStructureType = item6.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 7; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item6 = Unsafe.AsRef(currentPtr); + } + + var item6Size = Marshal.SizeOf(); + + + // Create string of errors + errors = errorBuilder.ToString().Trim(); + + _headPtr = Marshal.AllocHGlobal( + headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + } + /// /// Creates a new with 7 items. /// @@ -1795,7 +2517,7 @@ public ManagedChain(ManagedChain previous, T6 item6 _headPtr = Marshal.AllocHGlobal(newSize); // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + Buffer.MemoryCopy(previous.HeadPtr, (void*) _headPtr, originalSize, originalSize); _item1Ptr = _headPtr + headSize; ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; @@ -1829,7 +2551,7 @@ public ManagedChain(ManagedChain previous, T6 item6 /// Do not forget to dispose this chain if you are no longer using it. /// public ManagedChain Append(T7 item7 = default) - where T7: struct, IExtendsChain + where T7 : struct, IExtendsChain { return new ManagedChain(this, item7); } @@ -1924,6 +2646,7 @@ public T1 Item1 ((Chain*) _item1Ptr)->PNext = nextPtr; } } + private IntPtr _item2Ptr; /// @@ -1945,6 +2668,7 @@ public T2 Item2 ((Chain*) _item2Ptr)->PNext = nextPtr; } } + private IntPtr _item3Ptr; /// @@ -1966,6 +2690,7 @@ public T3 Item3 ((Chain*) _item3Ptr)->PNext = nextPtr; } } + private IntPtr _item4Ptr; /// @@ -1987,6 +2712,7 @@ public T4 Item4 ((Chain*) _item4Ptr)->PNext = nextPtr; } } + private IntPtr _item5Ptr; /// @@ -2008,6 +2734,7 @@ public T5 Item5 ((Chain*) _item5Ptr)->PNext = nextPtr; } } + private IntPtr _item6Ptr; /// @@ -2029,6 +2756,7 @@ public T6 Item6 ((Chain*) _item6Ptr)->PNext = nextPtr; } } + private IntPtr _item7Ptr; /// @@ -2062,7 +2790,8 @@ public T7 Item7 /// Item 5. /// Item 6. /// Item 7. - public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default) + public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, + T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default) { // Calculate memory requirements var headSize = Marshal.SizeOf(); @@ -2074,7 +2803,8 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul var item6Size = Marshal.SizeOf(); var item7Size = Marshal.SizeOf(); - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size); + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + + item6Size + item7Size); head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); @@ -2115,7 +2845,205 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul } /// - /// Creates a new with 8 items. + /// Creates a new with 8 items from an existing unmanaged chain. + /// + /// The unmanaged chain to use as the basis of this chain. + /// Any errors loading the chain. + public ManagedChain(TChain chain, out string errors) + { + // Load existing chain first, so any errors occur before we allocate memory + var head = chain; + var headSize = Marshal.SizeOf(); + var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); + StructureType expectedStructureType; + var errorBuilder = new StringBuilder(); + + currentPtr = currentPtr->PNext; + T1 item1 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 8"); + else + { + expectedStructureType = item1.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 2; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item1 = Unsafe.AsRef(currentPtr); + } + + var item1Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T2 item2 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 8"); + else + { + expectedStructureType = item2.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 3; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item2 = Unsafe.AsRef(currentPtr); + } + + var item2Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T3 item3 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 8"); + else + { + expectedStructureType = item3.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 4; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item3 = Unsafe.AsRef(currentPtr); + } + + var item3Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T4 item4 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 8"); + else + { + expectedStructureType = item4.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 5; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item4 = Unsafe.AsRef(currentPtr); + } + + var item4Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T5 item5 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 8"); + else + { + expectedStructureType = item5.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 6; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item5 = Unsafe.AsRef(currentPtr); + } + + var item5Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T6 item6 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 8"); + else + { + expectedStructureType = item6.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 7; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item6 = Unsafe.AsRef(currentPtr); + } + + var item6Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T7 item7 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 8"); + else + { + expectedStructureType = item7.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 8; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item7 = Unsafe.AsRef(currentPtr); + } + + var item7Size = Marshal.SizeOf(); + + + // Create string of errors + errors = errorBuilder.ToString().Trim(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + + item6Size + item7Size); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + Marshal.StructureToPtr(item7, _item7Ptr, false); + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + } + + /// + /// Creates a new with 8 items. /// /// The chain to append to. /// Item 7. @@ -2139,7 +3067,7 @@ public ManagedChain(ManagedChain previous, T7 it _headPtr = Marshal.AllocHGlobal(newSize); // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + Buffer.MemoryCopy(previous.HeadPtr, (void*) _headPtr, originalSize, originalSize); _item1Ptr = _headPtr + headSize; ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; @@ -2176,7 +3104,7 @@ public ManagedChain(ManagedChain previous, T7 it /// Do not forget to dispose this chain if you are no longer using it. /// public ManagedChain Append(T8 item8 = default) - where T8: struct, IExtendsChain + where T8 : struct, IExtendsChain { return new ManagedChain(this, item8); } @@ -2275,6 +3203,7 @@ public T1 Item1 ((Chain*) _item1Ptr)->PNext = nextPtr; } } + private IntPtr _item2Ptr; /// @@ -2296,6 +3225,7 @@ public T2 Item2 ((Chain*) _item2Ptr)->PNext = nextPtr; } } + private IntPtr _item3Ptr; /// @@ -2317,6 +3247,7 @@ public T3 Item3 ((Chain*) _item3Ptr)->PNext = nextPtr; } } + private IntPtr _item4Ptr; /// @@ -2338,6 +3269,7 @@ public T4 Item4 ((Chain*) _item4Ptr)->PNext = nextPtr; } } + private IntPtr _item5Ptr; /// @@ -2359,6 +3291,7 @@ public T5 Item5 ((Chain*) _item5Ptr)->PNext = nextPtr; } } + private IntPtr _item6Ptr; /// @@ -2380,6 +3313,7 @@ public T6 Item6 ((Chain*) _item6Ptr)->PNext = nextPtr; } } + private IntPtr _item7Ptr; /// @@ -2401,6 +3335,7 @@ public T7 Item7 ((Chain*) _item7Ptr)->PNext = nextPtr; } } + private IntPtr _item8Ptr; /// @@ -2435,7 +3370,8 @@ public T8 Item8 /// Item 6. /// Item 7. /// Item 8. - public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default) + public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, + T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default) { // Calculate memory requirements var headSize = Marshal.SizeOf(); @@ -2448,7 +3384,8 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul var item7Size = Marshal.SizeOf(); var item8Size = Marshal.SizeOf(); - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size); + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + + item6Size + item7Size + item8Size); head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); @@ -2493,6 +3430,229 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; } + /// + /// Creates a new with 9 items from an existing unmanaged chain. + /// + /// The unmanaged chain to use as the basis of this chain. + /// Any errors loading the chain. + public ManagedChain(TChain chain, out string errors) + { + // Load existing chain first, so any errors occur before we allocate memory + var head = chain; + var headSize = Marshal.SizeOf(); + var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); + StructureType expectedStructureType; + var errorBuilder = new StringBuilder(); + + currentPtr = currentPtr->PNext; + T1 item1 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 9"); + else + { + expectedStructureType = item1.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 2; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item1 = Unsafe.AsRef(currentPtr); + } + + var item1Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T2 item2 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 9"); + else + { + expectedStructureType = item2.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 3; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item2 = Unsafe.AsRef(currentPtr); + } + + var item2Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T3 item3 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 9"); + else + { + expectedStructureType = item3.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 4; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item3 = Unsafe.AsRef(currentPtr); + } + + var item3Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T4 item4 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 9"); + else + { + expectedStructureType = item4.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 5; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item4 = Unsafe.AsRef(currentPtr); + } + + var item4Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T5 item5 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 9"); + else + { + expectedStructureType = item5.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 6; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item5 = Unsafe.AsRef(currentPtr); + } + + var item5Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T6 item6 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 9"); + else + { + expectedStructureType = item6.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 7; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item6 = Unsafe.AsRef(currentPtr); + } + + var item6Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T7 item7 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 9"); + else + { + expectedStructureType = item7.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 8; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item7 = Unsafe.AsRef(currentPtr); + } + + var item7Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T8 item8 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 9"); + else + { + expectedStructureType = item8.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 9; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item8 = Unsafe.AsRef(currentPtr); + } + + var item8Size = Marshal.SizeOf(); + + + // Create string of errors + errors = errorBuilder.ToString().Trim(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + + item6Size + item7Size + item8Size); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + Marshal.StructureToPtr(item7, _item7Ptr, false); + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + Marshal.StructureToPtr(item8, _item8Ptr, false); + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + } + /// /// Creates a new with 9 items. /// @@ -2519,7 +3679,7 @@ public ManagedChain(ManagedChain previous, T _headPtr = Marshal.AllocHGlobal(newSize); // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + Buffer.MemoryCopy(previous.HeadPtr, (void*) _headPtr, originalSize, originalSize); _item1Ptr = _headPtr + headSize; ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; @@ -2559,7 +3719,7 @@ public ManagedChain(ManagedChain previous, T /// Do not forget to dispose this chain if you are no longer using it. /// public ManagedChain Append(T9 item9 = default) - where T9: struct, IExtendsChain + where T9 : struct, IExtendsChain { return new ManagedChain(this, item9); } @@ -2662,6 +3822,7 @@ public T1 Item1 ((Chain*) _item1Ptr)->PNext = nextPtr; } } + private IntPtr _item2Ptr; /// @@ -2683,6 +3844,7 @@ public T2 Item2 ((Chain*) _item2Ptr)->PNext = nextPtr; } } + private IntPtr _item3Ptr; /// @@ -2704,6 +3866,7 @@ public T3 Item3 ((Chain*) _item3Ptr)->PNext = nextPtr; } } + private IntPtr _item4Ptr; /// @@ -2725,6 +3888,7 @@ public T4 Item4 ((Chain*) _item4Ptr)->PNext = nextPtr; } } + private IntPtr _item5Ptr; /// @@ -2746,6 +3910,7 @@ public T5 Item5 ((Chain*) _item5Ptr)->PNext = nextPtr; } } + private IntPtr _item6Ptr; /// @@ -2767,6 +3932,7 @@ public T6 Item6 ((Chain*) _item6Ptr)->PNext = nextPtr; } } + private IntPtr _item7Ptr; /// @@ -2788,6 +3954,7 @@ public T7 Item7 ((Chain*) _item7Ptr)->PNext = nextPtr; } } + private IntPtr _item8Ptr; /// @@ -2809,6 +3976,7 @@ public T8 Item8 ((Chain*) _item8Ptr)->PNext = nextPtr; } } + private IntPtr _item9Ptr; /// @@ -2844,7 +4012,9 @@ public T9 Item9 /// Item 7. /// Item 8. /// Item 9. - public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default) + public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, + T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, + T9 item9 = default) { // Calculate memory requirements var headSize = Marshal.SizeOf(); @@ -2858,7 +4028,8 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul var item8Size = Marshal.SizeOf(); var item9Size = Marshal.SizeOf(); - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size); + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + + item6Size + item7Size + item8Size + item9Size); head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); @@ -2908,6 +4079,254 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; } + /// + /// Creates a new with 10 items from an existing unmanaged chain. + /// + /// The unmanaged chain to use as the basis of this chain. + /// Any errors loading the chain. + public ManagedChain(TChain chain, out string errors) + { + // Load existing chain first, so any errors occur before we allocate memory + var head = chain; + var headSize = Marshal.SizeOf(); + var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); + StructureType expectedStructureType; + var errorBuilder = new StringBuilder(); + + currentPtr = currentPtr->PNext; + T1 item1 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 10"); + else + { + expectedStructureType = item1.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 2; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item1 = Unsafe.AsRef(currentPtr); + } + + var item1Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T2 item2 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 10"); + else + { + expectedStructureType = item2.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 3; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item2 = Unsafe.AsRef(currentPtr); + } + + var item2Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T3 item3 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 10"); + else + { + expectedStructureType = item3.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 4; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item3 = Unsafe.AsRef(currentPtr); + } + + var item3Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T4 item4 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 10"); + else + { + expectedStructureType = item4.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 5; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item4 = Unsafe.AsRef(currentPtr); + } + + var item4Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T5 item5 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 10"); + else + { + expectedStructureType = item5.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 6; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item5 = Unsafe.AsRef(currentPtr); + } + + var item5Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T6 item6 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 10"); + else + { + expectedStructureType = item6.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 7; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item6 = Unsafe.AsRef(currentPtr); + } + + var item6Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T7 item7 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 10"); + else + { + expectedStructureType = item7.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 8; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item7 = Unsafe.AsRef(currentPtr); + } + + var item7Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T8 item8 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 10"); + else + { + expectedStructureType = item8.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 9; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item8 = Unsafe.AsRef(currentPtr); + } + + var item8Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T9 item9 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 9, expected length 10"); + else + { + expectedStructureType = item9.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 10; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item9 = Unsafe.AsRef(currentPtr); + } + + var item9Size = Marshal.SizeOf(); + + + // Create string of errors + errors = errorBuilder.ToString().Trim(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + + item6Size + item7Size + item8Size + item9Size); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + Marshal.StructureToPtr(item7, _item7Ptr, false); + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + Marshal.StructureToPtr(item8, _item8Ptr, false); + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + + _item9Ptr = _item8Ptr + item8Size; + Marshal.StructureToPtr(item9, _item9Ptr, false); + ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + } + /// /// Creates a new with 10 items. /// @@ -2930,12 +4349,13 @@ public ManagedChain(ManagedChain previou var item8Size = Marshal.SizeOf(); var item9Size = Marshal.SizeOf(); - var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size; + var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + + item7Size + item8Size; var newSize = originalSize + item9Size; _headPtr = Marshal.AllocHGlobal(newSize); // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + Buffer.MemoryCopy(previous.HeadPtr, (void*) _headPtr, originalSize, originalSize); _item1Ptr = _headPtr + headSize; ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; @@ -2978,7 +4398,7 @@ public ManagedChain(ManagedChain previou /// Do not forget to dispose this chain if you are no longer using it. /// public ManagedChain Append(T10 item10 = default) - where T10: struct, IExtendsChain + where T10 : struct, IExtendsChain { return new ManagedChain(this, item10); } @@ -3085,6 +4505,7 @@ public T1 Item1 ((Chain*) _item1Ptr)->PNext = nextPtr; } } + private IntPtr _item2Ptr; /// @@ -3106,6 +4527,7 @@ public T2 Item2 ((Chain*) _item2Ptr)->PNext = nextPtr; } } + private IntPtr _item3Ptr; /// @@ -3127,6 +4549,7 @@ public T3 Item3 ((Chain*) _item3Ptr)->PNext = nextPtr; } } + private IntPtr _item4Ptr; /// @@ -3148,6 +4571,7 @@ public T4 Item4 ((Chain*) _item4Ptr)->PNext = nextPtr; } } + private IntPtr _item5Ptr; /// @@ -3169,6 +4593,7 @@ public T5 Item5 ((Chain*) _item5Ptr)->PNext = nextPtr; } } + private IntPtr _item6Ptr; /// @@ -3190,6 +4615,7 @@ public T6 Item6 ((Chain*) _item6Ptr)->PNext = nextPtr; } } + private IntPtr _item7Ptr; /// @@ -3211,6 +4637,7 @@ public T7 Item7 ((Chain*) _item7Ptr)->PNext = nextPtr; } } + private IntPtr _item8Ptr; /// @@ -3232,6 +4659,7 @@ public T8 Item8 ((Chain*) _item8Ptr)->PNext = nextPtr; } } + private IntPtr _item9Ptr; /// @@ -3253,6 +4681,7 @@ public T9 Item9 ((Chain*) _item9Ptr)->PNext = nextPtr; } } + private IntPtr _item10Ptr; /// @@ -3289,7 +4718,9 @@ public T10 Item10 /// Item 8. /// Item 9. /// Item 10. - public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default) + public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, + T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, + T9 item9 = default, T10 item10 = default) { // Calculate memory requirements var headSize = Marshal.SizeOf(); @@ -3304,7 +4735,8 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul var item9Size = Marshal.SizeOf(); var item10Size = Marshal.SizeOf(); - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size); + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + + item6Size + item7Size + item8Size + item9Size + item10Size); head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); @@ -3360,18 +4792,291 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul } /// - /// Creates a new with 11 items. + /// Creates a new with 11 items from an existing unmanaged chain. /// - /// The chain to append to. - /// Item 10. - /// - /// Do not forget to dispose the chain if you are no longer using it. - /// - public ManagedChain(ManagedChain previous, T10 item10 = default) + /// The unmanaged chain to use as the basis of this chain. + /// Any errors loading the chain. + public ManagedChain(TChain chain, out string errors) { - // Calculate memory requirements + // Load existing chain first, so any errors occur before we allocate memory + var head = chain; var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); + var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); + StructureType expectedStructureType; + var errorBuilder = new StringBuilder(); + + currentPtr = currentPtr->PNext; + T1 item1 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 11"); + else + { + expectedStructureType = item1.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 2; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item1 = Unsafe.AsRef(currentPtr); + } + + var item1Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T2 item2 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 11"); + else + { + expectedStructureType = item2.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 3; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item2 = Unsafe.AsRef(currentPtr); + } + + var item2Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T3 item3 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 11"); + else + { + expectedStructureType = item3.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 4; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item3 = Unsafe.AsRef(currentPtr); + } + + var item3Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T4 item4 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 11"); + else + { + expectedStructureType = item4.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 5; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item4 = Unsafe.AsRef(currentPtr); + } + + var item4Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T5 item5 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 11"); + else + { + expectedStructureType = item5.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 6; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item5 = Unsafe.AsRef(currentPtr); + } + + var item5Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T6 item6 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 11"); + else + { + expectedStructureType = item6.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 7; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item6 = Unsafe.AsRef(currentPtr); + } + + var item6Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T7 item7 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 11"); + else + { + expectedStructureType = item7.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 8; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item7 = Unsafe.AsRef(currentPtr); + } + + var item7Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T8 item8 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 11"); + else + { + expectedStructureType = item8.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 9; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item8 = Unsafe.AsRef(currentPtr); + } + + var item8Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T9 item9 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 9, expected length 11"); + else + { + expectedStructureType = item9.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 10; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item9 = Unsafe.AsRef(currentPtr); + } + + var item9Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T10 item10 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 10, expected length 11"); + else + { + expectedStructureType = item10.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 11; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item10 = Unsafe.AsRef(currentPtr); + } + + var item10Size = Marshal.SizeOf(); + + + // Create string of errors + errors = errorBuilder.ToString().Trim(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + + item6Size + item7Size + item8Size + item9Size + item10Size); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + Marshal.StructureToPtr(item7, _item7Ptr, false); + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + Marshal.StructureToPtr(item8, _item8Ptr, false); + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + + _item9Ptr = _item8Ptr + item8Size; + Marshal.StructureToPtr(item9, _item9Ptr, false); + ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + + _item10Ptr = _item9Ptr + item9Size; + Marshal.StructureToPtr(item10, _item10Ptr, false); + ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; + } + + /// + /// Creates a new with 11 items. + /// + /// The chain to append to. + /// Item 10. + /// + /// Do not forget to dispose the chain if you are no longer using it. + /// + public ManagedChain(ManagedChain previous, T10 item10 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); var item2Size = Marshal.SizeOf(); var item3Size = Marshal.SizeOf(); var item4Size = Marshal.SizeOf(); @@ -3382,12 +5087,13 @@ public ManagedChain(ManagedChain pre var item9Size = Marshal.SizeOf(); var item10Size = Marshal.SizeOf(); - var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size; + var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + + item7Size + item8Size + item9Size; var newSize = originalSize + item10Size; _headPtr = Marshal.AllocHGlobal(newSize); // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + Buffer.MemoryCopy(previous.HeadPtr, (void*) _headPtr, originalSize, originalSize); _item1Ptr = _headPtr + headSize; ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; @@ -3433,7 +5139,7 @@ public ManagedChain(ManagedChain pre /// Do not forget to dispose this chain if you are no longer using it. /// public ManagedChain Append(T11 item11 = default) - where T11: struct, IExtendsChain + where T11 : struct, IExtendsChain { return new ManagedChain(this, item11); } @@ -3544,6 +5250,7 @@ public T1 Item1 ((Chain*) _item1Ptr)->PNext = nextPtr; } } + private IntPtr _item2Ptr; /// @@ -3565,6 +5272,7 @@ public T2 Item2 ((Chain*) _item2Ptr)->PNext = nextPtr; } } + private IntPtr _item3Ptr; /// @@ -3586,6 +5294,7 @@ public T3 Item3 ((Chain*) _item3Ptr)->PNext = nextPtr; } } + private IntPtr _item4Ptr; /// @@ -3607,6 +5316,7 @@ public T4 Item4 ((Chain*) _item4Ptr)->PNext = nextPtr; } } + private IntPtr _item5Ptr; /// @@ -3628,6 +5338,7 @@ public T5 Item5 ((Chain*) _item5Ptr)->PNext = nextPtr; } } + private IntPtr _item6Ptr; /// @@ -3649,6 +5360,7 @@ public T6 Item6 ((Chain*) _item6Ptr)->PNext = nextPtr; } } + private IntPtr _item7Ptr; /// @@ -3670,6 +5382,7 @@ public T7 Item7 ((Chain*) _item7Ptr)->PNext = nextPtr; } } + private IntPtr _item8Ptr; /// @@ -3691,6 +5404,7 @@ public T8 Item8 ((Chain*) _item8Ptr)->PNext = nextPtr; } } + private IntPtr _item9Ptr; /// @@ -3712,6 +5426,7 @@ public T9 Item9 ((Chain*) _item9Ptr)->PNext = nextPtr; } } + private IntPtr _item10Ptr; /// @@ -3733,6 +5448,7 @@ public T10 Item10 ((Chain*) _item10Ptr)->PNext = nextPtr; } } + private IntPtr _item11Ptr; /// @@ -3770,7 +5486,9 @@ public T11 Item11 /// Item 9. /// Item 10. /// Item 11. - public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default) + public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, + T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, + T9 item9 = default, T10 item10 = default, T11 item11 = default) { // Calculate memory requirements var headSize = Marshal.SizeOf(); @@ -3786,7 +5504,8 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul var item10Size = Marshal.SizeOf(); var item11Size = Marshal.SizeOf(); - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size); + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size); head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); @@ -3846,6 +5565,304 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; } + /// + /// Creates a new with 12 items from an existing unmanaged chain. + /// + /// The unmanaged chain to use as the basis of this chain. + /// Any errors loading the chain. + public ManagedChain(TChain chain, out string errors) + { + // Load existing chain first, so any errors occur before we allocate memory + var head = chain; + var headSize = Marshal.SizeOf(); + var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); + StructureType expectedStructureType; + var errorBuilder = new StringBuilder(); + + currentPtr = currentPtr->PNext; + T1 item1 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 12"); + else + { + expectedStructureType = item1.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 2; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item1 = Unsafe.AsRef(currentPtr); + } + + var item1Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T2 item2 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 12"); + else + { + expectedStructureType = item2.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 3; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item2 = Unsafe.AsRef(currentPtr); + } + + var item2Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T3 item3 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 12"); + else + { + expectedStructureType = item3.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 4; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item3 = Unsafe.AsRef(currentPtr); + } + + var item3Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T4 item4 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 12"); + else + { + expectedStructureType = item4.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 5; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item4 = Unsafe.AsRef(currentPtr); + } + + var item4Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T5 item5 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 12"); + else + { + expectedStructureType = item5.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 6; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item5 = Unsafe.AsRef(currentPtr); + } + + var item5Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T6 item6 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 12"); + else + { + expectedStructureType = item6.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 7; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item6 = Unsafe.AsRef(currentPtr); + } + + var item6Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T7 item7 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 12"); + else + { + expectedStructureType = item7.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 8; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item7 = Unsafe.AsRef(currentPtr); + } + + var item7Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T8 item8 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 12"); + else + { + expectedStructureType = item8.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 9; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item8 = Unsafe.AsRef(currentPtr); + } + + var item8Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T9 item9 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 9, expected length 12"); + else + { + expectedStructureType = item9.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 10; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item9 = Unsafe.AsRef(currentPtr); + } + + var item9Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T10 item10 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 10, expected length 12"); + else + { + expectedStructureType = item10.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 11; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item10 = Unsafe.AsRef(currentPtr); + } + + var item10Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T11 item11 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 11, expected length 12"); + else + { + expectedStructureType = item11.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 12; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item11 = Unsafe.AsRef(currentPtr); + } + + var item11Size = Marshal.SizeOf(); + + + // Create string of errors + errors = errorBuilder.ToString().Trim(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + Marshal.StructureToPtr(item7, _item7Ptr, false); + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + Marshal.StructureToPtr(item8, _item8Ptr, false); + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + + _item9Ptr = _item8Ptr + item8Size; + Marshal.StructureToPtr(item9, _item9Ptr, false); + ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + + _item10Ptr = _item9Ptr + item9Size; + Marshal.StructureToPtr(item10, _item10Ptr, false); + ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; + + _item11Ptr = _item10Ptr + item10Size; + Marshal.StructureToPtr(item11, _item11Ptr, false); + ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; + } + /// /// Creates a new with 12 items. /// @@ -3870,12 +5887,13 @@ public ManagedChain(ManagedChain(); var item11Size = Marshal.SizeOf(); - var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size; + var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + + item7Size + item8Size + item9Size + item10Size; var newSize = originalSize + item11Size; _headPtr = Marshal.AllocHGlobal(newSize); // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + Buffer.MemoryCopy(previous.HeadPtr, (void*) _headPtr, originalSize, originalSize); _item1Ptr = _headPtr + headSize; ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; @@ -3924,7 +5942,7 @@ public ManagedChain(ManagedChain public ManagedChain Append(T12 item12 = default) - where T12: struct, IExtendsChain + where T12 : struct, IExtendsChain { return new ManagedChain(this, item12); } @@ -4039,6 +6057,7 @@ public T1 Item1 ((Chain*) _item1Ptr)->PNext = nextPtr; } } + private IntPtr _item2Ptr; /// @@ -4060,6 +6079,7 @@ public T2 Item2 ((Chain*) _item2Ptr)->PNext = nextPtr; } } + private IntPtr _item3Ptr; /// @@ -4081,6 +6101,7 @@ public T3 Item3 ((Chain*) _item3Ptr)->PNext = nextPtr; } } + private IntPtr _item4Ptr; /// @@ -4102,6 +6123,7 @@ public T4 Item4 ((Chain*) _item4Ptr)->PNext = nextPtr; } } + private IntPtr _item5Ptr; /// @@ -4123,6 +6145,7 @@ public T5 Item5 ((Chain*) _item5Ptr)->PNext = nextPtr; } } + private IntPtr _item6Ptr; /// @@ -4144,6 +6167,7 @@ public T6 Item6 ((Chain*) _item6Ptr)->PNext = nextPtr; } } + private IntPtr _item7Ptr; /// @@ -4165,6 +6189,7 @@ public T7 Item7 ((Chain*) _item7Ptr)->PNext = nextPtr; } } + private IntPtr _item8Ptr; /// @@ -4186,6 +6211,7 @@ public T8 Item8 ((Chain*) _item8Ptr)->PNext = nextPtr; } } + private IntPtr _item9Ptr; /// @@ -4207,6 +6233,7 @@ public T9 Item9 ((Chain*) _item9Ptr)->PNext = nextPtr; } } + private IntPtr _item10Ptr; /// @@ -4228,6 +6255,7 @@ public T10 Item10 ((Chain*) _item10Ptr)->PNext = nextPtr; } } + private IntPtr _item11Ptr; /// @@ -4249,6 +6277,7 @@ public T11 Item11 ((Chain*) _item11Ptr)->PNext = nextPtr; } } + private IntPtr _item12Ptr; /// @@ -4287,7 +6316,9 @@ public T12 Item12 /// Item 10. /// Item 11. /// Item 12. - public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default) + public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, + T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, + T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default) { // Calculate memory requirements var headSize = Marshal.SizeOf(); @@ -4304,7 +6335,9 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul var item11Size = Marshal.SizeOf(); var item12Size = Marshal.SizeOf(); - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + item12Size); + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + + item12Size); head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); @@ -4370,36 +6403,362 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul } /// - /// Creates a new with 13 items. + /// Creates a new with 13 items from an existing unmanaged chain. /// - /// The chain to append to. - /// Item 12. - /// - /// Do not forget to dispose the chain if you are no longer using it. - /// - public ManagedChain(ManagedChain previous, T12 item12 = default) + /// The unmanaged chain to use as the basis of this chain. + /// Any errors loading the chain. + public ManagedChain(TChain chain, out string errors) { - // Calculate memory requirements + // Load existing chain first, so any errors occur before we allocate memory + var head = chain; var headSize = Marshal.SizeOf(); + var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); + StructureType expectedStructureType; + var errorBuilder = new StringBuilder(); + + currentPtr = currentPtr->PNext; + T1 item1 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 13"); + else + { + expectedStructureType = item1.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 2; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item1 = Unsafe.AsRef(currentPtr); + } + var item1Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T2 item2 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 13"); + else + { + expectedStructureType = item2.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 3; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item2 = Unsafe.AsRef(currentPtr); + } + var item2Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T3 item3 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 13"); + else + { + expectedStructureType = item3.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 4; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item3 = Unsafe.AsRef(currentPtr); + } + var item3Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T4 item4 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 13"); + else + { + expectedStructureType = item4.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 5; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item4 = Unsafe.AsRef(currentPtr); + } + var item4Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T5 item5 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 13"); + else + { + expectedStructureType = item5.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 6; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item5 = Unsafe.AsRef(currentPtr); + } + var item5Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T6 item6 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 13"); + else + { + expectedStructureType = item6.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 7; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item6 = Unsafe.AsRef(currentPtr); + } + var item6Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T7 item7 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 13"); + else + { + expectedStructureType = item7.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 8; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item7 = Unsafe.AsRef(currentPtr); + } + var item7Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T8 item8 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 13"); + else + { + expectedStructureType = item8.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 9; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item8 = Unsafe.AsRef(currentPtr); + } + var item8Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T9 item9 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 9, expected length 13"); + else + { + expectedStructureType = item9.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 10; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item9 = Unsafe.AsRef(currentPtr); + } + var item9Size = Marshal.SizeOf(); - var item10Size = Marshal.SizeOf(); - var item11Size = Marshal.SizeOf(); - var item12Size = Marshal.SizeOf(); - var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size; - var newSize = originalSize + item12Size; + currentPtr = currentPtr->PNext; + T10 item10 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 10, expected length 13"); + else + { + expectedStructureType = item10.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 11; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item10 = Unsafe.AsRef(currentPtr); + } + + var item10Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T11 item11 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 11, expected length 13"); + else + { + expectedStructureType = item11.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 12; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item11 = Unsafe.AsRef(currentPtr); + } + + var item11Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T12 item12 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 12, expected length 13"); + else + { + expectedStructureType = item12.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 13; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item12 = Unsafe.AsRef(currentPtr); + } + + var item12Size = Marshal.SizeOf(); + + + // Create string of errors + errors = errorBuilder.ToString().Trim(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + + item12Size); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + Marshal.StructureToPtr(item7, _item7Ptr, false); + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + Marshal.StructureToPtr(item8, _item8Ptr, false); + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + + _item9Ptr = _item8Ptr + item8Size; + Marshal.StructureToPtr(item9, _item9Ptr, false); + ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + + _item10Ptr = _item9Ptr + item9Size; + Marshal.StructureToPtr(item10, _item10Ptr, false); + ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; + + _item11Ptr = _item10Ptr + item10Size; + Marshal.StructureToPtr(item11, _item11Ptr, false); + ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; + + _item12Ptr = _item11Ptr + item11Size; + Marshal.StructureToPtr(item12, _item12Ptr, false); + ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; + } + + /// + /// Creates a new with 13 items. + /// + /// The chain to append to. + /// Item 12. + /// + /// Do not forget to dispose the chain if you are no longer using it. + /// + public ManagedChain(ManagedChain previous, + T12 item12 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + var item6Size = Marshal.SizeOf(); + var item7Size = Marshal.SizeOf(); + var item8Size = Marshal.SizeOf(); + var item9Size = Marshal.SizeOf(); + var item10Size = Marshal.SizeOf(); + var item11Size = Marshal.SizeOf(); + var item12Size = Marshal.SizeOf(); + + var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + + item7Size + item8Size + item9Size + item10Size + item11Size; + var newSize = originalSize + item12Size; _headPtr = Marshal.AllocHGlobal(newSize); // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + Buffer.MemoryCopy(previous.HeadPtr, (void*) _headPtr, originalSize, originalSize); _item1Ptr = _headPtr + headSize; ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; @@ -4450,8 +6809,9 @@ public ManagedChain(ManagedChain /// Do not forget to dispose this chain if you are no longer using it. /// - public ManagedChain Append(T13 item13 = default) - where T13: struct, IExtendsChain + public ManagedChain Append( + T13 item13 = default) + where T13 : struct, IExtendsChain { return new ManagedChain(this, item13); } @@ -4570,6 +6930,7 @@ public T1 Item1 ((Chain*) _item1Ptr)->PNext = nextPtr; } } + private IntPtr _item2Ptr; /// @@ -4591,6 +6952,7 @@ public T2 Item2 ((Chain*) _item2Ptr)->PNext = nextPtr; } } + private IntPtr _item3Ptr; /// @@ -4612,6 +6974,7 @@ public T3 Item3 ((Chain*) _item3Ptr)->PNext = nextPtr; } } + private IntPtr _item4Ptr; /// @@ -4633,6 +6996,7 @@ public T4 Item4 ((Chain*) _item4Ptr)->PNext = nextPtr; } } + private IntPtr _item5Ptr; /// @@ -4654,6 +7018,7 @@ public T5 Item5 ((Chain*) _item5Ptr)->PNext = nextPtr; } } + private IntPtr _item6Ptr; /// @@ -4675,6 +7040,7 @@ public T6 Item6 ((Chain*) _item6Ptr)->PNext = nextPtr; } } + private IntPtr _item7Ptr; /// @@ -4696,6 +7062,7 @@ public T7 Item7 ((Chain*) _item7Ptr)->PNext = nextPtr; } } + private IntPtr _item8Ptr; /// @@ -4717,6 +7084,7 @@ public T8 Item8 ((Chain*) _item8Ptr)->PNext = nextPtr; } } + private IntPtr _item9Ptr; /// @@ -4738,6 +7106,7 @@ public T9 Item9 ((Chain*) _item9Ptr)->PNext = nextPtr; } } + private IntPtr _item10Ptr; /// @@ -4759,6 +7128,7 @@ public T10 Item10 ((Chain*) _item10Ptr)->PNext = nextPtr; } } + private IntPtr _item11Ptr; /// @@ -4780,6 +7150,7 @@ public T11 Item11 ((Chain*) _item11Ptr)->PNext = nextPtr; } } + private IntPtr _item12Ptr; /// @@ -4801,6 +7172,7 @@ public T12 Item12 ((Chain*) _item12Ptr)->PNext = nextPtr; } } + private IntPtr _item13Ptr; /// @@ -4840,7 +7212,9 @@ public T13 Item13 /// Item 11. /// Item 12. /// Item 13. - public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default, T13 item13 = default) + public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, + T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, + T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default, T13 item13 = default) { // Calculate memory requirements var headSize = Marshal.SizeOf(); @@ -4858,7 +7232,9 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul var item12Size = Marshal.SizeOf(); var item13Size = Marshal.SizeOf(); - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + item12Size + item13Size); + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + + item12Size + item13Size); head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); @@ -4928,6 +7304,355 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul ((Chain*) _item12Ptr)->PNext = (Chain*) _item13Ptr; } + /// + /// Creates a new with 14 items from an existing unmanaged chain. + /// + /// The unmanaged chain to use as the basis of this chain. + /// Any errors loading the chain. + public ManagedChain(TChain chain, out string errors) + { + // Load existing chain first, so any errors occur before we allocate memory + var head = chain; + var headSize = Marshal.SizeOf(); + var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); + StructureType expectedStructureType; + var errorBuilder = new StringBuilder(); + + currentPtr = currentPtr->PNext; + T1 item1 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 14"); + else + { + expectedStructureType = item1.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 2; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item1 = Unsafe.AsRef(currentPtr); + } + + var item1Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T2 item2 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 14"); + else + { + expectedStructureType = item2.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 3; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item2 = Unsafe.AsRef(currentPtr); + } + + var item2Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T3 item3 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 14"); + else + { + expectedStructureType = item3.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 4; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item3 = Unsafe.AsRef(currentPtr); + } + + var item3Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T4 item4 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 14"); + else + { + expectedStructureType = item4.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 5; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item4 = Unsafe.AsRef(currentPtr); + } + + var item4Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T5 item5 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 14"); + else + { + expectedStructureType = item5.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 6; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item5 = Unsafe.AsRef(currentPtr); + } + + var item5Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T6 item6 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 14"); + else + { + expectedStructureType = item6.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 7; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item6 = Unsafe.AsRef(currentPtr); + } + + var item6Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T7 item7 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 14"); + else + { + expectedStructureType = item7.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 8; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item7 = Unsafe.AsRef(currentPtr); + } + + var item7Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T8 item8 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 14"); + else + { + expectedStructureType = item8.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 9; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item8 = Unsafe.AsRef(currentPtr); + } + + var item8Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T9 item9 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 9, expected length 14"); + else + { + expectedStructureType = item9.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 10; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item9 = Unsafe.AsRef(currentPtr); + } + + var item9Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T10 item10 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 10, expected length 14"); + else + { + expectedStructureType = item10.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 11; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item10 = Unsafe.AsRef(currentPtr); + } + + var item10Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T11 item11 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 11, expected length 14"); + else + { + expectedStructureType = item11.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 12; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item11 = Unsafe.AsRef(currentPtr); + } + + var item11Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T12 item12 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 12, expected length 14"); + else + { + expectedStructureType = item12.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 13; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item12 = Unsafe.AsRef(currentPtr); + } + + var item12Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T13 item13 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 13, expected length 14"); + else + { + expectedStructureType = item13.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 14; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item13 = Unsafe.AsRef(currentPtr); + } + + var item13Size = Marshal.SizeOf(); + + + // Create string of errors + errors = errorBuilder.ToString().Trim(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + + item12Size + item13Size); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + Marshal.StructureToPtr(item7, _item7Ptr, false); + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + Marshal.StructureToPtr(item8, _item8Ptr, false); + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + + _item9Ptr = _item8Ptr + item8Size; + Marshal.StructureToPtr(item9, _item9Ptr, false); + ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + + _item10Ptr = _item9Ptr + item9Size; + Marshal.StructureToPtr(item10, _item10Ptr, false); + ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; + + _item11Ptr = _item10Ptr + item10Size; + Marshal.StructureToPtr(item11, _item11Ptr, false); + ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; + + _item12Ptr = _item11Ptr + item11Size; + Marshal.StructureToPtr(item12, _item12Ptr, false); + ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; + + _item13Ptr = _item12Ptr + item12Size; + Marshal.StructureToPtr(item13, _item13Ptr, false); + ((Chain*) _item12Ptr)->PNext = (Chain*) _item13Ptr; + } + /// /// Creates a new with 14 items. /// @@ -4936,7 +7661,8 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul /// /// Do not forget to dispose the chain if you are no longer using it. /// - public ManagedChain(ManagedChain previous, T13 item13 = default) + public ManagedChain(ManagedChain previous, + T13 item13 = default) { // Calculate memory requirements var headSize = Marshal.SizeOf(); @@ -4954,12 +7680,13 @@ public ManagedChain(ManagedChain(); var item13Size = Marshal.SizeOf(); - var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + item12Size; + var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + + item7Size + item8Size + item9Size + item10Size + item11Size + item12Size; var newSize = originalSize + item13Size; _headPtr = Marshal.AllocHGlobal(newSize); // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + Buffer.MemoryCopy(previous.HeadPtr, (void*) _headPtr, originalSize, originalSize); _item1Ptr = _headPtr + headSize; ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; @@ -5013,8 +7740,9 @@ public ManagedChain(ManagedChain /// Do not forget to dispose this chain if you are no longer using it. /// - public ManagedChain Append(T14 item14 = default) - where T14: struct, IExtendsChain + public ManagedChain Append( + T14 item14 = default) + where T14 : struct, IExtendsChain { return new ManagedChain(this, item14); } @@ -5137,6 +7865,7 @@ public T1 Item1 ((Chain*) _item1Ptr)->PNext = nextPtr; } } + private IntPtr _item2Ptr; /// @@ -5158,6 +7887,7 @@ public T2 Item2 ((Chain*) _item2Ptr)->PNext = nextPtr; } } + private IntPtr _item3Ptr; /// @@ -5179,6 +7909,7 @@ public T3 Item3 ((Chain*) _item3Ptr)->PNext = nextPtr; } } + private IntPtr _item4Ptr; /// @@ -5200,6 +7931,7 @@ public T4 Item4 ((Chain*) _item4Ptr)->PNext = nextPtr; } } + private IntPtr _item5Ptr; /// @@ -5221,6 +7953,7 @@ public T5 Item5 ((Chain*) _item5Ptr)->PNext = nextPtr; } } + private IntPtr _item6Ptr; /// @@ -5242,6 +7975,7 @@ public T6 Item6 ((Chain*) _item6Ptr)->PNext = nextPtr; } } + private IntPtr _item7Ptr; /// @@ -5263,6 +7997,7 @@ public T7 Item7 ((Chain*) _item7Ptr)->PNext = nextPtr; } } + private IntPtr _item8Ptr; /// @@ -5284,6 +8019,7 @@ public T8 Item8 ((Chain*) _item8Ptr)->PNext = nextPtr; } } + private IntPtr _item9Ptr; /// @@ -5305,6 +8041,7 @@ public T9 Item9 ((Chain*) _item9Ptr)->PNext = nextPtr; } } + private IntPtr _item10Ptr; /// @@ -5326,6 +8063,7 @@ public T10 Item10 ((Chain*) _item10Ptr)->PNext = nextPtr; } } + private IntPtr _item11Ptr; /// @@ -5347,6 +8085,7 @@ public T11 Item11 ((Chain*) _item11Ptr)->PNext = nextPtr; } } + private IntPtr _item12Ptr; /// @@ -5368,6 +8107,7 @@ public T12 Item12 ((Chain*) _item12Ptr)->PNext = nextPtr; } } + private IntPtr _item13Ptr; /// @@ -5389,6 +8129,7 @@ public T13 Item13 ((Chain*) _item13Ptr)->PNext = nextPtr; } } + private IntPtr _item14Ptr; /// @@ -5429,7 +8170,10 @@ public T14 Item14 /// Item 12. /// Item 13. /// Item 14. - public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default, T13 item13 = default, T14 item14 = default) + public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, + T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, + T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default, T13 item13 = default, + T14 item14 = default) { // Calculate memory requirements var headSize = Marshal.SizeOf(); @@ -5448,7 +8192,9 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul var item13Size = Marshal.SizeOf(); var item14Size = Marshal.SizeOf(); - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + item12Size + item13Size + item14Size); + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + + item12Size + item13Size + item14Size); head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); @@ -5523,6 +8269,380 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul ((Chain*) _item13Ptr)->PNext = (Chain*) _item14Ptr; } + /// + /// Creates a new with 15 items from an existing unmanaged chain. + /// + /// The unmanaged chain to use as the basis of this chain. + /// Any errors loading the chain. + public ManagedChain(TChain chain, out string errors) + { + // Load existing chain first, so any errors occur before we allocate memory + var head = chain; + var headSize = Marshal.SizeOf(); + var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); + StructureType expectedStructureType; + var errorBuilder = new StringBuilder(); + + currentPtr = currentPtr->PNext; + T1 item1 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 15"); + else + { + expectedStructureType = item1.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 2; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item1 = Unsafe.AsRef(currentPtr); + } + + var item1Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T2 item2 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 15"); + else + { + expectedStructureType = item2.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 3; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item2 = Unsafe.AsRef(currentPtr); + } + + var item2Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T3 item3 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 15"); + else + { + expectedStructureType = item3.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 4; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item3 = Unsafe.AsRef(currentPtr); + } + + var item3Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T4 item4 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 15"); + else + { + expectedStructureType = item4.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 5; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item4 = Unsafe.AsRef(currentPtr); + } + + var item4Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T5 item5 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 15"); + else + { + expectedStructureType = item5.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 6; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item5 = Unsafe.AsRef(currentPtr); + } + + var item5Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T6 item6 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 15"); + else + { + expectedStructureType = item6.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 7; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item6 = Unsafe.AsRef(currentPtr); + } + + var item6Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T7 item7 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 15"); + else + { + expectedStructureType = item7.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 8; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item7 = Unsafe.AsRef(currentPtr); + } + + var item7Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T8 item8 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 15"); + else + { + expectedStructureType = item8.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 9; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item8 = Unsafe.AsRef(currentPtr); + } + + var item8Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T9 item9 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 9, expected length 15"); + else + { + expectedStructureType = item9.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 10; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item9 = Unsafe.AsRef(currentPtr); + } + + var item9Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T10 item10 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 10, expected length 15"); + else + { + expectedStructureType = item10.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 11; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item10 = Unsafe.AsRef(currentPtr); + } + + var item10Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T11 item11 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 11, expected length 15"); + else + { + expectedStructureType = item11.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 12; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item11 = Unsafe.AsRef(currentPtr); + } + + var item11Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T12 item12 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 12, expected length 15"); + else + { + expectedStructureType = item12.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 13; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item12 = Unsafe.AsRef(currentPtr); + } + + var item12Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T13 item13 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 13, expected length 15"); + else + { + expectedStructureType = item13.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 14; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item13 = Unsafe.AsRef(currentPtr); + } + + var item13Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T14 item14 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 14, expected length 15"); + else + { + expectedStructureType = item14.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 15; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item14 = Unsafe.AsRef(currentPtr); + } + + var item14Size = Marshal.SizeOf(); + + + // Create string of errors + errors = errorBuilder.ToString().Trim(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + + item12Size + item13Size + item14Size); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + Marshal.StructureToPtr(item7, _item7Ptr, false); + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + Marshal.StructureToPtr(item8, _item8Ptr, false); + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + + _item9Ptr = _item8Ptr + item8Size; + Marshal.StructureToPtr(item9, _item9Ptr, false); + ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + + _item10Ptr = _item9Ptr + item9Size; + Marshal.StructureToPtr(item10, _item10Ptr, false); + ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; + + _item11Ptr = _item10Ptr + item10Size; + Marshal.StructureToPtr(item11, _item11Ptr, false); + ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; + + _item12Ptr = _item11Ptr + item11Size; + Marshal.StructureToPtr(item12, _item12Ptr, false); + ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; + + _item13Ptr = _item12Ptr + item12Size; + Marshal.StructureToPtr(item13, _item13Ptr, false); + ((Chain*) _item12Ptr)->PNext = (Chain*) _item13Ptr; + + _item14Ptr = _item13Ptr + item13Size; + Marshal.StructureToPtr(item14, _item14Ptr, false); + ((Chain*) _item13Ptr)->PNext = (Chain*) _item14Ptr; + } + /// /// Creates a new with 15 items. /// @@ -5531,7 +8651,8 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul /// /// Do not forget to dispose the chain if you are no longer using it. /// - public ManagedChain(ManagedChain previous, T14 item14 = default) + public ManagedChain(ManagedChain previous, + T14 item14 = default) { // Calculate memory requirements var headSize = Marshal.SizeOf(); @@ -5550,12 +8671,13 @@ public ManagedChain(ManagedChain(); var item14Size = Marshal.SizeOf(); - var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + item12Size + item13Size; + var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + + item7Size + item8Size + item9Size + item10Size + item11Size + item12Size + item13Size; var newSize = originalSize + item14Size; _headPtr = Marshal.AllocHGlobal(newSize); // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + Buffer.MemoryCopy(previous.HeadPtr, (void*) _headPtr, originalSize, originalSize); _item1Ptr = _headPtr + headSize; ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; @@ -5612,8 +8734,9 @@ public ManagedChain(ManagedChain /// Do not forget to dispose this chain if you are no longer using it. /// - public ManagedChain Append(T15 item15 = default) - where T15: struct, IExtendsChain + public ManagedChain Append( + T15 item15 = default) + where T15 : struct, IExtendsChain { return new ManagedChain(this, item15); } @@ -5740,6 +8863,7 @@ public T1 Item1 ((Chain*) _item1Ptr)->PNext = nextPtr; } } + private IntPtr _item2Ptr; /// @@ -5761,6 +8885,7 @@ public T2 Item2 ((Chain*) _item2Ptr)->PNext = nextPtr; } } + private IntPtr _item3Ptr; /// @@ -5782,6 +8907,7 @@ public T3 Item3 ((Chain*) _item3Ptr)->PNext = nextPtr; } } + private IntPtr _item4Ptr; /// @@ -5803,6 +8929,7 @@ public T4 Item4 ((Chain*) _item4Ptr)->PNext = nextPtr; } } + private IntPtr _item5Ptr; /// @@ -5824,6 +8951,7 @@ public T5 Item5 ((Chain*) _item5Ptr)->PNext = nextPtr; } } + private IntPtr _item6Ptr; /// @@ -5845,6 +8973,7 @@ public T6 Item6 ((Chain*) _item6Ptr)->PNext = nextPtr; } } + private IntPtr _item7Ptr; /// @@ -5866,6 +8995,7 @@ public T7 Item7 ((Chain*) _item7Ptr)->PNext = nextPtr; } } + private IntPtr _item8Ptr; /// @@ -5887,6 +9017,7 @@ public T8 Item8 ((Chain*) _item8Ptr)->PNext = nextPtr; } } + private IntPtr _item9Ptr; /// @@ -5908,6 +9039,7 @@ public T9 Item9 ((Chain*) _item9Ptr)->PNext = nextPtr; } } + private IntPtr _item10Ptr; /// @@ -5929,6 +9061,7 @@ public T10 Item10 ((Chain*) _item10Ptr)->PNext = nextPtr; } } + private IntPtr _item11Ptr; /// @@ -5950,6 +9083,7 @@ public T11 Item11 ((Chain*) _item11Ptr)->PNext = nextPtr; } } + private IntPtr _item12Ptr; /// @@ -5971,6 +9105,7 @@ public T12 Item12 ((Chain*) _item12Ptr)->PNext = nextPtr; } } + private IntPtr _item13Ptr; /// @@ -5992,6 +9127,7 @@ public T13 Item13 ((Chain*) _item13Ptr)->PNext = nextPtr; } } + private IntPtr _item14Ptr; /// @@ -6013,6 +9149,7 @@ public T14 Item14 ((Chain*) _item14Ptr)->PNext = nextPtr; } } + private IntPtr _item15Ptr; /// @@ -6054,7 +9191,10 @@ public T15 Item15 /// Item 13. /// Item 14. /// Item 15. - public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default, T13 item13 = default, T14 item14 = default, T15 item15 = default) + public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, + T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, + T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default, T13 item13 = default, + T14 item14 = default, T15 item15 = default) { // Calculate memory requirements var headSize = Marshal.SizeOf(); @@ -6074,7 +9214,9 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul var item14Size = Marshal.SizeOf(); var item15Size = Marshal.SizeOf(); - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + item12Size + item13Size + item14Size + item15Size); + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + + item12Size + item13Size + item14Size + item15Size); head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); @@ -6154,6 +9296,405 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul ((Chain*) _item14Ptr)->PNext = (Chain*) _item15Ptr; } + /// + /// Creates a new with 16 items from an existing unmanaged chain. + /// + /// The unmanaged chain to use as the basis of this chain. + /// Any errors loading the chain. + public ManagedChain(TChain chain, out string errors) + { + // Load existing chain first, so any errors occur before we allocate memory + var head = chain; + var headSize = Marshal.SizeOf(); + var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); + StructureType expectedStructureType; + var errorBuilder = new StringBuilder(); + + currentPtr = currentPtr->PNext; + T1 item1 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 16"); + else + { + expectedStructureType = item1.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 2; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item1 = Unsafe.AsRef(currentPtr); + } + + var item1Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T2 item2 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 16"); + else + { + expectedStructureType = item2.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 3; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item2 = Unsafe.AsRef(currentPtr); + } + + var item2Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T3 item3 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 16"); + else + { + expectedStructureType = item3.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 4; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item3 = Unsafe.AsRef(currentPtr); + } + + var item3Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T4 item4 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 16"); + else + { + expectedStructureType = item4.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 5; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item4 = Unsafe.AsRef(currentPtr); + } + + var item4Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T5 item5 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 16"); + else + { + expectedStructureType = item5.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 6; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item5 = Unsafe.AsRef(currentPtr); + } + + var item5Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T6 item6 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 16"); + else + { + expectedStructureType = item6.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 7; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item6 = Unsafe.AsRef(currentPtr); + } + + var item6Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T7 item7 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 16"); + else + { + expectedStructureType = item7.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 8; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item7 = Unsafe.AsRef(currentPtr); + } + + var item7Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T8 item8 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 16"); + else + { + expectedStructureType = item8.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 9; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item8 = Unsafe.AsRef(currentPtr); + } + + var item8Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T9 item9 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 9, expected length 16"); + else + { + expectedStructureType = item9.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 10; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item9 = Unsafe.AsRef(currentPtr); + } + + var item9Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T10 item10 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 10, expected length 16"); + else + { + expectedStructureType = item10.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 11; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item10 = Unsafe.AsRef(currentPtr); + } + + var item10Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T11 item11 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 11, expected length 16"); + else + { + expectedStructureType = item11.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 12; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item11 = Unsafe.AsRef(currentPtr); + } + + var item11Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T12 item12 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 12, expected length 16"); + else + { + expectedStructureType = item12.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 13; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item12 = Unsafe.AsRef(currentPtr); + } + + var item12Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T13 item13 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 13, expected length 16"); + else + { + expectedStructureType = item13.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 14; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item13 = Unsafe.AsRef(currentPtr); + } + + var item13Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T14 item14 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 14, expected length 16"); + else + { + expectedStructureType = item14.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 15; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item14 = Unsafe.AsRef(currentPtr); + } + + var item14Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T15 item15 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 15, expected length 16"); + else + { + expectedStructureType = item15.StructureType(); + if (currentPtr->SType != expectedStructureType) + { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 16; expected ") + .Append(expectedStructureType) + .AppendLine(); + } + else + item15 = Unsafe.AsRef(currentPtr); + } + + var item15Size = Marshal.SizeOf(); + + + // Create string of errors + errors = errorBuilder.ToString().Trim(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + + item12Size + item13Size + item14Size + item15Size); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + Marshal.StructureToPtr(item7, _item7Ptr, false); + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + Marshal.StructureToPtr(item8, _item8Ptr, false); + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + + _item9Ptr = _item8Ptr + item8Size; + Marshal.StructureToPtr(item9, _item9Ptr, false); + ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + + _item10Ptr = _item9Ptr + item9Size; + Marshal.StructureToPtr(item10, _item10Ptr, false); + ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; + + _item11Ptr = _item10Ptr + item10Size; + Marshal.StructureToPtr(item11, _item11Ptr, false); + ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; + + _item12Ptr = _item11Ptr + item11Size; + Marshal.StructureToPtr(item12, _item12Ptr, false); + ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; + + _item13Ptr = _item12Ptr + item12Size; + Marshal.StructureToPtr(item13, _item13Ptr, false); + ((Chain*) _item12Ptr)->PNext = (Chain*) _item13Ptr; + + _item14Ptr = _item13Ptr + item13Size; + Marshal.StructureToPtr(item14, _item14Ptr, false); + ((Chain*) _item13Ptr)->PNext = (Chain*) _item14Ptr; + + _item15Ptr = _item14Ptr + item14Size; + Marshal.StructureToPtr(item15, _item15Ptr, false); + ((Chain*) _item14Ptr)->PNext = (Chain*) _item15Ptr; + } + /// /// Creates a new with 16 items. /// @@ -6162,7 +9703,8 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul /// /// Do not forget to dispose the chain if you are no longer using it. /// - public ManagedChain(ManagedChain previous, T15 item15 = default) + public ManagedChain(ManagedChain previous, + T15 item15 = default) { // Calculate memory requirements var headSize = Marshal.SizeOf(); @@ -6182,12 +9724,14 @@ public ManagedChain(ManagedChain(); var item15Size = Marshal.SizeOf(); - var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + item12Size + item13Size + item14Size; + var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + + item7Size + item8Size + item9Size + item10Size + item11Size + item12Size + item13Size + + item14Size; var newSize = originalSize + item15Size; _headPtr = Marshal.AllocHGlobal(newSize); // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + Buffer.MemoryCopy(previous.HeadPtr, (void*) _headPtr, originalSize, originalSize); _item1Ptr = _headPtr + headSize; ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; @@ -6280,4 +9824,4 @@ public void Dispose() // Free memory block Marshal.FreeHGlobal(headPtr); } -} +} \ No newline at end of file diff --git a/PrototypeStructChaining/ManagedChain.tt b/PrototypeStructChaining/ManagedChain.gen.tt similarity index 80% rename from PrototypeStructChaining/ManagedChain.tt rename to PrototypeStructChaining/ManagedChain.gen.tt index 89df1c60b2..cb91403f6c 100644 --- a/PrototypeStructChaining/ManagedChain.tt +++ b/PrototypeStructChaining/ManagedChain.gen.tt @@ -97,6 +97,7 @@ #> using System.Runtime.CompilerServices; using System.Runtime.InteropServices; +using System.Text; namespace Silk.Net.Vulkan; @@ -229,6 +230,71 @@ public unsafe class ManagedChain<<#= tList #>> : IDisposable ((Chain*) _<#= prevItem #>Ptr)->PNext = (Chain*) _item<#= j #>Ptr; <# } // for (int j = 1; j < i; j++) { +#> + } + + /// + /// Creates a new with <#= i #> items from an existing unmanaged chain. + /// + /// The unmanaged chain to use as the basis of this chain. + /// Any errors loading the chain. + public ManagedChain(TChain chain, out string errors) + { + // Load existing chain first, so any errors occur before we allocate memory + var head = chain; + var headSize = Marshal.SizeOf(); + var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); + StructureType expectedStructureType; + StringBuilder errorBuilder = new StringBuilder(); + +<# + for (var j = 1; j < i; j++) + { +#> + currentPtr = currentPtr->PNext; + T<#= j #> item<#= j #> = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length <#= j #>, expected length <#= i #>"); + else { + expectedStructureType = item<#= j #>.StructureType(); + if (currentPtr->SType != expectedStructureType) + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position <#= j + 1 #>; expected ") + .Append(expectedStructureType) + .AppendLine(); + else + item<#= j #> = Unsafe.AsRef>(currentPtr); + } + var item<#= j #>Size = Marshal.SizeOf>(); + +<# + } // for (int j = 1; j < i; j++) { +#> + + // Create string of errors + errors = errorBuilder.ToString().Trim(); + + _headPtr = Marshal.AllocHGlobal(headSize<# + for (var j = 1; j < i; j++) + { +#> + item<#= j #>Size<# + } // for (int j = 1; j < i; j++) { +#>); + Marshal.StructureToPtr(head, _headPtr, false); +<# + for (var j = 1; j < i; j++) + { + var prevItem = j > 1 + ? $"item{j - 1}" + : "head"; +#> + + _item<#= j #>Ptr = _<#= prevItem #>Ptr + <#= prevItem #>Size; + Marshal.StructureToPtr(item<#= j #>, _item<#= j #>Ptr, false); + ((Chain*) _<#= prevItem #>Ptr)->PNext = (Chain*) _item<#= j #>Ptr; +<# + } // for (int j = 1; j < i; j++) { #> } <# @@ -279,13 +345,14 @@ public unsafe class ManagedChain<<#= tList #>> : IDisposable _item<#= j #>Ptr = _<#= prevItem #>Ptr + <#= prevItem #>Size; <# if (j == i - 1) - {#> + { +#> // Append the last structure item<#= j #>.StructureType(); Marshal.StructureToPtr(item<#= j #>, _item<#= j #>Ptr, false); <# } // if (j == i - 1) - #> +#> ((Chain*) _<#= prevItem #>Ptr)->PNext = (Chain*) _item<#= j #>Ptr; <# } // for (int j = 1; j < i; j++) { diff --git a/PrototypeStructChaining/PrototypeStructChaining.csproj b/PrototypeStructChaining/PrototypeStructChaining.csproj index 6de1a80a99..7feb76b14e 100644 --- a/PrototypeStructChaining/PrototypeStructChaining.csproj +++ b/PrototypeStructChaining/PrototypeStructChaining.csproj @@ -10,28 +10,33 @@ - - - - - - - + + + + + + + - + TextTemplatingFileGenerator - ManagedChain.cs + ManagedChain.gen.cs - - True - True - ManagedChain.tt - + + True + True + ManagedChain.gen.tt + + + True + True + ManagedChain.gen.tt + diff --git a/Readme.md b/Readme.md index 5efa2bc43f..4f51bfb5ad 100644 --- a/Readme.md +++ b/Readme.md @@ -181,7 +181,9 @@ Sometimes it is desirable to keep the structures around on the heap. To facilita the `ManagedChain` types. Like `Tuple` et al, these support up to chain size 16. They should be disposed when finished with. -Example: +### Creation + +For example: ```csharp using var chain = new ManagedChain( @@ -263,4 +269,70 @@ using var newChain = chain.Append(unmanagedChain, out var errors); + +// Check we had no loading errors +Assert.Equal("", errors); + +// Check the flag still set +Assert.True(managedChain.Item1.ShaderInputAttachmentArrayDynamicIndexing); +``` + +Notice that this special form of the constructor returns an output parameter `errors`. It does this to prevent any +possible confusion with the normal constructor which also can accept a single parameter of type `TChain` (which will +only load the head of the chain). Secondly, it also allows the constructor to indicate any failures that occurred whilst +loading from the unmanaged type, for example: + +```csharp +var indexingFeatures = new PhysicalDeviceDescriptorIndexingFeatures +{ + ShaderInputAttachmentArrayDynamicIndexing = true +}; +// Load an unmanaged chain +DeviceCreateInfo + .Chain(out var unmanagedChain) + .AddNext(out PhysicalDeviceFeatures2 features2) + .SetNext(ref indexingFeatures) + .AddNext(out PhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeaturesKhr); + +// Loads a new managed chain from an unmanaged chain +using var managedChain = + new ManagedChain< + DeviceCreateInfo, + // Note we are supplied a PhysicalDeviceFeatures2 here from the unmanaged chain + PhysicalDeviceAccelerationStructureFeaturesKHR, + PhysicalDeviceDescriptorIndexingFeatures, + PhysicalDeviceAccelerationStructureFeaturesKHR, + // Note that the unmanaged chain did not supply a 5th entry + PhysicalDeviceFeatures2>(unmanagedChain, out var errors); + +// Check for errors +Assert.Equal( +@"The unmanaged chain has a structure type PhysicalDeviceFeatures2Khr at position 2; expected PhysicalDeviceAccelerationStructureFeaturesKhr +The unmanaged chain was length 4, expected length 5", + errors); + +// Despite the errors indexing features was at the right location so was loaded +Assert.True(managedChain.Item2.ShaderInputAttachmentArrayDynamicIndexing); ``` \ No newline at end of file From ec40730b7dbcd014289acc8bf62e2ecf920fce59 Mon Sep 17 00:00:00 2001 From: Craig Dean Date: Sat, 6 Nov 2021 00:23:02 +0000 Subject: [PATCH 14/42] feat: Added `IReadOnlyList` support to `ManagedChain` --- .../TestManagedChains.cs | 26 + PrototypeStructChaining/ManagedChain.gen.cs | 8943 +---------------- PrototypeStructChaining/ManagedChain.gen.tt | 61 +- .../PrototypeStructChaining.csproj | 28 +- Readme.md | 29 +- 5 files changed, 278 insertions(+), 8809 deletions(-) diff --git a/PrototypeStructChaining.Test/TestManagedChains.cs b/PrototypeStructChaining.Test/TestManagedChains.cs index 6bbf0eb889..6708f88bad 100644 --- a/PrototypeStructChaining.Test/TestManagedChains.cs +++ b/PrototypeStructChaining.Test/TestManagedChains.cs @@ -1,3 +1,5 @@ +using System; +using System.Linq; using Silk.Net.Vulkan; using Xunit; @@ -207,4 +209,28 @@ public unsafe void TestManagedChainLoadWithError() // Despite the errors indexing features was at the right location so was loaded Assert.True(managedChain.Item2.ShaderInputAttachmentArrayDynamicIndexing); } + + [Fact] + public unsafe void TestReadOnlyList() + { + using var chain = new ManagedChain(); + + Assert.Equal(3, chain.Count); + + // Ensure all STypes set correctly using indexer + Assert.Equal(StructureType.PhysicalDeviceFeatures2, chain[0].StructureType()); + Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, chain[1].StructureType()); + Assert.Equal(StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr, chain[2].StructureType()); + + Assert.Throws(() => chain[3]); + + // Get array using IEnumerable implementation + IChainable[] structures = chain.ToArray(); + + // Check concrete types + Assert.IsType(structures[0]); + Assert.IsType(structures[1]); + Assert.IsType(structures[2]); + } } \ No newline at end of file diff --git a/PrototypeStructChaining/ManagedChain.gen.cs b/PrototypeStructChaining/ManagedChain.gen.cs index 0a58ef2b0b..6d3e16ebc9 100644 --- a/PrototypeStructChaining/ManagedChain.gen.cs +++ b/PrototypeStructChaining/ManagedChain.gen.cs @@ -1,3 +1,4 @@ +using System.Collections; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Text; @@ -7,8 +8,24 @@ namespace Silk.Net.Vulkan; /// /// Static class for creating Managed Chains. /// -public static class ManagedChain +public abstract class ManagedChain : IReadOnlyList, IDisposable { + /// + public abstract IEnumerator GetEnumerator(); + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + /// + public abstract int Count { get; } + + /// + public abstract IChainable this[int index] { get; } + + /// + public abstract void Dispose(); + /// /// Creates a new with 2 items. /// @@ -21,7 +38,7 @@ public static ManagedChain Create(TChain head = default, where TChain : struct, IChainStart where T1 : struct, IExtendsChain { - return new ManagedChain(head, item1); + return new(head, item1); } /// @@ -34,13 +51,12 @@ public static ManagedChain Create(TChain head = default, /// Type of Item 1. /// Type of Item 2. /// A new with 3 items. - public static ManagedChain Create(TChain head = default, T1 item1 = default, - T2 item2 = default) + public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain { - return new ManagedChain(head, item1, item2); + return new(head, item1, item2); } /// @@ -55,14 +71,13 @@ public static ManagedChain Create(TChain head = /// Type of Item 2. /// Type of Item 3. /// A new with 4 items. - public static ManagedChain Create(TChain head = default, T1 item1 = default, - T2 item2 = default, T3 item3 = default) + public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain where T3 : struct, IExtendsChain { - return new ManagedChain(head, item1, item2, item3); + return new(head, item1, item2, item3); } /// @@ -79,520 +94,16 @@ public static ManagedChain Create(TChain /// Type of Item 3. /// Type of Item 4. /// A new with 5 items. - public static ManagedChain Create(TChain head = default, - T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default) - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - { - return new ManagedChain(head, item1, item2, item3, item4); - } - - /// - /// Creates a new with 6 items. - /// - /// The head of the chain. - /// Item 1. - /// Item 2. - /// Item 3. - /// Item 4. - /// Item 5. - /// The chain type - /// Type of Item 1. - /// Type of Item 2. - /// Type of Item 3. - /// Type of Item 4. - /// Type of Item 5. - /// A new with 6 items. - public static ManagedChain Create(TChain head = default, - T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default) - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - { - return new ManagedChain(head, item1, item2, item3, item4, item5); - } - - /// - /// Creates a new with 7 items. - /// - /// The head of the chain. - /// Item 1. - /// Item 2. - /// Item 3. - /// Item 4. - /// Item 5. - /// Item 6. - /// The chain type - /// Type of Item 1. - /// Type of Item 2. - /// Type of Item 3. - /// Type of Item 4. - /// Type of Item 5. - /// Type of Item 6. - /// A new with 7 items. - public static ManagedChain Create( - TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, - T5 item5 = default, T6 item6 = default) - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - { - return new ManagedChain(head, item1, item2, item3, item4, item5, item6); - } - - /// - /// Creates a new with 8 items. - /// - /// The head of the chain. - /// Item 1. - /// Item 2. - /// Item 3. - /// Item 4. - /// Item 5. - /// Item 6. - /// Item 7. - /// The chain type - /// Type of Item 1. - /// Type of Item 2. - /// Type of Item 3. - /// Type of Item 4. - /// Type of Item 5. - /// Type of Item 6. - /// Type of Item 7. - /// A new with 8 items. - public static ManagedChain Create( - TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, - T5 item5 = default, T6 item6 = default, T7 item7 = default) - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain - { - return new ManagedChain(head, item1, item2, item3, item4, item5, item6, - item7); - } - - /// - /// Creates a new with 9 items. - /// - /// The head of the chain. - /// Item 1. - /// Item 2. - /// Item 3. - /// Item 4. - /// Item 5. - /// Item 6. - /// Item 7. - /// Item 8. - /// The chain type - /// Type of Item 1. - /// Type of Item 2. - /// Type of Item 3. - /// Type of Item 4. - /// Type of Item 5. - /// Type of Item 6. - /// Type of Item 7. - /// Type of Item 8. - /// A new with 9 items. - public static ManagedChain Create( - TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, - T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default) - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain - where T8 : struct, IExtendsChain - { - return new ManagedChain(head, item1, item2, item3, item4, item5, item6, - item7, item8); - } - - /// - /// Creates a new with 10 items. - /// - /// The head of the chain. - /// Item 1. - /// Item 2. - /// Item 3. - /// Item 4. - /// Item 5. - /// Item 6. - /// Item 7. - /// Item 8. - /// Item 9. - /// The chain type - /// Type of Item 1. - /// Type of Item 2. - /// Type of Item 3. - /// Type of Item 4. - /// Type of Item 5. - /// Type of Item 6. - /// Type of Item 7. - /// Type of Item 8. - /// Type of Item 9. - /// A new with 10 items. - public static ManagedChain - Create(TChain head = default, T1 item1 = default, - T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, - T7 item7 = default, T8 item8 = default, T9 item9 = default) - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain - where T8 : struct, IExtendsChain - where T9 : struct, IExtendsChain - { - return new ManagedChain(head, item1, item2, item3, item4, item5, - item6, item7, item8, item9); - } - - /// - /// Creates a new with 11 items. - /// - /// The head of the chain. - /// Item 1. - /// Item 2. - /// Item 3. - /// Item 4. - /// Item 5. - /// Item 6. - /// Item 7. - /// Item 8. - /// Item 9. - /// Item 10. - /// The chain type - /// Type of Item 1. - /// Type of Item 2. - /// Type of Item 3. - /// Type of Item 4. - /// Type of Item 5. - /// Type of Item 6. - /// Type of Item 7. - /// Type of Item 8. - /// Type of Item 9. - /// Type of Item 10. - /// A new with 11 items. - public static ManagedChain - Create(TChain head = default, T1 item1 = default, - T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, - T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default) - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain - where T8 : struct, IExtendsChain - where T9 : struct, IExtendsChain - where T10 : struct, IExtendsChain - { - return new ManagedChain(head, item1, item2, item3, item4, - item5, item6, item7, item8, item9, item10); - } - - /// - /// Creates a new with 12 items. - /// - /// The head of the chain. - /// Item 1. - /// Item 2. - /// Item 3. - /// Item 4. - /// Item 5. - /// Item 6. - /// Item 7. - /// Item 8. - /// Item 9. - /// Item 10. - /// Item 11. - /// The chain type - /// Type of Item 1. - /// Type of Item 2. - /// Type of Item 3. - /// Type of Item 4. - /// Type of Item 5. - /// Type of Item 6. - /// Type of Item 7. - /// Type of Item 8. - /// Type of Item 9. - /// Type of Item 10. - /// Type of Item 11. - /// A new with 12 items. - public static ManagedChain - Create(TChain head = default, T1 item1 = default, - T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, - T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default) - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain - where T8 : struct, IExtendsChain - where T9 : struct, IExtendsChain - where T10 : struct, IExtendsChain - where T11 : struct, IExtendsChain - { - return new ManagedChain(head, item1, item2, item3, item4, - item5, item6, item7, item8, item9, item10, item11); - } - - /// - /// Creates a new with 13 items. - /// - /// The head of the chain. - /// Item 1. - /// Item 2. - /// Item 3. - /// Item 4. - /// Item 5. - /// Item 6. - /// Item 7. - /// Item 8. - /// Item 9. - /// Item 10. - /// Item 11. - /// Item 12. - /// The chain type - /// Type of Item 1. - /// Type of Item 2. - /// Type of Item 3. - /// Type of Item 4. - /// Type of Item 5. - /// Type of Item 6. - /// Type of Item 7. - /// Type of Item 8. - /// Type of Item 9. - /// Type of Item 10. - /// Type of Item 11. - /// Type of Item 12. - /// A new with 13 items. - public static ManagedChain - Create(TChain head = default, T1 item1 = default, - T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, - T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, - T12 item12 = default) - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain - where T8 : struct, IExtendsChain - where T9 : struct, IExtendsChain - where T10 : struct, IExtendsChain - where T11 : struct, IExtendsChain - where T12 : struct, IExtendsChain - { - return new ManagedChain(head, item1, item2, item3, - item4, item5, item6, item7, item8, item9, item10, item11, item12); - } - - /// - /// Creates a new with 14 items. - /// - /// The head of the chain. - /// Item 1. - /// Item 2. - /// Item 3. - /// Item 4. - /// Item 5. - /// Item 6. - /// Item 7. - /// Item 8. - /// Item 9. - /// Item 10. - /// Item 11. - /// Item 12. - /// Item 13. - /// The chain type - /// Type of Item 1. - /// Type of Item 2. - /// Type of Item 3. - /// Type of Item 4. - /// Type of Item 5. - /// Type of Item 6. - /// Type of Item 7. - /// Type of Item 8. - /// Type of Item 9. - /// Type of Item 10. - /// Type of Item 11. - /// Type of Item 12. - /// Type of Item 13. - /// A new with 14 items. - public static ManagedChain - Create(TChain head = default, - T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, - T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, - T11 item11 = default, T12 item12 = default, T13 item13 = default) - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain - where T8 : struct, IExtendsChain - where T9 : struct, IExtendsChain - where T10 : struct, IExtendsChain - where T11 : struct, IExtendsChain - where T12 : struct, IExtendsChain - where T13 : struct, IExtendsChain - { - return new ManagedChain(head, item1, item2, - item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13); - } - - /// - /// Creates a new with 15 items. - /// - /// The head of the chain. - /// Item 1. - /// Item 2. - /// Item 3. - /// Item 4. - /// Item 5. - /// Item 6. - /// Item 7. - /// Item 8. - /// Item 9. - /// Item 10. - /// Item 11. - /// Item 12. - /// Item 13. - /// Item 14. - /// The chain type - /// Type of Item 1. - /// Type of Item 2. - /// Type of Item 3. - /// Type of Item 4. - /// Type of Item 5. - /// Type of Item 6. - /// Type of Item 7. - /// Type of Item 8. - /// Type of Item 9. - /// Type of Item 10. - /// Type of Item 11. - /// Type of Item 12. - /// Type of Item 13. - /// Type of Item 14. - /// A new with 15 items. - public static ManagedChain - Create(TChain head = default, - T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, - T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, - T11 item11 = default, T12 item12 = default, T13 item13 = default, T14 item14 = default) + public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain where T3 : struct, IExtendsChain where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain - where T8 : struct, IExtendsChain - where T9 : struct, IExtendsChain - where T10 : struct, IExtendsChain - where T11 : struct, IExtendsChain - where T12 : struct, IExtendsChain - where T13 : struct, IExtendsChain - where T14 : struct, IExtendsChain { - return new ManagedChain(head, item1, item2, - item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13, item14); + return new(head, item1, item2, item3, item4); } - /// - /// Creates a new with 16 items. - /// - /// The head of the chain. - /// Item 1. - /// Item 2. - /// Item 3. - /// Item 4. - /// Item 5. - /// Item 6. - /// Item 7. - /// Item 8. - /// Item 9. - /// Item 10. - /// Item 11. - /// Item 12. - /// Item 13. - /// Item 14. - /// Item 15. - /// The chain type - /// Type of Item 1. - /// Type of Item 2. - /// Type of Item 3. - /// Type of Item 4. - /// Type of Item 5. - /// Type of Item 6. - /// Type of Item 7. - /// Type of Item 8. - /// Type of Item 9. - /// Type of Item 10. - /// Type of Item 11. - /// Type of Item 12. - /// Type of Item 13. - /// Type of Item 14. - /// Type of Item 15. - /// A new with 16 items. - public static ManagedChain - Create(TChain head = default, - T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, - T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, - T11 item11 = default, T12 item12 = default, T13 item13 = default, T14 item14 = default, - T15 item15 = default) - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain - where T8 : struct, IExtendsChain - where T9 : struct, IExtendsChain - where T10 : struct, IExtendsChain - where T11 : struct, IExtendsChain - where T12 : struct, IExtendsChain - where T13 : struct, IExtendsChain - where T14 : struct, IExtendsChain - where T15 : struct, IExtendsChain - { - return new ManagedChain(head, item1, - item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13, item14, item15); - } } /// @@ -600,7 +111,7 @@ public static ManagedChain /// The chain type /// Type of Item 1. -public unsafe class ManagedChain : IDisposable +public unsafe class ManagedChain : ManagedChain where TChain : struct, IChainStart where T1 : struct, IExtendsChain { @@ -681,27 +192,23 @@ public ManagedChain(TChain chain, out string errors) var headSize = Marshal.SizeOf(); var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); StructureType expectedStructureType; - var errorBuilder = new StringBuilder(); + StringBuilder errorBuilder = new StringBuilder(); currentPtr = currentPtr->PNext; T1 item1 = default; if (currentPtr is null) errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 2"); - else - { + else { expectedStructureType = item1.StructureType(); - if (currentPtr->SType != expectedStructureType) - { + if (currentPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") .Append(currentPtr->SType) .Append(" at position 2; expected ") .Append(expectedStructureType) .AppendLine(); - } - else + } else item1 = Unsafe.AsRef(currentPtr); } - var item1Size = Marshal.SizeOf(); @@ -726,13 +233,31 @@ public ManagedChain(TChain chain, out string errors) /// Do not forget to dispose this chain if you are no longer using it. /// public ManagedChain Append(T2 item2 = default) - where T2 : struct, IExtendsChain + where T2: struct, IExtendsChain { return new ManagedChain(this, item2); } /// - public void Dispose() + public override IEnumerator GetEnumerator() + { + yield return Head; + yield return Item1; + } + + /// + public override int Count => 2; + + /// + public override IChainable this[int index] + => index switch + { + 0 => Head, 1 => Item1, + _ => throw new IndexOutOfRangeException() + }; + + /// + public override void Dispose() { var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); if (headPtr == IntPtr.Zero) return; @@ -753,7 +278,7 @@ public void Dispose() /// The chain type /// Type of Item 1. /// Type of Item 2. -public unsafe class ManagedChain : IDisposable +public unsafe class ManagedChain : ManagedChain where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain @@ -801,7 +326,6 @@ public T1 Item1 ((Chain*) _item1Ptr)->PNext = nextPtr; } } - private IntPtr _item2Ptr; /// @@ -864,48 +388,40 @@ public ManagedChain(TChain chain, out string errors) var headSize = Marshal.SizeOf(); var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); StructureType expectedStructureType; - var errorBuilder = new StringBuilder(); + StringBuilder errorBuilder = new StringBuilder(); currentPtr = currentPtr->PNext; T1 item1 = default; if (currentPtr is null) errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 3"); - else - { + else { expectedStructureType = item1.StructureType(); - if (currentPtr->SType != expectedStructureType) - { + if (currentPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") .Append(currentPtr->SType) .Append(" at position 2; expected ") .Append(expectedStructureType) .AppendLine(); - } - else + } else item1 = Unsafe.AsRef(currentPtr); } - var item1Size = Marshal.SizeOf(); currentPtr = currentPtr->PNext; T2 item2 = default; if (currentPtr is null) errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 3"); - else - { + else { expectedStructureType = item2.StructureType(); - if (currentPtr->SType != expectedStructureType) - { + if (currentPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") .Append(currentPtr->SType) .Append(" at position 3; expected ") .Append(expectedStructureType) .AppendLine(); - } - else + } else item2 = Unsafe.AsRef(currentPtr); } - var item2Size = Marshal.SizeOf(); @@ -944,7 +460,7 @@ public ManagedChain(ManagedChain previous, T2 item2 = default) _headPtr = Marshal.AllocHGlobal(newSize); // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*) _headPtr, originalSize, originalSize); + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); _item1Ptr = _headPtr + headSize; ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; @@ -966,13 +482,33 @@ public ManagedChain(ManagedChain previous, T2 item2 = default) /// Do not forget to dispose this chain if you are no longer using it. /// public ManagedChain Append(T3 item3 = default) - where T3 : struct, IExtendsChain + where T3: struct, IExtendsChain { return new ManagedChain(this, item3); } /// - public void Dispose() + public override IEnumerator GetEnumerator() + { + yield return Head; + yield return Item1; + yield return Item2; + } + + /// + public override int Count => 3; + + /// + public override IChainable this[int index] + => index switch + { + 0 => Head, 1 => Item1, + 2 => Item2, + _ => throw new IndexOutOfRangeException() + }; + + /// + public override void Dispose() { var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); if (headPtr == IntPtr.Zero) return; @@ -996,7 +532,7 @@ public void Dispose() /// Type of Item 1. /// Type of Item 2. /// Type of Item 3. -public unsafe class ManagedChain : IDisposable +public unsafe class ManagedChain : ManagedChain where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain @@ -1045,7 +581,6 @@ public T1 Item1 ((Chain*) _item1Ptr)->PNext = nextPtr; } } - private IntPtr _item2Ptr; /// @@ -1067,7 +602,6 @@ public T2 Item2 ((Chain*) _item2Ptr)->PNext = nextPtr; } } - private IntPtr _item3Ptr; /// @@ -1137,69 +671,57 @@ public ManagedChain(TChain chain, out string errors) var headSize = Marshal.SizeOf(); var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); StructureType expectedStructureType; - var errorBuilder = new StringBuilder(); + StringBuilder errorBuilder = new StringBuilder(); currentPtr = currentPtr->PNext; T1 item1 = default; if (currentPtr is null) errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 4"); - else - { + else { expectedStructureType = item1.StructureType(); - if (currentPtr->SType != expectedStructureType) - { + if (currentPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") .Append(currentPtr->SType) .Append(" at position 2; expected ") .Append(expectedStructureType) .AppendLine(); - } - else + } else item1 = Unsafe.AsRef(currentPtr); } - var item1Size = Marshal.SizeOf(); currentPtr = currentPtr->PNext; T2 item2 = default; if (currentPtr is null) errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 4"); - else - { + else { expectedStructureType = item2.StructureType(); - if (currentPtr->SType != expectedStructureType) - { + if (currentPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") .Append(currentPtr->SType) .Append(" at position 3; expected ") .Append(expectedStructureType) .AppendLine(); - } - else + } else item2 = Unsafe.AsRef(currentPtr); } - var item2Size = Marshal.SizeOf(); currentPtr = currentPtr->PNext; T3 item3 = default; if (currentPtr is null) errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 4"); - else - { + else { expectedStructureType = item3.StructureType(); - if (currentPtr->SType != expectedStructureType) - { + if (currentPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") .Append(currentPtr->SType) .Append(" at position 4; expected ") .Append(expectedStructureType) .AppendLine(); - } - else + } else item3 = Unsafe.AsRef(currentPtr); } - var item3Size = Marshal.SizeOf(); @@ -1243,7 +765,7 @@ public ManagedChain(ManagedChain previous, T3 item3 = default) _headPtr = Marshal.AllocHGlobal(newSize); // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*) _headPtr, originalSize, originalSize); + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); _item1Ptr = _headPtr + headSize; ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; @@ -1268,13 +790,35 @@ public ManagedChain(ManagedChain previous, T3 item3 = default) /// Do not forget to dispose this chain if you are no longer using it. /// public ManagedChain Append(T4 item4 = default) - where T4 : struct, IExtendsChain + where T4: struct, IExtendsChain { return new ManagedChain(this, item4); } /// - public void Dispose() + public override IEnumerator GetEnumerator() + { + yield return Head; + yield return Item1; + yield return Item2; + yield return Item3; + } + + /// + public override int Count => 4; + + /// + public override IChainable this[int index] + => index switch + { + 0 => Head, 1 => Item1, + 2 => Item2, + 3 => Item3, + _ => throw new IndexOutOfRangeException() + }; + + /// + public override void Dispose() { var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); if (headPtr == IntPtr.Zero) return; @@ -1301,7 +845,7 @@ public void Dispose() /// Type of Item 2. /// Type of Item 3. /// Type of Item 4. -public unsafe class ManagedChain : IDisposable +public unsafe class ManagedChain : ManagedChain where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain @@ -1351,7 +895,6 @@ public T1 Item1 ((Chain*) _item1Ptr)->PNext = nextPtr; } } - private IntPtr _item2Ptr; /// @@ -1373,7 +916,6 @@ public T2 Item2 ((Chain*) _item2Ptr)->PNext = nextPtr; } } - private IntPtr _item3Ptr; /// @@ -1395,7 +937,6 @@ public T3 Item3 ((Chain*) _item3Ptr)->PNext = nextPtr; } } - private IntPtr _item4Ptr; /// @@ -1426,8 +967,7 @@ public T4 Item4 /// Item 2. /// Item 3. /// Item 4. - public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, - T4 item4 = default) + public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default) { // Calculate memory requirements var headSize = Marshal.SizeOf(); @@ -1473,90 +1013,74 @@ public ManagedChain(TChain chain, out string errors) var headSize = Marshal.SizeOf(); var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); StructureType expectedStructureType; - var errorBuilder = new StringBuilder(); + StringBuilder errorBuilder = new StringBuilder(); currentPtr = currentPtr->PNext; T1 item1 = default; if (currentPtr is null) errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 5"); - else - { + else { expectedStructureType = item1.StructureType(); - if (currentPtr->SType != expectedStructureType) - { + if (currentPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") .Append(currentPtr->SType) .Append(" at position 2; expected ") .Append(expectedStructureType) .AppendLine(); - } - else + } else item1 = Unsafe.AsRef(currentPtr); } - var item1Size = Marshal.SizeOf(); currentPtr = currentPtr->PNext; T2 item2 = default; if (currentPtr is null) errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 5"); - else - { + else { expectedStructureType = item2.StructureType(); - if (currentPtr->SType != expectedStructureType) - { + if (currentPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") .Append(currentPtr->SType) .Append(" at position 3; expected ") .Append(expectedStructureType) .AppendLine(); - } - else + } else item2 = Unsafe.AsRef(currentPtr); } - var item2Size = Marshal.SizeOf(); currentPtr = currentPtr->PNext; T3 item3 = default; if (currentPtr is null) errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 5"); - else - { + else { expectedStructureType = item3.StructureType(); - if (currentPtr->SType != expectedStructureType) - { + if (currentPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") .Append(currentPtr->SType) .Append(" at position 4; expected ") .Append(expectedStructureType) .AppendLine(); - } - else + } else item3 = Unsafe.AsRef(currentPtr); } - var item3Size = Marshal.SizeOf(); currentPtr = currentPtr->PNext; T4 item4 = default; if (currentPtr is null) errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 5"); - else - { + else { expectedStructureType = item4.StructureType(); - if (currentPtr->SType != expectedStructureType) - { + if (currentPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") .Append(currentPtr->SType) .Append(" at position 5; expected ") .Append(expectedStructureType) .AppendLine(); - } - else + } else item4 = Unsafe.AsRef(currentPtr); } - var item4Size = Marshal.SizeOf(); @@ -1605,7 +1129,7 @@ public ManagedChain(ManagedChain previous, T4 item4 = defaul _headPtr = Marshal.AllocHGlobal(newSize); // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*) _headPtr, originalSize, originalSize); + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); _item1Ptr = _headPtr + headSize; ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; @@ -1623,23 +1147,32 @@ public ManagedChain(ManagedChain previous, T4 item4 = defaul ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; } - /// - /// Creates a new with 6 items, by appending to - /// the end of this chain. - /// - /// Item 5. - /// Type of Item 5 - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Append(T5 item5 = default) - where T5 : struct, IExtendsChain + /// + public override IEnumerator GetEnumerator() { - return new ManagedChain(this, item5); + yield return Head; + yield return Item1; + yield return Item2; + yield return Item3; + yield return Item4; } /// - public void Dispose() + public override int Count => 5; + + /// + public override IChainable this[int index] + => index switch + { + 0 => Head, 1 => Item1, + 2 => Item2, + 3 => Item3, + 4 => Item4, + _ => throw new IndexOutOfRangeException() + }; + + /// + public override void Dispose() { var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); if (headPtr == IntPtr.Zero) return; @@ -1659,8169 +1192,3 @@ public void Dispose() Marshal.FreeHGlobal(headPtr); } } - -/// -/// A safely manages the pointers of a managed structure chain. -/// -/// The chain type -/// Type of Item 1. -/// Type of Item 2. -/// Type of Item 3. -/// Type of Item 4. -/// Type of Item 5. -public unsafe class ManagedChain : IDisposable - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain -{ - private IntPtr _headPtr; - - /// - /// Gets a pointer to the current head. - /// - public Chain* HeadPtr => (Chain*) _headPtr; - - /// - /// Gets or sets the head of the chain. - /// - public TChain Head - { - get => Unsafe.AsRef((Chain*) _headPtr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _headPtr)->PNext; - Marshal.StructureToPtr(value, _headPtr, true); - ((Chain*) _headPtr)->PNext = nextPtr; - } - } - - private IntPtr _item1Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item1Ptr => (Chain*) _item1Ptr; - - /// - /// Gets or sets item #1 in the chain. - /// - public T1 Item1 - { - get => Unsafe.AsRef((Chain*) _item1Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item1Ptr)->PNext; - Marshal.StructureToPtr(value, _item1Ptr, true); - ((Chain*) _item1Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item2Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item2Ptr => (Chain*) _item2Ptr; - - /// - /// Gets or sets item #2 in the chain. - /// - public T2 Item2 - { - get => Unsafe.AsRef((Chain*) _item2Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item2Ptr)->PNext; - Marshal.StructureToPtr(value, _item2Ptr, true); - ((Chain*) _item2Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item3Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item3Ptr => (Chain*) _item3Ptr; - - /// - /// Gets or sets item #3 in the chain. - /// - public T3 Item3 - { - get => Unsafe.AsRef((Chain*) _item3Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item3Ptr)->PNext; - Marshal.StructureToPtr(value, _item3Ptr, true); - ((Chain*) _item3Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item4Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item4Ptr => (Chain*) _item4Ptr; - - /// - /// Gets or sets item #4 in the chain. - /// - public T4 Item4 - { - get => Unsafe.AsRef((Chain*) _item4Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item4Ptr)->PNext; - Marshal.StructureToPtr(value, _item4Ptr, true); - ((Chain*) _item4Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item5Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item5Ptr => (Chain*) _item5Ptr; - - /// - /// Gets or sets item #5 in the chain. - /// - public T5 Item5 - { - get => Unsafe.AsRef((Chain*) _item5Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item5Ptr)->PNext; - Marshal.StructureToPtr(value, _item5Ptr, true); - ((Chain*) _item5Ptr)->PNext = nextPtr; - } - } - - /// - /// Creates a new with 6 items. - /// - /// The head of the chain. - /// Item 1. - /// Item 2. - /// Item 3. - /// Item 4. - /// Item 5. - public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, - T4 item4 = default, T5 item5 = default) - { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size); - head.StructureType(); - Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; - item1.StructureType(); - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - item2.StructureType(); - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - item3.StructureType(); - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - item4.StructureType(); - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - item5.StructureType(); - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - } - - /// - /// Creates a new with 6 items from an existing unmanaged chain. - /// - /// The unmanaged chain to use as the basis of this chain. - /// Any errors loading the chain. - public ManagedChain(TChain chain, out string errors) - { - // Load existing chain first, so any errors occur before we allocate memory - var head = chain; - var headSize = Marshal.SizeOf(); - var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); - StructureType expectedStructureType; - var errorBuilder = new StringBuilder(); - - currentPtr = currentPtr->PNext; - T1 item1 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 6"); - else - { - expectedStructureType = item1.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 2; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item1 = Unsafe.AsRef(currentPtr); - } - - var item1Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T2 item2 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 6"); - else - { - expectedStructureType = item2.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 3; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item2 = Unsafe.AsRef(currentPtr); - } - - var item2Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T3 item3 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 6"); - else - { - expectedStructureType = item3.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 4; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item3 = Unsafe.AsRef(currentPtr); - } - - var item3Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T4 item4 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 6"); - else - { - expectedStructureType = item4.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 5; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item4 = Unsafe.AsRef(currentPtr); - } - - var item4Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T5 item5 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 6"); - else - { - expectedStructureType = item5.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 6; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item5 = Unsafe.AsRef(currentPtr); - } - - var item5Size = Marshal.SizeOf(); - - - // Create string of errors - errors = errorBuilder.ToString().Trim(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size); - Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - } - - /// - /// Creates a new with 6 items. - /// - /// The chain to append to. - /// Item 5. - /// - /// Do not forget to dispose the chain if you are no longer using it. - /// - public ManagedChain(ManagedChain previous, T5 item5 = default) - { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - - var originalSize = headSize + item1Size + item2Size + item3Size + item4Size; - var newSize = originalSize + item5Size; - - _headPtr = Marshal.AllocHGlobal(newSize); - // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*) _headPtr, originalSize, originalSize); - - _item1Ptr = _headPtr + headSize; - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - // Append the last structure - item5.StructureType(); - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - } - - /// - /// Creates a new with 7 items, by appending to - /// the end of this chain. - /// - /// Item 6. - /// Type of Item 6 - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Append(T6 item6 = default) - where T6 : struct, IExtendsChain - { - return new ManagedChain(this, item6); - } - - /// - public void Dispose() - { - var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); - if (headPtr == IntPtr.Zero) return; - - // Destroy all structures - Marshal.DestroyStructure(headPtr); - var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item1Ptr); - var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item2Ptr); - var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item3Ptr); - var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item4Ptr); - var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item5Ptr); - - // Free memory block - Marshal.FreeHGlobal(headPtr); - } -} - -/// -/// A safely manages the pointers of a managed structure chain. -/// -/// The chain type -/// Type of Item 1. -/// Type of Item 2. -/// Type of Item 3. -/// Type of Item 4. -/// Type of Item 5. -/// Type of Item 6. -public unsafe class ManagedChain : IDisposable - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain -{ - private IntPtr _headPtr; - - /// - /// Gets a pointer to the current head. - /// - public Chain* HeadPtr => (Chain*) _headPtr; - - /// - /// Gets or sets the head of the chain. - /// - public TChain Head - { - get => Unsafe.AsRef((Chain*) _headPtr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _headPtr)->PNext; - Marshal.StructureToPtr(value, _headPtr, true); - ((Chain*) _headPtr)->PNext = nextPtr; - } - } - - private IntPtr _item1Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item1Ptr => (Chain*) _item1Ptr; - - /// - /// Gets or sets item #1 in the chain. - /// - public T1 Item1 - { - get => Unsafe.AsRef((Chain*) _item1Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item1Ptr)->PNext; - Marshal.StructureToPtr(value, _item1Ptr, true); - ((Chain*) _item1Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item2Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item2Ptr => (Chain*) _item2Ptr; - - /// - /// Gets or sets item #2 in the chain. - /// - public T2 Item2 - { - get => Unsafe.AsRef((Chain*) _item2Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item2Ptr)->PNext; - Marshal.StructureToPtr(value, _item2Ptr, true); - ((Chain*) _item2Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item3Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item3Ptr => (Chain*) _item3Ptr; - - /// - /// Gets or sets item #3 in the chain. - /// - public T3 Item3 - { - get => Unsafe.AsRef((Chain*) _item3Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item3Ptr)->PNext; - Marshal.StructureToPtr(value, _item3Ptr, true); - ((Chain*) _item3Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item4Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item4Ptr => (Chain*) _item4Ptr; - - /// - /// Gets or sets item #4 in the chain. - /// - public T4 Item4 - { - get => Unsafe.AsRef((Chain*) _item4Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item4Ptr)->PNext; - Marshal.StructureToPtr(value, _item4Ptr, true); - ((Chain*) _item4Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item5Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item5Ptr => (Chain*) _item5Ptr; - - /// - /// Gets or sets item #5 in the chain. - /// - public T5 Item5 - { - get => Unsafe.AsRef((Chain*) _item5Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item5Ptr)->PNext; - Marshal.StructureToPtr(value, _item5Ptr, true); - ((Chain*) _item5Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item6Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item6Ptr => (Chain*) _item6Ptr; - - /// - /// Gets or sets item #6 in the chain. - /// - public T6 Item6 - { - get => Unsafe.AsRef((Chain*) _item6Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item6Ptr)->PNext; - Marshal.StructureToPtr(value, _item6Ptr, true); - ((Chain*) _item6Ptr)->PNext = nextPtr; - } - } - - /// - /// Creates a new with 7 items. - /// - /// The head of the chain. - /// Item 1. - /// Item 2. - /// Item 3. - /// Item 4. - /// Item 5. - /// Item 6. - public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, - T4 item4 = default, T5 item5 = default, T6 item6 = default) - { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - var item6Size = Marshal.SizeOf(); - - _headPtr = Marshal.AllocHGlobal( - headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size); - head.StructureType(); - Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; - item1.StructureType(); - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - item2.StructureType(); - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - item3.StructureType(); - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - item4.StructureType(); - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - item5.StructureType(); - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - item6.StructureType(); - Marshal.StructureToPtr(item6, _item6Ptr, false); - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - } - - /// - /// Creates a new with 7 items from an existing unmanaged chain. - /// - /// The unmanaged chain to use as the basis of this chain. - /// Any errors loading the chain. - public ManagedChain(TChain chain, out string errors) - { - // Load existing chain first, so any errors occur before we allocate memory - var head = chain; - var headSize = Marshal.SizeOf(); - var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); - StructureType expectedStructureType; - var errorBuilder = new StringBuilder(); - - currentPtr = currentPtr->PNext; - T1 item1 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 7"); - else - { - expectedStructureType = item1.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 2; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item1 = Unsafe.AsRef(currentPtr); - } - - var item1Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T2 item2 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 7"); - else - { - expectedStructureType = item2.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 3; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item2 = Unsafe.AsRef(currentPtr); - } - - var item2Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T3 item3 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 7"); - else - { - expectedStructureType = item3.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 4; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item3 = Unsafe.AsRef(currentPtr); - } - - var item3Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T4 item4 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 7"); - else - { - expectedStructureType = item4.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 5; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item4 = Unsafe.AsRef(currentPtr); - } - - var item4Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T5 item5 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 7"); - else - { - expectedStructureType = item5.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 6; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item5 = Unsafe.AsRef(currentPtr); - } - - var item5Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T6 item6 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 7"); - else - { - expectedStructureType = item6.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 7; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item6 = Unsafe.AsRef(currentPtr); - } - - var item6Size = Marshal.SizeOf(); - - - // Create string of errors - errors = errorBuilder.ToString().Trim(); - - _headPtr = Marshal.AllocHGlobal( - headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size); - Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - Marshal.StructureToPtr(item6, _item6Ptr, false); - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - } - - /// - /// Creates a new with 7 items. - /// - /// The chain to append to. - /// Item 6. - /// - /// Do not forget to dispose the chain if you are no longer using it. - /// - public ManagedChain(ManagedChain previous, T6 item6 = default) - { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - var item6Size = Marshal.SizeOf(); - - var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size; - var newSize = originalSize + item6Size; - - _headPtr = Marshal.AllocHGlobal(newSize); - // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*) _headPtr, originalSize, originalSize); - - _item1Ptr = _headPtr + headSize; - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - // Append the last structure - item6.StructureType(); - Marshal.StructureToPtr(item6, _item6Ptr, false); - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - } - - /// - /// Creates a new with 8 items, by appending to - /// the end of this chain. - /// - /// Item 7. - /// Type of Item 7 - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Append(T7 item7 = default) - where T7 : struct, IExtendsChain - { - return new ManagedChain(this, item7); - } - - /// - public void Dispose() - { - var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); - if (headPtr == IntPtr.Zero) return; - - // Destroy all structures - Marshal.DestroyStructure(headPtr); - var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item1Ptr); - var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item2Ptr); - var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item3Ptr); - var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item4Ptr); - var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item5Ptr); - var item6Ptr = Interlocked.Exchange(ref _item6Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item6Ptr); - - // Free memory block - Marshal.FreeHGlobal(headPtr); - } -} - -/// -/// A safely manages the pointers of a managed structure chain. -/// -/// The chain type -/// Type of Item 1. -/// Type of Item 2. -/// Type of Item 3. -/// Type of Item 4. -/// Type of Item 5. -/// Type of Item 6. -/// Type of Item 7. -public unsafe class ManagedChain : IDisposable - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain -{ - private IntPtr _headPtr; - - /// - /// Gets a pointer to the current head. - /// - public Chain* HeadPtr => (Chain*) _headPtr; - - /// - /// Gets or sets the head of the chain. - /// - public TChain Head - { - get => Unsafe.AsRef((Chain*) _headPtr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _headPtr)->PNext; - Marshal.StructureToPtr(value, _headPtr, true); - ((Chain*) _headPtr)->PNext = nextPtr; - } - } - - private IntPtr _item1Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item1Ptr => (Chain*) _item1Ptr; - - /// - /// Gets or sets item #1 in the chain. - /// - public T1 Item1 - { - get => Unsafe.AsRef((Chain*) _item1Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item1Ptr)->PNext; - Marshal.StructureToPtr(value, _item1Ptr, true); - ((Chain*) _item1Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item2Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item2Ptr => (Chain*) _item2Ptr; - - /// - /// Gets or sets item #2 in the chain. - /// - public T2 Item2 - { - get => Unsafe.AsRef((Chain*) _item2Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item2Ptr)->PNext; - Marshal.StructureToPtr(value, _item2Ptr, true); - ((Chain*) _item2Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item3Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item3Ptr => (Chain*) _item3Ptr; - - /// - /// Gets or sets item #3 in the chain. - /// - public T3 Item3 - { - get => Unsafe.AsRef((Chain*) _item3Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item3Ptr)->PNext; - Marshal.StructureToPtr(value, _item3Ptr, true); - ((Chain*) _item3Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item4Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item4Ptr => (Chain*) _item4Ptr; - - /// - /// Gets or sets item #4 in the chain. - /// - public T4 Item4 - { - get => Unsafe.AsRef((Chain*) _item4Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item4Ptr)->PNext; - Marshal.StructureToPtr(value, _item4Ptr, true); - ((Chain*) _item4Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item5Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item5Ptr => (Chain*) _item5Ptr; - - /// - /// Gets or sets item #5 in the chain. - /// - public T5 Item5 - { - get => Unsafe.AsRef((Chain*) _item5Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item5Ptr)->PNext; - Marshal.StructureToPtr(value, _item5Ptr, true); - ((Chain*) _item5Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item6Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item6Ptr => (Chain*) _item6Ptr; - - /// - /// Gets or sets item #6 in the chain. - /// - public T6 Item6 - { - get => Unsafe.AsRef((Chain*) _item6Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item6Ptr)->PNext; - Marshal.StructureToPtr(value, _item6Ptr, true); - ((Chain*) _item6Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item7Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item7Ptr => (Chain*) _item7Ptr; - - /// - /// Gets or sets item #7 in the chain. - /// - public T7 Item7 - { - get => Unsafe.AsRef((Chain*) _item7Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item7Ptr)->PNext; - Marshal.StructureToPtr(value, _item7Ptr, true); - ((Chain*) _item7Ptr)->PNext = nextPtr; - } - } - - /// - /// Creates a new with 8 items. - /// - /// The head of the chain. - /// Item 1. - /// Item 2. - /// Item 3. - /// Item 4. - /// Item 5. - /// Item 6. - /// Item 7. - public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, - T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default) - { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - var item6Size = Marshal.SizeOf(); - var item7Size = Marshal.SizeOf(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + - item6Size + item7Size); - head.StructureType(); - Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; - item1.StructureType(); - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - item2.StructureType(); - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - item3.StructureType(); - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - item4.StructureType(); - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - item5.StructureType(); - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - item6.StructureType(); - Marshal.StructureToPtr(item6, _item6Ptr, false); - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - item7.StructureType(); - Marshal.StructureToPtr(item7, _item7Ptr, false); - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - } - - /// - /// Creates a new with 8 items from an existing unmanaged chain. - /// - /// The unmanaged chain to use as the basis of this chain. - /// Any errors loading the chain. - public ManagedChain(TChain chain, out string errors) - { - // Load existing chain first, so any errors occur before we allocate memory - var head = chain; - var headSize = Marshal.SizeOf(); - var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); - StructureType expectedStructureType; - var errorBuilder = new StringBuilder(); - - currentPtr = currentPtr->PNext; - T1 item1 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 8"); - else - { - expectedStructureType = item1.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 2; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item1 = Unsafe.AsRef(currentPtr); - } - - var item1Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T2 item2 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 8"); - else - { - expectedStructureType = item2.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 3; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item2 = Unsafe.AsRef(currentPtr); - } - - var item2Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T3 item3 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 8"); - else - { - expectedStructureType = item3.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 4; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item3 = Unsafe.AsRef(currentPtr); - } - - var item3Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T4 item4 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 8"); - else - { - expectedStructureType = item4.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 5; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item4 = Unsafe.AsRef(currentPtr); - } - - var item4Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T5 item5 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 8"); - else - { - expectedStructureType = item5.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 6; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item5 = Unsafe.AsRef(currentPtr); - } - - var item5Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T6 item6 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 8"); - else - { - expectedStructureType = item6.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 7; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item6 = Unsafe.AsRef(currentPtr); - } - - var item6Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T7 item7 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 8"); - else - { - expectedStructureType = item7.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 8; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item7 = Unsafe.AsRef(currentPtr); - } - - var item7Size = Marshal.SizeOf(); - - - // Create string of errors - errors = errorBuilder.ToString().Trim(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + - item6Size + item7Size); - Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - Marshal.StructureToPtr(item6, _item6Ptr, false); - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - Marshal.StructureToPtr(item7, _item7Ptr, false); - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - } - - /// - /// Creates a new with 8 items. - /// - /// The chain to append to. - /// Item 7. - /// - /// Do not forget to dispose the chain if you are no longer using it. - /// - public ManagedChain(ManagedChain previous, T7 item7 = default) - { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - var item6Size = Marshal.SizeOf(); - var item7Size = Marshal.SizeOf(); - - var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size; - var newSize = originalSize + item7Size; - - _headPtr = Marshal.AllocHGlobal(newSize); - // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*) _headPtr, originalSize, originalSize); - - _item1Ptr = _headPtr + headSize; - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - // Append the last structure - item7.StructureType(); - Marshal.StructureToPtr(item7, _item7Ptr, false); - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - } - - /// - /// Creates a new with 9 items, by appending to - /// the end of this chain. - /// - /// Item 8. - /// Type of Item 8 - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Append(T8 item8 = default) - where T8 : struct, IExtendsChain - { - return new ManagedChain(this, item8); - } - - /// - public void Dispose() - { - var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); - if (headPtr == IntPtr.Zero) return; - - // Destroy all structures - Marshal.DestroyStructure(headPtr); - var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item1Ptr); - var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item2Ptr); - var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item3Ptr); - var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item4Ptr); - var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item5Ptr); - var item6Ptr = Interlocked.Exchange(ref _item6Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item6Ptr); - var item7Ptr = Interlocked.Exchange(ref _item7Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item7Ptr); - - // Free memory block - Marshal.FreeHGlobal(headPtr); - } -} - -/// -/// A safely manages the pointers of a managed structure chain. -/// -/// The chain type -/// Type of Item 1. -/// Type of Item 2. -/// Type of Item 3. -/// Type of Item 4. -/// Type of Item 5. -/// Type of Item 6. -/// Type of Item 7. -/// Type of Item 8. -public unsafe class ManagedChain : IDisposable - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain - where T8 : struct, IExtendsChain -{ - private IntPtr _headPtr; - - /// - /// Gets a pointer to the current head. - /// - public Chain* HeadPtr => (Chain*) _headPtr; - - /// - /// Gets or sets the head of the chain. - /// - public TChain Head - { - get => Unsafe.AsRef((Chain*) _headPtr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _headPtr)->PNext; - Marshal.StructureToPtr(value, _headPtr, true); - ((Chain*) _headPtr)->PNext = nextPtr; - } - } - - private IntPtr _item1Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item1Ptr => (Chain*) _item1Ptr; - - /// - /// Gets or sets item #1 in the chain. - /// - public T1 Item1 - { - get => Unsafe.AsRef((Chain*) _item1Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item1Ptr)->PNext; - Marshal.StructureToPtr(value, _item1Ptr, true); - ((Chain*) _item1Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item2Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item2Ptr => (Chain*) _item2Ptr; - - /// - /// Gets or sets item #2 in the chain. - /// - public T2 Item2 - { - get => Unsafe.AsRef((Chain*) _item2Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item2Ptr)->PNext; - Marshal.StructureToPtr(value, _item2Ptr, true); - ((Chain*) _item2Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item3Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item3Ptr => (Chain*) _item3Ptr; - - /// - /// Gets or sets item #3 in the chain. - /// - public T3 Item3 - { - get => Unsafe.AsRef((Chain*) _item3Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item3Ptr)->PNext; - Marshal.StructureToPtr(value, _item3Ptr, true); - ((Chain*) _item3Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item4Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item4Ptr => (Chain*) _item4Ptr; - - /// - /// Gets or sets item #4 in the chain. - /// - public T4 Item4 - { - get => Unsafe.AsRef((Chain*) _item4Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item4Ptr)->PNext; - Marshal.StructureToPtr(value, _item4Ptr, true); - ((Chain*) _item4Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item5Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item5Ptr => (Chain*) _item5Ptr; - - /// - /// Gets or sets item #5 in the chain. - /// - public T5 Item5 - { - get => Unsafe.AsRef((Chain*) _item5Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item5Ptr)->PNext; - Marshal.StructureToPtr(value, _item5Ptr, true); - ((Chain*) _item5Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item6Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item6Ptr => (Chain*) _item6Ptr; - - /// - /// Gets or sets item #6 in the chain. - /// - public T6 Item6 - { - get => Unsafe.AsRef((Chain*) _item6Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item6Ptr)->PNext; - Marshal.StructureToPtr(value, _item6Ptr, true); - ((Chain*) _item6Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item7Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item7Ptr => (Chain*) _item7Ptr; - - /// - /// Gets or sets item #7 in the chain. - /// - public T7 Item7 - { - get => Unsafe.AsRef((Chain*) _item7Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item7Ptr)->PNext; - Marshal.StructureToPtr(value, _item7Ptr, true); - ((Chain*) _item7Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item8Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item8Ptr => (Chain*) _item8Ptr; - - /// - /// Gets or sets item #8 in the chain. - /// - public T8 Item8 - { - get => Unsafe.AsRef((Chain*) _item8Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item8Ptr)->PNext; - Marshal.StructureToPtr(value, _item8Ptr, true); - ((Chain*) _item8Ptr)->PNext = nextPtr; - } - } - - /// - /// Creates a new with 9 items. - /// - /// The head of the chain. - /// Item 1. - /// Item 2. - /// Item 3. - /// Item 4. - /// Item 5. - /// Item 6. - /// Item 7. - /// Item 8. - public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, - T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default) - { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - var item6Size = Marshal.SizeOf(); - var item7Size = Marshal.SizeOf(); - var item8Size = Marshal.SizeOf(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + - item6Size + item7Size + item8Size); - head.StructureType(); - Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; - item1.StructureType(); - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - item2.StructureType(); - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - item3.StructureType(); - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - item4.StructureType(); - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - item5.StructureType(); - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - item6.StructureType(); - Marshal.StructureToPtr(item6, _item6Ptr, false); - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - item7.StructureType(); - Marshal.StructureToPtr(item7, _item7Ptr, false); - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; - item8.StructureType(); - Marshal.StructureToPtr(item8, _item8Ptr, false); - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - } - - /// - /// Creates a new with 9 items from an existing unmanaged chain. - /// - /// The unmanaged chain to use as the basis of this chain. - /// Any errors loading the chain. - public ManagedChain(TChain chain, out string errors) - { - // Load existing chain first, so any errors occur before we allocate memory - var head = chain; - var headSize = Marshal.SizeOf(); - var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); - StructureType expectedStructureType; - var errorBuilder = new StringBuilder(); - - currentPtr = currentPtr->PNext; - T1 item1 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 9"); - else - { - expectedStructureType = item1.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 2; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item1 = Unsafe.AsRef(currentPtr); - } - - var item1Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T2 item2 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 9"); - else - { - expectedStructureType = item2.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 3; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item2 = Unsafe.AsRef(currentPtr); - } - - var item2Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T3 item3 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 9"); - else - { - expectedStructureType = item3.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 4; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item3 = Unsafe.AsRef(currentPtr); - } - - var item3Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T4 item4 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 9"); - else - { - expectedStructureType = item4.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 5; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item4 = Unsafe.AsRef(currentPtr); - } - - var item4Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T5 item5 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 9"); - else - { - expectedStructureType = item5.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 6; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item5 = Unsafe.AsRef(currentPtr); - } - - var item5Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T6 item6 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 9"); - else - { - expectedStructureType = item6.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 7; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item6 = Unsafe.AsRef(currentPtr); - } - - var item6Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T7 item7 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 9"); - else - { - expectedStructureType = item7.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 8; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item7 = Unsafe.AsRef(currentPtr); - } - - var item7Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T8 item8 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 9"); - else - { - expectedStructureType = item8.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 9; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item8 = Unsafe.AsRef(currentPtr); - } - - var item8Size = Marshal.SizeOf(); - - - // Create string of errors - errors = errorBuilder.ToString().Trim(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + - item6Size + item7Size + item8Size); - Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - Marshal.StructureToPtr(item6, _item6Ptr, false); - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - Marshal.StructureToPtr(item7, _item7Ptr, false); - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; - Marshal.StructureToPtr(item8, _item8Ptr, false); - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - } - - /// - /// Creates a new with 9 items. - /// - /// The chain to append to. - /// Item 8. - /// - /// Do not forget to dispose the chain if you are no longer using it. - /// - public ManagedChain(ManagedChain previous, T8 item8 = default) - { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - var item6Size = Marshal.SizeOf(); - var item7Size = Marshal.SizeOf(); - var item8Size = Marshal.SizeOf(); - - var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size; - var newSize = originalSize + item8Size; - - _headPtr = Marshal.AllocHGlobal(newSize); - // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*) _headPtr, originalSize, originalSize); - - _item1Ptr = _headPtr + headSize; - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; - // Append the last structure - item8.StructureType(); - Marshal.StructureToPtr(item8, _item8Ptr, false); - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - } - - /// - /// Creates a new with 10 items, by appending to - /// the end of this chain. - /// - /// Item 9. - /// Type of Item 9 - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Append(T9 item9 = default) - where T9 : struct, IExtendsChain - { - return new ManagedChain(this, item9); - } - - /// - public void Dispose() - { - var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); - if (headPtr == IntPtr.Zero) return; - - // Destroy all structures - Marshal.DestroyStructure(headPtr); - var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item1Ptr); - var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item2Ptr); - var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item3Ptr); - var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item4Ptr); - var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item5Ptr); - var item6Ptr = Interlocked.Exchange(ref _item6Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item6Ptr); - var item7Ptr = Interlocked.Exchange(ref _item7Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item7Ptr); - var item8Ptr = Interlocked.Exchange(ref _item8Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item8Ptr); - - // Free memory block - Marshal.FreeHGlobal(headPtr); - } -} - -/// -/// A safely manages the pointers of a managed structure chain. -/// -/// The chain type -/// Type of Item 1. -/// Type of Item 2. -/// Type of Item 3. -/// Type of Item 4. -/// Type of Item 5. -/// Type of Item 6. -/// Type of Item 7. -/// Type of Item 8. -/// Type of Item 9. -public unsafe class ManagedChain : IDisposable - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain - where T8 : struct, IExtendsChain - where T9 : struct, IExtendsChain -{ - private IntPtr _headPtr; - - /// - /// Gets a pointer to the current head. - /// - public Chain* HeadPtr => (Chain*) _headPtr; - - /// - /// Gets or sets the head of the chain. - /// - public TChain Head - { - get => Unsafe.AsRef((Chain*) _headPtr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _headPtr)->PNext; - Marshal.StructureToPtr(value, _headPtr, true); - ((Chain*) _headPtr)->PNext = nextPtr; - } - } - - private IntPtr _item1Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item1Ptr => (Chain*) _item1Ptr; - - /// - /// Gets or sets item #1 in the chain. - /// - public T1 Item1 - { - get => Unsafe.AsRef((Chain*) _item1Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item1Ptr)->PNext; - Marshal.StructureToPtr(value, _item1Ptr, true); - ((Chain*) _item1Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item2Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item2Ptr => (Chain*) _item2Ptr; - - /// - /// Gets or sets item #2 in the chain. - /// - public T2 Item2 - { - get => Unsafe.AsRef((Chain*) _item2Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item2Ptr)->PNext; - Marshal.StructureToPtr(value, _item2Ptr, true); - ((Chain*) _item2Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item3Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item3Ptr => (Chain*) _item3Ptr; - - /// - /// Gets or sets item #3 in the chain. - /// - public T3 Item3 - { - get => Unsafe.AsRef((Chain*) _item3Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item3Ptr)->PNext; - Marshal.StructureToPtr(value, _item3Ptr, true); - ((Chain*) _item3Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item4Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item4Ptr => (Chain*) _item4Ptr; - - /// - /// Gets or sets item #4 in the chain. - /// - public T4 Item4 - { - get => Unsafe.AsRef((Chain*) _item4Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item4Ptr)->PNext; - Marshal.StructureToPtr(value, _item4Ptr, true); - ((Chain*) _item4Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item5Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item5Ptr => (Chain*) _item5Ptr; - - /// - /// Gets or sets item #5 in the chain. - /// - public T5 Item5 - { - get => Unsafe.AsRef((Chain*) _item5Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item5Ptr)->PNext; - Marshal.StructureToPtr(value, _item5Ptr, true); - ((Chain*) _item5Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item6Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item6Ptr => (Chain*) _item6Ptr; - - /// - /// Gets or sets item #6 in the chain. - /// - public T6 Item6 - { - get => Unsafe.AsRef((Chain*) _item6Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item6Ptr)->PNext; - Marshal.StructureToPtr(value, _item6Ptr, true); - ((Chain*) _item6Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item7Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item7Ptr => (Chain*) _item7Ptr; - - /// - /// Gets or sets item #7 in the chain. - /// - public T7 Item7 - { - get => Unsafe.AsRef((Chain*) _item7Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item7Ptr)->PNext; - Marshal.StructureToPtr(value, _item7Ptr, true); - ((Chain*) _item7Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item8Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item8Ptr => (Chain*) _item8Ptr; - - /// - /// Gets or sets item #8 in the chain. - /// - public T8 Item8 - { - get => Unsafe.AsRef((Chain*) _item8Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item8Ptr)->PNext; - Marshal.StructureToPtr(value, _item8Ptr, true); - ((Chain*) _item8Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item9Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item9Ptr => (Chain*) _item9Ptr; - - /// - /// Gets or sets item #9 in the chain. - /// - public T9 Item9 - { - get => Unsafe.AsRef((Chain*) _item9Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item9Ptr)->PNext; - Marshal.StructureToPtr(value, _item9Ptr, true); - ((Chain*) _item9Ptr)->PNext = nextPtr; - } - } - - /// - /// Creates a new with 10 items. - /// - /// The head of the chain. - /// Item 1. - /// Item 2. - /// Item 3. - /// Item 4. - /// Item 5. - /// Item 6. - /// Item 7. - /// Item 8. - /// Item 9. - public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, - T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, - T9 item9 = default) - { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - var item6Size = Marshal.SizeOf(); - var item7Size = Marshal.SizeOf(); - var item8Size = Marshal.SizeOf(); - var item9Size = Marshal.SizeOf(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + - item6Size + item7Size + item8Size + item9Size); - head.StructureType(); - Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; - item1.StructureType(); - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - item2.StructureType(); - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - item3.StructureType(); - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - item4.StructureType(); - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - item5.StructureType(); - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - item6.StructureType(); - Marshal.StructureToPtr(item6, _item6Ptr, false); - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - item7.StructureType(); - Marshal.StructureToPtr(item7, _item7Ptr, false); - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; - item8.StructureType(); - Marshal.StructureToPtr(item8, _item8Ptr, false); - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - - _item9Ptr = _item8Ptr + item8Size; - item9.StructureType(); - Marshal.StructureToPtr(item9, _item9Ptr, false); - ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; - } - - /// - /// Creates a new with 10 items from an existing unmanaged chain. - /// - /// The unmanaged chain to use as the basis of this chain. - /// Any errors loading the chain. - public ManagedChain(TChain chain, out string errors) - { - // Load existing chain first, so any errors occur before we allocate memory - var head = chain; - var headSize = Marshal.SizeOf(); - var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); - StructureType expectedStructureType; - var errorBuilder = new StringBuilder(); - - currentPtr = currentPtr->PNext; - T1 item1 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 10"); - else - { - expectedStructureType = item1.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 2; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item1 = Unsafe.AsRef(currentPtr); - } - - var item1Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T2 item2 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 10"); - else - { - expectedStructureType = item2.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 3; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item2 = Unsafe.AsRef(currentPtr); - } - - var item2Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T3 item3 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 10"); - else - { - expectedStructureType = item3.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 4; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item3 = Unsafe.AsRef(currentPtr); - } - - var item3Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T4 item4 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 10"); - else - { - expectedStructureType = item4.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 5; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item4 = Unsafe.AsRef(currentPtr); - } - - var item4Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T5 item5 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 10"); - else - { - expectedStructureType = item5.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 6; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item5 = Unsafe.AsRef(currentPtr); - } - - var item5Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T6 item6 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 10"); - else - { - expectedStructureType = item6.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 7; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item6 = Unsafe.AsRef(currentPtr); - } - - var item6Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T7 item7 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 10"); - else - { - expectedStructureType = item7.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 8; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item7 = Unsafe.AsRef(currentPtr); - } - - var item7Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T8 item8 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 10"); - else - { - expectedStructureType = item8.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 9; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item8 = Unsafe.AsRef(currentPtr); - } - - var item8Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T9 item9 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 9, expected length 10"); - else - { - expectedStructureType = item9.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 10; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item9 = Unsafe.AsRef(currentPtr); - } - - var item9Size = Marshal.SizeOf(); - - - // Create string of errors - errors = errorBuilder.ToString().Trim(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + - item6Size + item7Size + item8Size + item9Size); - Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - Marshal.StructureToPtr(item6, _item6Ptr, false); - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - Marshal.StructureToPtr(item7, _item7Ptr, false); - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; - Marshal.StructureToPtr(item8, _item8Ptr, false); - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - - _item9Ptr = _item8Ptr + item8Size; - Marshal.StructureToPtr(item9, _item9Ptr, false); - ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; - } - - /// - /// Creates a new with 10 items. - /// - /// The chain to append to. - /// Item 9. - /// - /// Do not forget to dispose the chain if you are no longer using it. - /// - public ManagedChain(ManagedChain previous, T9 item9 = default) - { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - var item6Size = Marshal.SizeOf(); - var item7Size = Marshal.SizeOf(); - var item8Size = Marshal.SizeOf(); - var item9Size = Marshal.SizeOf(); - - var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + - item7Size + item8Size; - var newSize = originalSize + item9Size; - - _headPtr = Marshal.AllocHGlobal(newSize); - // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*) _headPtr, originalSize, originalSize); - - _item1Ptr = _headPtr + headSize; - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - - _item9Ptr = _item8Ptr + item8Size; - // Append the last structure - item9.StructureType(); - Marshal.StructureToPtr(item9, _item9Ptr, false); - ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; - } - - /// - /// Creates a new with 11 items, by appending to - /// the end of this chain. - /// - /// Item 10. - /// Type of Item 10 - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Append(T10 item10 = default) - where T10 : struct, IExtendsChain - { - return new ManagedChain(this, item10); - } - - /// - public void Dispose() - { - var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); - if (headPtr == IntPtr.Zero) return; - - // Destroy all structures - Marshal.DestroyStructure(headPtr); - var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item1Ptr); - var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item2Ptr); - var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item3Ptr); - var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item4Ptr); - var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item5Ptr); - var item6Ptr = Interlocked.Exchange(ref _item6Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item6Ptr); - var item7Ptr = Interlocked.Exchange(ref _item7Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item7Ptr); - var item8Ptr = Interlocked.Exchange(ref _item8Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item8Ptr); - var item9Ptr = Interlocked.Exchange(ref _item9Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item9Ptr); - - // Free memory block - Marshal.FreeHGlobal(headPtr); - } -} - -/// -/// A safely manages the pointers of a managed structure chain. -/// -/// The chain type -/// Type of Item 1. -/// Type of Item 2. -/// Type of Item 3. -/// Type of Item 4. -/// Type of Item 5. -/// Type of Item 6. -/// Type of Item 7. -/// Type of Item 8. -/// Type of Item 9. -/// Type of Item 10. -public unsafe class ManagedChain : IDisposable - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain - where T8 : struct, IExtendsChain - where T9 : struct, IExtendsChain - where T10 : struct, IExtendsChain -{ - private IntPtr _headPtr; - - /// - /// Gets a pointer to the current head. - /// - public Chain* HeadPtr => (Chain*) _headPtr; - - /// - /// Gets or sets the head of the chain. - /// - public TChain Head - { - get => Unsafe.AsRef((Chain*) _headPtr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _headPtr)->PNext; - Marshal.StructureToPtr(value, _headPtr, true); - ((Chain*) _headPtr)->PNext = nextPtr; - } - } - - private IntPtr _item1Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item1Ptr => (Chain*) _item1Ptr; - - /// - /// Gets or sets item #1 in the chain. - /// - public T1 Item1 - { - get => Unsafe.AsRef((Chain*) _item1Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item1Ptr)->PNext; - Marshal.StructureToPtr(value, _item1Ptr, true); - ((Chain*) _item1Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item2Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item2Ptr => (Chain*) _item2Ptr; - - /// - /// Gets or sets item #2 in the chain. - /// - public T2 Item2 - { - get => Unsafe.AsRef((Chain*) _item2Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item2Ptr)->PNext; - Marshal.StructureToPtr(value, _item2Ptr, true); - ((Chain*) _item2Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item3Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item3Ptr => (Chain*) _item3Ptr; - - /// - /// Gets or sets item #3 in the chain. - /// - public T3 Item3 - { - get => Unsafe.AsRef((Chain*) _item3Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item3Ptr)->PNext; - Marshal.StructureToPtr(value, _item3Ptr, true); - ((Chain*) _item3Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item4Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item4Ptr => (Chain*) _item4Ptr; - - /// - /// Gets or sets item #4 in the chain. - /// - public T4 Item4 - { - get => Unsafe.AsRef((Chain*) _item4Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item4Ptr)->PNext; - Marshal.StructureToPtr(value, _item4Ptr, true); - ((Chain*) _item4Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item5Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item5Ptr => (Chain*) _item5Ptr; - - /// - /// Gets or sets item #5 in the chain. - /// - public T5 Item5 - { - get => Unsafe.AsRef((Chain*) _item5Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item5Ptr)->PNext; - Marshal.StructureToPtr(value, _item5Ptr, true); - ((Chain*) _item5Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item6Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item6Ptr => (Chain*) _item6Ptr; - - /// - /// Gets or sets item #6 in the chain. - /// - public T6 Item6 - { - get => Unsafe.AsRef((Chain*) _item6Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item6Ptr)->PNext; - Marshal.StructureToPtr(value, _item6Ptr, true); - ((Chain*) _item6Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item7Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item7Ptr => (Chain*) _item7Ptr; - - /// - /// Gets or sets item #7 in the chain. - /// - public T7 Item7 - { - get => Unsafe.AsRef((Chain*) _item7Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item7Ptr)->PNext; - Marshal.StructureToPtr(value, _item7Ptr, true); - ((Chain*) _item7Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item8Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item8Ptr => (Chain*) _item8Ptr; - - /// - /// Gets or sets item #8 in the chain. - /// - public T8 Item8 - { - get => Unsafe.AsRef((Chain*) _item8Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item8Ptr)->PNext; - Marshal.StructureToPtr(value, _item8Ptr, true); - ((Chain*) _item8Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item9Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item9Ptr => (Chain*) _item9Ptr; - - /// - /// Gets or sets item #9 in the chain. - /// - public T9 Item9 - { - get => Unsafe.AsRef((Chain*) _item9Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item9Ptr)->PNext; - Marshal.StructureToPtr(value, _item9Ptr, true); - ((Chain*) _item9Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item10Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item10Ptr => (Chain*) _item10Ptr; - - /// - /// Gets or sets item #10 in the chain. - /// - public T10 Item10 - { - get => Unsafe.AsRef((Chain*) _item10Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item10Ptr)->PNext; - Marshal.StructureToPtr(value, _item10Ptr, true); - ((Chain*) _item10Ptr)->PNext = nextPtr; - } - } - - /// - /// Creates a new with 11 items. - /// - /// The head of the chain. - /// Item 1. - /// Item 2. - /// Item 3. - /// Item 4. - /// Item 5. - /// Item 6. - /// Item 7. - /// Item 8. - /// Item 9. - /// Item 10. - public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, - T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, - T9 item9 = default, T10 item10 = default) - { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - var item6Size = Marshal.SizeOf(); - var item7Size = Marshal.SizeOf(); - var item8Size = Marshal.SizeOf(); - var item9Size = Marshal.SizeOf(); - var item10Size = Marshal.SizeOf(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + - item6Size + item7Size + item8Size + item9Size + item10Size); - head.StructureType(); - Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; - item1.StructureType(); - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - item2.StructureType(); - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - item3.StructureType(); - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - item4.StructureType(); - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - item5.StructureType(); - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - item6.StructureType(); - Marshal.StructureToPtr(item6, _item6Ptr, false); - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - item7.StructureType(); - Marshal.StructureToPtr(item7, _item7Ptr, false); - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; - item8.StructureType(); - Marshal.StructureToPtr(item8, _item8Ptr, false); - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - - _item9Ptr = _item8Ptr + item8Size; - item9.StructureType(); - Marshal.StructureToPtr(item9, _item9Ptr, false); - ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; - - _item10Ptr = _item9Ptr + item9Size; - item10.StructureType(); - Marshal.StructureToPtr(item10, _item10Ptr, false); - ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; - } - - /// - /// Creates a new with 11 items from an existing unmanaged chain. - /// - /// The unmanaged chain to use as the basis of this chain. - /// Any errors loading the chain. - public ManagedChain(TChain chain, out string errors) - { - // Load existing chain first, so any errors occur before we allocate memory - var head = chain; - var headSize = Marshal.SizeOf(); - var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); - StructureType expectedStructureType; - var errorBuilder = new StringBuilder(); - - currentPtr = currentPtr->PNext; - T1 item1 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 11"); - else - { - expectedStructureType = item1.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 2; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item1 = Unsafe.AsRef(currentPtr); - } - - var item1Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T2 item2 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 11"); - else - { - expectedStructureType = item2.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 3; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item2 = Unsafe.AsRef(currentPtr); - } - - var item2Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T3 item3 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 11"); - else - { - expectedStructureType = item3.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 4; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item3 = Unsafe.AsRef(currentPtr); - } - - var item3Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T4 item4 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 11"); - else - { - expectedStructureType = item4.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 5; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item4 = Unsafe.AsRef(currentPtr); - } - - var item4Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T5 item5 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 11"); - else - { - expectedStructureType = item5.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 6; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item5 = Unsafe.AsRef(currentPtr); - } - - var item5Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T6 item6 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 11"); - else - { - expectedStructureType = item6.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 7; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item6 = Unsafe.AsRef(currentPtr); - } - - var item6Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T7 item7 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 11"); - else - { - expectedStructureType = item7.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 8; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item7 = Unsafe.AsRef(currentPtr); - } - - var item7Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T8 item8 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 11"); - else - { - expectedStructureType = item8.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 9; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item8 = Unsafe.AsRef(currentPtr); - } - - var item8Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T9 item9 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 9, expected length 11"); - else - { - expectedStructureType = item9.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 10; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item9 = Unsafe.AsRef(currentPtr); - } - - var item9Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T10 item10 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 10, expected length 11"); - else - { - expectedStructureType = item10.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 11; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item10 = Unsafe.AsRef(currentPtr); - } - - var item10Size = Marshal.SizeOf(); - - - // Create string of errors - errors = errorBuilder.ToString().Trim(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + - item6Size + item7Size + item8Size + item9Size + item10Size); - Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - Marshal.StructureToPtr(item6, _item6Ptr, false); - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - Marshal.StructureToPtr(item7, _item7Ptr, false); - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; - Marshal.StructureToPtr(item8, _item8Ptr, false); - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - - _item9Ptr = _item8Ptr + item8Size; - Marshal.StructureToPtr(item9, _item9Ptr, false); - ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; - - _item10Ptr = _item9Ptr + item9Size; - Marshal.StructureToPtr(item10, _item10Ptr, false); - ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; - } - - /// - /// Creates a new with 11 items. - /// - /// The chain to append to. - /// Item 10. - /// - /// Do not forget to dispose the chain if you are no longer using it. - /// - public ManagedChain(ManagedChain previous, T10 item10 = default) - { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - var item6Size = Marshal.SizeOf(); - var item7Size = Marshal.SizeOf(); - var item8Size = Marshal.SizeOf(); - var item9Size = Marshal.SizeOf(); - var item10Size = Marshal.SizeOf(); - - var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + - item7Size + item8Size + item9Size; - var newSize = originalSize + item10Size; - - _headPtr = Marshal.AllocHGlobal(newSize); - // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*) _headPtr, originalSize, originalSize); - - _item1Ptr = _headPtr + headSize; - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - - _item9Ptr = _item8Ptr + item8Size; - ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; - - _item10Ptr = _item9Ptr + item9Size; - // Append the last structure - item10.StructureType(); - Marshal.StructureToPtr(item10, _item10Ptr, false); - ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; - } - - /// - /// Creates a new with 12 items, by appending to - /// the end of this chain. - /// - /// Item 11. - /// Type of Item 11 - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Append(T11 item11 = default) - where T11 : struct, IExtendsChain - { - return new ManagedChain(this, item11); - } - - /// - public void Dispose() - { - var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); - if (headPtr == IntPtr.Zero) return; - - // Destroy all structures - Marshal.DestroyStructure(headPtr); - var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item1Ptr); - var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item2Ptr); - var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item3Ptr); - var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item4Ptr); - var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item5Ptr); - var item6Ptr = Interlocked.Exchange(ref _item6Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item6Ptr); - var item7Ptr = Interlocked.Exchange(ref _item7Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item7Ptr); - var item8Ptr = Interlocked.Exchange(ref _item8Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item8Ptr); - var item9Ptr = Interlocked.Exchange(ref _item9Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item9Ptr); - var item10Ptr = Interlocked.Exchange(ref _item10Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item10Ptr); - - // Free memory block - Marshal.FreeHGlobal(headPtr); - } -} - -/// -/// A safely manages the pointers of a managed structure chain. -/// -/// The chain type -/// Type of Item 1. -/// Type of Item 2. -/// Type of Item 3. -/// Type of Item 4. -/// Type of Item 5. -/// Type of Item 6. -/// Type of Item 7. -/// Type of Item 8. -/// Type of Item 9. -/// Type of Item 10. -/// Type of Item 11. -public unsafe class ManagedChain : IDisposable - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain - where T8 : struct, IExtendsChain - where T9 : struct, IExtendsChain - where T10 : struct, IExtendsChain - where T11 : struct, IExtendsChain -{ - private IntPtr _headPtr; - - /// - /// Gets a pointer to the current head. - /// - public Chain* HeadPtr => (Chain*) _headPtr; - - /// - /// Gets or sets the head of the chain. - /// - public TChain Head - { - get => Unsafe.AsRef((Chain*) _headPtr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _headPtr)->PNext; - Marshal.StructureToPtr(value, _headPtr, true); - ((Chain*) _headPtr)->PNext = nextPtr; - } - } - - private IntPtr _item1Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item1Ptr => (Chain*) _item1Ptr; - - /// - /// Gets or sets item #1 in the chain. - /// - public T1 Item1 - { - get => Unsafe.AsRef((Chain*) _item1Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item1Ptr)->PNext; - Marshal.StructureToPtr(value, _item1Ptr, true); - ((Chain*) _item1Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item2Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item2Ptr => (Chain*) _item2Ptr; - - /// - /// Gets or sets item #2 in the chain. - /// - public T2 Item2 - { - get => Unsafe.AsRef((Chain*) _item2Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item2Ptr)->PNext; - Marshal.StructureToPtr(value, _item2Ptr, true); - ((Chain*) _item2Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item3Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item3Ptr => (Chain*) _item3Ptr; - - /// - /// Gets or sets item #3 in the chain. - /// - public T3 Item3 - { - get => Unsafe.AsRef((Chain*) _item3Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item3Ptr)->PNext; - Marshal.StructureToPtr(value, _item3Ptr, true); - ((Chain*) _item3Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item4Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item4Ptr => (Chain*) _item4Ptr; - - /// - /// Gets or sets item #4 in the chain. - /// - public T4 Item4 - { - get => Unsafe.AsRef((Chain*) _item4Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item4Ptr)->PNext; - Marshal.StructureToPtr(value, _item4Ptr, true); - ((Chain*) _item4Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item5Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item5Ptr => (Chain*) _item5Ptr; - - /// - /// Gets or sets item #5 in the chain. - /// - public T5 Item5 - { - get => Unsafe.AsRef((Chain*) _item5Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item5Ptr)->PNext; - Marshal.StructureToPtr(value, _item5Ptr, true); - ((Chain*) _item5Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item6Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item6Ptr => (Chain*) _item6Ptr; - - /// - /// Gets or sets item #6 in the chain. - /// - public T6 Item6 - { - get => Unsafe.AsRef((Chain*) _item6Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item6Ptr)->PNext; - Marshal.StructureToPtr(value, _item6Ptr, true); - ((Chain*) _item6Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item7Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item7Ptr => (Chain*) _item7Ptr; - - /// - /// Gets or sets item #7 in the chain. - /// - public T7 Item7 - { - get => Unsafe.AsRef((Chain*) _item7Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item7Ptr)->PNext; - Marshal.StructureToPtr(value, _item7Ptr, true); - ((Chain*) _item7Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item8Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item8Ptr => (Chain*) _item8Ptr; - - /// - /// Gets or sets item #8 in the chain. - /// - public T8 Item8 - { - get => Unsafe.AsRef((Chain*) _item8Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item8Ptr)->PNext; - Marshal.StructureToPtr(value, _item8Ptr, true); - ((Chain*) _item8Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item9Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item9Ptr => (Chain*) _item9Ptr; - - /// - /// Gets or sets item #9 in the chain. - /// - public T9 Item9 - { - get => Unsafe.AsRef((Chain*) _item9Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item9Ptr)->PNext; - Marshal.StructureToPtr(value, _item9Ptr, true); - ((Chain*) _item9Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item10Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item10Ptr => (Chain*) _item10Ptr; - - /// - /// Gets or sets item #10 in the chain. - /// - public T10 Item10 - { - get => Unsafe.AsRef((Chain*) _item10Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item10Ptr)->PNext; - Marshal.StructureToPtr(value, _item10Ptr, true); - ((Chain*) _item10Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item11Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item11Ptr => (Chain*) _item11Ptr; - - /// - /// Gets or sets item #11 in the chain. - /// - public T11 Item11 - { - get => Unsafe.AsRef((Chain*) _item11Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item11Ptr)->PNext; - Marshal.StructureToPtr(value, _item11Ptr, true); - ((Chain*) _item11Ptr)->PNext = nextPtr; - } - } - - /// - /// Creates a new with 12 items. - /// - /// The head of the chain. - /// Item 1. - /// Item 2. - /// Item 3. - /// Item 4. - /// Item 5. - /// Item 6. - /// Item 7. - /// Item 8. - /// Item 9. - /// Item 10. - /// Item 11. - public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, - T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, - T9 item9 = default, T10 item10 = default, T11 item11 = default) - { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - var item6Size = Marshal.SizeOf(); - var item7Size = Marshal.SizeOf(); - var item8Size = Marshal.SizeOf(); - var item9Size = Marshal.SizeOf(); - var item10Size = Marshal.SizeOf(); - var item11Size = Marshal.SizeOf(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + - item6Size + item7Size + item8Size + item9Size + item10Size + item11Size); - head.StructureType(); - Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; - item1.StructureType(); - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - item2.StructureType(); - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - item3.StructureType(); - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - item4.StructureType(); - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - item5.StructureType(); - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - item6.StructureType(); - Marshal.StructureToPtr(item6, _item6Ptr, false); - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - item7.StructureType(); - Marshal.StructureToPtr(item7, _item7Ptr, false); - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; - item8.StructureType(); - Marshal.StructureToPtr(item8, _item8Ptr, false); - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - - _item9Ptr = _item8Ptr + item8Size; - item9.StructureType(); - Marshal.StructureToPtr(item9, _item9Ptr, false); - ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; - - _item10Ptr = _item9Ptr + item9Size; - item10.StructureType(); - Marshal.StructureToPtr(item10, _item10Ptr, false); - ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; - - _item11Ptr = _item10Ptr + item10Size; - item11.StructureType(); - Marshal.StructureToPtr(item11, _item11Ptr, false); - ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; - } - - /// - /// Creates a new with 12 items from an existing unmanaged chain. - /// - /// The unmanaged chain to use as the basis of this chain. - /// Any errors loading the chain. - public ManagedChain(TChain chain, out string errors) - { - // Load existing chain first, so any errors occur before we allocate memory - var head = chain; - var headSize = Marshal.SizeOf(); - var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); - StructureType expectedStructureType; - var errorBuilder = new StringBuilder(); - - currentPtr = currentPtr->PNext; - T1 item1 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 12"); - else - { - expectedStructureType = item1.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 2; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item1 = Unsafe.AsRef(currentPtr); - } - - var item1Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T2 item2 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 12"); - else - { - expectedStructureType = item2.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 3; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item2 = Unsafe.AsRef(currentPtr); - } - - var item2Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T3 item3 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 12"); - else - { - expectedStructureType = item3.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 4; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item3 = Unsafe.AsRef(currentPtr); - } - - var item3Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T4 item4 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 12"); - else - { - expectedStructureType = item4.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 5; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item4 = Unsafe.AsRef(currentPtr); - } - - var item4Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T5 item5 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 12"); - else - { - expectedStructureType = item5.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 6; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item5 = Unsafe.AsRef(currentPtr); - } - - var item5Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T6 item6 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 12"); - else - { - expectedStructureType = item6.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 7; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item6 = Unsafe.AsRef(currentPtr); - } - - var item6Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T7 item7 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 12"); - else - { - expectedStructureType = item7.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 8; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item7 = Unsafe.AsRef(currentPtr); - } - - var item7Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T8 item8 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 12"); - else - { - expectedStructureType = item8.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 9; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item8 = Unsafe.AsRef(currentPtr); - } - - var item8Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T9 item9 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 9, expected length 12"); - else - { - expectedStructureType = item9.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 10; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item9 = Unsafe.AsRef(currentPtr); - } - - var item9Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T10 item10 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 10, expected length 12"); - else - { - expectedStructureType = item10.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 11; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item10 = Unsafe.AsRef(currentPtr); - } - - var item10Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T11 item11 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 11, expected length 12"); - else - { - expectedStructureType = item11.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 12; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item11 = Unsafe.AsRef(currentPtr); - } - - var item11Size = Marshal.SizeOf(); - - - // Create string of errors - errors = errorBuilder.ToString().Trim(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + - item6Size + item7Size + item8Size + item9Size + item10Size + item11Size); - Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - Marshal.StructureToPtr(item6, _item6Ptr, false); - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - Marshal.StructureToPtr(item7, _item7Ptr, false); - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; - Marshal.StructureToPtr(item8, _item8Ptr, false); - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - - _item9Ptr = _item8Ptr + item8Size; - Marshal.StructureToPtr(item9, _item9Ptr, false); - ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; - - _item10Ptr = _item9Ptr + item9Size; - Marshal.StructureToPtr(item10, _item10Ptr, false); - ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; - - _item11Ptr = _item10Ptr + item10Size; - Marshal.StructureToPtr(item11, _item11Ptr, false); - ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; - } - - /// - /// Creates a new with 12 items. - /// - /// The chain to append to. - /// Item 11. - /// - /// Do not forget to dispose the chain if you are no longer using it. - /// - public ManagedChain(ManagedChain previous, T11 item11 = default) - { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - var item6Size = Marshal.SizeOf(); - var item7Size = Marshal.SizeOf(); - var item8Size = Marshal.SizeOf(); - var item9Size = Marshal.SizeOf(); - var item10Size = Marshal.SizeOf(); - var item11Size = Marshal.SizeOf(); - - var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + - item7Size + item8Size + item9Size + item10Size; - var newSize = originalSize + item11Size; - - _headPtr = Marshal.AllocHGlobal(newSize); - // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*) _headPtr, originalSize, originalSize); - - _item1Ptr = _headPtr + headSize; - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - - _item9Ptr = _item8Ptr + item8Size; - ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; - - _item10Ptr = _item9Ptr + item9Size; - ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; - - _item11Ptr = _item10Ptr + item10Size; - // Append the last structure - item11.StructureType(); - Marshal.StructureToPtr(item11, _item11Ptr, false); - ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; - } - - /// - /// Creates a new with 13 items, by appending to - /// the end of this chain. - /// - /// Item 12. - /// Type of Item 12 - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Append(T12 item12 = default) - where T12 : struct, IExtendsChain - { - return new ManagedChain(this, item12); - } - - /// - public void Dispose() - { - var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); - if (headPtr == IntPtr.Zero) return; - - // Destroy all structures - Marshal.DestroyStructure(headPtr); - var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item1Ptr); - var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item2Ptr); - var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item3Ptr); - var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item4Ptr); - var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item5Ptr); - var item6Ptr = Interlocked.Exchange(ref _item6Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item6Ptr); - var item7Ptr = Interlocked.Exchange(ref _item7Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item7Ptr); - var item8Ptr = Interlocked.Exchange(ref _item8Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item8Ptr); - var item9Ptr = Interlocked.Exchange(ref _item9Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item9Ptr); - var item10Ptr = Interlocked.Exchange(ref _item10Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item10Ptr); - var item11Ptr = Interlocked.Exchange(ref _item11Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item11Ptr); - - // Free memory block - Marshal.FreeHGlobal(headPtr); - } -} - -/// -/// A safely manages the pointers of a managed structure chain. -/// -/// The chain type -/// Type of Item 1. -/// Type of Item 2. -/// Type of Item 3. -/// Type of Item 4. -/// Type of Item 5. -/// Type of Item 6. -/// Type of Item 7. -/// Type of Item 8. -/// Type of Item 9. -/// Type of Item 10. -/// Type of Item 11. -/// Type of Item 12. -public unsafe class ManagedChain : IDisposable - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain - where T8 : struct, IExtendsChain - where T9 : struct, IExtendsChain - where T10 : struct, IExtendsChain - where T11 : struct, IExtendsChain - where T12 : struct, IExtendsChain -{ - private IntPtr _headPtr; - - /// - /// Gets a pointer to the current head. - /// - public Chain* HeadPtr => (Chain*) _headPtr; - - /// - /// Gets or sets the head of the chain. - /// - public TChain Head - { - get => Unsafe.AsRef((Chain*) _headPtr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _headPtr)->PNext; - Marshal.StructureToPtr(value, _headPtr, true); - ((Chain*) _headPtr)->PNext = nextPtr; - } - } - - private IntPtr _item1Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item1Ptr => (Chain*) _item1Ptr; - - /// - /// Gets or sets item #1 in the chain. - /// - public T1 Item1 - { - get => Unsafe.AsRef((Chain*) _item1Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item1Ptr)->PNext; - Marshal.StructureToPtr(value, _item1Ptr, true); - ((Chain*) _item1Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item2Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item2Ptr => (Chain*) _item2Ptr; - - /// - /// Gets or sets item #2 in the chain. - /// - public T2 Item2 - { - get => Unsafe.AsRef((Chain*) _item2Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item2Ptr)->PNext; - Marshal.StructureToPtr(value, _item2Ptr, true); - ((Chain*) _item2Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item3Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item3Ptr => (Chain*) _item3Ptr; - - /// - /// Gets or sets item #3 in the chain. - /// - public T3 Item3 - { - get => Unsafe.AsRef((Chain*) _item3Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item3Ptr)->PNext; - Marshal.StructureToPtr(value, _item3Ptr, true); - ((Chain*) _item3Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item4Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item4Ptr => (Chain*) _item4Ptr; - - /// - /// Gets or sets item #4 in the chain. - /// - public T4 Item4 - { - get => Unsafe.AsRef((Chain*) _item4Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item4Ptr)->PNext; - Marshal.StructureToPtr(value, _item4Ptr, true); - ((Chain*) _item4Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item5Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item5Ptr => (Chain*) _item5Ptr; - - /// - /// Gets or sets item #5 in the chain. - /// - public T5 Item5 - { - get => Unsafe.AsRef((Chain*) _item5Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item5Ptr)->PNext; - Marshal.StructureToPtr(value, _item5Ptr, true); - ((Chain*) _item5Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item6Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item6Ptr => (Chain*) _item6Ptr; - - /// - /// Gets or sets item #6 in the chain. - /// - public T6 Item6 - { - get => Unsafe.AsRef((Chain*) _item6Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item6Ptr)->PNext; - Marshal.StructureToPtr(value, _item6Ptr, true); - ((Chain*) _item6Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item7Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item7Ptr => (Chain*) _item7Ptr; - - /// - /// Gets or sets item #7 in the chain. - /// - public T7 Item7 - { - get => Unsafe.AsRef((Chain*) _item7Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item7Ptr)->PNext; - Marshal.StructureToPtr(value, _item7Ptr, true); - ((Chain*) _item7Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item8Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item8Ptr => (Chain*) _item8Ptr; - - /// - /// Gets or sets item #8 in the chain. - /// - public T8 Item8 - { - get => Unsafe.AsRef((Chain*) _item8Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item8Ptr)->PNext; - Marshal.StructureToPtr(value, _item8Ptr, true); - ((Chain*) _item8Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item9Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item9Ptr => (Chain*) _item9Ptr; - - /// - /// Gets or sets item #9 in the chain. - /// - public T9 Item9 - { - get => Unsafe.AsRef((Chain*) _item9Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item9Ptr)->PNext; - Marshal.StructureToPtr(value, _item9Ptr, true); - ((Chain*) _item9Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item10Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item10Ptr => (Chain*) _item10Ptr; - - /// - /// Gets or sets item #10 in the chain. - /// - public T10 Item10 - { - get => Unsafe.AsRef((Chain*) _item10Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item10Ptr)->PNext; - Marshal.StructureToPtr(value, _item10Ptr, true); - ((Chain*) _item10Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item11Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item11Ptr => (Chain*) _item11Ptr; - - /// - /// Gets or sets item #11 in the chain. - /// - public T11 Item11 - { - get => Unsafe.AsRef((Chain*) _item11Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item11Ptr)->PNext; - Marshal.StructureToPtr(value, _item11Ptr, true); - ((Chain*) _item11Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item12Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item12Ptr => (Chain*) _item12Ptr; - - /// - /// Gets or sets item #12 in the chain. - /// - public T12 Item12 - { - get => Unsafe.AsRef((Chain*) _item12Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item12Ptr)->PNext; - Marshal.StructureToPtr(value, _item12Ptr, true); - ((Chain*) _item12Ptr)->PNext = nextPtr; - } - } - - /// - /// Creates a new with 13 items. - /// - /// The head of the chain. - /// Item 1. - /// Item 2. - /// Item 3. - /// Item 4. - /// Item 5. - /// Item 6. - /// Item 7. - /// Item 8. - /// Item 9. - /// Item 10. - /// Item 11. - /// Item 12. - public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, - T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, - T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default) - { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - var item6Size = Marshal.SizeOf(); - var item7Size = Marshal.SizeOf(); - var item8Size = Marshal.SizeOf(); - var item9Size = Marshal.SizeOf(); - var item10Size = Marshal.SizeOf(); - var item11Size = Marshal.SizeOf(); - var item12Size = Marshal.SizeOf(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + - item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + - item12Size); - head.StructureType(); - Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; - item1.StructureType(); - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - item2.StructureType(); - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - item3.StructureType(); - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - item4.StructureType(); - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - item5.StructureType(); - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - item6.StructureType(); - Marshal.StructureToPtr(item6, _item6Ptr, false); - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - item7.StructureType(); - Marshal.StructureToPtr(item7, _item7Ptr, false); - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; - item8.StructureType(); - Marshal.StructureToPtr(item8, _item8Ptr, false); - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - - _item9Ptr = _item8Ptr + item8Size; - item9.StructureType(); - Marshal.StructureToPtr(item9, _item9Ptr, false); - ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; - - _item10Ptr = _item9Ptr + item9Size; - item10.StructureType(); - Marshal.StructureToPtr(item10, _item10Ptr, false); - ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; - - _item11Ptr = _item10Ptr + item10Size; - item11.StructureType(); - Marshal.StructureToPtr(item11, _item11Ptr, false); - ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; - - _item12Ptr = _item11Ptr + item11Size; - item12.StructureType(); - Marshal.StructureToPtr(item12, _item12Ptr, false); - ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; - } - - /// - /// Creates a new with 13 items from an existing unmanaged chain. - /// - /// The unmanaged chain to use as the basis of this chain. - /// Any errors loading the chain. - public ManagedChain(TChain chain, out string errors) - { - // Load existing chain first, so any errors occur before we allocate memory - var head = chain; - var headSize = Marshal.SizeOf(); - var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); - StructureType expectedStructureType; - var errorBuilder = new StringBuilder(); - - currentPtr = currentPtr->PNext; - T1 item1 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 13"); - else - { - expectedStructureType = item1.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 2; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item1 = Unsafe.AsRef(currentPtr); - } - - var item1Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T2 item2 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 13"); - else - { - expectedStructureType = item2.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 3; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item2 = Unsafe.AsRef(currentPtr); - } - - var item2Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T3 item3 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 13"); - else - { - expectedStructureType = item3.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 4; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item3 = Unsafe.AsRef(currentPtr); - } - - var item3Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T4 item4 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 13"); - else - { - expectedStructureType = item4.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 5; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item4 = Unsafe.AsRef(currentPtr); - } - - var item4Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T5 item5 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 13"); - else - { - expectedStructureType = item5.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 6; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item5 = Unsafe.AsRef(currentPtr); - } - - var item5Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T6 item6 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 13"); - else - { - expectedStructureType = item6.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 7; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item6 = Unsafe.AsRef(currentPtr); - } - - var item6Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T7 item7 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 13"); - else - { - expectedStructureType = item7.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 8; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item7 = Unsafe.AsRef(currentPtr); - } - - var item7Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T8 item8 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 13"); - else - { - expectedStructureType = item8.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 9; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item8 = Unsafe.AsRef(currentPtr); - } - - var item8Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T9 item9 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 9, expected length 13"); - else - { - expectedStructureType = item9.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 10; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item9 = Unsafe.AsRef(currentPtr); - } - - var item9Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T10 item10 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 10, expected length 13"); - else - { - expectedStructureType = item10.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 11; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item10 = Unsafe.AsRef(currentPtr); - } - - var item10Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T11 item11 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 11, expected length 13"); - else - { - expectedStructureType = item11.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 12; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item11 = Unsafe.AsRef(currentPtr); - } - - var item11Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T12 item12 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 12, expected length 13"); - else - { - expectedStructureType = item12.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 13; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item12 = Unsafe.AsRef(currentPtr); - } - - var item12Size = Marshal.SizeOf(); - - - // Create string of errors - errors = errorBuilder.ToString().Trim(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + - item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + - item12Size); - Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - Marshal.StructureToPtr(item6, _item6Ptr, false); - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - Marshal.StructureToPtr(item7, _item7Ptr, false); - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; - Marshal.StructureToPtr(item8, _item8Ptr, false); - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - - _item9Ptr = _item8Ptr + item8Size; - Marshal.StructureToPtr(item9, _item9Ptr, false); - ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; - - _item10Ptr = _item9Ptr + item9Size; - Marshal.StructureToPtr(item10, _item10Ptr, false); - ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; - - _item11Ptr = _item10Ptr + item10Size; - Marshal.StructureToPtr(item11, _item11Ptr, false); - ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; - - _item12Ptr = _item11Ptr + item11Size; - Marshal.StructureToPtr(item12, _item12Ptr, false); - ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; - } - - /// - /// Creates a new with 13 items. - /// - /// The chain to append to. - /// Item 12. - /// - /// Do not forget to dispose the chain if you are no longer using it. - /// - public ManagedChain(ManagedChain previous, - T12 item12 = default) - { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - var item6Size = Marshal.SizeOf(); - var item7Size = Marshal.SizeOf(); - var item8Size = Marshal.SizeOf(); - var item9Size = Marshal.SizeOf(); - var item10Size = Marshal.SizeOf(); - var item11Size = Marshal.SizeOf(); - var item12Size = Marshal.SizeOf(); - - var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + - item7Size + item8Size + item9Size + item10Size + item11Size; - var newSize = originalSize + item12Size; - - _headPtr = Marshal.AllocHGlobal(newSize); - // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*) _headPtr, originalSize, originalSize); - - _item1Ptr = _headPtr + headSize; - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - - _item9Ptr = _item8Ptr + item8Size; - ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; - - _item10Ptr = _item9Ptr + item9Size; - ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; - - _item11Ptr = _item10Ptr + item10Size; - ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; - - _item12Ptr = _item11Ptr + item11Size; - // Append the last structure - item12.StructureType(); - Marshal.StructureToPtr(item12, _item12Ptr, false); - ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; - } - - /// - /// Creates a new with 14 items, by appending to - /// the end of this chain. - /// - /// Item 13. - /// Type of Item 13 - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Append( - T13 item13 = default) - where T13 : struct, IExtendsChain - { - return new ManagedChain(this, item13); - } - - /// - public void Dispose() - { - var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); - if (headPtr == IntPtr.Zero) return; - - // Destroy all structures - Marshal.DestroyStructure(headPtr); - var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item1Ptr); - var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item2Ptr); - var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item3Ptr); - var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item4Ptr); - var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item5Ptr); - var item6Ptr = Interlocked.Exchange(ref _item6Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item6Ptr); - var item7Ptr = Interlocked.Exchange(ref _item7Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item7Ptr); - var item8Ptr = Interlocked.Exchange(ref _item8Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item8Ptr); - var item9Ptr = Interlocked.Exchange(ref _item9Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item9Ptr); - var item10Ptr = Interlocked.Exchange(ref _item10Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item10Ptr); - var item11Ptr = Interlocked.Exchange(ref _item11Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item11Ptr); - var item12Ptr = Interlocked.Exchange(ref _item12Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item12Ptr); - - // Free memory block - Marshal.FreeHGlobal(headPtr); - } -} - -/// -/// A safely manages the pointers of a managed structure chain. -/// -/// The chain type -/// Type of Item 1. -/// Type of Item 2. -/// Type of Item 3. -/// Type of Item 4. -/// Type of Item 5. -/// Type of Item 6. -/// Type of Item 7. -/// Type of Item 8. -/// Type of Item 9. -/// Type of Item 10. -/// Type of Item 11. -/// Type of Item 12. -/// Type of Item 13. -public unsafe class ManagedChain : IDisposable - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain - where T8 : struct, IExtendsChain - where T9 : struct, IExtendsChain - where T10 : struct, IExtendsChain - where T11 : struct, IExtendsChain - where T12 : struct, IExtendsChain - where T13 : struct, IExtendsChain -{ - private IntPtr _headPtr; - - /// - /// Gets a pointer to the current head. - /// - public Chain* HeadPtr => (Chain*) _headPtr; - - /// - /// Gets or sets the head of the chain. - /// - public TChain Head - { - get => Unsafe.AsRef((Chain*) _headPtr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _headPtr)->PNext; - Marshal.StructureToPtr(value, _headPtr, true); - ((Chain*) _headPtr)->PNext = nextPtr; - } - } - - private IntPtr _item1Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item1Ptr => (Chain*) _item1Ptr; - - /// - /// Gets or sets item #1 in the chain. - /// - public T1 Item1 - { - get => Unsafe.AsRef((Chain*) _item1Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item1Ptr)->PNext; - Marshal.StructureToPtr(value, _item1Ptr, true); - ((Chain*) _item1Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item2Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item2Ptr => (Chain*) _item2Ptr; - - /// - /// Gets or sets item #2 in the chain. - /// - public T2 Item2 - { - get => Unsafe.AsRef((Chain*) _item2Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item2Ptr)->PNext; - Marshal.StructureToPtr(value, _item2Ptr, true); - ((Chain*) _item2Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item3Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item3Ptr => (Chain*) _item3Ptr; - - /// - /// Gets or sets item #3 in the chain. - /// - public T3 Item3 - { - get => Unsafe.AsRef((Chain*) _item3Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item3Ptr)->PNext; - Marshal.StructureToPtr(value, _item3Ptr, true); - ((Chain*) _item3Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item4Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item4Ptr => (Chain*) _item4Ptr; - - /// - /// Gets or sets item #4 in the chain. - /// - public T4 Item4 - { - get => Unsafe.AsRef((Chain*) _item4Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item4Ptr)->PNext; - Marshal.StructureToPtr(value, _item4Ptr, true); - ((Chain*) _item4Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item5Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item5Ptr => (Chain*) _item5Ptr; - - /// - /// Gets or sets item #5 in the chain. - /// - public T5 Item5 - { - get => Unsafe.AsRef((Chain*) _item5Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item5Ptr)->PNext; - Marshal.StructureToPtr(value, _item5Ptr, true); - ((Chain*) _item5Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item6Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item6Ptr => (Chain*) _item6Ptr; - - /// - /// Gets or sets item #6 in the chain. - /// - public T6 Item6 - { - get => Unsafe.AsRef((Chain*) _item6Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item6Ptr)->PNext; - Marshal.StructureToPtr(value, _item6Ptr, true); - ((Chain*) _item6Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item7Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item7Ptr => (Chain*) _item7Ptr; - - /// - /// Gets or sets item #7 in the chain. - /// - public T7 Item7 - { - get => Unsafe.AsRef((Chain*) _item7Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item7Ptr)->PNext; - Marshal.StructureToPtr(value, _item7Ptr, true); - ((Chain*) _item7Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item8Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item8Ptr => (Chain*) _item8Ptr; - - /// - /// Gets or sets item #8 in the chain. - /// - public T8 Item8 - { - get => Unsafe.AsRef((Chain*) _item8Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item8Ptr)->PNext; - Marshal.StructureToPtr(value, _item8Ptr, true); - ((Chain*) _item8Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item9Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item9Ptr => (Chain*) _item9Ptr; - - /// - /// Gets or sets item #9 in the chain. - /// - public T9 Item9 - { - get => Unsafe.AsRef((Chain*) _item9Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item9Ptr)->PNext; - Marshal.StructureToPtr(value, _item9Ptr, true); - ((Chain*) _item9Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item10Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item10Ptr => (Chain*) _item10Ptr; - - /// - /// Gets or sets item #10 in the chain. - /// - public T10 Item10 - { - get => Unsafe.AsRef((Chain*) _item10Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item10Ptr)->PNext; - Marshal.StructureToPtr(value, _item10Ptr, true); - ((Chain*) _item10Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item11Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item11Ptr => (Chain*) _item11Ptr; - - /// - /// Gets or sets item #11 in the chain. - /// - public T11 Item11 - { - get => Unsafe.AsRef((Chain*) _item11Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item11Ptr)->PNext; - Marshal.StructureToPtr(value, _item11Ptr, true); - ((Chain*) _item11Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item12Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item12Ptr => (Chain*) _item12Ptr; - - /// - /// Gets or sets item #12 in the chain. - /// - public T12 Item12 - { - get => Unsafe.AsRef((Chain*) _item12Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item12Ptr)->PNext; - Marshal.StructureToPtr(value, _item12Ptr, true); - ((Chain*) _item12Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item13Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item13Ptr => (Chain*) _item13Ptr; - - /// - /// Gets or sets item #13 in the chain. - /// - public T13 Item13 - { - get => Unsafe.AsRef((Chain*) _item13Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item13Ptr)->PNext; - Marshal.StructureToPtr(value, _item13Ptr, true); - ((Chain*) _item13Ptr)->PNext = nextPtr; - } - } - - /// - /// Creates a new with 14 items. - /// - /// The head of the chain. - /// Item 1. - /// Item 2. - /// Item 3. - /// Item 4. - /// Item 5. - /// Item 6. - /// Item 7. - /// Item 8. - /// Item 9. - /// Item 10. - /// Item 11. - /// Item 12. - /// Item 13. - public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, - T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, - T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default, T13 item13 = default) - { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - var item6Size = Marshal.SizeOf(); - var item7Size = Marshal.SizeOf(); - var item8Size = Marshal.SizeOf(); - var item9Size = Marshal.SizeOf(); - var item10Size = Marshal.SizeOf(); - var item11Size = Marshal.SizeOf(); - var item12Size = Marshal.SizeOf(); - var item13Size = Marshal.SizeOf(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + - item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + - item12Size + item13Size); - head.StructureType(); - Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; - item1.StructureType(); - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - item2.StructureType(); - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - item3.StructureType(); - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - item4.StructureType(); - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - item5.StructureType(); - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - item6.StructureType(); - Marshal.StructureToPtr(item6, _item6Ptr, false); - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - item7.StructureType(); - Marshal.StructureToPtr(item7, _item7Ptr, false); - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; - item8.StructureType(); - Marshal.StructureToPtr(item8, _item8Ptr, false); - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - - _item9Ptr = _item8Ptr + item8Size; - item9.StructureType(); - Marshal.StructureToPtr(item9, _item9Ptr, false); - ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; - - _item10Ptr = _item9Ptr + item9Size; - item10.StructureType(); - Marshal.StructureToPtr(item10, _item10Ptr, false); - ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; - - _item11Ptr = _item10Ptr + item10Size; - item11.StructureType(); - Marshal.StructureToPtr(item11, _item11Ptr, false); - ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; - - _item12Ptr = _item11Ptr + item11Size; - item12.StructureType(); - Marshal.StructureToPtr(item12, _item12Ptr, false); - ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; - - _item13Ptr = _item12Ptr + item12Size; - item13.StructureType(); - Marshal.StructureToPtr(item13, _item13Ptr, false); - ((Chain*) _item12Ptr)->PNext = (Chain*) _item13Ptr; - } - - /// - /// Creates a new with 14 items from an existing unmanaged chain. - /// - /// The unmanaged chain to use as the basis of this chain. - /// Any errors loading the chain. - public ManagedChain(TChain chain, out string errors) - { - // Load existing chain first, so any errors occur before we allocate memory - var head = chain; - var headSize = Marshal.SizeOf(); - var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); - StructureType expectedStructureType; - var errorBuilder = new StringBuilder(); - - currentPtr = currentPtr->PNext; - T1 item1 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 14"); - else - { - expectedStructureType = item1.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 2; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item1 = Unsafe.AsRef(currentPtr); - } - - var item1Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T2 item2 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 14"); - else - { - expectedStructureType = item2.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 3; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item2 = Unsafe.AsRef(currentPtr); - } - - var item2Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T3 item3 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 14"); - else - { - expectedStructureType = item3.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 4; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item3 = Unsafe.AsRef(currentPtr); - } - - var item3Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T4 item4 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 14"); - else - { - expectedStructureType = item4.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 5; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item4 = Unsafe.AsRef(currentPtr); - } - - var item4Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T5 item5 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 14"); - else - { - expectedStructureType = item5.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 6; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item5 = Unsafe.AsRef(currentPtr); - } - - var item5Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T6 item6 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 14"); - else - { - expectedStructureType = item6.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 7; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item6 = Unsafe.AsRef(currentPtr); - } - - var item6Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T7 item7 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 14"); - else - { - expectedStructureType = item7.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 8; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item7 = Unsafe.AsRef(currentPtr); - } - - var item7Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T8 item8 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 14"); - else - { - expectedStructureType = item8.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 9; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item8 = Unsafe.AsRef(currentPtr); - } - - var item8Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T9 item9 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 9, expected length 14"); - else - { - expectedStructureType = item9.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 10; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item9 = Unsafe.AsRef(currentPtr); - } - - var item9Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T10 item10 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 10, expected length 14"); - else - { - expectedStructureType = item10.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 11; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item10 = Unsafe.AsRef(currentPtr); - } - - var item10Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T11 item11 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 11, expected length 14"); - else - { - expectedStructureType = item11.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 12; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item11 = Unsafe.AsRef(currentPtr); - } - - var item11Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T12 item12 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 12, expected length 14"); - else - { - expectedStructureType = item12.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 13; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item12 = Unsafe.AsRef(currentPtr); - } - - var item12Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T13 item13 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 13, expected length 14"); - else - { - expectedStructureType = item13.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 14; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item13 = Unsafe.AsRef(currentPtr); - } - - var item13Size = Marshal.SizeOf(); - - - // Create string of errors - errors = errorBuilder.ToString().Trim(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + - item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + - item12Size + item13Size); - Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - Marshal.StructureToPtr(item6, _item6Ptr, false); - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - Marshal.StructureToPtr(item7, _item7Ptr, false); - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; - Marshal.StructureToPtr(item8, _item8Ptr, false); - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - - _item9Ptr = _item8Ptr + item8Size; - Marshal.StructureToPtr(item9, _item9Ptr, false); - ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; - - _item10Ptr = _item9Ptr + item9Size; - Marshal.StructureToPtr(item10, _item10Ptr, false); - ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; - - _item11Ptr = _item10Ptr + item10Size; - Marshal.StructureToPtr(item11, _item11Ptr, false); - ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; - - _item12Ptr = _item11Ptr + item11Size; - Marshal.StructureToPtr(item12, _item12Ptr, false); - ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; - - _item13Ptr = _item12Ptr + item12Size; - Marshal.StructureToPtr(item13, _item13Ptr, false); - ((Chain*) _item12Ptr)->PNext = (Chain*) _item13Ptr; - } - - /// - /// Creates a new with 14 items. - /// - /// The chain to append to. - /// Item 13. - /// - /// Do not forget to dispose the chain if you are no longer using it. - /// - public ManagedChain(ManagedChain previous, - T13 item13 = default) - { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - var item6Size = Marshal.SizeOf(); - var item7Size = Marshal.SizeOf(); - var item8Size = Marshal.SizeOf(); - var item9Size = Marshal.SizeOf(); - var item10Size = Marshal.SizeOf(); - var item11Size = Marshal.SizeOf(); - var item12Size = Marshal.SizeOf(); - var item13Size = Marshal.SizeOf(); - - var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + - item7Size + item8Size + item9Size + item10Size + item11Size + item12Size; - var newSize = originalSize + item13Size; - - _headPtr = Marshal.AllocHGlobal(newSize); - // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*) _headPtr, originalSize, originalSize); - - _item1Ptr = _headPtr + headSize; - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - - _item9Ptr = _item8Ptr + item8Size; - ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; - - _item10Ptr = _item9Ptr + item9Size; - ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; - - _item11Ptr = _item10Ptr + item10Size; - ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; - - _item12Ptr = _item11Ptr + item11Size; - ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; - - _item13Ptr = _item12Ptr + item12Size; - // Append the last structure - item13.StructureType(); - Marshal.StructureToPtr(item13, _item13Ptr, false); - ((Chain*) _item12Ptr)->PNext = (Chain*) _item13Ptr; - } - - /// - /// Creates a new with 15 items, by appending to - /// the end of this chain. - /// - /// Item 14. - /// Type of Item 14 - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Append( - T14 item14 = default) - where T14 : struct, IExtendsChain - { - return new ManagedChain(this, item14); - } - - /// - public void Dispose() - { - var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); - if (headPtr == IntPtr.Zero) return; - - // Destroy all structures - Marshal.DestroyStructure(headPtr); - var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item1Ptr); - var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item2Ptr); - var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item3Ptr); - var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item4Ptr); - var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item5Ptr); - var item6Ptr = Interlocked.Exchange(ref _item6Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item6Ptr); - var item7Ptr = Interlocked.Exchange(ref _item7Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item7Ptr); - var item8Ptr = Interlocked.Exchange(ref _item8Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item8Ptr); - var item9Ptr = Interlocked.Exchange(ref _item9Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item9Ptr); - var item10Ptr = Interlocked.Exchange(ref _item10Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item10Ptr); - var item11Ptr = Interlocked.Exchange(ref _item11Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item11Ptr); - var item12Ptr = Interlocked.Exchange(ref _item12Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item12Ptr); - var item13Ptr = Interlocked.Exchange(ref _item13Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item13Ptr); - - // Free memory block - Marshal.FreeHGlobal(headPtr); - } -} - -/// -/// A safely manages the pointers of a managed structure chain. -/// -/// The chain type -/// Type of Item 1. -/// Type of Item 2. -/// Type of Item 3. -/// Type of Item 4. -/// Type of Item 5. -/// Type of Item 6. -/// Type of Item 7. -/// Type of Item 8. -/// Type of Item 9. -/// Type of Item 10. -/// Type of Item 11. -/// Type of Item 12. -/// Type of Item 13. -/// Type of Item 14. -public unsafe class ManagedChain : IDisposable - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain - where T8 : struct, IExtendsChain - where T9 : struct, IExtendsChain - where T10 : struct, IExtendsChain - where T11 : struct, IExtendsChain - where T12 : struct, IExtendsChain - where T13 : struct, IExtendsChain - where T14 : struct, IExtendsChain -{ - private IntPtr _headPtr; - - /// - /// Gets a pointer to the current head. - /// - public Chain* HeadPtr => (Chain*) _headPtr; - - /// - /// Gets or sets the head of the chain. - /// - public TChain Head - { - get => Unsafe.AsRef((Chain*) _headPtr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _headPtr)->PNext; - Marshal.StructureToPtr(value, _headPtr, true); - ((Chain*) _headPtr)->PNext = nextPtr; - } - } - - private IntPtr _item1Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item1Ptr => (Chain*) _item1Ptr; - - /// - /// Gets or sets item #1 in the chain. - /// - public T1 Item1 - { - get => Unsafe.AsRef((Chain*) _item1Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item1Ptr)->PNext; - Marshal.StructureToPtr(value, _item1Ptr, true); - ((Chain*) _item1Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item2Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item2Ptr => (Chain*) _item2Ptr; - - /// - /// Gets or sets item #2 in the chain. - /// - public T2 Item2 - { - get => Unsafe.AsRef((Chain*) _item2Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item2Ptr)->PNext; - Marshal.StructureToPtr(value, _item2Ptr, true); - ((Chain*) _item2Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item3Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item3Ptr => (Chain*) _item3Ptr; - - /// - /// Gets or sets item #3 in the chain. - /// - public T3 Item3 - { - get => Unsafe.AsRef((Chain*) _item3Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item3Ptr)->PNext; - Marshal.StructureToPtr(value, _item3Ptr, true); - ((Chain*) _item3Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item4Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item4Ptr => (Chain*) _item4Ptr; - - /// - /// Gets or sets item #4 in the chain. - /// - public T4 Item4 - { - get => Unsafe.AsRef((Chain*) _item4Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item4Ptr)->PNext; - Marshal.StructureToPtr(value, _item4Ptr, true); - ((Chain*) _item4Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item5Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item5Ptr => (Chain*) _item5Ptr; - - /// - /// Gets or sets item #5 in the chain. - /// - public T5 Item5 - { - get => Unsafe.AsRef((Chain*) _item5Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item5Ptr)->PNext; - Marshal.StructureToPtr(value, _item5Ptr, true); - ((Chain*) _item5Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item6Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item6Ptr => (Chain*) _item6Ptr; - - /// - /// Gets or sets item #6 in the chain. - /// - public T6 Item6 - { - get => Unsafe.AsRef((Chain*) _item6Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item6Ptr)->PNext; - Marshal.StructureToPtr(value, _item6Ptr, true); - ((Chain*) _item6Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item7Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item7Ptr => (Chain*) _item7Ptr; - - /// - /// Gets or sets item #7 in the chain. - /// - public T7 Item7 - { - get => Unsafe.AsRef((Chain*) _item7Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item7Ptr)->PNext; - Marshal.StructureToPtr(value, _item7Ptr, true); - ((Chain*) _item7Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item8Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item8Ptr => (Chain*) _item8Ptr; - - /// - /// Gets or sets item #8 in the chain. - /// - public T8 Item8 - { - get => Unsafe.AsRef((Chain*) _item8Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item8Ptr)->PNext; - Marshal.StructureToPtr(value, _item8Ptr, true); - ((Chain*) _item8Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item9Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item9Ptr => (Chain*) _item9Ptr; - - /// - /// Gets or sets item #9 in the chain. - /// - public T9 Item9 - { - get => Unsafe.AsRef((Chain*) _item9Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item9Ptr)->PNext; - Marshal.StructureToPtr(value, _item9Ptr, true); - ((Chain*) _item9Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item10Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item10Ptr => (Chain*) _item10Ptr; - - /// - /// Gets or sets item #10 in the chain. - /// - public T10 Item10 - { - get => Unsafe.AsRef((Chain*) _item10Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item10Ptr)->PNext; - Marshal.StructureToPtr(value, _item10Ptr, true); - ((Chain*) _item10Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item11Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item11Ptr => (Chain*) _item11Ptr; - - /// - /// Gets or sets item #11 in the chain. - /// - public T11 Item11 - { - get => Unsafe.AsRef((Chain*) _item11Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item11Ptr)->PNext; - Marshal.StructureToPtr(value, _item11Ptr, true); - ((Chain*) _item11Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item12Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item12Ptr => (Chain*) _item12Ptr; - - /// - /// Gets or sets item #12 in the chain. - /// - public T12 Item12 - { - get => Unsafe.AsRef((Chain*) _item12Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item12Ptr)->PNext; - Marshal.StructureToPtr(value, _item12Ptr, true); - ((Chain*) _item12Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item13Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item13Ptr => (Chain*) _item13Ptr; - - /// - /// Gets or sets item #13 in the chain. - /// - public T13 Item13 - { - get => Unsafe.AsRef((Chain*) _item13Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item13Ptr)->PNext; - Marshal.StructureToPtr(value, _item13Ptr, true); - ((Chain*) _item13Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item14Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item14Ptr => (Chain*) _item14Ptr; - - /// - /// Gets or sets item #14 in the chain. - /// - public T14 Item14 - { - get => Unsafe.AsRef((Chain*) _item14Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item14Ptr)->PNext; - Marshal.StructureToPtr(value, _item14Ptr, true); - ((Chain*) _item14Ptr)->PNext = nextPtr; - } - } - - /// - /// Creates a new with 15 items. - /// - /// The head of the chain. - /// Item 1. - /// Item 2. - /// Item 3. - /// Item 4. - /// Item 5. - /// Item 6. - /// Item 7. - /// Item 8. - /// Item 9. - /// Item 10. - /// Item 11. - /// Item 12. - /// Item 13. - /// Item 14. - public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, - T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, - T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default, T13 item13 = default, - T14 item14 = default) - { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - var item6Size = Marshal.SizeOf(); - var item7Size = Marshal.SizeOf(); - var item8Size = Marshal.SizeOf(); - var item9Size = Marshal.SizeOf(); - var item10Size = Marshal.SizeOf(); - var item11Size = Marshal.SizeOf(); - var item12Size = Marshal.SizeOf(); - var item13Size = Marshal.SizeOf(); - var item14Size = Marshal.SizeOf(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + - item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + - item12Size + item13Size + item14Size); - head.StructureType(); - Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; - item1.StructureType(); - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - item2.StructureType(); - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - item3.StructureType(); - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - item4.StructureType(); - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - item5.StructureType(); - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - item6.StructureType(); - Marshal.StructureToPtr(item6, _item6Ptr, false); - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - item7.StructureType(); - Marshal.StructureToPtr(item7, _item7Ptr, false); - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; - item8.StructureType(); - Marshal.StructureToPtr(item8, _item8Ptr, false); - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - - _item9Ptr = _item8Ptr + item8Size; - item9.StructureType(); - Marshal.StructureToPtr(item9, _item9Ptr, false); - ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; - - _item10Ptr = _item9Ptr + item9Size; - item10.StructureType(); - Marshal.StructureToPtr(item10, _item10Ptr, false); - ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; - - _item11Ptr = _item10Ptr + item10Size; - item11.StructureType(); - Marshal.StructureToPtr(item11, _item11Ptr, false); - ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; - - _item12Ptr = _item11Ptr + item11Size; - item12.StructureType(); - Marshal.StructureToPtr(item12, _item12Ptr, false); - ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; - - _item13Ptr = _item12Ptr + item12Size; - item13.StructureType(); - Marshal.StructureToPtr(item13, _item13Ptr, false); - ((Chain*) _item12Ptr)->PNext = (Chain*) _item13Ptr; - - _item14Ptr = _item13Ptr + item13Size; - item14.StructureType(); - Marshal.StructureToPtr(item14, _item14Ptr, false); - ((Chain*) _item13Ptr)->PNext = (Chain*) _item14Ptr; - } - - /// - /// Creates a new with 15 items from an existing unmanaged chain. - /// - /// The unmanaged chain to use as the basis of this chain. - /// Any errors loading the chain. - public ManagedChain(TChain chain, out string errors) - { - // Load existing chain first, so any errors occur before we allocate memory - var head = chain; - var headSize = Marshal.SizeOf(); - var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); - StructureType expectedStructureType; - var errorBuilder = new StringBuilder(); - - currentPtr = currentPtr->PNext; - T1 item1 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 15"); - else - { - expectedStructureType = item1.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 2; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item1 = Unsafe.AsRef(currentPtr); - } - - var item1Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T2 item2 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 15"); - else - { - expectedStructureType = item2.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 3; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item2 = Unsafe.AsRef(currentPtr); - } - - var item2Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T3 item3 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 15"); - else - { - expectedStructureType = item3.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 4; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item3 = Unsafe.AsRef(currentPtr); - } - - var item3Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T4 item4 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 15"); - else - { - expectedStructureType = item4.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 5; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item4 = Unsafe.AsRef(currentPtr); - } - - var item4Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T5 item5 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 15"); - else - { - expectedStructureType = item5.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 6; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item5 = Unsafe.AsRef(currentPtr); - } - - var item5Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T6 item6 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 15"); - else - { - expectedStructureType = item6.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 7; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item6 = Unsafe.AsRef(currentPtr); - } - - var item6Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T7 item7 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 15"); - else - { - expectedStructureType = item7.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 8; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item7 = Unsafe.AsRef(currentPtr); - } - - var item7Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T8 item8 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 15"); - else - { - expectedStructureType = item8.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 9; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item8 = Unsafe.AsRef(currentPtr); - } - - var item8Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T9 item9 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 9, expected length 15"); - else - { - expectedStructureType = item9.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 10; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item9 = Unsafe.AsRef(currentPtr); - } - - var item9Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T10 item10 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 10, expected length 15"); - else - { - expectedStructureType = item10.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 11; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item10 = Unsafe.AsRef(currentPtr); - } - - var item10Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T11 item11 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 11, expected length 15"); - else - { - expectedStructureType = item11.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 12; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item11 = Unsafe.AsRef(currentPtr); - } - - var item11Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T12 item12 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 12, expected length 15"); - else - { - expectedStructureType = item12.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 13; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item12 = Unsafe.AsRef(currentPtr); - } - - var item12Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T13 item13 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 13, expected length 15"); - else - { - expectedStructureType = item13.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 14; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item13 = Unsafe.AsRef(currentPtr); - } - - var item13Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T14 item14 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 14, expected length 15"); - else - { - expectedStructureType = item14.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 15; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item14 = Unsafe.AsRef(currentPtr); - } - - var item14Size = Marshal.SizeOf(); - - - // Create string of errors - errors = errorBuilder.ToString().Trim(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + - item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + - item12Size + item13Size + item14Size); - Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - Marshal.StructureToPtr(item6, _item6Ptr, false); - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - Marshal.StructureToPtr(item7, _item7Ptr, false); - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; - Marshal.StructureToPtr(item8, _item8Ptr, false); - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - - _item9Ptr = _item8Ptr + item8Size; - Marshal.StructureToPtr(item9, _item9Ptr, false); - ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; - - _item10Ptr = _item9Ptr + item9Size; - Marshal.StructureToPtr(item10, _item10Ptr, false); - ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; - - _item11Ptr = _item10Ptr + item10Size; - Marshal.StructureToPtr(item11, _item11Ptr, false); - ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; - - _item12Ptr = _item11Ptr + item11Size; - Marshal.StructureToPtr(item12, _item12Ptr, false); - ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; - - _item13Ptr = _item12Ptr + item12Size; - Marshal.StructureToPtr(item13, _item13Ptr, false); - ((Chain*) _item12Ptr)->PNext = (Chain*) _item13Ptr; - - _item14Ptr = _item13Ptr + item13Size; - Marshal.StructureToPtr(item14, _item14Ptr, false); - ((Chain*) _item13Ptr)->PNext = (Chain*) _item14Ptr; - } - - /// - /// Creates a new with 15 items. - /// - /// The chain to append to. - /// Item 14. - /// - /// Do not forget to dispose the chain if you are no longer using it. - /// - public ManagedChain(ManagedChain previous, - T14 item14 = default) - { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - var item6Size = Marshal.SizeOf(); - var item7Size = Marshal.SizeOf(); - var item8Size = Marshal.SizeOf(); - var item9Size = Marshal.SizeOf(); - var item10Size = Marshal.SizeOf(); - var item11Size = Marshal.SizeOf(); - var item12Size = Marshal.SizeOf(); - var item13Size = Marshal.SizeOf(); - var item14Size = Marshal.SizeOf(); - - var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + - item7Size + item8Size + item9Size + item10Size + item11Size + item12Size + item13Size; - var newSize = originalSize + item14Size; - - _headPtr = Marshal.AllocHGlobal(newSize); - // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*) _headPtr, originalSize, originalSize); - - _item1Ptr = _headPtr + headSize; - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - - _item9Ptr = _item8Ptr + item8Size; - ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; - - _item10Ptr = _item9Ptr + item9Size; - ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; - - _item11Ptr = _item10Ptr + item10Size; - ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; - - _item12Ptr = _item11Ptr + item11Size; - ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; - - _item13Ptr = _item12Ptr + item12Size; - ((Chain*) _item12Ptr)->PNext = (Chain*) _item13Ptr; - - _item14Ptr = _item13Ptr + item13Size; - // Append the last structure - item14.StructureType(); - Marshal.StructureToPtr(item14, _item14Ptr, false); - ((Chain*) _item13Ptr)->PNext = (Chain*) _item14Ptr; - } - - /// - /// Creates a new with 16 items, by appending to - /// the end of this chain. - /// - /// Item 15. - /// Type of Item 15 - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Append( - T15 item15 = default) - where T15 : struct, IExtendsChain - { - return new ManagedChain(this, item15); - } - - /// - public void Dispose() - { - var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); - if (headPtr == IntPtr.Zero) return; - - // Destroy all structures - Marshal.DestroyStructure(headPtr); - var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item1Ptr); - var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item2Ptr); - var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item3Ptr); - var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item4Ptr); - var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item5Ptr); - var item6Ptr = Interlocked.Exchange(ref _item6Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item6Ptr); - var item7Ptr = Interlocked.Exchange(ref _item7Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item7Ptr); - var item8Ptr = Interlocked.Exchange(ref _item8Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item8Ptr); - var item9Ptr = Interlocked.Exchange(ref _item9Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item9Ptr); - var item10Ptr = Interlocked.Exchange(ref _item10Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item10Ptr); - var item11Ptr = Interlocked.Exchange(ref _item11Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item11Ptr); - var item12Ptr = Interlocked.Exchange(ref _item12Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item12Ptr); - var item13Ptr = Interlocked.Exchange(ref _item13Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item13Ptr); - var item14Ptr = Interlocked.Exchange(ref _item14Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item14Ptr); - - // Free memory block - Marshal.FreeHGlobal(headPtr); - } -} - -/// -/// A safely manages the pointers of a managed structure chain. -/// -/// The chain type -/// Type of Item 1. -/// Type of Item 2. -/// Type of Item 3. -/// Type of Item 4. -/// Type of Item 5. -/// Type of Item 6. -/// Type of Item 7. -/// Type of Item 8. -/// Type of Item 9. -/// Type of Item 10. -/// Type of Item 11. -/// Type of Item 12. -/// Type of Item 13. -/// Type of Item 14. -/// Type of Item 15. -public unsafe class ManagedChain : IDisposable - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain - where T8 : struct, IExtendsChain - where T9 : struct, IExtendsChain - where T10 : struct, IExtendsChain - where T11 : struct, IExtendsChain - where T12 : struct, IExtendsChain - where T13 : struct, IExtendsChain - where T14 : struct, IExtendsChain - where T15 : struct, IExtendsChain -{ - private IntPtr _headPtr; - - /// - /// Gets a pointer to the current head. - /// - public Chain* HeadPtr => (Chain*) _headPtr; - - /// - /// Gets or sets the head of the chain. - /// - public TChain Head - { - get => Unsafe.AsRef((Chain*) _headPtr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _headPtr)->PNext; - Marshal.StructureToPtr(value, _headPtr, true); - ((Chain*) _headPtr)->PNext = nextPtr; - } - } - - private IntPtr _item1Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item1Ptr => (Chain*) _item1Ptr; - - /// - /// Gets or sets item #1 in the chain. - /// - public T1 Item1 - { - get => Unsafe.AsRef((Chain*) _item1Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item1Ptr)->PNext; - Marshal.StructureToPtr(value, _item1Ptr, true); - ((Chain*) _item1Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item2Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item2Ptr => (Chain*) _item2Ptr; - - /// - /// Gets or sets item #2 in the chain. - /// - public T2 Item2 - { - get => Unsafe.AsRef((Chain*) _item2Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item2Ptr)->PNext; - Marshal.StructureToPtr(value, _item2Ptr, true); - ((Chain*) _item2Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item3Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item3Ptr => (Chain*) _item3Ptr; - - /// - /// Gets or sets item #3 in the chain. - /// - public T3 Item3 - { - get => Unsafe.AsRef((Chain*) _item3Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item3Ptr)->PNext; - Marshal.StructureToPtr(value, _item3Ptr, true); - ((Chain*) _item3Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item4Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item4Ptr => (Chain*) _item4Ptr; - - /// - /// Gets or sets item #4 in the chain. - /// - public T4 Item4 - { - get => Unsafe.AsRef((Chain*) _item4Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item4Ptr)->PNext; - Marshal.StructureToPtr(value, _item4Ptr, true); - ((Chain*) _item4Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item5Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item5Ptr => (Chain*) _item5Ptr; - - /// - /// Gets or sets item #5 in the chain. - /// - public T5 Item5 - { - get => Unsafe.AsRef((Chain*) _item5Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item5Ptr)->PNext; - Marshal.StructureToPtr(value, _item5Ptr, true); - ((Chain*) _item5Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item6Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item6Ptr => (Chain*) _item6Ptr; - - /// - /// Gets or sets item #6 in the chain. - /// - public T6 Item6 - { - get => Unsafe.AsRef((Chain*) _item6Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item6Ptr)->PNext; - Marshal.StructureToPtr(value, _item6Ptr, true); - ((Chain*) _item6Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item7Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item7Ptr => (Chain*) _item7Ptr; - - /// - /// Gets or sets item #7 in the chain. - /// - public T7 Item7 - { - get => Unsafe.AsRef((Chain*) _item7Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item7Ptr)->PNext; - Marshal.StructureToPtr(value, _item7Ptr, true); - ((Chain*) _item7Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item8Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item8Ptr => (Chain*) _item8Ptr; - - /// - /// Gets or sets item #8 in the chain. - /// - public T8 Item8 - { - get => Unsafe.AsRef((Chain*) _item8Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item8Ptr)->PNext; - Marshal.StructureToPtr(value, _item8Ptr, true); - ((Chain*) _item8Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item9Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item9Ptr => (Chain*) _item9Ptr; - - /// - /// Gets or sets item #9 in the chain. - /// - public T9 Item9 - { - get => Unsafe.AsRef((Chain*) _item9Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item9Ptr)->PNext; - Marshal.StructureToPtr(value, _item9Ptr, true); - ((Chain*) _item9Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item10Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item10Ptr => (Chain*) _item10Ptr; - - /// - /// Gets or sets item #10 in the chain. - /// - public T10 Item10 - { - get => Unsafe.AsRef((Chain*) _item10Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item10Ptr)->PNext; - Marshal.StructureToPtr(value, _item10Ptr, true); - ((Chain*) _item10Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item11Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item11Ptr => (Chain*) _item11Ptr; - - /// - /// Gets or sets item #11 in the chain. - /// - public T11 Item11 - { - get => Unsafe.AsRef((Chain*) _item11Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item11Ptr)->PNext; - Marshal.StructureToPtr(value, _item11Ptr, true); - ((Chain*) _item11Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item12Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item12Ptr => (Chain*) _item12Ptr; - - /// - /// Gets or sets item #12 in the chain. - /// - public T12 Item12 - { - get => Unsafe.AsRef((Chain*) _item12Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item12Ptr)->PNext; - Marshal.StructureToPtr(value, _item12Ptr, true); - ((Chain*) _item12Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item13Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item13Ptr => (Chain*) _item13Ptr; - - /// - /// Gets or sets item #13 in the chain. - /// - public T13 Item13 - { - get => Unsafe.AsRef((Chain*) _item13Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item13Ptr)->PNext; - Marshal.StructureToPtr(value, _item13Ptr, true); - ((Chain*) _item13Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item14Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item14Ptr => (Chain*) _item14Ptr; - - /// - /// Gets or sets item #14 in the chain. - /// - public T14 Item14 - { - get => Unsafe.AsRef((Chain*) _item14Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item14Ptr)->PNext; - Marshal.StructureToPtr(value, _item14Ptr, true); - ((Chain*) _item14Ptr)->PNext = nextPtr; - } - } - - private IntPtr _item15Ptr; - - /// - /// Gets a pointer to the second item in the chain. - /// - public Chain* Item15Ptr => (Chain*) _item15Ptr; - - /// - /// Gets or sets item #15 in the chain. - /// - public T15 Item15 - { - get => Unsafe.AsRef((Chain*) _item15Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item15Ptr)->PNext; - Marshal.StructureToPtr(value, _item15Ptr, true); - ((Chain*) _item15Ptr)->PNext = nextPtr; - } - } - - /// - /// Creates a new with 16 items. - /// - /// The head of the chain. - /// Item 1. - /// Item 2. - /// Item 3. - /// Item 4. - /// Item 5. - /// Item 6. - /// Item 7. - /// Item 8. - /// Item 9. - /// Item 10. - /// Item 11. - /// Item 12. - /// Item 13. - /// Item 14. - /// Item 15. - public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, - T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, - T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default, T13 item13 = default, - T14 item14 = default, T15 item15 = default) - { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - var item6Size = Marshal.SizeOf(); - var item7Size = Marshal.SizeOf(); - var item8Size = Marshal.SizeOf(); - var item9Size = Marshal.SizeOf(); - var item10Size = Marshal.SizeOf(); - var item11Size = Marshal.SizeOf(); - var item12Size = Marshal.SizeOf(); - var item13Size = Marshal.SizeOf(); - var item14Size = Marshal.SizeOf(); - var item15Size = Marshal.SizeOf(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + - item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + - item12Size + item13Size + item14Size + item15Size); - head.StructureType(); - Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; - item1.StructureType(); - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - item2.StructureType(); - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - item3.StructureType(); - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - item4.StructureType(); - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - item5.StructureType(); - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - item6.StructureType(); - Marshal.StructureToPtr(item6, _item6Ptr, false); - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - item7.StructureType(); - Marshal.StructureToPtr(item7, _item7Ptr, false); - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; - item8.StructureType(); - Marshal.StructureToPtr(item8, _item8Ptr, false); - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - - _item9Ptr = _item8Ptr + item8Size; - item9.StructureType(); - Marshal.StructureToPtr(item9, _item9Ptr, false); - ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; - - _item10Ptr = _item9Ptr + item9Size; - item10.StructureType(); - Marshal.StructureToPtr(item10, _item10Ptr, false); - ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; - - _item11Ptr = _item10Ptr + item10Size; - item11.StructureType(); - Marshal.StructureToPtr(item11, _item11Ptr, false); - ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; - - _item12Ptr = _item11Ptr + item11Size; - item12.StructureType(); - Marshal.StructureToPtr(item12, _item12Ptr, false); - ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; - - _item13Ptr = _item12Ptr + item12Size; - item13.StructureType(); - Marshal.StructureToPtr(item13, _item13Ptr, false); - ((Chain*) _item12Ptr)->PNext = (Chain*) _item13Ptr; - - _item14Ptr = _item13Ptr + item13Size; - item14.StructureType(); - Marshal.StructureToPtr(item14, _item14Ptr, false); - ((Chain*) _item13Ptr)->PNext = (Chain*) _item14Ptr; - - _item15Ptr = _item14Ptr + item14Size; - item15.StructureType(); - Marshal.StructureToPtr(item15, _item15Ptr, false); - ((Chain*) _item14Ptr)->PNext = (Chain*) _item15Ptr; - } - - /// - /// Creates a new with 16 items from an existing unmanaged chain. - /// - /// The unmanaged chain to use as the basis of this chain. - /// Any errors loading the chain. - public ManagedChain(TChain chain, out string errors) - { - // Load existing chain first, so any errors occur before we allocate memory - var head = chain; - var headSize = Marshal.SizeOf(); - var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); - StructureType expectedStructureType; - var errorBuilder = new StringBuilder(); - - currentPtr = currentPtr->PNext; - T1 item1 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 16"); - else - { - expectedStructureType = item1.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 2; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item1 = Unsafe.AsRef(currentPtr); - } - - var item1Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T2 item2 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 16"); - else - { - expectedStructureType = item2.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 3; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item2 = Unsafe.AsRef(currentPtr); - } - - var item2Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T3 item3 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 16"); - else - { - expectedStructureType = item3.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 4; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item3 = Unsafe.AsRef(currentPtr); - } - - var item3Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T4 item4 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 16"); - else - { - expectedStructureType = item4.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 5; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item4 = Unsafe.AsRef(currentPtr); - } - - var item4Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T5 item5 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 16"); - else - { - expectedStructureType = item5.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 6; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item5 = Unsafe.AsRef(currentPtr); - } - - var item5Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T6 item6 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 16"); - else - { - expectedStructureType = item6.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 7; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item6 = Unsafe.AsRef(currentPtr); - } - - var item6Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T7 item7 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 16"); - else - { - expectedStructureType = item7.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 8; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item7 = Unsafe.AsRef(currentPtr); - } - - var item7Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T8 item8 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 16"); - else - { - expectedStructureType = item8.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 9; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item8 = Unsafe.AsRef(currentPtr); - } - - var item8Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T9 item9 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 9, expected length 16"); - else - { - expectedStructureType = item9.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 10; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item9 = Unsafe.AsRef(currentPtr); - } - - var item9Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T10 item10 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 10, expected length 16"); - else - { - expectedStructureType = item10.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 11; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item10 = Unsafe.AsRef(currentPtr); - } - - var item10Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T11 item11 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 11, expected length 16"); - else - { - expectedStructureType = item11.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 12; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item11 = Unsafe.AsRef(currentPtr); - } - - var item11Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T12 item12 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 12, expected length 16"); - else - { - expectedStructureType = item12.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 13; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item12 = Unsafe.AsRef(currentPtr); - } - - var item12Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T13 item13 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 13, expected length 16"); - else - { - expectedStructureType = item13.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 14; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item13 = Unsafe.AsRef(currentPtr); - } - - var item13Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T14 item14 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 14, expected length 16"); - else - { - expectedStructureType = item14.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 15; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item14 = Unsafe.AsRef(currentPtr); - } - - var item14Size = Marshal.SizeOf(); - - currentPtr = currentPtr->PNext; - T15 item15 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 15, expected length 16"); - else - { - expectedStructureType = item15.StructureType(); - if (currentPtr->SType != expectedStructureType) - { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 16; expected ") - .Append(expectedStructureType) - .AppendLine(); - } - else - item15 = Unsafe.AsRef(currentPtr); - } - - var item15Size = Marshal.SizeOf(); - - - // Create string of errors - errors = errorBuilder.ToString().Trim(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + - item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + - item12Size + item13Size + item14Size + item15Size); - Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - Marshal.StructureToPtr(item6, _item6Ptr, false); - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - Marshal.StructureToPtr(item7, _item7Ptr, false); - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; - Marshal.StructureToPtr(item8, _item8Ptr, false); - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - - _item9Ptr = _item8Ptr + item8Size; - Marshal.StructureToPtr(item9, _item9Ptr, false); - ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; - - _item10Ptr = _item9Ptr + item9Size; - Marshal.StructureToPtr(item10, _item10Ptr, false); - ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; - - _item11Ptr = _item10Ptr + item10Size; - Marshal.StructureToPtr(item11, _item11Ptr, false); - ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; - - _item12Ptr = _item11Ptr + item11Size; - Marshal.StructureToPtr(item12, _item12Ptr, false); - ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; - - _item13Ptr = _item12Ptr + item12Size; - Marshal.StructureToPtr(item13, _item13Ptr, false); - ((Chain*) _item12Ptr)->PNext = (Chain*) _item13Ptr; - - _item14Ptr = _item13Ptr + item13Size; - Marshal.StructureToPtr(item14, _item14Ptr, false); - ((Chain*) _item13Ptr)->PNext = (Chain*) _item14Ptr; - - _item15Ptr = _item14Ptr + item14Size; - Marshal.StructureToPtr(item15, _item15Ptr, false); - ((Chain*) _item14Ptr)->PNext = (Chain*) _item15Ptr; - } - - /// - /// Creates a new with 16 items. - /// - /// The chain to append to. - /// Item 15. - /// - /// Do not forget to dispose the chain if you are no longer using it. - /// - public ManagedChain(ManagedChain previous, - T15 item15 = default) - { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - var item6Size = Marshal.SizeOf(); - var item7Size = Marshal.SizeOf(); - var item8Size = Marshal.SizeOf(); - var item9Size = Marshal.SizeOf(); - var item10Size = Marshal.SizeOf(); - var item11Size = Marshal.SizeOf(); - var item12Size = Marshal.SizeOf(); - var item13Size = Marshal.SizeOf(); - var item14Size = Marshal.SizeOf(); - var item15Size = Marshal.SizeOf(); - - var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + - item7Size + item8Size + item9Size + item10Size + item11Size + item12Size + item13Size + - item14Size; - var newSize = originalSize + item15Size; - - _headPtr = Marshal.AllocHGlobal(newSize); - // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*) _headPtr, originalSize, originalSize); - - _item1Ptr = _headPtr + headSize; - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - - _item9Ptr = _item8Ptr + item8Size; - ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; - - _item10Ptr = _item9Ptr + item9Size; - ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; - - _item11Ptr = _item10Ptr + item10Size; - ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; - - _item12Ptr = _item11Ptr + item11Size; - ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; - - _item13Ptr = _item12Ptr + item12Size; - ((Chain*) _item12Ptr)->PNext = (Chain*) _item13Ptr; - - _item14Ptr = _item13Ptr + item13Size; - ((Chain*) _item13Ptr)->PNext = (Chain*) _item14Ptr; - - _item15Ptr = _item14Ptr + item14Size; - // Append the last structure - item15.StructureType(); - Marshal.StructureToPtr(item15, _item15Ptr, false); - ((Chain*) _item14Ptr)->PNext = (Chain*) _item15Ptr; - } - - /// - public void Dispose() - { - var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); - if (headPtr == IntPtr.Zero) return; - - // Destroy all structures - Marshal.DestroyStructure(headPtr); - var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item1Ptr); - var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item2Ptr); - var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item3Ptr); - var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item4Ptr); - var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item5Ptr); - var item6Ptr = Interlocked.Exchange(ref _item6Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item6Ptr); - var item7Ptr = Interlocked.Exchange(ref _item7Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item7Ptr); - var item8Ptr = Interlocked.Exchange(ref _item8Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item8Ptr); - var item9Ptr = Interlocked.Exchange(ref _item9Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item9Ptr); - var item10Ptr = Interlocked.Exchange(ref _item10Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item10Ptr); - var item11Ptr = Interlocked.Exchange(ref _item11Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item11Ptr); - var item12Ptr = Interlocked.Exchange(ref _item12Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item12Ptr); - var item13Ptr = Interlocked.Exchange(ref _item13Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item13Ptr); - var item14Ptr = Interlocked.Exchange(ref _item14Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item14Ptr); - var item15Ptr = Interlocked.Exchange(ref _item15Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item15Ptr); - - // Free memory block - Marshal.FreeHGlobal(headPtr); - } -} \ No newline at end of file diff --git a/PrototypeStructChaining/ManagedChain.gen.tt b/PrototypeStructChaining/ManagedChain.gen.tt index cb91403f6c..997583ede4 100644 --- a/PrototypeStructChaining/ManagedChain.gen.tt +++ b/PrototypeStructChaining/ManagedChain.gen.tt @@ -2,7 +2,7 @@ <#@ import namespace="System.Text" #> <#@ import namespace="System.Collections.Generic" #> <# - var maximumItems = 16; + var maximumItems = 5; string parameterDocs(int index, string prefix) { @@ -95,6 +95,7 @@ return builder.ToString(); } #> +using System.Collections; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Text; @@ -104,8 +105,24 @@ namespace Silk.Net.Vulkan; /// /// Static class for creating Managed Chains. /// -public static class ManagedChain +public abstract class ManagedChain : IReadOnlyList, IDisposable { + /// + public abstract IEnumerator GetEnumerator(); + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + /// + public abstract int Count { get; } + + /// + public abstract IChainable this[int index] { get; } + + /// + public abstract void Dispose(); + <# for (var i = 2; i <= maximumItems; i++) { @@ -137,7 +154,7 @@ public static class ManagedChain /// A safely manages the pointers of a managed structure chain. /// <#= parameterTypeDocs(i, "/// ") #> -public unsafe class ManagedChain<<#= tList #>> : IDisposable +public unsafe class ManagedChain<<#= tList #>> : ManagedChain <#= constraintList(i, " ") #> { private IntPtr _headPtr; @@ -257,13 +274,13 @@ public unsafe class ManagedChain<<#= tList #>> : IDisposable errorBuilder.AppendLine("The unmanaged chain was length <#= j #>, expected length <#= i #>"); else { expectedStructureType = item<#= j #>.StructureType(); - if (currentPtr->SType != expectedStructureType) + if (currentPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") .Append(currentPtr->SType) .Append(" at position <#= j + 1 #>; expected ") .Append(expectedStructureType) .AppendLine(); - else + } else item<#= j #> = Unsafe.AsRef>(currentPtr); } var item<#= j #>Size = Marshal.SizeOf>(); @@ -384,7 +401,39 @@ public unsafe class ManagedChain<<#= tList #>> : IDisposable #> /// - public void Dispose() + public override IEnumerator GetEnumerator() + { + yield return Head; +<# + for (var j = 1; j < i; j++) + { +#> + yield return Item<#= j #>; +<# + } // for (int j = 1; j < i; j++) { +#> + } + + /// + public override int Count => <#= i #>; + + /// + public override IChainable this[int index] + => index switch + { + 0 => Head,<# + for (var j = 1; j < i; j++) + { +#> + <#= j #> => Item<#= j #>, +<# + } // for (int j = 1; j < i; j++) { +#> + _ => throw new IndexOutOfRangeException() + }; + + /// + public override void Dispose() { var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); if (headPtr == IntPtr.Zero) return; diff --git a/PrototypeStructChaining/PrototypeStructChaining.csproj b/PrototypeStructChaining/PrototypeStructChaining.csproj index 7feb76b14e..5a7f851a90 100644 --- a/PrototypeStructChaining/PrototypeStructChaining.csproj +++ b/PrototypeStructChaining/PrototypeStructChaining.csproj @@ -1,7 +1,7 @@ - netstandard2.0;netstandard2.1;netcoreapp3.1;net5.0 + netstandard2.0 10 enable enable @@ -10,13 +10,13 @@ - - - - - - - + + + + + + + @@ -28,14 +28,14 @@ - True - True - ManagedChain.gen.tt + True + True + ManagedChain.gen.tt - True - True - ManagedChain.gen.tt + True + True + ManagedChain.gen.tt diff --git a/Readme.md b/Readme.md index 4f51bfb5ad..03be89248f 100644 --- a/Readme.md +++ b/Readme.md @@ -335,4 +335,31 @@ The unmanaged chain was length 4, expected length 5", // Despite the errors indexing features was at the right location so was loaded Assert.True(managedChain.Item2.ShaderInputAttachmentArrayDynamicIndexing); -``` \ No newline at end of file +``` + +### IReadOnlyList + +All the fully generic `ManageChain` types extend `ManagedChain` which implements `IDisposable` +and `IReadOnlyList`. The latter allowing for easy consumption of any `ManagedChain`, e.g.: + +```csharp +using var chain = new ManagedChain(); + +Assert.Equal(3, chain.Count); + +// Ensure all STypes set correctly using indexer +Assert.Equal(StructureType.PhysicalDeviceFeatures2, chain[0].StructureType()); +Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, chain[1].StructureType()); +Assert.Equal(StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr, chain[2].StructureType()); + +Assert.Throws(() => chain[3]); + +// Get array using IEnumerable implementation +IChainable[] structures = chain.ToArray(); + +// Check concrete types +Assert.IsType(structures[0]); +Assert.IsType(structures[1]); +Assert.IsType(structures[2]); +``` From 5254b9d454c314edbd02f103176c95b336a80b6e Mon Sep 17 00:00:00 2001 From: Craig Dean Date: Sat, 6 Nov 2021 16:03:44 +0000 Subject: [PATCH 15/42] feat: Added deconstructor to `ManageChain<...>` --- .../TestManagedChains.cs | 14 +++++ PrototypeStructChaining/ManagedChain.gen.cs | 56 +++++++++++++++++++ PrototypeStructChaining/ManagedChain.gen.tt | 24 +++++++- Readme.md | 11 ++++ 4 files changed, 104 insertions(+), 1 deletion(-) diff --git a/PrototypeStructChaining.Test/TestManagedChains.cs b/PrototypeStructChaining.Test/TestManagedChains.cs index 6708f88bad..baa568926a 100644 --- a/PrototypeStructChaining.Test/TestManagedChains.cs +++ b/PrototypeStructChaining.Test/TestManagedChains.cs @@ -233,4 +233,18 @@ public unsafe void TestReadOnlyList() Assert.IsType(structures[1]); Assert.IsType(structures[2]); } + + [Fact] + public unsafe void TestDeconstructor() + { + using var chain = new ManagedChain(); + + var (physicalDeviceFeatures2, indexingFeatures, accelerationStructureFeaturesKhr) = chain; + + // Ensure all STypes set correctly + Assert.Equal(StructureType.PhysicalDeviceFeatures2, physicalDeviceFeatures2.SType); + Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, indexingFeatures.SType); + Assert.Equal(StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr, accelerationStructureFeaturesKhr.SType); + } } \ No newline at end of file diff --git a/PrototypeStructChaining/ManagedChain.gen.cs b/PrototypeStructChaining/ManagedChain.gen.cs index 6d3e16ebc9..b927d6bf7d 100644 --- a/PrototypeStructChaining/ManagedChain.gen.cs +++ b/PrototypeStructChaining/ManagedChain.gen.cs @@ -256,6 +256,17 @@ public override IChainable this[int index] _ => throw new IndexOutOfRangeException() }; + /// + /// Deconstructs this chain. + /// + /// The head of the chain. + /// Item 1. + public void Deconstruct(out TChain head, out T1 item1) + { + head = Head; + item1 = Item1; + } + /// public override void Dispose() { @@ -507,6 +518,19 @@ public override IChainable this[int index] _ => throw new IndexOutOfRangeException() }; + /// + /// Deconstructs this chain. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + public void Deconstruct(out TChain head, out T1 item1, out T2 item2) + { + head = Head; + item1 = Item1; + item2 = Item2; + } + /// public override void Dispose() { @@ -817,6 +841,21 @@ public override IChainable this[int index] _ => throw new IndexOutOfRangeException() }; + /// + /// Deconstructs this chain. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item3) + { + head = Head; + item1 = Item1; + item2 = Item2; + item3 = Item3; + } + /// public override void Dispose() { @@ -1171,6 +1210,23 @@ public override IChainable this[int index] _ => throw new IndexOutOfRangeException() }; + /// + /// Deconstructs this chain. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item3, out T4 item4) + { + head = Head; + item1 = Item1; + item2 = Item2; + item3 = Item3; + item4 = Item4; + } + /// public override void Dispose() { diff --git a/PrototypeStructChaining/ManagedChain.gen.tt b/PrototypeStructChaining/ManagedChain.gen.tt index 997583ede4..7c1b6c98ac 100644 --- a/PrototypeStructChaining/ManagedChain.gen.tt +++ b/PrototypeStructChaining/ManagedChain.gen.tt @@ -2,7 +2,7 @@ <#@ import namespace="System.Text" #> <#@ import namespace="System.Collections.Generic" #> <# - var maximumItems = 5; + var maximumItems = 5; // TODO use 16/32 in production string parameterDocs(int index, string prefix) { @@ -432,6 +432,28 @@ public unsafe class ManagedChain<<#= tList #>> : ManagedChain _ => throw new IndexOutOfRangeException() }; + /// + /// Deconstructs this chain. + /// +<#= parameterDocs(i, " /// ") #> + public void Deconstruct(out TChain head<# + for (var j = 1; j < i; j++) + { +#>, out T<#= j #> item<#= j #><# + } // for (int j = 1; j < i; j++) { +#>) + { + head = Head; +<# + for (var j = 1; j < i; j++) + { +#> + item<#= j #> = Item<#= j #>; +<# + } // for (int j = 1; j < i; j++) { +#> + } + /// public override void Dispose() { diff --git a/Readme.md b/Readme.md index 03be89248f..dd3131311d 100644 --- a/Readme.md +++ b/Readme.md @@ -363,3 +363,14 @@ Assert.IsType(structures[0]); Assert.IsType(structures[1]); Assert.IsType(structures[2]); ``` + +### Deconstructor + +Each `ManageChain` has a corresponding deconstructor for convenience, e.g.: + +```csharp +``` + +# TODOS + +- Add `Load` static methods to `ManagedChain` to call the `ManagedChain(TChain chain, out string errors)` constructors. \ No newline at end of file From 8d3f124255fcb6bde7f6ed68d00971a3c4446e59 Mon Sep 17 00:00:00 2001 From: Craig Dean Date: Sat, 6 Nov 2021 16:28:50 +0000 Subject: [PATCH 16/42] feat: Added static `ManagedChain.Load` Also improved loading to detect when the unmanaged chain is too long. --- .../TestManagedChains.cs | 34 ++++- PrototypeStructChaining/ManagedChain.gen.cs | 140 +++++++++++++++++- PrototypeStructChaining/ManagedChain.gen.tt | 37 ++++- Readme.md | 35 +++-- 4 files changed, 223 insertions(+), 23 deletions(-) diff --git a/PrototypeStructChaining.Test/TestManagedChains.cs b/PrototypeStructChaining.Test/TestManagedChains.cs index baa568926a..9e36831cbd 100644 --- a/PrototypeStructChaining.Test/TestManagedChains.cs +++ b/PrototypeStructChaining.Test/TestManagedChains.cs @@ -157,7 +157,7 @@ public unsafe void TestManagedChainLoad() // Loads a new managed chain from an unmanaged chain using var managedChain = new ManagedChain(unmanagedChain, out var errors); + PhysicalDeviceAccelerationStructureFeaturesKHR>(out var errors, unmanagedChain); // Check we had no loading errors Assert.Equal("", errors); @@ -192,14 +192,14 @@ public unsafe void TestManagedChainLoadWithError() // Loads a new managed chain from an unmanaged chain using var managedChain = - new ManagedChain< + ManagedChain.Load< DeviceCreateInfo, // Note we are supplied a PhysicalDeviceFeatures2 here from the unmanaged chain PhysicalDeviceAccelerationStructureFeaturesKHR, PhysicalDeviceDescriptorIndexingFeatures, PhysicalDeviceAccelerationStructureFeaturesKHR, // Note that the unmanaged chain did not supply a 5th entry - PhysicalDeviceFeatures2>(unmanagedChain, out var errors); + PhysicalDeviceFeatures2>(out var errors, unmanagedChain); // Check for errors Assert.Equal( @@ -210,6 +210,34 @@ public unsafe void TestManagedChainLoadWithError() Assert.True(managedChain.Item2.ShaderInputAttachmentArrayDynamicIndexing); } + [Fact] + public unsafe void TestManagedChainLoadWithErrorTooLong() + { + var indexingFeatures = new PhysicalDeviceDescriptorIndexingFeatures + { + ShaderInputAttachmentArrayDynamicIndexing = true + }; + // Load an unmanaged chain + DeviceCreateInfo + .Chain(out var unmanagedChain) + .AddNext(out PhysicalDeviceFeatures2 features2) + .SetNext(ref indexingFeatures) + .AddNext(out PhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeaturesKhr); + + // Try loading a shorter managed chain + using var managedChain = + ManagedChain.Load< + DeviceCreateInfo, + PhysicalDeviceFeatures2, + PhysicalDeviceDescriptorIndexingFeatures>(out var errors, unmanagedChain); + + // Check for errors + Assert.Equal(@"The unmanaged chain was longer than the expected length 3", errors); + + // Despite the errors indexing features was at the right location so was loaded + Assert.True(managedChain.Item2.ShaderInputAttachmentArrayDynamicIndexing); + } + [Fact] public unsafe void TestReadOnlyList() { diff --git a/PrototypeStructChaining/ManagedChain.gen.cs b/PrototypeStructChaining/ManagedChain.gen.cs index b927d6bf7d..6e41217355 100644 --- a/PrototypeStructChaining/ManagedChain.gen.cs +++ b/PrototypeStructChaining/ManagedChain.gen.cs @@ -41,6 +41,32 @@ public static ManagedChain Create(TChain head = default, return new(head, item1); } + /// + /// Loads a new with 2 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + /// A new with 2 items. + public static ManagedChain Load(out string errors, TChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + { + return new(out errors, chain); + } + + /// + /// Loads a new with 2 items from an existing unmanaged chain, + /// ignoring any errors. + /// + /// The unmanaged chain to use as the basis of this chain. + /// A new with 2 items. + public static ManagedChain Load(TChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + { + return new(out var _, chain); + } + /// /// Creates a new with 3 items. /// @@ -59,6 +85,34 @@ public static ManagedChain Create(TChain head = return new(head, item1, item2); } + /// + /// Loads a new with 3 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + /// A new with 3 items. + public static ManagedChain Load(out string errors, TChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + { + return new(out errors, chain); + } + + /// + /// Loads a new with 3 items from an existing unmanaged chain, + /// ignoring any errors. + /// + /// The unmanaged chain to use as the basis of this chain. + /// A new with 3 items. + public static ManagedChain Load(TChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + { + return new(out var _, chain); + } + /// /// Creates a new with 4 items. /// @@ -80,6 +134,36 @@ public static ManagedChain Create(TChain return new(head, item1, item2, item3); } + /// + /// Loads a new with 4 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + /// A new with 4 items. + public static ManagedChain Load(out string errors, TChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + { + return new(out errors, chain); + } + + /// + /// Loads a new with 4 items from an existing unmanaged chain, + /// ignoring any errors. + /// + /// The unmanaged chain to use as the basis of this chain. + /// A new with 4 items. + public static ManagedChain Load(TChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + { + return new(out var _, chain); + } + /// /// Creates a new with 5 items. /// @@ -104,6 +188,38 @@ public static ManagedChain Create + /// Loads a new with 5 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + /// A new with 5 items. + public static ManagedChain Load(out string errors, TChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + { + return new(out errors, chain); + } + + /// + /// Loads a new with 5 items from an existing unmanaged chain, + /// ignoring any errors. + /// + /// The unmanaged chain to use as the basis of this chain. + /// A new with 5 items. + public static ManagedChain Load(TChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + { + return new(out var _, chain); + } + } /// @@ -183,9 +299,9 @@ public ManagedChain(TChain head = default, T1 item1 = default) /// /// Creates a new with 2 items from an existing unmanaged chain. /// - /// The unmanaged chain to use as the basis of this chain. /// Any errors loading the chain. - public ManagedChain(TChain chain, out string errors) + /// The unmanaged chain to use as the basis of this chain. + public ManagedChain(out string errors, TChain chain) { // Load existing chain first, so any errors occur before we allocate memory var head = chain; @@ -208,6 +324,8 @@ public ManagedChain(TChain chain, out string errors) .AppendLine(); } else item1 = Unsafe.AsRef(currentPtr); + if (currentPtr->PNext is not null) + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 2"); } var item1Size = Marshal.SizeOf(); @@ -390,9 +508,9 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul /// /// Creates a new with 3 items from an existing unmanaged chain. /// - /// The unmanaged chain to use as the basis of this chain. /// Any errors loading the chain. - public ManagedChain(TChain chain, out string errors) + /// The unmanaged chain to use as the basis of this chain. + public ManagedChain(out string errors, TChain chain) { // Load existing chain first, so any errors occur before we allocate memory var head = chain; @@ -432,6 +550,8 @@ public ManagedChain(TChain chain, out string errors) .AppendLine(); } else item2 = Unsafe.AsRef(currentPtr); + if (currentPtr->PNext is not null) + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 3"); } var item2Size = Marshal.SizeOf(); @@ -686,9 +806,9 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul /// /// Creates a new with 4 items from an existing unmanaged chain. /// - /// The unmanaged chain to use as the basis of this chain. /// Any errors loading the chain. - public ManagedChain(TChain chain, out string errors) + /// The unmanaged chain to use as the basis of this chain. + public ManagedChain(out string errors, TChain chain) { // Load existing chain first, so any errors occur before we allocate memory var head = chain; @@ -745,6 +865,8 @@ public ManagedChain(TChain chain, out string errors) .AppendLine(); } else item3 = Unsafe.AsRef(currentPtr); + if (currentPtr->PNext is not null) + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 4"); } var item3Size = Marshal.SizeOf(); @@ -1043,9 +1165,9 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul /// /// Creates a new with 5 items from an existing unmanaged chain. /// - /// The unmanaged chain to use as the basis of this chain. /// Any errors loading the chain. - public ManagedChain(TChain chain, out string errors) + /// The unmanaged chain to use as the basis of this chain. + public ManagedChain(out string errors, TChain chain) { // Load existing chain first, so any errors occur before we allocate memory var head = chain; @@ -1119,6 +1241,8 @@ public ManagedChain(TChain chain, out string errors) .AppendLine(); } else item4 = Unsafe.AsRef(currentPtr); + if (currentPtr->PNext is not null) + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 5"); } var item4Size = Marshal.SizeOf(); diff --git a/PrototypeStructChaining/ManagedChain.gen.tt b/PrototypeStructChaining/ManagedChain.gen.tt index 7c1b6c98ac..3747a699c9 100644 --- a/PrototypeStructChaining/ManagedChain.gen.tt +++ b/PrototypeStructChaining/ManagedChain.gen.tt @@ -140,6 +140,30 @@ public abstract class ManagedChain : IReadOnlyList, IDisposable return new(<#= argList(i) #>); } + /// + /// Loads a new with <#= i #> items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + /// A new with <#= i #> items. + public static ManagedChain<<#= tList #>> Load<<#= tList #>>(out string errors, TChain chain) +<#= constraintList(i, " ") #> + { + return new(out errors, chain); + } + + /// + /// Loads a new with <#= i #> items from an existing unmanaged chain, + /// ignoring any errors. + /// + /// The unmanaged chain to use as the basis of this chain. + /// A new with <#= i #> items. + public static ManagedChain<<#= tList #>> Load<<#= tList #>>(TChain chain) +<#= constraintList(i, " ") #> + { + return new(out var _, chain); + } + <# } // for (var 2 = 1; i <= maximumItems; i++) { #> @@ -253,9 +277,9 @@ public unsafe class ManagedChain<<#= tList #>> : ManagedChain /// /// Creates a new with <#= i #> items from an existing unmanaged chain. /// - /// The unmanaged chain to use as the basis of this chain. /// Any errors loading the chain. - public ManagedChain(TChain chain, out string errors) + /// The unmanaged chain to use as the basis of this chain. + public ManagedChain(out string errors, TChain chain) { // Load existing chain first, so any errors occur before we allocate memory var head = chain; @@ -282,6 +306,15 @@ public unsafe class ManagedChain<<#= tList #>> : ManagedChain .AppendLine(); } else item<#= j #> = Unsafe.AsRef>(currentPtr); +<# + if (j == i -1) + { +#> + if (currentPtr->PNext is not null) + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length <#= i #>"); +<# + } // if (j == i -1) +#> } var item<#= j #>Size = Marshal.SizeOf>(); diff --git a/Readme.md b/Readme.md index dd3131311d..c366a8eaa3 100644 --- a/Readme.md +++ b/Readme.md @@ -273,8 +273,8 @@ Assert.True(newChain.Item1.ShaderInputAttachmentArrayDynamicIndexing); ### Loading from an unmanaged chain -If you have created an unmanaged chain and would like to load that into a `ManagedChain` you can supply it to a -constructor: +If you have created an unmanaged chain and would like to load that into a `ManagedChain` you can use one of the +`ManagedChain.Load` methods: ```csharp // Load an unmanaged chain @@ -289,7 +289,7 @@ PhysicalDeviceFeatures2 // Loads a new managed chain from an unmanaged chain using var managedChain = - new ManagedChain(unmanagedChain, out var errors); // Check we had no loading errors @@ -299,10 +299,12 @@ Assert.Equal("", errors); Assert.True(managedChain.Item1.ShaderInputAttachmentArrayDynamicIndexing); ``` -Notice that this special form of the constructor returns an output parameter `errors`. It does this to prevent any -possible confusion with the normal constructor which also can accept a single parameter of type `TChain` (which will -only load the head of the chain). Secondly, it also allows the constructor to indicate any failures that occurred whilst -loading from the unmanaged type, for example: +The full version of the `Load` method returns an output parameter `errors` as it's first parameter. The `errors` +parameter will be `string.Empty` if there are no errors, otherwise each line will contain a separate error for each +issue found during loading. There is also an overload that accepts a single argument `chain` for when you don't care if +there are any errors. Either method always succeeds, even if the unmanaged chain doesn't match exactly - for example it +is shorter or longer than the chain being loaded, or if the managed chain has different structure types in any of the +positions. Any structure type in the expected position will always be loaded into the new `ManagedChain`. ```csharp var indexingFeatures = new PhysicalDeviceDescriptorIndexingFeatures @@ -337,6 +339,8 @@ The unmanaged chain was length 4, expected length 5", Assert.True(managedChain.Item2.ShaderInputAttachmentArrayDynamicIndexing); ``` +Notice that the above form use the constructor as an alternative. + ### IReadOnlyList All the fully generic `ManageChain` types extend `ManagedChain` which implements `IDisposable` @@ -364,13 +368,24 @@ Assert.IsType(structures[1]); Assert.IsType(structures[2]); ``` -### Deconstructor +### Deconstruction Each `ManageChain` has a corresponding deconstructor for convenience, e.g.: ```csharp +using var chain = new ManagedChain(); + +var (physicalDeviceFeatures2, indexingFeatures, accelerationStructureFeaturesKhr) = chain; + +// Ensure all STypes set correctly +Assert.Equal(StructureType.PhysicalDeviceFeatures2, physicalDeviceFeatures2.SType); +Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, indexingFeatures.SType); +Assert.Equal(StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr, accelerationStructureFeaturesKhr.SType); ``` -# TODOS +### Disposal -- Add `Load` static methods to `ManagedChain` to call the `ManagedChain(TChain chain, out string errors)` constructors. \ No newline at end of file +As each `ManagedChain` holds the underlying structures in unmanaged memory (to prevent them being moved and their +pointers being invalidated), then it is critical you dispose them; either by calling `Dispose()` or by using a `using` +statement. \ No newline at end of file From 80dac45186cdd71c0c939290f1df3411239e350e Mon Sep 17 00:00:00 2001 From: Craig Dean Date: Sat, 6 Nov 2021 16:37:09 +0000 Subject: [PATCH 17/42] chore: Readme.md updated --- Readme.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Readme.md b/Readme.md index c366a8eaa3..2eb68080a7 100644 --- a/Readme.md +++ b/Readme.md @@ -178,8 +178,10 @@ As adding `IChainStart` requires relatively simple logic I believe it's worth in ## ManagedChain Sometimes it is desirable to keep the structures around on the heap. To facilitate that you can use -the `ManagedChain` -types. Like `Tuple` et al, these support up to chain size 16. They should be disposed when finished with. +the `ManagedChain` types. Like `Tuple` et al, these support up to chain size 16. They must be +disposed when finished with. Whenever a structure is loaded into the `ManagedChain` it's `SType` and `PNext` are +forced to be correct, preventing errors. Structures can be replaced at any time, and we be inserted efficiently +into the chain as an O(1) operation. ### Creation From e74c9772ce58a869f526dc9b71d4b1def3b4b8eb Mon Sep 17 00:00:00 2001 From: Craig Dean Date: Sat, 6 Nov 2021 17:31:42 +0000 Subject: [PATCH 18/42] chore: Added Lab projects to Solution Also added the new blank proposals. --- ...uct Chaining - #1 StructureType correction.md | 16 ++++++++++++++++ ...an Struct Chaining - #2 Unmanaged Chaining.md | 16 ++++++++++++++++ ...lkan Struct Chaining - #3 Managed Chaining.md | 0 ...Chaining - #4 Chaining Metadata extensions.md | 16 ++++++++++++++++ 4 files changed, 48 insertions(+) create mode 100644 documentation/proposals/Proposal - Vulkan Struct Chaining - #1 StructureType correction.md create mode 100644 documentation/proposals/Proposal - Vulkan Struct Chaining - #2 Unmanaged Chaining.md create mode 100644 documentation/proposals/Proposal - Vulkan Struct Chaining - #3 Managed Chaining.md create mode 100644 documentation/proposals/Proposal - Vulkan Struct Chaining - #4 Chaining Metadata extensions.md diff --git a/documentation/proposals/Proposal - Vulkan Struct Chaining - #1 StructureType correction.md b/documentation/proposals/Proposal - Vulkan Struct Chaining - #1 StructureType correction.md new file mode 100644 index 0000000000..ef4927b2fb --- /dev/null +++ b/documentation/proposals/Proposal - Vulkan Struct Chaining - #1 StructureType correction.md @@ -0,0 +1,16 @@ +# Summary + +# Contributors +- [Craig Dean, DevDecoder](https://github.com/thargy) + +# Current Status +- [x] Proposed +- [ ] Discussed with API Review Board (ARB) +- [ ] Approved +- [ ] Implemented + +# Design Decisions +This proposal purposely excludes window views as described in the views proposal, as barely any of the concepts +are applicable to mobile/view-based windowing platforms. + +# Proposed API diff --git a/documentation/proposals/Proposal - Vulkan Struct Chaining - #2 Unmanaged Chaining.md b/documentation/proposals/Proposal - Vulkan Struct Chaining - #2 Unmanaged Chaining.md new file mode 100644 index 0000000000..ef4927b2fb --- /dev/null +++ b/documentation/proposals/Proposal - Vulkan Struct Chaining - #2 Unmanaged Chaining.md @@ -0,0 +1,16 @@ +# Summary + +# Contributors +- [Craig Dean, DevDecoder](https://github.com/thargy) + +# Current Status +- [x] Proposed +- [ ] Discussed with API Review Board (ARB) +- [ ] Approved +- [ ] Implemented + +# Design Decisions +This proposal purposely excludes window views as described in the views proposal, as barely any of the concepts +are applicable to mobile/view-based windowing platforms. + +# Proposed API diff --git a/documentation/proposals/Proposal - Vulkan Struct Chaining - #3 Managed Chaining.md b/documentation/proposals/Proposal - Vulkan Struct Chaining - #3 Managed Chaining.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/documentation/proposals/Proposal - Vulkan Struct Chaining - #4 Chaining Metadata extensions.md b/documentation/proposals/Proposal - Vulkan Struct Chaining - #4 Chaining Metadata extensions.md new file mode 100644 index 0000000000..ef4927b2fb --- /dev/null +++ b/documentation/proposals/Proposal - Vulkan Struct Chaining - #4 Chaining Metadata extensions.md @@ -0,0 +1,16 @@ +# Summary + +# Contributors +- [Craig Dean, DevDecoder](https://github.com/thargy) + +# Current Status +- [x] Proposed +- [ ] Discussed with API Review Board (ARB) +- [ ] Approved +- [ ] Implemented + +# Design Decisions +This proposal purposely excludes window views as described in the views proposal, as barely any of the concepts +are applicable to mobile/view-based windowing platforms. + +# Proposed API From 3cae5ccdb0dee2ef6b2113800fd04c3461c2b139 Mon Sep 17 00:00:00 2001 From: Craig Dean Date: Sat, 6 Nov 2021 17:34:03 +0000 Subject: [PATCH 19/42] chore: Fixed issues with previous commit --- Silk.NET.sln | 39 +++++++++++++++++-- ... Chaining - #1 StructureType correction.md | 7 ++-- ...Struct Chaining - #2 Unmanaged Chaining.md | 7 ++-- ...n Struct Chaining - #3 Managed Chaining.md | 17 ++++++++ ...ining - #4 Chaining Metadata extensions.md | 7 ++-- 5 files changed, 65 insertions(+), 12 deletions(-) diff --git a/Silk.NET.sln b/Silk.NET.sln index a56b4d0837..89381e3214 100644 --- a/Silk.NET.sln +++ b/Silk.NET.sln @@ -270,9 +270,9 @@ EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Silk.NET.NUKE", "build\nuke\Silk.NET.NUKE.csproj", "{B9A8D738-FE7D-4860-A446-4A03E3DDEB74}" EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Microsoft", "Microsoft", "{F2CF5D32-4B41-425E-B229-8FFC48F88063}" -ProjectSection(SolutionItems) = preProject - src\Microsoft\dxva.h = src\Microsoft\dxva.h -EndProjectSection + ProjectSection(SolutionItems) = preProject + src\Microsoft\dxva.h = src\Microsoft\dxva.h + EndProjectSection EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Silk.NET.Direct3D11", "src\Microsoft\Silk.NET.Direct3D11\Silk.NET.Direct3D11.csproj", "{F3B7A9D6-5B15-45E8-925B-20B5BBD33428}" EndProject @@ -468,6 +468,12 @@ Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Silk.NET.OpenXR.Extensions. EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Silk.NET.OpenXR.Extensions.HTCX", "src\OpenXR\Extensions\Silk.NET.OpenXR.Extensions.HTCX\Silk.NET.OpenXR.Extensions.HTCX.csproj", "{782B6A7E-9F04-429A-9DCD-D7273AA3882E}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "PrototypeStructChaining", "PrototypeStructChaining", "{B15922CB-815C-4038-B635-EE2D8A8F700B}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PrototypeStructChaining", "src\Lab\Experiments\PrototypeStructChaining\PrototypeStructChaining\PrototypeStructChaining.csproj", "{EEFF37DA-E4F2-406E-AF97-8615BB7BC34C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PrototypeStructChaining.Test", "src\Lab\Experiments\PrototypeStructChaining\PrototypeStructChaining.Test\PrototypeStructChaining.Test.csproj", "{BD19250B-E143-4F4E-9E1D-18829CCB3642}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -2793,6 +2799,30 @@ Global {782B6A7E-9F04-429A-9DCD-D7273AA3882E}.Release|x64.Build.0 = Release|Any CPU {782B6A7E-9F04-429A-9DCD-D7273AA3882E}.Release|x86.ActiveCfg = Release|Any CPU {782B6A7E-9F04-429A-9DCD-D7273AA3882E}.Release|x86.Build.0 = Release|Any CPU + {EEFF37DA-E4F2-406E-AF97-8615BB7BC34C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {EEFF37DA-E4F2-406E-AF97-8615BB7BC34C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EEFF37DA-E4F2-406E-AF97-8615BB7BC34C}.Debug|x64.ActiveCfg = Debug|Any CPU + {EEFF37DA-E4F2-406E-AF97-8615BB7BC34C}.Debug|x64.Build.0 = Debug|Any CPU + {EEFF37DA-E4F2-406E-AF97-8615BB7BC34C}.Debug|x86.ActiveCfg = Debug|Any CPU + {EEFF37DA-E4F2-406E-AF97-8615BB7BC34C}.Debug|x86.Build.0 = Debug|Any CPU + {EEFF37DA-E4F2-406E-AF97-8615BB7BC34C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {EEFF37DA-E4F2-406E-AF97-8615BB7BC34C}.Release|Any CPU.Build.0 = Release|Any CPU + {EEFF37DA-E4F2-406E-AF97-8615BB7BC34C}.Release|x64.ActiveCfg = Release|Any CPU + {EEFF37DA-E4F2-406E-AF97-8615BB7BC34C}.Release|x64.Build.0 = Release|Any CPU + {EEFF37DA-E4F2-406E-AF97-8615BB7BC34C}.Release|x86.ActiveCfg = Release|Any CPU + {EEFF37DA-E4F2-406E-AF97-8615BB7BC34C}.Release|x86.Build.0 = Release|Any CPU + {BD19250B-E143-4F4E-9E1D-18829CCB3642}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BD19250B-E143-4F4E-9E1D-18829CCB3642}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BD19250B-E143-4F4E-9E1D-18829CCB3642}.Debug|x64.ActiveCfg = Debug|Any CPU + {BD19250B-E143-4F4E-9E1D-18829CCB3642}.Debug|x64.Build.0 = Debug|Any CPU + {BD19250B-E143-4F4E-9E1D-18829CCB3642}.Debug|x86.ActiveCfg = Debug|Any CPU + {BD19250B-E143-4F4E-9E1D-18829CCB3642}.Debug|x86.Build.0 = Debug|Any CPU + {BD19250B-E143-4F4E-9E1D-18829CCB3642}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BD19250B-E143-4F4E-9E1D-18829CCB3642}.Release|Any CPU.Build.0 = Release|Any CPU + {BD19250B-E143-4F4E-9E1D-18829CCB3642}.Release|x64.ActiveCfg = Release|Any CPU + {BD19250B-E143-4F4E-9E1D-18829CCB3642}.Release|x64.Build.0 = Release|Any CPU + {BD19250B-E143-4F4E-9E1D-18829CCB3642}.Release|x86.ActiveCfg = Release|Any CPU + {BD19250B-E143-4F4E-9E1D-18829CCB3642}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -3019,6 +3049,9 @@ Global {3E30D674-9282-4297-AD1F-9B233A166308} = {0651C5EF-50AA-4598-8D9C-8F210ADD8490} {606214B8-07FC-436F-9523-02AF32E1AB1E} = {90471225-AC23-424E-B62E-F6EC4C6ECAC0} {782B6A7E-9F04-429A-9DCD-D7273AA3882E} = {90471225-AC23-424E-B62E-F6EC4C6ECAC0} + {B15922CB-815C-4038-B635-EE2D8A8F700B} = {39B598E9-44BA-4A61-A1BB-7C543734DBA6} + {EEFF37DA-E4F2-406E-AF97-8615BB7BC34C} = {B15922CB-815C-4038-B635-EE2D8A8F700B} + {BD19250B-E143-4F4E-9E1D-18829CCB3642} = {B15922CB-815C-4038-B635-EE2D8A8F700B} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {F5273D7F-3334-48DF-94E3-41AE6816CD4D} diff --git a/documentation/proposals/Proposal - Vulkan Struct Chaining - #1 StructureType correction.md b/documentation/proposals/Proposal - Vulkan Struct Chaining - #1 StructureType correction.md index ef4927b2fb..6039b01fcd 100644 --- a/documentation/proposals/Proposal - Vulkan Struct Chaining - #1 StructureType correction.md +++ b/documentation/proposals/Proposal - Vulkan Struct Chaining - #1 StructureType correction.md @@ -1,7 +1,8 @@ # Summary +TODO # Contributors -- [Craig Dean, DevDecoder](https://github.com/thargy) +- [Craig Dean, DevDecoder](https://github.com/thargy) # Current Status - [x] Proposed @@ -10,7 +11,7 @@ - [ ] Implemented # Design Decisions -This proposal purposely excludes window views as described in the views proposal, as barely any of the concepts -are applicable to mobile/view-based windowing platforms. +TODO # Proposed API +TODO \ No newline at end of file diff --git a/documentation/proposals/Proposal - Vulkan Struct Chaining - #2 Unmanaged Chaining.md b/documentation/proposals/Proposal - Vulkan Struct Chaining - #2 Unmanaged Chaining.md index ef4927b2fb..6039b01fcd 100644 --- a/documentation/proposals/Proposal - Vulkan Struct Chaining - #2 Unmanaged Chaining.md +++ b/documentation/proposals/Proposal - Vulkan Struct Chaining - #2 Unmanaged Chaining.md @@ -1,7 +1,8 @@ # Summary +TODO # Contributors -- [Craig Dean, DevDecoder](https://github.com/thargy) +- [Craig Dean, DevDecoder](https://github.com/thargy) # Current Status - [x] Proposed @@ -10,7 +11,7 @@ - [ ] Implemented # Design Decisions -This proposal purposely excludes window views as described in the views proposal, as barely any of the concepts -are applicable to mobile/view-based windowing platforms. +TODO # Proposed API +TODO \ No newline at end of file diff --git a/documentation/proposals/Proposal - Vulkan Struct Chaining - #3 Managed Chaining.md b/documentation/proposals/Proposal - Vulkan Struct Chaining - #3 Managed Chaining.md index e69de29bb2..6039b01fcd 100644 --- a/documentation/proposals/Proposal - Vulkan Struct Chaining - #3 Managed Chaining.md +++ b/documentation/proposals/Proposal - Vulkan Struct Chaining - #3 Managed Chaining.md @@ -0,0 +1,17 @@ +# Summary +TODO + +# Contributors +- [Craig Dean, DevDecoder](https://github.com/thargy) + +# Current Status +- [x] Proposed +- [ ] Discussed with API Review Board (ARB) +- [ ] Approved +- [ ] Implemented + +# Design Decisions +TODO + +# Proposed API +TODO \ No newline at end of file diff --git a/documentation/proposals/Proposal - Vulkan Struct Chaining - #4 Chaining Metadata extensions.md b/documentation/proposals/Proposal - Vulkan Struct Chaining - #4 Chaining Metadata extensions.md index ef4927b2fb..6039b01fcd 100644 --- a/documentation/proposals/Proposal - Vulkan Struct Chaining - #4 Chaining Metadata extensions.md +++ b/documentation/proposals/Proposal - Vulkan Struct Chaining - #4 Chaining Metadata extensions.md @@ -1,7 +1,8 @@ # Summary +TODO # Contributors -- [Craig Dean, DevDecoder](https://github.com/thargy) +- [Craig Dean, DevDecoder](https://github.com/thargy) # Current Status - [x] Proposed @@ -10,7 +11,7 @@ - [ ] Implemented # Design Decisions -This proposal purposely excludes window views as described in the views proposal, as barely any of the concepts -are applicable to mobile/view-based windowing platforms. +TODO # Proposed API +TODO \ No newline at end of file From ef57171b7dac595182661e35f4ec4f8254933ae9 Mon Sep 17 00:00:00 2001 From: Craig Dean Date: Sat, 6 Nov 2021 18:05:13 +0000 Subject: [PATCH 20/42] docs: Finished initial draft #1 Proposal - Vulkan Struct Chaining - #1 StructureType correction.md --- ... Chaining - #1 StructureType correction.md | 55 ++++++++++++++++++- 1 file changed, 52 insertions(+), 3 deletions(-) diff --git a/documentation/proposals/Proposal - Vulkan Struct Chaining - #1 StructureType correction.md b/documentation/proposals/Proposal - Vulkan Struct Chaining - #1 StructureType correction.md index 6039b01fcd..d114a75fe2 100644 --- a/documentation/proposals/Proposal - Vulkan Struct Chaining - #1 StructureType correction.md +++ b/documentation/proposals/Proposal - Vulkan Struct Chaining - #1 StructureType correction.md @@ -1,17 +1,66 @@ # Summary -TODO + +This proposal is a minimal enhancement to [`Silk.Net.Vulkan`](../../src/Vulkan/Silk.NET.Vulkan) to mark all structures +that contain a `StructureType SType` field (in the first position) as implementing the interface `IStructuredType`. + +This is a tiny pre-requisite for +[Proposal - Vulkan Struct Chaining - #2 Unmanaged Chaining.md](Proposal%20-%20Vulkan%20Struct%20Chaining%20-%20%232%20Unmanaged%20Chaining.md) +and is of limited value otherwise. Its primary purpose is to mark any structure that requires it's `SType` field to be +correctly set when passing to Vulkan, and to provide a mechanism for doing so. # Contributors + - [Craig Dean, DevDecoder](https://github.com/thargy) # Current Status + - [x] Proposed - [ ] Discussed with API Review Board (ARB) - [ ] Approved - [ ] Implemented # Design Decisions -TODO + +- The `IStructuredType` interface will usually not be implemented directly, instead `IChainable` (from + the [unmanaged chaining proposal](Proposal%20-%20Vulkan%20Struct%20Chaining%20-%20%232%20Unmanaged%20Chaining.md)) + will extend this interface. +- The BuildTools should instead only add this interface to any structure that meets the above constraints (the first + field must be `StructureType SType`) that _doesn't_ already add the `IChainable` interface. Though I believe this + scenario won't occur in the current Vulkan specification, I need to check all valid StructureType structures to + confirm, and regardless, writing the code to add the interface in such scenarios will future proof it. +- Whenever the `IStructuredType` is added to an interface + +# Implementation Notes + +- BuildTools already contains enough information to determine whether the interface should be added to a structure, and + already knows which `StructureType` the structure should use. +- A working example of such a struct can + be [found in the labs.](../../src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceFeatures2.cs) # Proposed API -TODO \ No newline at end of file + +## StructureType structures + +### IStructuredType + +This proposal adds a single interface `IStructuredType`, the primary purpose of which is to mark any structure that +requires it's `SType` to be correctly set when passing to Vulkan. It adds a single +method `void IStructuredType.StructureType()` +which sets the `SType` correctly and returns it to the caller. + +```csharp +# ../../src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IStructuredType.cs +``` + +### IStructureType implementation + +Each struct generated that implements `IStructuredType` should also have the following code auto-generated, to +explicitly implement the interface. The method sets and returns the `SType` correctly for the current structure. + +```csharp +/// +StructureType IStructuredType.StructureType() +{ + return SType = StructureType.; +} +``` From 089f2e5406dc26269ef7533a99a2198bf7f690fc Mon Sep 17 00:00:00 2001 From: Craig Dean Date: Sat, 6 Nov 2021 18:08:09 +0000 Subject: [PATCH 21/42] docs: Embedded code sample directly into Proposal #1 --- ...Struct Chaining - #1 StructureType correction.md | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/documentation/proposals/Proposal - Vulkan Struct Chaining - #1 StructureType correction.md b/documentation/proposals/Proposal - Vulkan Struct Chaining - #1 StructureType correction.md index d114a75fe2..c05a802a0e 100644 --- a/documentation/proposals/Proposal - Vulkan Struct Chaining - #1 StructureType correction.md +++ b/documentation/proposals/Proposal - Vulkan Struct Chaining - #1 StructureType correction.md @@ -49,7 +49,18 @@ method `void IStructuredType.StructureType()` which sets the `SType` correctly and returns it to the caller. ```csharp -# ../../src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IStructuredType.cs +namespace Silk.Net.Vulkan; + +public interface IStructuredType +{ + /// + /// Gets the structured type's enum value. + /// + /// + /// Retrieving the also coerces it to the correct value. + /// + StructureType StructureType(); +} ``` ### IStructureType implementation From d5552b69fd54b258e2b350eb9776cf360af2576a Mon Sep 17 00:00:00 2001 From: Craig Dean Date: Sun, 7 Nov 2021 12:05:44 +0000 Subject: [PATCH 22/42] docs: Updated the Unmanaged Chaining Proposal. --- ... Chaining - #1 StructureType correction.md | 27 +- ...Struct Chaining - #2 Unmanaged Chaining.md | 481 +++++++++++++++++- .../PrototypeStructChaining/Chain.cs | 18 +- .../ChainExtensions.cs | 60 +-- .../DeviceCreateInfo.cs | 3 +- .../PrototypeStructChaining/IChainable.cs | 4 +- .../PrototypeStructChaining/IExtendsChain.cs | 5 +- .../IStructuredType.cs | 6 +- .../PhysicalDeviceFeatures2.cs | 3 +- 9 files changed, 556 insertions(+), 51 deletions(-) diff --git a/documentation/proposals/Proposal - Vulkan Struct Chaining - #1 StructureType correction.md b/documentation/proposals/Proposal - Vulkan Struct Chaining - #1 StructureType correction.md index c05a802a0e..a1532210f5 100644 --- a/documentation/proposals/Proposal - Vulkan Struct Chaining - #1 StructureType correction.md +++ b/documentation/proposals/Proposal - Vulkan Struct Chaining - #1 StructureType correction.md @@ -1,7 +1,7 @@ # Summary This proposal is a minimal enhancement to [`Silk.Net.Vulkan`](../../src/Vulkan/Silk.NET.Vulkan) to mark all structures -that contain a `StructureType SType` field (in the first position) as implementing the interface `IStructuredType`. +that contain a `StructureType SType` field as implementing the interface `IStructuredType`. This is a tiny pre-requisite for [Proposal - Vulkan Struct Chaining - #2 Unmanaged Chaining.md](Proposal%20-%20Vulkan%20Struct%20Chaining%20-%20%232%20Unmanaged%20Chaining.md) @@ -24,11 +24,22 @@ correctly set when passing to Vulkan, and to provide a mechanism for doing so. - The `IStructuredType` interface will usually not be implemented directly, instead `IChainable` (from the [unmanaged chaining proposal](Proposal%20-%20Vulkan%20Struct%20Chaining%20-%20%232%20Unmanaged%20Chaining.md)) will extend this interface. -- The BuildTools should instead only add this interface to any structure that meets the above constraints (the first - field must be `StructureType SType`) that _doesn't_ already add the `IChainable` interface. Though I believe this - scenario won't occur in the current Vulkan specification, I need to check all valid StructureType structures to +- The BuildTools should instead only add this interface to any structure that meets the above constraint (the structure + has a `StructureType SType` field) that _doesn't_ already add the `IChainable` interface. Though I believe this + scenario won't occur in the current Vulkan specification, we'd need to check all valid StructureType structures to confirm, and regardless, writing the code to add the interface in such scenarios will future proof it. -- Whenever the `IStructuredType` is added to an interface +- Whenever the `IStructuredType` is added to an interface (either directly or indirectly) the + corresponding `StructureType()` method should also be explicitly + implemented ([see below](#istructuretype-implementation)). +- This proposed interface could easily be combined/merged with the `IChainable` + interface which [is proposed](Proposal%20-%20Vulkan%20Struct%20Chaining%20-%20%232%20Unmanaged%20Chaining.md) as an + extension. However, that interface marks a struct as having a second field `void* PNext`, as well as requiring + that `StructureType sType` field is in the first position, which is not required by this proposal (but is allowed). + Keeping the two concepts separate is good encapsulation and good for supporting future changes. The concept + that an `SType` must be correct is somewhat different to the concept of a chain (implied by `void* PNext`). +- To be clear, this proposal does not need to guarantee that the `SType` field is in position 0 (i.e. first), + that requirement is only necessary to implement the functionality + [proposed by the unmanaged chaining system](Proposal%20-%20Vulkan%20Struct%20Chaining%20-%20%232%20Unmanaged%20Chaining.md) # Implementation Notes @@ -51,13 +62,17 @@ which sets the `SType` correctly and returns it to the caller. ```csharp namespace Silk.Net.Vulkan; +/// +/// Base interface for any struct that has a field called `SType`, that must be correctly +/// set when passing into the Vulkan API. +/// public interface IStructuredType { /// /// Gets the structured type's enum value. /// /// - /// Retrieving the also coerces it to the correct value. + /// Retrieving the also ensures it is set to the correct value. /// StructureType StructureType(); } diff --git a/documentation/proposals/Proposal - Vulkan Struct Chaining - #2 Unmanaged Chaining.md b/documentation/proposals/Proposal - Vulkan Struct Chaining - #2 Unmanaged Chaining.md index 6039b01fcd..baf8f809b6 100644 --- a/documentation/proposals/Proposal - Vulkan Struct Chaining - #2 Unmanaged Chaining.md +++ b/documentation/proposals/Proposal - Vulkan Struct Chaining - #2 Unmanaged Chaining.md @@ -1,17 +1,492 @@ # Summary -TODO + +This proposal presents a lightweight mechanism for fluently building Vulkan Structure Chains. You may wish to start with +the [Usage section below](#Usage) to aid understanding. There is also a fully working prototype +[in the labs](../../src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/). + +To do so it marks any structure that meets the following requirements as being `IChainable`: + +* Is a struct. +* Has a `StructureType SType` field in position 0 (first field) +* Has a `void* PNext` field in position 1 (second field) + +The `IChainable` interface extends the `IStructuredType` interface +from [Proposal - Vulkan Struct Chaining - #1 StructureType correction](Proposal%20-%20Vulkan%20Struct%20Chaining%20-%20%231%20StructureType%20correction.md) +and so the explicit implementation of `IChainable.StructureType()` from +[that proposal](Proposal%20-%20Vulkan%20Struct%20Chaining%20-%20%231%20StructureType%20correction.md#istructuretype-implementation) +is triggerred for the structure, providing a mechanism for ensuring the `SType` is correctly set. + +The presence of the `IChainable` interface, also acts as a **guarantee** that it is safe to cast any pointer of a struct +implementing it to a pointer to a `Chain` struct, which is a struct which has just the `SType` and `PNext` fields +present. Therefore it is always possible to cast `void* PNext` of an `IChainable` struct to `Chain*`. It is this +guarantee that requires the position of the fields to be fixed (which they are in practice). However, by ensuring we +validate the constraints at build time (when choosing to add the interface), we can prevent downstream bugs occurring at +run time. + +**Note** that the `IChainable` interface adds the additional constraint that the `StructureType SType` field must be at +offset 0, i.e. in the first position. + +However, rather than extending `IChainable` directly, it will be more common to choose one of `IChainStart` +or `IExtendsChain` (both of which extend `IChainable`). It does this based on the `structextends` attribute +provided in +the [Vulkan Specification](https://raw.githubusercontent.com/KhronosGroup/Vulkan-Headers/master/registry/vk.xml)). + +For example, if `struct B` extends `struct A` (as per +the [Vulkan Specification](https://raw.githubusercontent.com/KhronosGroup/Vulkan-Headers/master/registry/vk.xml)), then +`struct B` will be marked with `IExtendsChain` and `struct A` will be marked with `IChainStart`. A struct may only +extend `IChainStart` once (even though it may appear in the `structextends` attribute of many structs), but is may +implement multiple `IExtendsChain` interfaces. It is also feasible for a struct to implement both (i.e. be able +to extend other chains, as well as being a chain start), a real example of this can be seen +[in the labs](../../src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceFeatures2.cs). + +As a result, `IChainable` will not usually be directly implemented (just as it is unlikely to see `IStructuredType` +[implemented directly]((Proposal%20-%20Vulkan%20Struct%20Chaining%20-%20%231%20StructureType%20correction.md))). +However, if +the [Vulkan Specification](https://raw.githubusercontent.com/KhronosGroup/Vulkan-Headers/master/registry/vk.xml) ever +includes a struct that meets the above constraints, but doesn't have, or appear in, a `structsextend` attribute, then it +will be explicitly marked as `IChainable`. + +Whenever a struct is marked as `IChainStart` a static `ref [StructType] Chain(out [StructType]) capture);` method is +also added, providing an easy form of starting a chain with default values. As `IChainStart` also +implements `IStructuredType` (via `IChainable`), then a chain start will have two additional methods generated (the +static +`Chain(out)` method and the explicit `IStructuredType.StructureType()` implementation); as compared to all other +`IChainable` structs, which will only have the explicit `IStructuredType.StructureType()` implementation from +[Proposal - Vulkan Struct Chaining - #1 StructureType correction](Proposal%20-%20Vulkan%20Struct%20Chaining%20-%20%231%20StructureType%20correction.md) +. + +The remaining functionality is provided entirely by the following new extension methods: + +```csharp +public static unsafe ref TChain SetNext(this ref TChain chain, ref TNext value, + bool alwaysAdd = false) + where TChain : struct, IChainStart + where TNext : struct, IExtendsChain {...} + +public static unsafe ref TChain AddNext(this ref TChain chain, out TNext next) + where TChain : struct, IChainStart + where TNext : struct, IExtendsChain {...} + +public static unsafe ref TChain TryAddNext(this ref TChain chain, out TNext next, out bool added) + where TChain : struct, IChainStart + where TNext : struct, IExtendsChain {...} + +public static unsafe int IndexOf(this ref TChain chain, ref TNext value) + where TChain : struct, IChainStart + where TNext : struct, IExtendsChain {...} +``` + +Their implementation can be +found [in the labs](../../src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ChainExtensions.cs) and +their use is detailed below. + +These extension methods # Contributors + - [Craig Dean, DevDecoder](https://github.com/thargy) # Current Status + - [x] Proposed - [ ] Discussed with API Review Board (ARB) - [ ] Approved - [ ] Implemented # Design Decisions -TODO + +The following requirements are achieved by this proposal: + +- **Backward compatibility** - the chaining system should not modify the existing structs, but add functionality. +- **Minimal bloat** - the minimum amount of new generated code was sought. +- **Discoverability** - it should be as easy as possible for a new user to discover. +- **Compile-time Validation** - it should prevent chaining invalid structures (as much as possible) during compilation. +- **SType coercion** - it should always set the `SType` of chained structures. +- **Pointer management** - it should handle setting the `PNext` pointer of structures. +- **Compact usage** - it should reduce copy-pasta code. +- **Avoids the heap** - boxing should be avoided. +- **Well Tested** - tests were added to ensure pointers are correctly set, and compilation failures occur. + +What this proposal does not do (some of these _are_ addressed +in [Proposal - Vulkan Struct Chaining - #3 Managed Chaining](Proposal%20-%20Vulkan%20Struct%20Chaining%20-%20%233%20Managed%20Chaining.md)) +is manage pointers of structures that find themselves on the heap. Any supplied structures should be held on the stack, +once moved to the heap their `PNext` values can no longer be trusted as the GC is free to move structures in heap +memory. The interface of this proposal makes it difficult to use with heap objects, but it is not impossible. The +presence of the `ManagedChain` classes +from [the proposal for managed chains](Proposal%20-%20Vulkan%20Struct%20Chaining%20-%20%233%20Managed%20Chaining.md), +along with a well documented API should highlight the danger of such practices. + +Indeed, it is important to remember that such dangers are already part of the existing implementation are a feature of +using unmanaged pointers in .NET rather than a 'limitation' of this proposal. + +# Usage + +The proposal provides for the following usage patterns: + +### Chain Building + +You can happily create the start of a chain as usual, and it's `SType` will be coerced when you start using it as a +chain: + +```csharp +var createInfo = new DeviceCreateInfo +{ + Flags = 1U +}; +// When you call any chaining method it will set the chain's SType automatically. +createinfo.AddNext... +``` + +-in many cases, we only want to create a default structure for population by the API. To do so, we use the +static `Chain` method like so: + +```csharp +PhysicalDeviceFeatures2.Chain(out var features2) +``` + +This has several advantages: + +- The method is only available for structures that are valid at the start of a chain; providing compile-time validation. +- The structure's `SType` will be correctly set immediately. +- The syntax is fluent, and creates more readable code when used with the other chaining methods (see below). + +**Note** All the chaining methods return the current start of the chain by reference (including `Chain`). This allows +each method to scan the entire chain. More importantly, it allows the Type constraints to be checked during compile time +to ensure that a type actually extends the chain. One side effect is that `ref Chain(out)` outputs the newly created +chain _and_ returns a reference to it. This can cause confusion to less experienced C# devs, for example: + +```csharp +// Don't do this, it is harmless but unnecessary and confusing! +var a = ChainStart.Chain(out var b).AddNext(out ChainExtension c); +``` + +Both `a` and `b` will appear to be identical structures; however 'a' is actually a copy of 'b', being separate locations +on the current stack frame. In most cases, that is really no problem at all as both point to the _start_ of a chain, and +so there are no unmanaged pointers pointing _to them_, therefore using _either_ is fine (though completely unnecessary). + +However, for deeper understanding the chain extension methods actually _take a reference_ to `this`, so `AddNext` +actually updates the `PNext` of variable `b`. Once the chain is built the final assignment _to_ `a` _copies_ `b` +into `a`. None of this is undefined behaviour, but as it is generally poorly understood so none of the examples ever +recommend assigning the output of a chain. + +### AddNext + +The most common use case is to add an empty structure to the end of a chain for it to be populated by the Vulkan API, +this can now be done like so: + +```csharp +PhysicalDeviceFeatures2 + .Chain(out var features2) + // CreateNext will create an empty struct, with the correct SType (as well as ensuring the + // chain's SType is set correctly). + .AddNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures) + .AddNext(out PhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeaturesKhr); +``` + +Each method `out` puts a struct into the local stack frame for querying once populated, and the pointers point to this +local variable. Despite generics and interfaces being used, the chain methods avoid the heap entirely. + +### TryAddNext + +You may only want to add a structure if it doesn't already exist in the chain, this can be done with `TryAddNext`, e.g.: + +```csharp +PhysicalDeviceFeatures2 + .Chain(out var features2) + .AddNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures) + // As there is already a PhysicalDeviceDescriptorIndexingFeatures structure the following + // will not add anything to the chain and `added` will be `false`. + .TryAddNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures2, out bool added); +``` + +### SetNext + +Sometimes we may wish to set the initial state of a structure, or replace any existing item within the structure that +has the same `StructureType` we can do this with `SetNext`: + +```csharp +var indexingFeatures = new PhysicalDeviceDescriptorIndexingFeatures +{ + ShaderInputAttachmentArrayDynamicIndexing = true +}; + +// Unlike AddNext, SetNext will only add the structure if isn't already present, otherwise it will overwrite it. +// So we can provide a default to SetNext like so: +var accelerationStructureFeaturesKhr = default(PhysicalDeviceAccelerationStructureFeaturesKHR); + +PhysicalDeviceFeatures2 + .Chain(out var features2) + // SetNext accepts an existing struct, note, it will coerce the SType and blank the PNext + .SetNext(ref indexingFeatures) + .SetNext(ref default(PhysicalDeviceAccelerationStructureFeaturesKHR)); +``` + +*NOTE* you can mix and match `AddNext` and `SetNext` (and any chaining method) in the same method chain. + +By default, `SetNext` will _replace_ any item in the chain with a matching `SType`, this behaviour can be changed by +setting the optional `alwaysAdd` parameter to `true`; + +```csharp +var indexingFeatures = new PhysicalDeviceDescriptorIndexingFeatures +{ + ShaderInputAttachmentArrayDynamicIndexing = true +}; +var indexingFeatures2 = new PhysicalDeviceDescriptorIndexingFeatures +{ + ShaderInputAttachmentArrayDynamicIndexing = false +}; +var accelerationStructureFeaturesKhr = new PhysicalDeviceAccelerationStructureFeaturesKHR +{ + AccelerationStructure = true +}; + +PhysicalDeviceFeatures2 + .Chain(out var features2) + .SetNext(ref indexingFeatures) + // This will add the second 'indexingFeatures' struct, even though one is already present in the chain. + .SetNext(ref indexingFeatures2, true); +``` + +### IndexOf + +Sometimes it's useful to know if a structure you previously supplied is still in a chain, this can be done +with `IndexOf`, which returns a non-negative index (zero-indexed) if the structure is found, eg.: + +```csharp +PhysicalDeviceFeatures2 + .Chain(out var features2) + .AddNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures) + .AddNext(out PhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeaturesKhr); + +// Check indices +Assert.Equal(1, features2.IndexOf(ref indexingFeatures)); +Assert.Equal(2, features2.IndexOf(ref accelerationStructureFeaturesKhr)); +``` + +### Validation + +Due to the generic constraints, all the chain extensions are only valid on a struct that implements `IChainStart` and +only accept struct that implement `IExtends` where `TChain` is the chain type. This means that it is impossible +to add invalid structs to a chain with these methods. Further, using any of the chain extension methods guarantees that +the chain, and the supplied item have the correct `SType`, **and** that the `PNext` pointers along the chain are valid. # Proposed API -TODO \ No newline at end of file + +## Chaining interfaces + +### IChainable + +The base interface of chaining interfaces: + +```csharp +namespace Silk.Net.Vulkan; + +/// +/// Base interface for any struct that has can set the next value. +/// +/// Note that any structure marked must start with a +/// and a void* field, in that order. This is so that a pointer to it can be coerced +/// to a pointer to a . +public interface IChainable : IStructuredType +{ +} + +``` + +### IChainStart + +Implemented by any struct that can be used as the start of a chain: + +```csharp +namespace Silk.Net.Vulkan; + +/// +/// Marks a chainable struct as being allowed at the start of a chain. +/// +/// Any will have a corresponding static `Chain(out var chain)` +/// convenience method. +public interface IChainStart : IChainable +{ +} +``` + +### IExtendsChain + +Implemented by any struct that can be added to a chain. + +```csharp +namespace Silk.Net.Vulkan; + +/// +/// Marks a chainable struct indicating which chain this type +/// extends. +/// +/// A chain start structure. +public interface IExtendsChain : IChainable + where TChain : IChainable +{ +} +``` + +### Chain Extensions + +Provides the struct chaining functionality, the full implementation can be +found [in the labs](../../src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ChainExtensions.cs): + +```csharp +namespace Silk.Net.Vulkan; + +public static class ChainExtensions +{ + /// + /// Replaces a structure in the chain (if present, and is false), or adds it to the end. + /// + /// The current chain + /// A reference to the structure to update + /// Always adds to the end of the chain, even if an equivalent structure is present. + /// The type of the current chain + /// The type of the value + /// A reference to the value value in the chain + /// + /// Note that both the supplied chain, and the supplied value will have their `SType` correctly set. Further, + /// the supplied structure's will be overwritten. + /// To use + /// + /// var indexingFeatures = new PhysicalDeviceDescriptorIndexingFeatures + /// { + /// ShaderInputAttachmentArrayDynamicIndexing = true + /// }; + /// var accelerationStructureFeaturesKhr = new PhysicalDeviceAccelerationStructureFeaturesKHR + /// { + /// AccelerationStructure = true + /// }; + /// + /// PhysicalDeviceFeatures2 + /// .Chain(out var features2) + /// .SetNext(ref indexingFeatures) + /// .SetNext(ref accelerationStructureFeaturesKhr); + /// + /// + public static unsafe ref TChain SetNext(this ref TChain chain, ref TNext value, + bool alwaysAdd = false) + where TChain : struct, IChainStart + where TNext : struct, IExtendsChain {...} + + /// + /// Adds a structure to the end of the chain. + /// + /// The current chain + /// The structure added to the end of the chain + /// The type of the current chain + /// The type of the structure to add + /// The reference to the chain. + /// + /// Note that both the supplied chain, and the added structure will have their `SType` correctly set + /// To use specify the output type required, e.g.: + /// + /// PhysicalDeviceFeatures2 + /// .Chain(out var features2) + /// .AddNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures) + /// .AddNext(out PhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeaturesKhr); + /// + /// Note, the value is always added, even if an equivalent value is added in the chain already. Use + /// to only add if not already present. + /// + public static unsafe ref TChain AddNext(this ref TChain chain, out TNext next) + where TChain : struct, IChainStart + where TNext : struct, IExtendsChain {...} + + /// + /// Tries to add a structure to the end of the chain. + /// + /// The current chain + /// The structure added to the end of the chain + /// Whether the structure was actually added + /// The type of the current chain + /// The type of the structure to add + /// The reference to the chain. + /// + /// Note that both the supplied chain, and the added structure will have their `SType` correctly set + /// To use specify the output type required, e.g.: + /// + /// PhysicalDeviceFeatures2 + /// .Chain(out var features2) + /// .TryAddNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures, out var added); + /// + /// + public static unsafe ref TChain TryAddNext(this ref TChain chain, out TNext next, out bool added) + where TChain : struct, IChainStart + where TNext : struct, IExtendsChain {...} + + /// + /// Returns the index of the in the , if present. + /// + /// The chain + /// The structure value + /// The type of the current chain + /// The type of the value + /// The zero-indexed index if found; otherwise -1. + public static unsafe int IndexOf(this ref TChain chain, ref TNext value) + where TChain : struct, IChainStart + where TNext : struct, IExtendsChain {...} +} +``` + +### Chain Structure + +The `Chain` struct makes it easy to access the `SType` and `PNext` of a structure pointed to by `void* PNext`, although +it is used internally, it is useful for consumers of Silk.Net to have access to use in their own scenarios, that is +because the `IChainable` interface does not directly expose the underlying `SType` and `PNext` fields; as they are +fields (not properties), and this proposal aims to avoid boxing (so we try not to use the interface directly +unnecessarily). + +```csharp +namespace Silk.Net.Vulkan; + +/// +/// Header struct of all structs. +/// +/// +/// Any pointer to a structure marked as can safely be cast to a pointer to this type. +/// In particular, this means that the void* PNext field can always be safely cast to Chain*, providing +/// access to the `SType` and `PNext` fields. +/// +/// +public struct Chain : IChainable +{ + /// + /// The structure type. + /// + public StructureType SType; + /// + /// The next struct in the chain, if any; otherwise . + /// + public unsafe Chain* PNext; + + /// + /// Note, this cannot coerce the type as 'guaranteed by the `IStructuredType` interface. + StructureType IStructuredType.StructureType() + { + return SType; + } +} +``` + +### Static Chain implementation + +Whenever the `IChainStart` interface is added to an `IChainable` struct, the following static convenience methods is +also added: + +```csharp +/// +/// Convenience method to start a chain. +/// +/// The newly created chain root +/// A reference to the newly created chain. +public static unsafe ref [StrucType] Chain( + out [StructType] capture) +{ + capture = new [StructType](StructureType.[StructureType]); + return ref capture; +} +``` diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/Chain.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/Chain.cs index 5f0ff03b0f..78984e2678 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/Chain.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/Chain.cs @@ -1,17 +1,29 @@ namespace Silk.Net.Vulkan; /// -/// Header struct of all chainable structs. +/// Header struct of all structs. /// +/// +/// Any pointer to a structure marked as can safely be cast to a pointer to this type. +/// In particular, this means that the void* PNext field can always be safely cast to Chain*, providing +/// access to the `SType` and `PNext` fields. +/// +/// public struct Chain : IChainable { + /// + /// The structure type. + /// public StructureType SType; + /// + /// The next struct in the chain, if any; otherwise . + /// public unsafe Chain* PNext; /// - /// Note, this doesn't coerce the type. + /// Note, this cannot coerce the type as 'guaranteed by the `IStructuredType` interface. StructureType IStructuredType.StructureType() { return SType; } -} \ No newline at end of file +} diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ChainExtensions.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ChainExtensions.cs index d0b5d95fef..4c0bf8ebde 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ChainExtensions.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ChainExtensions.cs @@ -69,36 +69,6 @@ public static unsafe ref TChain SetNext(this ref TChain chain, re return ref chain; } - /// - /// Returns the index of the in the , if present. - /// - /// The chain - /// The structure value - /// The type of the current chain - /// The type of the value - /// The zero-indexed index if found; otherwise -1. - public static unsafe int IndexOf(this ref TChain chain, ref TNext value) - where TChain : struct, IChainStart - where TNext : struct, IExtendsChain - { - // Ensure structure type of chain is set. - chain.StructureType(); - - var index = 0; - var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); - var valuePtr = (Chain*) Unsafe.AsPointer(ref value); - // Follow chain - do - { - if (currentPtr == valuePtr) - return index; - currentPtr = currentPtr->PNext; - index++; - } while (currentPtr is not null); - - return -1; - } - /// /// Adds a structure to the end of the chain. /// @@ -185,4 +155,34 @@ public static unsafe ref TChain TryAddNext(this ref TChain chain, added = true; return ref chain; } + + /// + /// Returns the index of the in the , if present. + /// + /// The chain + /// The structure value + /// The type of the current chain + /// The type of the value + /// The zero-indexed index if found; otherwise -1. + public static unsafe int IndexOf(this ref TChain chain, ref TNext value) + where TChain : struct, IChainStart + where TNext : struct, IExtendsChain + { + // Ensure structure type of chain is set. + chain.StructureType(); + + var index = 0; + var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); + var valuePtr = (Chain*) Unsafe.AsPointer(ref value); + // Follow chain + do + { + if (currentPtr == valuePtr) + return index; + currentPtr = currentPtr->PNext; + index++; + } while (currentPtr is not null); + + return -1; + } } \ No newline at end of file diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/DeviceCreateInfo.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/DeviceCreateInfo.cs index 4f7712d6e6..d6f477d8cb 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/DeviceCreateInfo.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/DeviceCreateInfo.cs @@ -39,8 +39,7 @@ public unsafe DeviceCreateInfo( public static unsafe ref DeviceCreateInfo Chain( out DeviceCreateInfo capture) { - capture = new DeviceCreateInfo( - StructureType.DeviceCreateInfo); + capture = new DeviceCreateInfo(StructureType.DeviceCreateInfo); return ref capture; } diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IChainable.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IChainable.cs index f33553d72c..7b8df844f2 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IChainable.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IChainable.cs @@ -4,8 +4,8 @@ namespace Silk.Net.Vulkan; /// Base interface for any struct that has can set the next value. /// /// Note that any structure marked must start with a -/// and a void* field. So that a pointer to it can be coerced +/// and a void* field, in that order. This is so that a pointer to it can be coerced /// to a pointer to a . public interface IChainable : IStructuredType { -} \ No newline at end of file +} diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IExtendsChain.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IExtendsChain.cs index 360c2063c8..5ef0a4ad99 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IExtendsChain.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IExtendsChain.cs @@ -1,10 +1,11 @@ namespace Silk.Net.Vulkan; /// -/// Generic interface indicating which chain this type can be added to. +/// Marks a chainable struct indicating which chain this type +/// extends. /// /// A chain start structure. public interface IExtendsChain : IChainable where TChain : IChainable { -} \ No newline at end of file +} diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IStructuredType.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IStructuredType.cs index 79d9385017..aa6a7fdbc1 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IStructuredType.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IStructuredType.cs @@ -1,12 +1,16 @@ namespace Silk.Net.Vulkan; +/// +/// Base interface for any struct that has a field called `SType`, that must be correctly +/// set when passing into the Vulkan API. +/// public interface IStructuredType { /// /// Gets the structured type's enum value. /// /// - /// Retrieving the also coerces it to the correct value. + /// Retrieving the also ensures it is set to the correct value. /// StructureType StructureType(); } \ No newline at end of file diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceFeatures2.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceFeatures2.cs index 8db163f074..f9aae21d47 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceFeatures2.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceFeatures2.cs @@ -33,8 +33,7 @@ public unsafe PhysicalDeviceFeatures2( public static unsafe ref PhysicalDeviceFeatures2 Chain( out PhysicalDeviceFeatures2 capture) { - capture = new PhysicalDeviceFeatures2( - StructureType.PhysicalDeviceFeatures2); + capture = new PhysicalDeviceFeatures2(StructureType.PhysicalDeviceFeatures2); return ref capture; } From bd9f0eb0c1647622c012ea024b26159f24d593a9 Mon Sep 17 00:00:00 2001 From: Craig Dean Date: Sun, 7 Nov 2021 12:08:49 +0000 Subject: [PATCH 23/42] chore: Minor fixes to lab * Restored targets for PrototypeStructChaining.csproj to match `Silk.Net.Vulkan` targets. * Upped the generated `ManageChain Load( return new(out var _, chain); } + /// + /// Creates a new with 6 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// A new with 6 items. + public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + { + return new(head, item1, item2, item3, item4, item5); + } + + /// + /// Loads a new with 6 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + /// A new with 6 items. + public static ManagedChain Load(out string errors, TChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + { + return new(out errors, chain); + } + + /// + /// Loads a new with 6 items from an existing unmanaged chain, + /// ignoring any errors. + /// + /// The unmanaged chain to use as the basis of this chain. + /// A new with 6 items. + public static ManagedChain Load(TChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + { + return new(out var _, chain); + } + + /// + /// Creates a new with 7 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// A new with 7 items. + public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + { + return new(head, item1, item2, item3, item4, item5, item6); + } + + /// + /// Loads a new with 7 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + /// A new with 7 items. + public static ManagedChain Load(out string errors, TChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + { + return new(out errors, chain); + } + + /// + /// Loads a new with 7 items from an existing unmanaged chain, + /// ignoring any errors. + /// + /// The unmanaged chain to use as the basis of this chain. + /// A new with 7 items. + public static ManagedChain Load(TChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + { + return new(out var _, chain); + } + + /// + /// Creates a new with 8 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// A new with 8 items. + public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + { + return new(head, item1, item2, item3, item4, item5, item6, item7); + } + + /// + /// Loads a new with 8 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + /// A new with 8 items. + public static ManagedChain Load(out string errors, TChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + { + return new(out errors, chain); + } + + /// + /// Loads a new with 8 items from an existing unmanaged chain, + /// ignoring any errors. + /// + /// The unmanaged chain to use as the basis of this chain. + /// A new with 8 items. + public static ManagedChain Load(TChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + { + return new(out var _, chain); + } + + /// + /// Creates a new with 9 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// A new with 9 items. + public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + { + return new(head, item1, item2, item3, item4, item5, item6, item7, item8); + } + + /// + /// Loads a new with 9 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + /// A new with 9 items. + public static ManagedChain Load(out string errors, TChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + { + return new(out errors, chain); + } + + /// + /// Loads a new with 9 items from an existing unmanaged chain, + /// ignoring any errors. + /// + /// The unmanaged chain to use as the basis of this chain. + /// A new with 9 items. + public static ManagedChain Load(TChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + { + return new(out var _, chain); + } + + /// + /// Creates a new with 10 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// A new with 10 items. + public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + { + return new(head, item1, item2, item3, item4, item5, item6, item7, item8, item9); + } + + /// + /// Loads a new with 10 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + /// A new with 10 items. + public static ManagedChain Load(out string errors, TChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + { + return new(out errors, chain); + } + + /// + /// Loads a new with 10 items from an existing unmanaged chain, + /// ignoring any errors. + /// + /// The unmanaged chain to use as the basis of this chain. + /// A new with 10 items. + public static ManagedChain Load(TChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + { + return new(out var _, chain); + } + + /// + /// Creates a new with 11 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// A new with 11 items. + public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + { + return new(head, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10); + } + + /// + /// Loads a new with 11 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + /// A new with 11 items. + public static ManagedChain Load(out string errors, TChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + { + return new(out errors, chain); + } + + /// + /// Loads a new with 11 items from an existing unmanaged chain, + /// ignoring any errors. + /// + /// The unmanaged chain to use as the basis of this chain. + /// A new with 11 items. + public static ManagedChain Load(TChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + { + return new(out var _, chain); + } + + /// + /// Creates a new with 12 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// Item 11. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// A new with 12 items. + public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + { + return new(head, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11); + } + + /// + /// Loads a new with 12 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + /// A new with 12 items. + public static ManagedChain Load(out string errors, TChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + { + return new(out errors, chain); + } + + /// + /// Loads a new with 12 items from an existing unmanaged chain, + /// ignoring any errors. + /// + /// The unmanaged chain to use as the basis of this chain. + /// A new with 12 items. + public static ManagedChain Load(TChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + { + return new(out var _, chain); + } + + /// + /// Creates a new with 13 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// Item 11. + /// Item 12. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// A new with 13 items. + public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + { + return new(head, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12); + } + + /// + /// Loads a new with 13 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + /// A new with 13 items. + public static ManagedChain Load(out string errors, TChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + { + return new(out errors, chain); + } + + /// + /// Loads a new with 13 items from an existing unmanaged chain, + /// ignoring any errors. + /// + /// The unmanaged chain to use as the basis of this chain. + /// A new with 13 items. + public static ManagedChain Load(TChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + { + return new(out var _, chain); + } + + /// + /// Creates a new with 14 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// Item 11. + /// Item 12. + /// Item 13. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// Type of Item 13. + /// A new with 14 items. + public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default, T13 item13 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + where T13 : struct, IExtendsChain + { + return new(head, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13); + } + + /// + /// Loads a new with 14 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + /// A new with 14 items. + public static ManagedChain Load(out string errors, TChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + where T13 : struct, IExtendsChain + { + return new(out errors, chain); + } + + /// + /// Loads a new with 14 items from an existing unmanaged chain, + /// ignoring any errors. + /// + /// The unmanaged chain to use as the basis of this chain. + /// A new with 14 items. + public static ManagedChain Load(TChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + where T13 : struct, IExtendsChain + { + return new(out var _, chain); + } + + /// + /// Creates a new with 15 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// Item 11. + /// Item 12. + /// Item 13. + /// Item 14. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// Type of Item 13. + /// Type of Item 14. + /// A new with 15 items. + public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default, T13 item13 = default, T14 item14 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + where T13 : struct, IExtendsChain + where T14 : struct, IExtendsChain + { + return new(head, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13, item14); + } + + /// + /// Loads a new with 15 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + /// A new with 15 items. + public static ManagedChain Load(out string errors, TChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + where T13 : struct, IExtendsChain + where T14 : struct, IExtendsChain + { + return new(out errors, chain); + } + + /// + /// Loads a new with 15 items from an existing unmanaged chain, + /// ignoring any errors. + /// + /// The unmanaged chain to use as the basis of this chain. + /// A new with 15 items. + public static ManagedChain Load(TChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + where T13 : struct, IExtendsChain + where T14 : struct, IExtendsChain + { + return new(out var _, chain); + } + + /// + /// Creates a new with 16 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// Item 11. + /// Item 12. + /// Item 13. + /// Item 14. + /// Item 15. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// Type of Item 13. + /// Type of Item 14. + /// Type of Item 15. + /// A new with 16 items. + public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default, T13 item13 = default, T14 item14 = default, T15 item15 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + where T13 : struct, IExtendsChain + where T14 : struct, IExtendsChain + where T15 : struct, IExtendsChain + { + return new(head, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13, item14, item15); + } + + /// + /// Loads a new with 16 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + /// A new with 16 items. + public static ManagedChain Load(out string errors, TChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + where T13 : struct, IExtendsChain + where T14 : struct, IExtendsChain + where T15 : struct, IExtendsChain + { + return new(out errors, chain); + } + + /// + /// Loads a new with 16 items from an existing unmanaged chain, + /// ignoring any errors. + /// + /// The unmanaged chain to use as the basis of this chain. + /// A new with 16 items. + public static ManagedChain Load(TChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + where T13 : struct, IExtendsChain + where T14 : struct, IExtendsChain + where T15 : struct, IExtendsChain + { + return new(out var _, chain); + } + +} + +/// +/// A safely manages the pointers of a managed structure chain. +/// +/// The chain type +/// Type of Item 1. +public unsafe class ManagedChain : ManagedChain + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain +{ + private IntPtr _headPtr; + + /// + /// Gets a pointer to the current head. + /// + public Chain* HeadPtr => (Chain*) _headPtr; + + /// + /// Gets or sets the head of the chain. + /// + public TChain Head + { + get => Unsafe.AsRef((Chain*) _headPtr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _headPtr)->PNext; + Marshal.StructureToPtr(value, _headPtr, true); + ((Chain*) _headPtr)->PNext = nextPtr; + } + } + + private IntPtr _item1Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item1Ptr => (Chain*) _item1Ptr; + + /// + /// Gets or sets item #1 in the chain. + /// + public T1 Item1 + { + get => Unsafe.AsRef((Chain*) _item1Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item1Ptr)->PNext; + Marshal.StructureToPtr(value, _item1Ptr, true); + ((Chain*) _item1Ptr)->PNext = nextPtr; + } + } + + /// + /// Creates a new with 2 items. + /// + /// The head of the chain. + /// Item 1. + public ManagedChain(TChain head = default, T1 item1 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size); + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + item1.StructureType(); + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + } + + /// + /// Creates a new with 2 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + public ManagedChain(out string errors, TChain chain) + { + // Load existing chain first, so any errors occur before we allocate memory + var head = chain; + var headSize = Marshal.SizeOf(); + var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); + StructureType expectedStructureType; + StringBuilder errorBuilder = new StringBuilder(); + + currentPtr = currentPtr->PNext; + T1 item1 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 2"); + else { + expectedStructureType = item1.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 2; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item1 = Unsafe.AsRef(currentPtr); + if (currentPtr->PNext is not null) + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 2"); + } + var item1Size = Marshal.SizeOf(); + + + // Create string of errors + errors = errorBuilder.ToString().Trim(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + } + + /// + /// Creates a new with 3 items, by appending to + /// the end of this chain. + /// + /// Item 2. + /// Type of Item 2 + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Append(T2 item2 = default) + where T2: struct, IExtendsChain + { + return new ManagedChain(this, item2); + } + + /// + public override IEnumerator GetEnumerator() + { + yield return Head; + yield return Item1; + } + + /// + public override int Count => 2; + + /// + public override IChainable this[int index] + => index switch + { + 0 => Head, 1 => Item1, + _ => throw new IndexOutOfRangeException() + }; + + /// + /// Deconstructs this chain. + /// + /// The head of the chain. + /// Item 1. + public void Deconstruct(out TChain head, out T1 item1) + { + head = Head; + item1 = Item1; + } + + /// + public override void Dispose() + { + var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); + if (headPtr == IntPtr.Zero) return; + + // Destroy all structures + Marshal.DestroyStructure(headPtr); + var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item1Ptr); + + // Free memory block + Marshal.FreeHGlobal(headPtr); + } +} + +/// +/// A safely manages the pointers of a managed structure chain. +/// +/// The chain type +/// Type of Item 1. +/// Type of Item 2. +public unsafe class ManagedChain : ManagedChain + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain +{ + private IntPtr _headPtr; + + /// + /// Gets a pointer to the current head. + /// + public Chain* HeadPtr => (Chain*) _headPtr; + + /// + /// Gets or sets the head of the chain. + /// + public TChain Head + { + get => Unsafe.AsRef((Chain*) _headPtr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _headPtr)->PNext; + Marshal.StructureToPtr(value, _headPtr, true); + ((Chain*) _headPtr)->PNext = nextPtr; + } + } + + private IntPtr _item1Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item1Ptr => (Chain*) _item1Ptr; + + /// + /// Gets or sets item #1 in the chain. + /// + public T1 Item1 + { + get => Unsafe.AsRef((Chain*) _item1Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item1Ptr)->PNext; + Marshal.StructureToPtr(value, _item1Ptr, true); + ((Chain*) _item1Ptr)->PNext = nextPtr; + } + } + private IntPtr _item2Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item2Ptr => (Chain*) _item2Ptr; + + /// + /// Gets or sets item #2 in the chain. + /// + public T2 Item2 + { + get => Unsafe.AsRef((Chain*) _item2Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item2Ptr)->PNext; + Marshal.StructureToPtr(value, _item2Ptr, true); + ((Chain*) _item2Ptr)->PNext = nextPtr; + } + } + + /// + /// Creates a new with 3 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size); + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + item1.StructureType(); + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + item2.StructureType(); + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + } + + /// + /// Creates a new with 3 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + public ManagedChain(out string errors, TChain chain) + { + // Load existing chain first, so any errors occur before we allocate memory + var head = chain; + var headSize = Marshal.SizeOf(); + var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); + StructureType expectedStructureType; + StringBuilder errorBuilder = new StringBuilder(); + + currentPtr = currentPtr->PNext; + T1 item1 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 3"); + else { + expectedStructureType = item1.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 2; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item1 = Unsafe.AsRef(currentPtr); + } + var item1Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T2 item2 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 3"); + else { + expectedStructureType = item2.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 3; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item2 = Unsafe.AsRef(currentPtr); + if (currentPtr->PNext is not null) + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 3"); + } + var item2Size = Marshal.SizeOf(); + + + // Create string of errors + errors = errorBuilder.ToString().Trim(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + } + + /// + /// Creates a new with 3 items. + /// + /// The chain to append to. + /// Item 2. + /// + /// Do not forget to dispose the chain if you are no longer using it. + /// + public ManagedChain(ManagedChain previous, T2 item2 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + + var originalSize = headSize + item1Size; + var newSize = originalSize + item2Size; + + _headPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + + _item1Ptr = _headPtr + headSize; + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + // Append the last structure + item2.StructureType(); + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + } + + /// + /// Creates a new with 4 items, by appending to + /// the end of this chain. + /// + /// Item 3. + /// Type of Item 3 + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Append(T3 item3 = default) + where T3: struct, IExtendsChain + { + return new ManagedChain(this, item3); + } + + /// + public override IEnumerator GetEnumerator() + { + yield return Head; + yield return Item1; + yield return Item2; + } + + /// + public override int Count => 3; + + /// + public override IChainable this[int index] + => index switch + { + 0 => Head, 1 => Item1, + 2 => Item2, + _ => throw new IndexOutOfRangeException() + }; + + /// + /// Deconstructs this chain. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + public void Deconstruct(out TChain head, out T1 item1, out T2 item2) + { + head = Head; + item1 = Item1; + item2 = Item2; + } + + /// + public override void Dispose() + { + var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); + if (headPtr == IntPtr.Zero) return; + + // Destroy all structures + Marshal.DestroyStructure(headPtr); + var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item1Ptr); + var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item2Ptr); + + // Free memory block + Marshal.FreeHGlobal(headPtr); + } +} + +/// +/// A safely manages the pointers of a managed structure chain. +/// +/// The chain type +/// Type of Item 1. +/// Type of Item 2. +/// Type of Item 3. +public unsafe class ManagedChain : ManagedChain + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain +{ + private IntPtr _headPtr; + + /// + /// Gets a pointer to the current head. + /// + public Chain* HeadPtr => (Chain*) _headPtr; + + /// + /// Gets or sets the head of the chain. + /// + public TChain Head + { + get => Unsafe.AsRef((Chain*) _headPtr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _headPtr)->PNext; + Marshal.StructureToPtr(value, _headPtr, true); + ((Chain*) _headPtr)->PNext = nextPtr; + } + } + + private IntPtr _item1Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item1Ptr => (Chain*) _item1Ptr; + + /// + /// Gets or sets item #1 in the chain. + /// + public T1 Item1 + { + get => Unsafe.AsRef((Chain*) _item1Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item1Ptr)->PNext; + Marshal.StructureToPtr(value, _item1Ptr, true); + ((Chain*) _item1Ptr)->PNext = nextPtr; + } + } + private IntPtr _item2Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item2Ptr => (Chain*) _item2Ptr; + + /// + /// Gets or sets item #2 in the chain. + /// + public T2 Item2 + { + get => Unsafe.AsRef((Chain*) _item2Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item2Ptr)->PNext; + Marshal.StructureToPtr(value, _item2Ptr, true); + ((Chain*) _item2Ptr)->PNext = nextPtr; + } + } + private IntPtr _item3Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item3Ptr => (Chain*) _item3Ptr; + + /// + /// Gets or sets item #3 in the chain. + /// + public T3 Item3 + { + get => Unsafe.AsRef((Chain*) _item3Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item3Ptr)->PNext; + Marshal.StructureToPtr(value, _item3Ptr, true); + ((Chain*) _item3Ptr)->PNext = nextPtr; + } + } + + /// + /// Creates a new with 4 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size); + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + item1.StructureType(); + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + item2.StructureType(); + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + item3.StructureType(); + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + } + + /// + /// Creates a new with 4 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + public ManagedChain(out string errors, TChain chain) + { + // Load existing chain first, so any errors occur before we allocate memory + var head = chain; + var headSize = Marshal.SizeOf(); + var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); + StructureType expectedStructureType; + StringBuilder errorBuilder = new StringBuilder(); + + currentPtr = currentPtr->PNext; + T1 item1 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 4"); + else { + expectedStructureType = item1.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 2; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item1 = Unsafe.AsRef(currentPtr); + } + var item1Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T2 item2 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 4"); + else { + expectedStructureType = item2.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 3; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item2 = Unsafe.AsRef(currentPtr); + } + var item2Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T3 item3 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 4"); + else { + expectedStructureType = item3.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 4; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item3 = Unsafe.AsRef(currentPtr); + if (currentPtr->PNext is not null) + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 4"); + } + var item3Size = Marshal.SizeOf(); + + + // Create string of errors + errors = errorBuilder.ToString().Trim(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + } + + /// + /// Creates a new with 4 items. + /// + /// The chain to append to. + /// Item 3. + /// + /// Do not forget to dispose the chain if you are no longer using it. + /// + public ManagedChain(ManagedChain previous, T3 item3 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + + var originalSize = headSize + item1Size + item2Size; + var newSize = originalSize + item3Size; + + _headPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + + _item1Ptr = _headPtr + headSize; + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + // Append the last structure + item3.StructureType(); + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + } + + /// + /// Creates a new with 5 items, by appending to + /// the end of this chain. + /// + /// Item 4. + /// Type of Item 4 + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Append(T4 item4 = default) + where T4: struct, IExtendsChain + { + return new ManagedChain(this, item4); + } + + /// + public override IEnumerator GetEnumerator() + { + yield return Head; + yield return Item1; + yield return Item2; + yield return Item3; + } + + /// + public override int Count => 4; + + /// + public override IChainable this[int index] + => index switch + { + 0 => Head, 1 => Item1, + 2 => Item2, + 3 => Item3, + _ => throw new IndexOutOfRangeException() + }; + + /// + /// Deconstructs this chain. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item3) + { + head = Head; + item1 = Item1; + item2 = Item2; + item3 = Item3; + } + + /// + public override void Dispose() + { + var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); + if (headPtr == IntPtr.Zero) return; + + // Destroy all structures + Marshal.DestroyStructure(headPtr); + var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item1Ptr); + var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item2Ptr); + var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item3Ptr); + + // Free memory block + Marshal.FreeHGlobal(headPtr); + } +} + +/// +/// A safely manages the pointers of a managed structure chain. +/// +/// The chain type +/// Type of Item 1. +/// Type of Item 2. +/// Type of Item 3. +/// Type of Item 4. +public unsafe class ManagedChain : ManagedChain + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain +{ + private IntPtr _headPtr; + + /// + /// Gets a pointer to the current head. + /// + public Chain* HeadPtr => (Chain*) _headPtr; + + /// + /// Gets or sets the head of the chain. + /// + public TChain Head + { + get => Unsafe.AsRef((Chain*) _headPtr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _headPtr)->PNext; + Marshal.StructureToPtr(value, _headPtr, true); + ((Chain*) _headPtr)->PNext = nextPtr; + } + } + + private IntPtr _item1Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item1Ptr => (Chain*) _item1Ptr; + + /// + /// Gets or sets item #1 in the chain. + /// + public T1 Item1 + { + get => Unsafe.AsRef((Chain*) _item1Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item1Ptr)->PNext; + Marshal.StructureToPtr(value, _item1Ptr, true); + ((Chain*) _item1Ptr)->PNext = nextPtr; + } + } + private IntPtr _item2Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item2Ptr => (Chain*) _item2Ptr; + + /// + /// Gets or sets item #2 in the chain. + /// + public T2 Item2 + { + get => Unsafe.AsRef((Chain*) _item2Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item2Ptr)->PNext; + Marshal.StructureToPtr(value, _item2Ptr, true); + ((Chain*) _item2Ptr)->PNext = nextPtr; + } + } + private IntPtr _item3Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item3Ptr => (Chain*) _item3Ptr; + + /// + /// Gets or sets item #3 in the chain. + /// + public T3 Item3 + { + get => Unsafe.AsRef((Chain*) _item3Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item3Ptr)->PNext; + Marshal.StructureToPtr(value, _item3Ptr, true); + ((Chain*) _item3Ptr)->PNext = nextPtr; + } + } + private IntPtr _item4Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item4Ptr => (Chain*) _item4Ptr; + + /// + /// Gets or sets item #4 in the chain. + /// + public T4 Item4 + { + get => Unsafe.AsRef((Chain*) _item4Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item4Ptr)->PNext; + Marshal.StructureToPtr(value, _item4Ptr, true); + ((Chain*) _item4Ptr)->PNext = nextPtr; + } + } + + /// + /// Creates a new with 5 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size); + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + item1.StructureType(); + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + item2.StructureType(); + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + item3.StructureType(); + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + item4.StructureType(); + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + } + + /// + /// Creates a new with 5 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + public ManagedChain(out string errors, TChain chain) + { + // Load existing chain first, so any errors occur before we allocate memory + var head = chain; + var headSize = Marshal.SizeOf(); + var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); + StructureType expectedStructureType; + StringBuilder errorBuilder = new StringBuilder(); + + currentPtr = currentPtr->PNext; + T1 item1 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 5"); + else { + expectedStructureType = item1.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 2; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item1 = Unsafe.AsRef(currentPtr); + } + var item1Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T2 item2 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 5"); + else { + expectedStructureType = item2.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 3; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item2 = Unsafe.AsRef(currentPtr); + } + var item2Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T3 item3 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 5"); + else { + expectedStructureType = item3.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 4; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item3 = Unsafe.AsRef(currentPtr); + } + var item3Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T4 item4 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 5"); + else { + expectedStructureType = item4.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 5; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item4 = Unsafe.AsRef(currentPtr); + if (currentPtr->PNext is not null) + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 5"); + } + var item4Size = Marshal.SizeOf(); + + + // Create string of errors + errors = errorBuilder.ToString().Trim(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + } + + /// + /// Creates a new with 5 items. + /// + /// The chain to append to. + /// Item 4. + /// + /// Do not forget to dispose the chain if you are no longer using it. + /// + public ManagedChain(ManagedChain previous, T4 item4 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + + var originalSize = headSize + item1Size + item2Size + item3Size; + var newSize = originalSize + item4Size; + + _headPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + + _item1Ptr = _headPtr + headSize; + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + // Append the last structure + item4.StructureType(); + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + } + + /// + /// Creates a new with 6 items, by appending to + /// the end of this chain. + /// + /// Item 5. + /// Type of Item 5 + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Append(T5 item5 = default) + where T5: struct, IExtendsChain + { + return new ManagedChain(this, item5); + } + + /// + public override IEnumerator GetEnumerator() + { + yield return Head; + yield return Item1; + yield return Item2; + yield return Item3; + yield return Item4; + } + + /// + public override int Count => 5; + + /// + public override IChainable this[int index] + => index switch + { + 0 => Head, 1 => Item1, + 2 => Item2, + 3 => Item3, + 4 => Item4, + _ => throw new IndexOutOfRangeException() + }; + + /// + /// Deconstructs this chain. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item3, out T4 item4) + { + head = Head; + item1 = Item1; + item2 = Item2; + item3 = Item3; + item4 = Item4; + } + + /// + public override void Dispose() + { + var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); + if (headPtr == IntPtr.Zero) return; + + // Destroy all structures + Marshal.DestroyStructure(headPtr); + var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item1Ptr); + var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item2Ptr); + var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item3Ptr); + var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item4Ptr); + + // Free memory block + Marshal.FreeHGlobal(headPtr); + } +} + +/// +/// A safely manages the pointers of a managed structure chain. +/// +/// The chain type +/// Type of Item 1. +/// Type of Item 2. +/// Type of Item 3. +/// Type of Item 4. +/// Type of Item 5. +public unsafe class ManagedChain : ManagedChain + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain +{ + private IntPtr _headPtr; + + /// + /// Gets a pointer to the current head. + /// + public Chain* HeadPtr => (Chain*) _headPtr; + + /// + /// Gets or sets the head of the chain. + /// + public TChain Head + { + get => Unsafe.AsRef((Chain*) _headPtr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _headPtr)->PNext; + Marshal.StructureToPtr(value, _headPtr, true); + ((Chain*) _headPtr)->PNext = nextPtr; + } + } + + private IntPtr _item1Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item1Ptr => (Chain*) _item1Ptr; + + /// + /// Gets or sets item #1 in the chain. + /// + public T1 Item1 + { + get => Unsafe.AsRef((Chain*) _item1Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item1Ptr)->PNext; + Marshal.StructureToPtr(value, _item1Ptr, true); + ((Chain*) _item1Ptr)->PNext = nextPtr; + } + } + private IntPtr _item2Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item2Ptr => (Chain*) _item2Ptr; + + /// + /// Gets or sets item #2 in the chain. + /// + public T2 Item2 + { + get => Unsafe.AsRef((Chain*) _item2Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item2Ptr)->PNext; + Marshal.StructureToPtr(value, _item2Ptr, true); + ((Chain*) _item2Ptr)->PNext = nextPtr; + } + } + private IntPtr _item3Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item3Ptr => (Chain*) _item3Ptr; + + /// + /// Gets or sets item #3 in the chain. + /// + public T3 Item3 + { + get => Unsafe.AsRef((Chain*) _item3Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item3Ptr)->PNext; + Marshal.StructureToPtr(value, _item3Ptr, true); + ((Chain*) _item3Ptr)->PNext = nextPtr; + } + } + private IntPtr _item4Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item4Ptr => (Chain*) _item4Ptr; + + /// + /// Gets or sets item #4 in the chain. + /// + public T4 Item4 + { + get => Unsafe.AsRef((Chain*) _item4Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item4Ptr)->PNext; + Marshal.StructureToPtr(value, _item4Ptr, true); + ((Chain*) _item4Ptr)->PNext = nextPtr; + } + } + private IntPtr _item5Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item5Ptr => (Chain*) _item5Ptr; + + /// + /// Gets or sets item #5 in the chain. + /// + public T5 Item5 + { + get => Unsafe.AsRef((Chain*) _item5Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item5Ptr)->PNext; + Marshal.StructureToPtr(value, _item5Ptr, true); + ((Chain*) _item5Ptr)->PNext = nextPtr; + } + } + + /// + /// Creates a new with 6 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size); + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + item1.StructureType(); + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + item2.StructureType(); + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + item3.StructureType(); + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + item4.StructureType(); + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + item5.StructureType(); + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + } + + /// + /// Creates a new with 6 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + public ManagedChain(out string errors, TChain chain) + { + // Load existing chain first, so any errors occur before we allocate memory + var head = chain; + var headSize = Marshal.SizeOf(); + var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); + StructureType expectedStructureType; + StringBuilder errorBuilder = new StringBuilder(); + + currentPtr = currentPtr->PNext; + T1 item1 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 6"); + else { + expectedStructureType = item1.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 2; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item1 = Unsafe.AsRef(currentPtr); + } + var item1Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T2 item2 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 6"); + else { + expectedStructureType = item2.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 3; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item2 = Unsafe.AsRef(currentPtr); + } + var item2Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T3 item3 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 6"); + else { + expectedStructureType = item3.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 4; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item3 = Unsafe.AsRef(currentPtr); + } + var item3Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T4 item4 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 6"); + else { + expectedStructureType = item4.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 5; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item4 = Unsafe.AsRef(currentPtr); + } + var item4Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T5 item5 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 6"); + else { + expectedStructureType = item5.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 6; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item5 = Unsafe.AsRef(currentPtr); + if (currentPtr->PNext is not null) + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 6"); + } + var item5Size = Marshal.SizeOf(); + + + // Create string of errors + errors = errorBuilder.ToString().Trim(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + } + + /// + /// Creates a new with 6 items. + /// + /// The chain to append to. + /// Item 5. + /// + /// Do not forget to dispose the chain if you are no longer using it. + /// + public ManagedChain(ManagedChain previous, T5 item5 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + + var originalSize = headSize + item1Size + item2Size + item3Size + item4Size; + var newSize = originalSize + item5Size; + + _headPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + + _item1Ptr = _headPtr + headSize; + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + // Append the last structure + item5.StructureType(); + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + } + + /// + /// Creates a new with 7 items, by appending to + /// the end of this chain. + /// + /// Item 6. + /// Type of Item 6 + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Append(T6 item6 = default) + where T6: struct, IExtendsChain + { + return new ManagedChain(this, item6); + } + + /// + public override IEnumerator GetEnumerator() + { + yield return Head; + yield return Item1; + yield return Item2; + yield return Item3; + yield return Item4; + yield return Item5; + } + + /// + public override int Count => 6; + + /// + public override IChainable this[int index] + => index switch + { + 0 => Head, 1 => Item1, + 2 => Item2, + 3 => Item3, + 4 => Item4, + 5 => Item5, + _ => throw new IndexOutOfRangeException() + }; + + /// + /// Deconstructs this chain. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5) + { + head = Head; + item1 = Item1; + item2 = Item2; + item3 = Item3; + item4 = Item4; + item5 = Item5; + } + + /// + public override void Dispose() + { + var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); + if (headPtr == IntPtr.Zero) return; + + // Destroy all structures + Marshal.DestroyStructure(headPtr); + var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item1Ptr); + var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item2Ptr); + var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item3Ptr); + var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item4Ptr); + var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item5Ptr); + + // Free memory block + Marshal.FreeHGlobal(headPtr); + } +} + +/// +/// A safely manages the pointers of a managed structure chain. +/// +/// The chain type +/// Type of Item 1. +/// Type of Item 2. +/// Type of Item 3. +/// Type of Item 4. +/// Type of Item 5. +/// Type of Item 6. +public unsafe class ManagedChain : ManagedChain + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain +{ + private IntPtr _headPtr; + + /// + /// Gets a pointer to the current head. + /// + public Chain* HeadPtr => (Chain*) _headPtr; + + /// + /// Gets or sets the head of the chain. + /// + public TChain Head + { + get => Unsafe.AsRef((Chain*) _headPtr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _headPtr)->PNext; + Marshal.StructureToPtr(value, _headPtr, true); + ((Chain*) _headPtr)->PNext = nextPtr; + } + } + + private IntPtr _item1Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item1Ptr => (Chain*) _item1Ptr; + + /// + /// Gets or sets item #1 in the chain. + /// + public T1 Item1 + { + get => Unsafe.AsRef((Chain*) _item1Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item1Ptr)->PNext; + Marshal.StructureToPtr(value, _item1Ptr, true); + ((Chain*) _item1Ptr)->PNext = nextPtr; + } + } + private IntPtr _item2Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item2Ptr => (Chain*) _item2Ptr; + + /// + /// Gets or sets item #2 in the chain. + /// + public T2 Item2 + { + get => Unsafe.AsRef((Chain*) _item2Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item2Ptr)->PNext; + Marshal.StructureToPtr(value, _item2Ptr, true); + ((Chain*) _item2Ptr)->PNext = nextPtr; + } + } + private IntPtr _item3Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item3Ptr => (Chain*) _item3Ptr; + + /// + /// Gets or sets item #3 in the chain. + /// + public T3 Item3 + { + get => Unsafe.AsRef((Chain*) _item3Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item3Ptr)->PNext; + Marshal.StructureToPtr(value, _item3Ptr, true); + ((Chain*) _item3Ptr)->PNext = nextPtr; + } + } + private IntPtr _item4Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item4Ptr => (Chain*) _item4Ptr; + + /// + /// Gets or sets item #4 in the chain. + /// + public T4 Item4 + { + get => Unsafe.AsRef((Chain*) _item4Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item4Ptr)->PNext; + Marshal.StructureToPtr(value, _item4Ptr, true); + ((Chain*) _item4Ptr)->PNext = nextPtr; + } + } + private IntPtr _item5Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item5Ptr => (Chain*) _item5Ptr; + + /// + /// Gets or sets item #5 in the chain. + /// + public T5 Item5 + { + get => Unsafe.AsRef((Chain*) _item5Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item5Ptr)->PNext; + Marshal.StructureToPtr(value, _item5Ptr, true); + ((Chain*) _item5Ptr)->PNext = nextPtr; + } + } + private IntPtr _item6Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item6Ptr => (Chain*) _item6Ptr; + + /// + /// Gets or sets item #6 in the chain. + /// + public T6 Item6 + { + get => Unsafe.AsRef((Chain*) _item6Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item6Ptr)->PNext; + Marshal.StructureToPtr(value, _item6Ptr, true); + ((Chain*) _item6Ptr)->PNext = nextPtr; + } + } + + /// + /// Creates a new with 7 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + var item6Size = Marshal.SizeOf(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size); + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + item1.StructureType(); + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + item2.StructureType(); + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + item3.StructureType(); + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + item4.StructureType(); + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + item5.StructureType(); + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + item6.StructureType(); + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + } + + /// + /// Creates a new with 7 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + public ManagedChain(out string errors, TChain chain) + { + // Load existing chain first, so any errors occur before we allocate memory + var head = chain; + var headSize = Marshal.SizeOf(); + var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); + StructureType expectedStructureType; + StringBuilder errorBuilder = new StringBuilder(); + + currentPtr = currentPtr->PNext; + T1 item1 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 7"); + else { + expectedStructureType = item1.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 2; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item1 = Unsafe.AsRef(currentPtr); + } + var item1Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T2 item2 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 7"); + else { + expectedStructureType = item2.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 3; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item2 = Unsafe.AsRef(currentPtr); + } + var item2Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T3 item3 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 7"); + else { + expectedStructureType = item3.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 4; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item3 = Unsafe.AsRef(currentPtr); + } + var item3Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T4 item4 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 7"); + else { + expectedStructureType = item4.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 5; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item4 = Unsafe.AsRef(currentPtr); + } + var item4Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T5 item5 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 7"); + else { + expectedStructureType = item5.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 6; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item5 = Unsafe.AsRef(currentPtr); + } + var item5Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T6 item6 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 7"); + else { + expectedStructureType = item6.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 7; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item6 = Unsafe.AsRef(currentPtr); + if (currentPtr->PNext is not null) + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 7"); + } + var item6Size = Marshal.SizeOf(); + + + // Create string of errors + errors = errorBuilder.ToString().Trim(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + } + + /// + /// Creates a new with 7 items. + /// + /// The chain to append to. + /// Item 6. + /// + /// Do not forget to dispose the chain if you are no longer using it. + /// + public ManagedChain(ManagedChain previous, T6 item6 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + var item6Size = Marshal.SizeOf(); + + var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size; + var newSize = originalSize + item6Size; + + _headPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + + _item1Ptr = _headPtr + headSize; + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + // Append the last structure + item6.StructureType(); + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + } + + /// + /// Creates a new with 8 items, by appending to + /// the end of this chain. + /// + /// Item 7. + /// Type of Item 7 + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Append(T7 item7 = default) + where T7: struct, IExtendsChain + { + return new ManagedChain(this, item7); + } + + /// + public override IEnumerator GetEnumerator() + { + yield return Head; + yield return Item1; + yield return Item2; + yield return Item3; + yield return Item4; + yield return Item5; + yield return Item6; + } + + /// + public override int Count => 7; + + /// + public override IChainable this[int index] + => index switch + { + 0 => Head, 1 => Item1, + 2 => Item2, + 3 => Item3, + 4 => Item4, + 5 => Item5, + 6 => Item6, + _ => throw new IndexOutOfRangeException() + }; + + /// + /// Deconstructs this chain. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6) + { + head = Head; + item1 = Item1; + item2 = Item2; + item3 = Item3; + item4 = Item4; + item5 = Item5; + item6 = Item6; + } + + /// + public override void Dispose() + { + var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); + if (headPtr == IntPtr.Zero) return; + + // Destroy all structures + Marshal.DestroyStructure(headPtr); + var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item1Ptr); + var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item2Ptr); + var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item3Ptr); + var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item4Ptr); + var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item5Ptr); + var item6Ptr = Interlocked.Exchange(ref _item6Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item6Ptr); + + // Free memory block + Marshal.FreeHGlobal(headPtr); + } +} + +/// +/// A safely manages the pointers of a managed structure chain. +/// +/// The chain type +/// Type of Item 1. +/// Type of Item 2. +/// Type of Item 3. +/// Type of Item 4. +/// Type of Item 5. +/// Type of Item 6. +/// Type of Item 7. +public unsafe class ManagedChain : ManagedChain + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain +{ + private IntPtr _headPtr; + + /// + /// Gets a pointer to the current head. + /// + public Chain* HeadPtr => (Chain*) _headPtr; + + /// + /// Gets or sets the head of the chain. + /// + public TChain Head + { + get => Unsafe.AsRef((Chain*) _headPtr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _headPtr)->PNext; + Marshal.StructureToPtr(value, _headPtr, true); + ((Chain*) _headPtr)->PNext = nextPtr; + } + } + + private IntPtr _item1Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item1Ptr => (Chain*) _item1Ptr; + + /// + /// Gets or sets item #1 in the chain. + /// + public T1 Item1 + { + get => Unsafe.AsRef((Chain*) _item1Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item1Ptr)->PNext; + Marshal.StructureToPtr(value, _item1Ptr, true); + ((Chain*) _item1Ptr)->PNext = nextPtr; + } + } + private IntPtr _item2Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item2Ptr => (Chain*) _item2Ptr; + + /// + /// Gets or sets item #2 in the chain. + /// + public T2 Item2 + { + get => Unsafe.AsRef((Chain*) _item2Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item2Ptr)->PNext; + Marshal.StructureToPtr(value, _item2Ptr, true); + ((Chain*) _item2Ptr)->PNext = nextPtr; + } + } + private IntPtr _item3Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item3Ptr => (Chain*) _item3Ptr; + + /// + /// Gets or sets item #3 in the chain. + /// + public T3 Item3 + { + get => Unsafe.AsRef((Chain*) _item3Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item3Ptr)->PNext; + Marshal.StructureToPtr(value, _item3Ptr, true); + ((Chain*) _item3Ptr)->PNext = nextPtr; + } + } + private IntPtr _item4Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item4Ptr => (Chain*) _item4Ptr; + + /// + /// Gets or sets item #4 in the chain. + /// + public T4 Item4 + { + get => Unsafe.AsRef((Chain*) _item4Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item4Ptr)->PNext; + Marshal.StructureToPtr(value, _item4Ptr, true); + ((Chain*) _item4Ptr)->PNext = nextPtr; + } + } + private IntPtr _item5Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item5Ptr => (Chain*) _item5Ptr; + + /// + /// Gets or sets item #5 in the chain. + /// + public T5 Item5 + { + get => Unsafe.AsRef((Chain*) _item5Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item5Ptr)->PNext; + Marshal.StructureToPtr(value, _item5Ptr, true); + ((Chain*) _item5Ptr)->PNext = nextPtr; + } + } + private IntPtr _item6Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item6Ptr => (Chain*) _item6Ptr; + + /// + /// Gets or sets item #6 in the chain. + /// + public T6 Item6 + { + get => Unsafe.AsRef((Chain*) _item6Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item6Ptr)->PNext; + Marshal.StructureToPtr(value, _item6Ptr, true); + ((Chain*) _item6Ptr)->PNext = nextPtr; + } + } + private IntPtr _item7Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item7Ptr => (Chain*) _item7Ptr; + + /// + /// Gets or sets item #7 in the chain. + /// + public T7 Item7 + { + get => Unsafe.AsRef((Chain*) _item7Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item7Ptr)->PNext; + Marshal.StructureToPtr(value, _item7Ptr, true); + ((Chain*) _item7Ptr)->PNext = nextPtr; + } + } + + /// + /// Creates a new with 8 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + var item6Size = Marshal.SizeOf(); + var item7Size = Marshal.SizeOf(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size); + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + item1.StructureType(); + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + item2.StructureType(); + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + item3.StructureType(); + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + item4.StructureType(); + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + item5.StructureType(); + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + item6.StructureType(); + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + item7.StructureType(); + Marshal.StructureToPtr(item7, _item7Ptr, false); + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + } + + /// + /// Creates a new with 8 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + public ManagedChain(out string errors, TChain chain) + { + // Load existing chain first, so any errors occur before we allocate memory + var head = chain; + var headSize = Marshal.SizeOf(); + var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); + StructureType expectedStructureType; + StringBuilder errorBuilder = new StringBuilder(); + + currentPtr = currentPtr->PNext; + T1 item1 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 8"); + else { + expectedStructureType = item1.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 2; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item1 = Unsafe.AsRef(currentPtr); + } + var item1Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T2 item2 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 8"); + else { + expectedStructureType = item2.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 3; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item2 = Unsafe.AsRef(currentPtr); + } + var item2Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T3 item3 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 8"); + else { + expectedStructureType = item3.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 4; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item3 = Unsafe.AsRef(currentPtr); + } + var item3Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T4 item4 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 8"); + else { + expectedStructureType = item4.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 5; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item4 = Unsafe.AsRef(currentPtr); + } + var item4Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T5 item5 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 8"); + else { + expectedStructureType = item5.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 6; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item5 = Unsafe.AsRef(currentPtr); + } + var item5Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T6 item6 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 8"); + else { + expectedStructureType = item6.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 7; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item6 = Unsafe.AsRef(currentPtr); + } + var item6Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T7 item7 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 8"); + else { + expectedStructureType = item7.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 8; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item7 = Unsafe.AsRef(currentPtr); + if (currentPtr->PNext is not null) + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 8"); + } + var item7Size = Marshal.SizeOf(); + + + // Create string of errors + errors = errorBuilder.ToString().Trim(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + Marshal.StructureToPtr(item7, _item7Ptr, false); + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + } + + /// + /// Creates a new with 8 items. + /// + /// The chain to append to. + /// Item 7. + /// + /// Do not forget to dispose the chain if you are no longer using it. + /// + public ManagedChain(ManagedChain previous, T7 item7 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + var item6Size = Marshal.SizeOf(); + var item7Size = Marshal.SizeOf(); + + var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size; + var newSize = originalSize + item7Size; + + _headPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + + _item1Ptr = _headPtr + headSize; + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + // Append the last structure + item7.StructureType(); + Marshal.StructureToPtr(item7, _item7Ptr, false); + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + } + + /// + /// Creates a new with 9 items, by appending to + /// the end of this chain. + /// + /// Item 8. + /// Type of Item 8 + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Append(T8 item8 = default) + where T8: struct, IExtendsChain + { + return new ManagedChain(this, item8); + } + + /// + public override IEnumerator GetEnumerator() + { + yield return Head; + yield return Item1; + yield return Item2; + yield return Item3; + yield return Item4; + yield return Item5; + yield return Item6; + yield return Item7; + } + + /// + public override int Count => 8; + + /// + public override IChainable this[int index] + => index switch + { + 0 => Head, 1 => Item1, + 2 => Item2, + 3 => Item3, + 4 => Item4, + 5 => Item5, + 6 => Item6, + 7 => Item7, + _ => throw new IndexOutOfRangeException() + }; + + /// + /// Deconstructs this chain. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6, out T7 item7) + { + head = Head; + item1 = Item1; + item2 = Item2; + item3 = Item3; + item4 = Item4; + item5 = Item5; + item6 = Item6; + item7 = Item7; + } + + /// + public override void Dispose() + { + var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); + if (headPtr == IntPtr.Zero) return; + + // Destroy all structures + Marshal.DestroyStructure(headPtr); + var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item1Ptr); + var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item2Ptr); + var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item3Ptr); + var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item4Ptr); + var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item5Ptr); + var item6Ptr = Interlocked.Exchange(ref _item6Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item6Ptr); + var item7Ptr = Interlocked.Exchange(ref _item7Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item7Ptr); + + // Free memory block + Marshal.FreeHGlobal(headPtr); + } +} + +/// +/// A safely manages the pointers of a managed structure chain. +/// +/// The chain type +/// Type of Item 1. +/// Type of Item 2. +/// Type of Item 3. +/// Type of Item 4. +/// Type of Item 5. +/// Type of Item 6. +/// Type of Item 7. +/// Type of Item 8. +public unsafe class ManagedChain : ManagedChain + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain +{ + private IntPtr _headPtr; + + /// + /// Gets a pointer to the current head. + /// + public Chain* HeadPtr => (Chain*) _headPtr; + + /// + /// Gets or sets the head of the chain. + /// + public TChain Head + { + get => Unsafe.AsRef((Chain*) _headPtr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _headPtr)->PNext; + Marshal.StructureToPtr(value, _headPtr, true); + ((Chain*) _headPtr)->PNext = nextPtr; + } + } + + private IntPtr _item1Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item1Ptr => (Chain*) _item1Ptr; + + /// + /// Gets or sets item #1 in the chain. + /// + public T1 Item1 + { + get => Unsafe.AsRef((Chain*) _item1Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item1Ptr)->PNext; + Marshal.StructureToPtr(value, _item1Ptr, true); + ((Chain*) _item1Ptr)->PNext = nextPtr; + } + } + private IntPtr _item2Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item2Ptr => (Chain*) _item2Ptr; + + /// + /// Gets or sets item #2 in the chain. + /// + public T2 Item2 + { + get => Unsafe.AsRef((Chain*) _item2Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item2Ptr)->PNext; + Marshal.StructureToPtr(value, _item2Ptr, true); + ((Chain*) _item2Ptr)->PNext = nextPtr; + } + } + private IntPtr _item3Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item3Ptr => (Chain*) _item3Ptr; + + /// + /// Gets or sets item #3 in the chain. + /// + public T3 Item3 + { + get => Unsafe.AsRef((Chain*) _item3Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item3Ptr)->PNext; + Marshal.StructureToPtr(value, _item3Ptr, true); + ((Chain*) _item3Ptr)->PNext = nextPtr; + } + } + private IntPtr _item4Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item4Ptr => (Chain*) _item4Ptr; + + /// + /// Gets or sets item #4 in the chain. + /// + public T4 Item4 + { + get => Unsafe.AsRef((Chain*) _item4Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item4Ptr)->PNext; + Marshal.StructureToPtr(value, _item4Ptr, true); + ((Chain*) _item4Ptr)->PNext = nextPtr; + } + } + private IntPtr _item5Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item5Ptr => (Chain*) _item5Ptr; + + /// + /// Gets or sets item #5 in the chain. + /// + public T5 Item5 + { + get => Unsafe.AsRef((Chain*) _item5Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item5Ptr)->PNext; + Marshal.StructureToPtr(value, _item5Ptr, true); + ((Chain*) _item5Ptr)->PNext = nextPtr; + } + } + private IntPtr _item6Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item6Ptr => (Chain*) _item6Ptr; + + /// + /// Gets or sets item #6 in the chain. + /// + public T6 Item6 + { + get => Unsafe.AsRef((Chain*) _item6Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item6Ptr)->PNext; + Marshal.StructureToPtr(value, _item6Ptr, true); + ((Chain*) _item6Ptr)->PNext = nextPtr; + } + } + private IntPtr _item7Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item7Ptr => (Chain*) _item7Ptr; + + /// + /// Gets or sets item #7 in the chain. + /// + public T7 Item7 + { + get => Unsafe.AsRef((Chain*) _item7Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item7Ptr)->PNext; + Marshal.StructureToPtr(value, _item7Ptr, true); + ((Chain*) _item7Ptr)->PNext = nextPtr; + } + } + private IntPtr _item8Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item8Ptr => (Chain*) _item8Ptr; + + /// + /// Gets or sets item #8 in the chain. + /// + public T8 Item8 + { + get => Unsafe.AsRef((Chain*) _item8Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item8Ptr)->PNext; + Marshal.StructureToPtr(value, _item8Ptr, true); + ((Chain*) _item8Ptr)->PNext = nextPtr; + } + } + + /// + /// Creates a new with 9 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + var item6Size = Marshal.SizeOf(); + var item7Size = Marshal.SizeOf(); + var item8Size = Marshal.SizeOf(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size); + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + item1.StructureType(); + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + item2.StructureType(); + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + item3.StructureType(); + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + item4.StructureType(); + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + item5.StructureType(); + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + item6.StructureType(); + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + item7.StructureType(); + Marshal.StructureToPtr(item7, _item7Ptr, false); + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + item8.StructureType(); + Marshal.StructureToPtr(item8, _item8Ptr, false); + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + } + + /// + /// Creates a new with 9 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + public ManagedChain(out string errors, TChain chain) + { + // Load existing chain first, so any errors occur before we allocate memory + var head = chain; + var headSize = Marshal.SizeOf(); + var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); + StructureType expectedStructureType; + StringBuilder errorBuilder = new StringBuilder(); + + currentPtr = currentPtr->PNext; + T1 item1 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 9"); + else { + expectedStructureType = item1.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 2; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item1 = Unsafe.AsRef(currentPtr); + } + var item1Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T2 item2 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 9"); + else { + expectedStructureType = item2.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 3; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item2 = Unsafe.AsRef(currentPtr); + } + var item2Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T3 item3 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 9"); + else { + expectedStructureType = item3.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 4; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item3 = Unsafe.AsRef(currentPtr); + } + var item3Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T4 item4 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 9"); + else { + expectedStructureType = item4.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 5; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item4 = Unsafe.AsRef(currentPtr); + } + var item4Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T5 item5 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 9"); + else { + expectedStructureType = item5.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 6; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item5 = Unsafe.AsRef(currentPtr); + } + var item5Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T6 item6 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 9"); + else { + expectedStructureType = item6.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 7; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item6 = Unsafe.AsRef(currentPtr); + } + var item6Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T7 item7 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 9"); + else { + expectedStructureType = item7.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 8; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item7 = Unsafe.AsRef(currentPtr); + } + var item7Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T8 item8 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 9"); + else { + expectedStructureType = item8.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 9; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item8 = Unsafe.AsRef(currentPtr); + if (currentPtr->PNext is not null) + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 9"); + } + var item8Size = Marshal.SizeOf(); + + + // Create string of errors + errors = errorBuilder.ToString().Trim(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + Marshal.StructureToPtr(item7, _item7Ptr, false); + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + Marshal.StructureToPtr(item8, _item8Ptr, false); + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + } + + /// + /// Creates a new with 9 items. + /// + /// The chain to append to. + /// Item 8. + /// + /// Do not forget to dispose the chain if you are no longer using it. + /// + public ManagedChain(ManagedChain previous, T8 item8 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + var item6Size = Marshal.SizeOf(); + var item7Size = Marshal.SizeOf(); + var item8Size = Marshal.SizeOf(); + + var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size; + var newSize = originalSize + item8Size; + + _headPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + + _item1Ptr = _headPtr + headSize; + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + // Append the last structure + item8.StructureType(); + Marshal.StructureToPtr(item8, _item8Ptr, false); + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + } + + /// + /// Creates a new with 10 items, by appending to + /// the end of this chain. + /// + /// Item 9. + /// Type of Item 9 + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Append(T9 item9 = default) + where T9: struct, IExtendsChain + { + return new ManagedChain(this, item9); + } + + /// + public override IEnumerator GetEnumerator() + { + yield return Head; + yield return Item1; + yield return Item2; + yield return Item3; + yield return Item4; + yield return Item5; + yield return Item6; + yield return Item7; + yield return Item8; + } + + /// + public override int Count => 9; + + /// + public override IChainable this[int index] + => index switch + { + 0 => Head, 1 => Item1, + 2 => Item2, + 3 => Item3, + 4 => Item4, + 5 => Item5, + 6 => Item6, + 7 => Item7, + 8 => Item8, + _ => throw new IndexOutOfRangeException() + }; + + /// + /// Deconstructs this chain. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6, out T7 item7, out T8 item8) + { + head = Head; + item1 = Item1; + item2 = Item2; + item3 = Item3; + item4 = Item4; + item5 = Item5; + item6 = Item6; + item7 = Item7; + item8 = Item8; + } + + /// + public override void Dispose() + { + var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); + if (headPtr == IntPtr.Zero) return; + + // Destroy all structures + Marshal.DestroyStructure(headPtr); + var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item1Ptr); + var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item2Ptr); + var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item3Ptr); + var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item4Ptr); + var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item5Ptr); + var item6Ptr = Interlocked.Exchange(ref _item6Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item6Ptr); + var item7Ptr = Interlocked.Exchange(ref _item7Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item7Ptr); + var item8Ptr = Interlocked.Exchange(ref _item8Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item8Ptr); + + // Free memory block + Marshal.FreeHGlobal(headPtr); + } +} + +/// +/// A safely manages the pointers of a managed structure chain. +/// +/// The chain type +/// Type of Item 1. +/// Type of Item 2. +/// Type of Item 3. +/// Type of Item 4. +/// Type of Item 5. +/// Type of Item 6. +/// Type of Item 7. +/// Type of Item 8. +/// Type of Item 9. +public unsafe class ManagedChain : ManagedChain + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain +{ + private IntPtr _headPtr; + + /// + /// Gets a pointer to the current head. + /// + public Chain* HeadPtr => (Chain*) _headPtr; + + /// + /// Gets or sets the head of the chain. + /// + public TChain Head + { + get => Unsafe.AsRef((Chain*) _headPtr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _headPtr)->PNext; + Marshal.StructureToPtr(value, _headPtr, true); + ((Chain*) _headPtr)->PNext = nextPtr; + } + } + + private IntPtr _item1Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item1Ptr => (Chain*) _item1Ptr; + + /// + /// Gets or sets item #1 in the chain. + /// + public T1 Item1 + { + get => Unsafe.AsRef((Chain*) _item1Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item1Ptr)->PNext; + Marshal.StructureToPtr(value, _item1Ptr, true); + ((Chain*) _item1Ptr)->PNext = nextPtr; + } + } + private IntPtr _item2Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item2Ptr => (Chain*) _item2Ptr; + + /// + /// Gets or sets item #2 in the chain. + /// + public T2 Item2 + { + get => Unsafe.AsRef((Chain*) _item2Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item2Ptr)->PNext; + Marshal.StructureToPtr(value, _item2Ptr, true); + ((Chain*) _item2Ptr)->PNext = nextPtr; + } + } + private IntPtr _item3Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item3Ptr => (Chain*) _item3Ptr; + + /// + /// Gets or sets item #3 in the chain. + /// + public T3 Item3 + { + get => Unsafe.AsRef((Chain*) _item3Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item3Ptr)->PNext; + Marshal.StructureToPtr(value, _item3Ptr, true); + ((Chain*) _item3Ptr)->PNext = nextPtr; + } + } + private IntPtr _item4Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item4Ptr => (Chain*) _item4Ptr; + + /// + /// Gets or sets item #4 in the chain. + /// + public T4 Item4 + { + get => Unsafe.AsRef((Chain*) _item4Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item4Ptr)->PNext; + Marshal.StructureToPtr(value, _item4Ptr, true); + ((Chain*) _item4Ptr)->PNext = nextPtr; + } + } + private IntPtr _item5Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item5Ptr => (Chain*) _item5Ptr; + + /// + /// Gets or sets item #5 in the chain. + /// + public T5 Item5 + { + get => Unsafe.AsRef((Chain*) _item5Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item5Ptr)->PNext; + Marshal.StructureToPtr(value, _item5Ptr, true); + ((Chain*) _item5Ptr)->PNext = nextPtr; + } + } + private IntPtr _item6Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item6Ptr => (Chain*) _item6Ptr; + + /// + /// Gets or sets item #6 in the chain. + /// + public T6 Item6 + { + get => Unsafe.AsRef((Chain*) _item6Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item6Ptr)->PNext; + Marshal.StructureToPtr(value, _item6Ptr, true); + ((Chain*) _item6Ptr)->PNext = nextPtr; + } + } + private IntPtr _item7Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item7Ptr => (Chain*) _item7Ptr; + + /// + /// Gets or sets item #7 in the chain. + /// + public T7 Item7 + { + get => Unsafe.AsRef((Chain*) _item7Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item7Ptr)->PNext; + Marshal.StructureToPtr(value, _item7Ptr, true); + ((Chain*) _item7Ptr)->PNext = nextPtr; + } + } + private IntPtr _item8Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item8Ptr => (Chain*) _item8Ptr; + + /// + /// Gets or sets item #8 in the chain. + /// + public T8 Item8 + { + get => Unsafe.AsRef((Chain*) _item8Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item8Ptr)->PNext; + Marshal.StructureToPtr(value, _item8Ptr, true); + ((Chain*) _item8Ptr)->PNext = nextPtr; + } + } + private IntPtr _item9Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item9Ptr => (Chain*) _item9Ptr; + + /// + /// Gets or sets item #9 in the chain. + /// + public T9 Item9 + { + get => Unsafe.AsRef((Chain*) _item9Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item9Ptr)->PNext; + Marshal.StructureToPtr(value, _item9Ptr, true); + ((Chain*) _item9Ptr)->PNext = nextPtr; + } + } + + /// + /// Creates a new with 10 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + var item6Size = Marshal.SizeOf(); + var item7Size = Marshal.SizeOf(); + var item8Size = Marshal.SizeOf(); + var item9Size = Marshal.SizeOf(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size); + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + item1.StructureType(); + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + item2.StructureType(); + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + item3.StructureType(); + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + item4.StructureType(); + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + item5.StructureType(); + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + item6.StructureType(); + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + item7.StructureType(); + Marshal.StructureToPtr(item7, _item7Ptr, false); + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + item8.StructureType(); + Marshal.StructureToPtr(item8, _item8Ptr, false); + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + + _item9Ptr = _item8Ptr + item8Size; + item9.StructureType(); + Marshal.StructureToPtr(item9, _item9Ptr, false); + ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + } + + /// + /// Creates a new with 10 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + public ManagedChain(out string errors, TChain chain) + { + // Load existing chain first, so any errors occur before we allocate memory + var head = chain; + var headSize = Marshal.SizeOf(); + var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); + StructureType expectedStructureType; + StringBuilder errorBuilder = new StringBuilder(); + + currentPtr = currentPtr->PNext; + T1 item1 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 10"); + else { + expectedStructureType = item1.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 2; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item1 = Unsafe.AsRef(currentPtr); + } + var item1Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T2 item2 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 10"); + else { + expectedStructureType = item2.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 3; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item2 = Unsafe.AsRef(currentPtr); + } + var item2Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T3 item3 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 10"); + else { + expectedStructureType = item3.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 4; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item3 = Unsafe.AsRef(currentPtr); + } + var item3Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T4 item4 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 10"); + else { + expectedStructureType = item4.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 5; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item4 = Unsafe.AsRef(currentPtr); + } + var item4Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T5 item5 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 10"); + else { + expectedStructureType = item5.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 6; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item5 = Unsafe.AsRef(currentPtr); + } + var item5Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T6 item6 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 10"); + else { + expectedStructureType = item6.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 7; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item6 = Unsafe.AsRef(currentPtr); + } + var item6Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T7 item7 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 10"); + else { + expectedStructureType = item7.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 8; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item7 = Unsafe.AsRef(currentPtr); + } + var item7Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T8 item8 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 10"); + else { + expectedStructureType = item8.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 9; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item8 = Unsafe.AsRef(currentPtr); + } + var item8Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T9 item9 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 9, expected length 10"); + else { + expectedStructureType = item9.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 10; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item9 = Unsafe.AsRef(currentPtr); + if (currentPtr->PNext is not null) + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 10"); + } + var item9Size = Marshal.SizeOf(); + + + // Create string of errors + errors = errorBuilder.ToString().Trim(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + Marshal.StructureToPtr(item7, _item7Ptr, false); + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + Marshal.StructureToPtr(item8, _item8Ptr, false); + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + + _item9Ptr = _item8Ptr + item8Size; + Marshal.StructureToPtr(item9, _item9Ptr, false); + ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + } + + /// + /// Creates a new with 10 items. + /// + /// The chain to append to. + /// Item 9. + /// + /// Do not forget to dispose the chain if you are no longer using it. + /// + public ManagedChain(ManagedChain previous, T9 item9 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + var item6Size = Marshal.SizeOf(); + var item7Size = Marshal.SizeOf(); + var item8Size = Marshal.SizeOf(); + var item9Size = Marshal.SizeOf(); + + var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size; + var newSize = originalSize + item9Size; + + _headPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + + _item1Ptr = _headPtr + headSize; + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + + _item9Ptr = _item8Ptr + item8Size; + // Append the last structure + item9.StructureType(); + Marshal.StructureToPtr(item9, _item9Ptr, false); + ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + } + + /// + /// Creates a new with 11 items, by appending to + /// the end of this chain. + /// + /// Item 10. + /// Type of Item 10 + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Append(T10 item10 = default) + where T10: struct, IExtendsChain + { + return new ManagedChain(this, item10); + } + + /// + public override IEnumerator GetEnumerator() + { + yield return Head; + yield return Item1; + yield return Item2; + yield return Item3; + yield return Item4; + yield return Item5; + yield return Item6; + yield return Item7; + yield return Item8; + yield return Item9; + } + + /// + public override int Count => 10; + + /// + public override IChainable this[int index] + => index switch + { + 0 => Head, 1 => Item1, + 2 => Item2, + 3 => Item3, + 4 => Item4, + 5 => Item5, + 6 => Item6, + 7 => Item7, + 8 => Item8, + 9 => Item9, + _ => throw new IndexOutOfRangeException() + }; + + /// + /// Deconstructs this chain. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6, out T7 item7, out T8 item8, out T9 item9) + { + head = Head; + item1 = Item1; + item2 = Item2; + item3 = Item3; + item4 = Item4; + item5 = Item5; + item6 = Item6; + item7 = Item7; + item8 = Item8; + item9 = Item9; + } + + /// + public override void Dispose() + { + var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); + if (headPtr == IntPtr.Zero) return; + + // Destroy all structures + Marshal.DestroyStructure(headPtr); + var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item1Ptr); + var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item2Ptr); + var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item3Ptr); + var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item4Ptr); + var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item5Ptr); + var item6Ptr = Interlocked.Exchange(ref _item6Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item6Ptr); + var item7Ptr = Interlocked.Exchange(ref _item7Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item7Ptr); + var item8Ptr = Interlocked.Exchange(ref _item8Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item8Ptr); + var item9Ptr = Interlocked.Exchange(ref _item9Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item9Ptr); + + // Free memory block + Marshal.FreeHGlobal(headPtr); + } +} + +/// +/// A safely manages the pointers of a managed structure chain. +/// +/// The chain type +/// Type of Item 1. +/// Type of Item 2. +/// Type of Item 3. +/// Type of Item 4. +/// Type of Item 5. +/// Type of Item 6. +/// Type of Item 7. +/// Type of Item 8. +/// Type of Item 9. +/// Type of Item 10. +public unsafe class ManagedChain : ManagedChain + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain +{ + private IntPtr _headPtr; + + /// + /// Gets a pointer to the current head. + /// + public Chain* HeadPtr => (Chain*) _headPtr; + + /// + /// Gets or sets the head of the chain. + /// + public TChain Head + { + get => Unsafe.AsRef((Chain*) _headPtr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _headPtr)->PNext; + Marshal.StructureToPtr(value, _headPtr, true); + ((Chain*) _headPtr)->PNext = nextPtr; + } + } + + private IntPtr _item1Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item1Ptr => (Chain*) _item1Ptr; + + /// + /// Gets or sets item #1 in the chain. + /// + public T1 Item1 + { + get => Unsafe.AsRef((Chain*) _item1Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item1Ptr)->PNext; + Marshal.StructureToPtr(value, _item1Ptr, true); + ((Chain*) _item1Ptr)->PNext = nextPtr; + } + } + private IntPtr _item2Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item2Ptr => (Chain*) _item2Ptr; + + /// + /// Gets or sets item #2 in the chain. + /// + public T2 Item2 + { + get => Unsafe.AsRef((Chain*) _item2Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item2Ptr)->PNext; + Marshal.StructureToPtr(value, _item2Ptr, true); + ((Chain*) _item2Ptr)->PNext = nextPtr; + } + } + private IntPtr _item3Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item3Ptr => (Chain*) _item3Ptr; + + /// + /// Gets or sets item #3 in the chain. + /// + public T3 Item3 + { + get => Unsafe.AsRef((Chain*) _item3Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item3Ptr)->PNext; + Marshal.StructureToPtr(value, _item3Ptr, true); + ((Chain*) _item3Ptr)->PNext = nextPtr; + } + } + private IntPtr _item4Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item4Ptr => (Chain*) _item4Ptr; + + /// + /// Gets or sets item #4 in the chain. + /// + public T4 Item4 + { + get => Unsafe.AsRef((Chain*) _item4Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item4Ptr)->PNext; + Marshal.StructureToPtr(value, _item4Ptr, true); + ((Chain*) _item4Ptr)->PNext = nextPtr; + } + } + private IntPtr _item5Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item5Ptr => (Chain*) _item5Ptr; + + /// + /// Gets or sets item #5 in the chain. + /// + public T5 Item5 + { + get => Unsafe.AsRef((Chain*) _item5Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item5Ptr)->PNext; + Marshal.StructureToPtr(value, _item5Ptr, true); + ((Chain*) _item5Ptr)->PNext = nextPtr; + } + } + private IntPtr _item6Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item6Ptr => (Chain*) _item6Ptr; + + /// + /// Gets or sets item #6 in the chain. + /// + public T6 Item6 + { + get => Unsafe.AsRef((Chain*) _item6Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item6Ptr)->PNext; + Marshal.StructureToPtr(value, _item6Ptr, true); + ((Chain*) _item6Ptr)->PNext = nextPtr; + } + } + private IntPtr _item7Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item7Ptr => (Chain*) _item7Ptr; + + /// + /// Gets or sets item #7 in the chain. + /// + public T7 Item7 + { + get => Unsafe.AsRef((Chain*) _item7Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item7Ptr)->PNext; + Marshal.StructureToPtr(value, _item7Ptr, true); + ((Chain*) _item7Ptr)->PNext = nextPtr; + } + } + private IntPtr _item8Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item8Ptr => (Chain*) _item8Ptr; + + /// + /// Gets or sets item #8 in the chain. + /// + public T8 Item8 + { + get => Unsafe.AsRef((Chain*) _item8Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item8Ptr)->PNext; + Marshal.StructureToPtr(value, _item8Ptr, true); + ((Chain*) _item8Ptr)->PNext = nextPtr; + } + } + private IntPtr _item9Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item9Ptr => (Chain*) _item9Ptr; + + /// + /// Gets or sets item #9 in the chain. + /// + public T9 Item9 + { + get => Unsafe.AsRef((Chain*) _item9Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item9Ptr)->PNext; + Marshal.StructureToPtr(value, _item9Ptr, true); + ((Chain*) _item9Ptr)->PNext = nextPtr; + } + } + private IntPtr _item10Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item10Ptr => (Chain*) _item10Ptr; + + /// + /// Gets or sets item #10 in the chain. + /// + public T10 Item10 + { + get => Unsafe.AsRef((Chain*) _item10Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item10Ptr)->PNext; + Marshal.StructureToPtr(value, _item10Ptr, true); + ((Chain*) _item10Ptr)->PNext = nextPtr; + } + } + + /// + /// Creates a new with 11 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + var item6Size = Marshal.SizeOf(); + var item7Size = Marshal.SizeOf(); + var item8Size = Marshal.SizeOf(); + var item9Size = Marshal.SizeOf(); + var item10Size = Marshal.SizeOf(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size); + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + item1.StructureType(); + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + item2.StructureType(); + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + item3.StructureType(); + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + item4.StructureType(); + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + item5.StructureType(); + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + item6.StructureType(); + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + item7.StructureType(); + Marshal.StructureToPtr(item7, _item7Ptr, false); + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + item8.StructureType(); + Marshal.StructureToPtr(item8, _item8Ptr, false); + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + + _item9Ptr = _item8Ptr + item8Size; + item9.StructureType(); + Marshal.StructureToPtr(item9, _item9Ptr, false); + ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + + _item10Ptr = _item9Ptr + item9Size; + item10.StructureType(); + Marshal.StructureToPtr(item10, _item10Ptr, false); + ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; + } + + /// + /// Creates a new with 11 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + public ManagedChain(out string errors, TChain chain) + { + // Load existing chain first, so any errors occur before we allocate memory + var head = chain; + var headSize = Marshal.SizeOf(); + var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); + StructureType expectedStructureType; + StringBuilder errorBuilder = new StringBuilder(); + + currentPtr = currentPtr->PNext; + T1 item1 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 11"); + else { + expectedStructureType = item1.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 2; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item1 = Unsafe.AsRef(currentPtr); + } + var item1Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T2 item2 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 11"); + else { + expectedStructureType = item2.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 3; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item2 = Unsafe.AsRef(currentPtr); + } + var item2Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T3 item3 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 11"); + else { + expectedStructureType = item3.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 4; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item3 = Unsafe.AsRef(currentPtr); + } + var item3Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T4 item4 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 11"); + else { + expectedStructureType = item4.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 5; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item4 = Unsafe.AsRef(currentPtr); + } + var item4Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T5 item5 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 11"); + else { + expectedStructureType = item5.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 6; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item5 = Unsafe.AsRef(currentPtr); + } + var item5Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T6 item6 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 11"); + else { + expectedStructureType = item6.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 7; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item6 = Unsafe.AsRef(currentPtr); + } + var item6Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T7 item7 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 11"); + else { + expectedStructureType = item7.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 8; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item7 = Unsafe.AsRef(currentPtr); + } + var item7Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T8 item8 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 11"); + else { + expectedStructureType = item8.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 9; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item8 = Unsafe.AsRef(currentPtr); + } + var item8Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T9 item9 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 9, expected length 11"); + else { + expectedStructureType = item9.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 10; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item9 = Unsafe.AsRef(currentPtr); + } + var item9Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T10 item10 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 10, expected length 11"); + else { + expectedStructureType = item10.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 11; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item10 = Unsafe.AsRef(currentPtr); + if (currentPtr->PNext is not null) + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 11"); + } + var item10Size = Marshal.SizeOf(); + + + // Create string of errors + errors = errorBuilder.ToString().Trim(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + Marshal.StructureToPtr(item7, _item7Ptr, false); + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + Marshal.StructureToPtr(item8, _item8Ptr, false); + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + + _item9Ptr = _item8Ptr + item8Size; + Marshal.StructureToPtr(item9, _item9Ptr, false); + ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + + _item10Ptr = _item9Ptr + item9Size; + Marshal.StructureToPtr(item10, _item10Ptr, false); + ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; + } + + /// + /// Creates a new with 11 items. + /// + /// The chain to append to. + /// Item 10. + /// + /// Do not forget to dispose the chain if you are no longer using it. + /// + public ManagedChain(ManagedChain previous, T10 item10 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + var item6Size = Marshal.SizeOf(); + var item7Size = Marshal.SizeOf(); + var item8Size = Marshal.SizeOf(); + var item9Size = Marshal.SizeOf(); + var item10Size = Marshal.SizeOf(); + + var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size; + var newSize = originalSize + item10Size; + + _headPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + + _item1Ptr = _headPtr + headSize; + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + + _item9Ptr = _item8Ptr + item8Size; + ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + + _item10Ptr = _item9Ptr + item9Size; + // Append the last structure + item10.StructureType(); + Marshal.StructureToPtr(item10, _item10Ptr, false); + ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; + } + + /// + /// Creates a new with 12 items, by appending to + /// the end of this chain. + /// + /// Item 11. + /// Type of Item 11 + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Append(T11 item11 = default) + where T11: struct, IExtendsChain + { + return new ManagedChain(this, item11); + } + + /// + public override IEnumerator GetEnumerator() + { + yield return Head; + yield return Item1; + yield return Item2; + yield return Item3; + yield return Item4; + yield return Item5; + yield return Item6; + yield return Item7; + yield return Item8; + yield return Item9; + yield return Item10; + } + + /// + public override int Count => 11; + + /// + public override IChainable this[int index] + => index switch + { + 0 => Head, 1 => Item1, + 2 => Item2, + 3 => Item3, + 4 => Item4, + 5 => Item5, + 6 => Item6, + 7 => Item7, + 8 => Item8, + 9 => Item9, + 10 => Item10, + _ => throw new IndexOutOfRangeException() + }; + + /// + /// Deconstructs this chain. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6, out T7 item7, out T8 item8, out T9 item9, out T10 item10) + { + head = Head; + item1 = Item1; + item2 = Item2; + item3 = Item3; + item4 = Item4; + item5 = Item5; + item6 = Item6; + item7 = Item7; + item8 = Item8; + item9 = Item9; + item10 = Item10; + } + + /// + public override void Dispose() + { + var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); + if (headPtr == IntPtr.Zero) return; + + // Destroy all structures + Marshal.DestroyStructure(headPtr); + var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item1Ptr); + var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item2Ptr); + var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item3Ptr); + var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item4Ptr); + var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item5Ptr); + var item6Ptr = Interlocked.Exchange(ref _item6Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item6Ptr); + var item7Ptr = Interlocked.Exchange(ref _item7Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item7Ptr); + var item8Ptr = Interlocked.Exchange(ref _item8Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item8Ptr); + var item9Ptr = Interlocked.Exchange(ref _item9Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item9Ptr); + var item10Ptr = Interlocked.Exchange(ref _item10Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item10Ptr); + + // Free memory block + Marshal.FreeHGlobal(headPtr); + } +} + +/// +/// A safely manages the pointers of a managed structure chain. +/// +/// The chain type +/// Type of Item 1. +/// Type of Item 2. +/// Type of Item 3. +/// Type of Item 4. +/// Type of Item 5. +/// Type of Item 6. +/// Type of Item 7. +/// Type of Item 8. +/// Type of Item 9. +/// Type of Item 10. +/// Type of Item 11. +public unsafe class ManagedChain : ManagedChain + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain +{ + private IntPtr _headPtr; + + /// + /// Gets a pointer to the current head. + /// + public Chain* HeadPtr => (Chain*) _headPtr; + + /// + /// Gets or sets the head of the chain. + /// + public TChain Head + { + get => Unsafe.AsRef((Chain*) _headPtr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _headPtr)->PNext; + Marshal.StructureToPtr(value, _headPtr, true); + ((Chain*) _headPtr)->PNext = nextPtr; + } + } + + private IntPtr _item1Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item1Ptr => (Chain*) _item1Ptr; + + /// + /// Gets or sets item #1 in the chain. + /// + public T1 Item1 + { + get => Unsafe.AsRef((Chain*) _item1Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item1Ptr)->PNext; + Marshal.StructureToPtr(value, _item1Ptr, true); + ((Chain*) _item1Ptr)->PNext = nextPtr; + } + } + private IntPtr _item2Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item2Ptr => (Chain*) _item2Ptr; + + /// + /// Gets or sets item #2 in the chain. + /// + public T2 Item2 + { + get => Unsafe.AsRef((Chain*) _item2Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item2Ptr)->PNext; + Marshal.StructureToPtr(value, _item2Ptr, true); + ((Chain*) _item2Ptr)->PNext = nextPtr; + } + } + private IntPtr _item3Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item3Ptr => (Chain*) _item3Ptr; + + /// + /// Gets or sets item #3 in the chain. + /// + public T3 Item3 + { + get => Unsafe.AsRef((Chain*) _item3Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item3Ptr)->PNext; + Marshal.StructureToPtr(value, _item3Ptr, true); + ((Chain*) _item3Ptr)->PNext = nextPtr; + } + } + private IntPtr _item4Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item4Ptr => (Chain*) _item4Ptr; + + /// + /// Gets or sets item #4 in the chain. + /// + public T4 Item4 + { + get => Unsafe.AsRef((Chain*) _item4Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item4Ptr)->PNext; + Marshal.StructureToPtr(value, _item4Ptr, true); + ((Chain*) _item4Ptr)->PNext = nextPtr; + } + } + private IntPtr _item5Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item5Ptr => (Chain*) _item5Ptr; + + /// + /// Gets or sets item #5 in the chain. + /// + public T5 Item5 + { + get => Unsafe.AsRef((Chain*) _item5Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item5Ptr)->PNext; + Marshal.StructureToPtr(value, _item5Ptr, true); + ((Chain*) _item5Ptr)->PNext = nextPtr; + } + } + private IntPtr _item6Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item6Ptr => (Chain*) _item6Ptr; + + /// + /// Gets or sets item #6 in the chain. + /// + public T6 Item6 + { + get => Unsafe.AsRef((Chain*) _item6Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item6Ptr)->PNext; + Marshal.StructureToPtr(value, _item6Ptr, true); + ((Chain*) _item6Ptr)->PNext = nextPtr; + } + } + private IntPtr _item7Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item7Ptr => (Chain*) _item7Ptr; + + /// + /// Gets or sets item #7 in the chain. + /// + public T7 Item7 + { + get => Unsafe.AsRef((Chain*) _item7Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item7Ptr)->PNext; + Marshal.StructureToPtr(value, _item7Ptr, true); + ((Chain*) _item7Ptr)->PNext = nextPtr; + } + } + private IntPtr _item8Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item8Ptr => (Chain*) _item8Ptr; + + /// + /// Gets or sets item #8 in the chain. + /// + public T8 Item8 + { + get => Unsafe.AsRef((Chain*) _item8Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item8Ptr)->PNext; + Marshal.StructureToPtr(value, _item8Ptr, true); + ((Chain*) _item8Ptr)->PNext = nextPtr; + } + } + private IntPtr _item9Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item9Ptr => (Chain*) _item9Ptr; + + /// + /// Gets or sets item #9 in the chain. + /// + public T9 Item9 + { + get => Unsafe.AsRef((Chain*) _item9Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item9Ptr)->PNext; + Marshal.StructureToPtr(value, _item9Ptr, true); + ((Chain*) _item9Ptr)->PNext = nextPtr; + } + } + private IntPtr _item10Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item10Ptr => (Chain*) _item10Ptr; + + /// + /// Gets or sets item #10 in the chain. + /// + public T10 Item10 + { + get => Unsafe.AsRef((Chain*) _item10Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item10Ptr)->PNext; + Marshal.StructureToPtr(value, _item10Ptr, true); + ((Chain*) _item10Ptr)->PNext = nextPtr; + } + } + private IntPtr _item11Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item11Ptr => (Chain*) _item11Ptr; + + /// + /// Gets or sets item #11 in the chain. + /// + public T11 Item11 + { + get => Unsafe.AsRef((Chain*) _item11Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item11Ptr)->PNext; + Marshal.StructureToPtr(value, _item11Ptr, true); + ((Chain*) _item11Ptr)->PNext = nextPtr; + } + } + + /// + /// Creates a new with 12 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// Item 11. + public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + var item6Size = Marshal.SizeOf(); + var item7Size = Marshal.SizeOf(); + var item8Size = Marshal.SizeOf(); + var item9Size = Marshal.SizeOf(); + var item10Size = Marshal.SizeOf(); + var item11Size = Marshal.SizeOf(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size); + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + item1.StructureType(); + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + item2.StructureType(); + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + item3.StructureType(); + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + item4.StructureType(); + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + item5.StructureType(); + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + item6.StructureType(); + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + item7.StructureType(); + Marshal.StructureToPtr(item7, _item7Ptr, false); + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + item8.StructureType(); + Marshal.StructureToPtr(item8, _item8Ptr, false); + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + + _item9Ptr = _item8Ptr + item8Size; + item9.StructureType(); + Marshal.StructureToPtr(item9, _item9Ptr, false); + ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + + _item10Ptr = _item9Ptr + item9Size; + item10.StructureType(); + Marshal.StructureToPtr(item10, _item10Ptr, false); + ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; + + _item11Ptr = _item10Ptr + item10Size; + item11.StructureType(); + Marshal.StructureToPtr(item11, _item11Ptr, false); + ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; + } + + /// + /// Creates a new with 12 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + public ManagedChain(out string errors, TChain chain) + { + // Load existing chain first, so any errors occur before we allocate memory + var head = chain; + var headSize = Marshal.SizeOf(); + var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); + StructureType expectedStructureType; + StringBuilder errorBuilder = new StringBuilder(); + + currentPtr = currentPtr->PNext; + T1 item1 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 12"); + else { + expectedStructureType = item1.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 2; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item1 = Unsafe.AsRef(currentPtr); + } + var item1Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T2 item2 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 12"); + else { + expectedStructureType = item2.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 3; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item2 = Unsafe.AsRef(currentPtr); + } + var item2Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T3 item3 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 12"); + else { + expectedStructureType = item3.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 4; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item3 = Unsafe.AsRef(currentPtr); + } + var item3Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T4 item4 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 12"); + else { + expectedStructureType = item4.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 5; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item4 = Unsafe.AsRef(currentPtr); + } + var item4Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T5 item5 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 12"); + else { + expectedStructureType = item5.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 6; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item5 = Unsafe.AsRef(currentPtr); + } + var item5Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T6 item6 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 12"); + else { + expectedStructureType = item6.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 7; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item6 = Unsafe.AsRef(currentPtr); + } + var item6Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T7 item7 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 12"); + else { + expectedStructureType = item7.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 8; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item7 = Unsafe.AsRef(currentPtr); + } + var item7Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T8 item8 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 12"); + else { + expectedStructureType = item8.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 9; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item8 = Unsafe.AsRef(currentPtr); + } + var item8Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T9 item9 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 9, expected length 12"); + else { + expectedStructureType = item9.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 10; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item9 = Unsafe.AsRef(currentPtr); + } + var item9Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T10 item10 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 10, expected length 12"); + else { + expectedStructureType = item10.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 11; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item10 = Unsafe.AsRef(currentPtr); + } + var item10Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T11 item11 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 11, expected length 12"); + else { + expectedStructureType = item11.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 12; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item11 = Unsafe.AsRef(currentPtr); + if (currentPtr->PNext is not null) + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 12"); + } + var item11Size = Marshal.SizeOf(); + + + // Create string of errors + errors = errorBuilder.ToString().Trim(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + Marshal.StructureToPtr(item7, _item7Ptr, false); + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + Marshal.StructureToPtr(item8, _item8Ptr, false); + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + + _item9Ptr = _item8Ptr + item8Size; + Marshal.StructureToPtr(item9, _item9Ptr, false); + ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + + _item10Ptr = _item9Ptr + item9Size; + Marshal.StructureToPtr(item10, _item10Ptr, false); + ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; + + _item11Ptr = _item10Ptr + item10Size; + Marshal.StructureToPtr(item11, _item11Ptr, false); + ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; + } + + /// + /// Creates a new with 12 items. + /// + /// The chain to append to. + /// Item 11. + /// + /// Do not forget to dispose the chain if you are no longer using it. + /// + public ManagedChain(ManagedChain previous, T11 item11 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + var item6Size = Marshal.SizeOf(); + var item7Size = Marshal.SizeOf(); + var item8Size = Marshal.SizeOf(); + var item9Size = Marshal.SizeOf(); + var item10Size = Marshal.SizeOf(); + var item11Size = Marshal.SizeOf(); + + var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size; + var newSize = originalSize + item11Size; + + _headPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + + _item1Ptr = _headPtr + headSize; + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + + _item9Ptr = _item8Ptr + item8Size; + ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + + _item10Ptr = _item9Ptr + item9Size; + ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; + + _item11Ptr = _item10Ptr + item10Size; + // Append the last structure + item11.StructureType(); + Marshal.StructureToPtr(item11, _item11Ptr, false); + ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; + } + + /// + /// Creates a new with 13 items, by appending to + /// the end of this chain. + /// + /// Item 12. + /// Type of Item 12 + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Append(T12 item12 = default) + where T12: struct, IExtendsChain + { + return new ManagedChain(this, item12); + } + + /// + public override IEnumerator GetEnumerator() + { + yield return Head; + yield return Item1; + yield return Item2; + yield return Item3; + yield return Item4; + yield return Item5; + yield return Item6; + yield return Item7; + yield return Item8; + yield return Item9; + yield return Item10; + yield return Item11; + } + + /// + public override int Count => 12; + + /// + public override IChainable this[int index] + => index switch + { + 0 => Head, 1 => Item1, + 2 => Item2, + 3 => Item3, + 4 => Item4, + 5 => Item5, + 6 => Item6, + 7 => Item7, + 8 => Item8, + 9 => Item9, + 10 => Item10, + 11 => Item11, + _ => throw new IndexOutOfRangeException() + }; + + /// + /// Deconstructs this chain. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// Item 11. + public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6, out T7 item7, out T8 item8, out T9 item9, out T10 item10, out T11 item11) + { + head = Head; + item1 = Item1; + item2 = Item2; + item3 = Item3; + item4 = Item4; + item5 = Item5; + item6 = Item6; + item7 = Item7; + item8 = Item8; + item9 = Item9; + item10 = Item10; + item11 = Item11; + } + + /// + public override void Dispose() + { + var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); + if (headPtr == IntPtr.Zero) return; + + // Destroy all structures + Marshal.DestroyStructure(headPtr); + var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item1Ptr); + var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item2Ptr); + var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item3Ptr); + var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item4Ptr); + var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item5Ptr); + var item6Ptr = Interlocked.Exchange(ref _item6Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item6Ptr); + var item7Ptr = Interlocked.Exchange(ref _item7Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item7Ptr); + var item8Ptr = Interlocked.Exchange(ref _item8Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item8Ptr); + var item9Ptr = Interlocked.Exchange(ref _item9Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item9Ptr); + var item10Ptr = Interlocked.Exchange(ref _item10Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item10Ptr); + var item11Ptr = Interlocked.Exchange(ref _item11Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item11Ptr); + + // Free memory block + Marshal.FreeHGlobal(headPtr); + } +} + +/// +/// A safely manages the pointers of a managed structure chain. +/// +/// The chain type +/// Type of Item 1. +/// Type of Item 2. +/// Type of Item 3. +/// Type of Item 4. +/// Type of Item 5. +/// Type of Item 6. +/// Type of Item 7. +/// Type of Item 8. +/// Type of Item 9. +/// Type of Item 10. +/// Type of Item 11. +/// Type of Item 12. +public unsafe class ManagedChain : ManagedChain + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain +{ + private IntPtr _headPtr; + + /// + /// Gets a pointer to the current head. + /// + public Chain* HeadPtr => (Chain*) _headPtr; + + /// + /// Gets or sets the head of the chain. + /// + public TChain Head + { + get => Unsafe.AsRef((Chain*) _headPtr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _headPtr)->PNext; + Marshal.StructureToPtr(value, _headPtr, true); + ((Chain*) _headPtr)->PNext = nextPtr; + } + } + + private IntPtr _item1Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item1Ptr => (Chain*) _item1Ptr; + + /// + /// Gets or sets item #1 in the chain. + /// + public T1 Item1 + { + get => Unsafe.AsRef((Chain*) _item1Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item1Ptr)->PNext; + Marshal.StructureToPtr(value, _item1Ptr, true); + ((Chain*) _item1Ptr)->PNext = nextPtr; + } + } + private IntPtr _item2Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item2Ptr => (Chain*) _item2Ptr; + + /// + /// Gets or sets item #2 in the chain. + /// + public T2 Item2 + { + get => Unsafe.AsRef((Chain*) _item2Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item2Ptr)->PNext; + Marshal.StructureToPtr(value, _item2Ptr, true); + ((Chain*) _item2Ptr)->PNext = nextPtr; + } + } + private IntPtr _item3Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item3Ptr => (Chain*) _item3Ptr; + + /// + /// Gets or sets item #3 in the chain. + /// + public T3 Item3 + { + get => Unsafe.AsRef((Chain*) _item3Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item3Ptr)->PNext; + Marshal.StructureToPtr(value, _item3Ptr, true); + ((Chain*) _item3Ptr)->PNext = nextPtr; + } + } + private IntPtr _item4Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item4Ptr => (Chain*) _item4Ptr; + + /// + /// Gets or sets item #4 in the chain. + /// + public T4 Item4 + { + get => Unsafe.AsRef((Chain*) _item4Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item4Ptr)->PNext; + Marshal.StructureToPtr(value, _item4Ptr, true); + ((Chain*) _item4Ptr)->PNext = nextPtr; + } + } + private IntPtr _item5Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item5Ptr => (Chain*) _item5Ptr; + + /// + /// Gets or sets item #5 in the chain. + /// + public T5 Item5 + { + get => Unsafe.AsRef((Chain*) _item5Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item5Ptr)->PNext; + Marshal.StructureToPtr(value, _item5Ptr, true); + ((Chain*) _item5Ptr)->PNext = nextPtr; + } + } + private IntPtr _item6Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item6Ptr => (Chain*) _item6Ptr; + + /// + /// Gets or sets item #6 in the chain. + /// + public T6 Item6 + { + get => Unsafe.AsRef((Chain*) _item6Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item6Ptr)->PNext; + Marshal.StructureToPtr(value, _item6Ptr, true); + ((Chain*) _item6Ptr)->PNext = nextPtr; + } + } + private IntPtr _item7Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item7Ptr => (Chain*) _item7Ptr; + + /// + /// Gets or sets item #7 in the chain. + /// + public T7 Item7 + { + get => Unsafe.AsRef((Chain*) _item7Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item7Ptr)->PNext; + Marshal.StructureToPtr(value, _item7Ptr, true); + ((Chain*) _item7Ptr)->PNext = nextPtr; + } + } + private IntPtr _item8Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item8Ptr => (Chain*) _item8Ptr; + + /// + /// Gets or sets item #8 in the chain. + /// + public T8 Item8 + { + get => Unsafe.AsRef((Chain*) _item8Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item8Ptr)->PNext; + Marshal.StructureToPtr(value, _item8Ptr, true); + ((Chain*) _item8Ptr)->PNext = nextPtr; + } + } + private IntPtr _item9Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item9Ptr => (Chain*) _item9Ptr; + + /// + /// Gets or sets item #9 in the chain. + /// + public T9 Item9 + { + get => Unsafe.AsRef((Chain*) _item9Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item9Ptr)->PNext; + Marshal.StructureToPtr(value, _item9Ptr, true); + ((Chain*) _item9Ptr)->PNext = nextPtr; + } + } + private IntPtr _item10Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item10Ptr => (Chain*) _item10Ptr; + + /// + /// Gets or sets item #10 in the chain. + /// + public T10 Item10 + { + get => Unsafe.AsRef((Chain*) _item10Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item10Ptr)->PNext; + Marshal.StructureToPtr(value, _item10Ptr, true); + ((Chain*) _item10Ptr)->PNext = nextPtr; + } + } + private IntPtr _item11Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item11Ptr => (Chain*) _item11Ptr; + + /// + /// Gets or sets item #11 in the chain. + /// + public T11 Item11 + { + get => Unsafe.AsRef((Chain*) _item11Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item11Ptr)->PNext; + Marshal.StructureToPtr(value, _item11Ptr, true); + ((Chain*) _item11Ptr)->PNext = nextPtr; + } + } + private IntPtr _item12Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item12Ptr => (Chain*) _item12Ptr; + + /// + /// Gets or sets item #12 in the chain. + /// + public T12 Item12 + { + get => Unsafe.AsRef((Chain*) _item12Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item12Ptr)->PNext; + Marshal.StructureToPtr(value, _item12Ptr, true); + ((Chain*) _item12Ptr)->PNext = nextPtr; + } + } + + /// + /// Creates a new with 13 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// Item 11. + /// Item 12. + public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + var item6Size = Marshal.SizeOf(); + var item7Size = Marshal.SizeOf(); + var item8Size = Marshal.SizeOf(); + var item9Size = Marshal.SizeOf(); + var item10Size = Marshal.SizeOf(); + var item11Size = Marshal.SizeOf(); + var item12Size = Marshal.SizeOf(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + item12Size); + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + item1.StructureType(); + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + item2.StructureType(); + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + item3.StructureType(); + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + item4.StructureType(); + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + item5.StructureType(); + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + item6.StructureType(); + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + item7.StructureType(); + Marshal.StructureToPtr(item7, _item7Ptr, false); + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + item8.StructureType(); + Marshal.StructureToPtr(item8, _item8Ptr, false); + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + + _item9Ptr = _item8Ptr + item8Size; + item9.StructureType(); + Marshal.StructureToPtr(item9, _item9Ptr, false); + ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + + _item10Ptr = _item9Ptr + item9Size; + item10.StructureType(); + Marshal.StructureToPtr(item10, _item10Ptr, false); + ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; + + _item11Ptr = _item10Ptr + item10Size; + item11.StructureType(); + Marshal.StructureToPtr(item11, _item11Ptr, false); + ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; + + _item12Ptr = _item11Ptr + item11Size; + item12.StructureType(); + Marshal.StructureToPtr(item12, _item12Ptr, false); + ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; + } + + /// + /// Creates a new with 13 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + public ManagedChain(out string errors, TChain chain) + { + // Load existing chain first, so any errors occur before we allocate memory + var head = chain; + var headSize = Marshal.SizeOf(); + var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); + StructureType expectedStructureType; + StringBuilder errorBuilder = new StringBuilder(); + + currentPtr = currentPtr->PNext; + T1 item1 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 13"); + else { + expectedStructureType = item1.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 2; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item1 = Unsafe.AsRef(currentPtr); + } + var item1Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T2 item2 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 13"); + else { + expectedStructureType = item2.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 3; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item2 = Unsafe.AsRef(currentPtr); + } + var item2Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T3 item3 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 13"); + else { + expectedStructureType = item3.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 4; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item3 = Unsafe.AsRef(currentPtr); + } + var item3Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T4 item4 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 13"); + else { + expectedStructureType = item4.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 5; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item4 = Unsafe.AsRef(currentPtr); + } + var item4Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T5 item5 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 13"); + else { + expectedStructureType = item5.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 6; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item5 = Unsafe.AsRef(currentPtr); + } + var item5Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T6 item6 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 13"); + else { + expectedStructureType = item6.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 7; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item6 = Unsafe.AsRef(currentPtr); + } + var item6Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T7 item7 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 13"); + else { + expectedStructureType = item7.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 8; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item7 = Unsafe.AsRef(currentPtr); + } + var item7Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T8 item8 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 13"); + else { + expectedStructureType = item8.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 9; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item8 = Unsafe.AsRef(currentPtr); + } + var item8Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T9 item9 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 9, expected length 13"); + else { + expectedStructureType = item9.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 10; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item9 = Unsafe.AsRef(currentPtr); + } + var item9Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T10 item10 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 10, expected length 13"); + else { + expectedStructureType = item10.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 11; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item10 = Unsafe.AsRef(currentPtr); + } + var item10Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T11 item11 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 11, expected length 13"); + else { + expectedStructureType = item11.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 12; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item11 = Unsafe.AsRef(currentPtr); + } + var item11Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T12 item12 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 12, expected length 13"); + else { + expectedStructureType = item12.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 13; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item12 = Unsafe.AsRef(currentPtr); + if (currentPtr->PNext is not null) + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 13"); + } + var item12Size = Marshal.SizeOf(); + + + // Create string of errors + errors = errorBuilder.ToString().Trim(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + item12Size); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + Marshal.StructureToPtr(item7, _item7Ptr, false); + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + Marshal.StructureToPtr(item8, _item8Ptr, false); + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + + _item9Ptr = _item8Ptr + item8Size; + Marshal.StructureToPtr(item9, _item9Ptr, false); + ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + + _item10Ptr = _item9Ptr + item9Size; + Marshal.StructureToPtr(item10, _item10Ptr, false); + ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; + + _item11Ptr = _item10Ptr + item10Size; + Marshal.StructureToPtr(item11, _item11Ptr, false); + ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; + + _item12Ptr = _item11Ptr + item11Size; + Marshal.StructureToPtr(item12, _item12Ptr, false); + ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; + } + + /// + /// Creates a new with 13 items. + /// + /// The chain to append to. + /// Item 12. + /// + /// Do not forget to dispose the chain if you are no longer using it. + /// + public ManagedChain(ManagedChain previous, T12 item12 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + var item6Size = Marshal.SizeOf(); + var item7Size = Marshal.SizeOf(); + var item8Size = Marshal.SizeOf(); + var item9Size = Marshal.SizeOf(); + var item10Size = Marshal.SizeOf(); + var item11Size = Marshal.SizeOf(); + var item12Size = Marshal.SizeOf(); + + var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size; + var newSize = originalSize + item12Size; + + _headPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + + _item1Ptr = _headPtr + headSize; + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + + _item9Ptr = _item8Ptr + item8Size; + ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + + _item10Ptr = _item9Ptr + item9Size; + ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; + + _item11Ptr = _item10Ptr + item10Size; + ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; + + _item12Ptr = _item11Ptr + item11Size; + // Append the last structure + item12.StructureType(); + Marshal.StructureToPtr(item12, _item12Ptr, false); + ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; + } + + /// + /// Creates a new with 14 items, by appending to + /// the end of this chain. + /// + /// Item 13. + /// Type of Item 13 + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Append(T13 item13 = default) + where T13: struct, IExtendsChain + { + return new ManagedChain(this, item13); + } + + /// + public override IEnumerator GetEnumerator() + { + yield return Head; + yield return Item1; + yield return Item2; + yield return Item3; + yield return Item4; + yield return Item5; + yield return Item6; + yield return Item7; + yield return Item8; + yield return Item9; + yield return Item10; + yield return Item11; + yield return Item12; + } + + /// + public override int Count => 13; + + /// + public override IChainable this[int index] + => index switch + { + 0 => Head, 1 => Item1, + 2 => Item2, + 3 => Item3, + 4 => Item4, + 5 => Item5, + 6 => Item6, + 7 => Item7, + 8 => Item8, + 9 => Item9, + 10 => Item10, + 11 => Item11, + 12 => Item12, + _ => throw new IndexOutOfRangeException() + }; + + /// + /// Deconstructs this chain. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// Item 11. + /// Item 12. + public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6, out T7 item7, out T8 item8, out T9 item9, out T10 item10, out T11 item11, out T12 item12) + { + head = Head; + item1 = Item1; + item2 = Item2; + item3 = Item3; + item4 = Item4; + item5 = Item5; + item6 = Item6; + item7 = Item7; + item8 = Item8; + item9 = Item9; + item10 = Item10; + item11 = Item11; + item12 = Item12; + } + + /// + public override void Dispose() + { + var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); + if (headPtr == IntPtr.Zero) return; + + // Destroy all structures + Marshal.DestroyStructure(headPtr); + var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item1Ptr); + var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item2Ptr); + var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item3Ptr); + var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item4Ptr); + var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item5Ptr); + var item6Ptr = Interlocked.Exchange(ref _item6Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item6Ptr); + var item7Ptr = Interlocked.Exchange(ref _item7Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item7Ptr); + var item8Ptr = Interlocked.Exchange(ref _item8Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item8Ptr); + var item9Ptr = Interlocked.Exchange(ref _item9Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item9Ptr); + var item10Ptr = Interlocked.Exchange(ref _item10Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item10Ptr); + var item11Ptr = Interlocked.Exchange(ref _item11Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item11Ptr); + var item12Ptr = Interlocked.Exchange(ref _item12Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item12Ptr); + + // Free memory block + Marshal.FreeHGlobal(headPtr); + } +} + +/// +/// A safely manages the pointers of a managed structure chain. +/// +/// The chain type +/// Type of Item 1. +/// Type of Item 2. +/// Type of Item 3. +/// Type of Item 4. +/// Type of Item 5. +/// Type of Item 6. +/// Type of Item 7. +/// Type of Item 8. +/// Type of Item 9. +/// Type of Item 10. +/// Type of Item 11. +/// Type of Item 12. +/// Type of Item 13. +public unsafe class ManagedChain : ManagedChain + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + where T13 : struct, IExtendsChain +{ + private IntPtr _headPtr; + + /// + /// Gets a pointer to the current head. + /// + public Chain* HeadPtr => (Chain*) _headPtr; + + /// + /// Gets or sets the head of the chain. + /// + public TChain Head + { + get => Unsafe.AsRef((Chain*) _headPtr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _headPtr)->PNext; + Marshal.StructureToPtr(value, _headPtr, true); + ((Chain*) _headPtr)->PNext = nextPtr; + } + } + + private IntPtr _item1Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item1Ptr => (Chain*) _item1Ptr; + + /// + /// Gets or sets item #1 in the chain. + /// + public T1 Item1 + { + get => Unsafe.AsRef((Chain*) _item1Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item1Ptr)->PNext; + Marshal.StructureToPtr(value, _item1Ptr, true); + ((Chain*) _item1Ptr)->PNext = nextPtr; + } + } + private IntPtr _item2Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item2Ptr => (Chain*) _item2Ptr; + + /// + /// Gets or sets item #2 in the chain. + /// + public T2 Item2 + { + get => Unsafe.AsRef((Chain*) _item2Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item2Ptr)->PNext; + Marshal.StructureToPtr(value, _item2Ptr, true); + ((Chain*) _item2Ptr)->PNext = nextPtr; + } + } + private IntPtr _item3Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item3Ptr => (Chain*) _item3Ptr; + + /// + /// Gets or sets item #3 in the chain. + /// + public T3 Item3 + { + get => Unsafe.AsRef((Chain*) _item3Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item3Ptr)->PNext; + Marshal.StructureToPtr(value, _item3Ptr, true); + ((Chain*) _item3Ptr)->PNext = nextPtr; + } + } + private IntPtr _item4Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item4Ptr => (Chain*) _item4Ptr; + + /// + /// Gets or sets item #4 in the chain. + /// + public T4 Item4 + { + get => Unsafe.AsRef((Chain*) _item4Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item4Ptr)->PNext; + Marshal.StructureToPtr(value, _item4Ptr, true); + ((Chain*) _item4Ptr)->PNext = nextPtr; + } + } + private IntPtr _item5Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item5Ptr => (Chain*) _item5Ptr; + + /// + /// Gets or sets item #5 in the chain. + /// + public T5 Item5 + { + get => Unsafe.AsRef((Chain*) _item5Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item5Ptr)->PNext; + Marshal.StructureToPtr(value, _item5Ptr, true); + ((Chain*) _item5Ptr)->PNext = nextPtr; + } + } + private IntPtr _item6Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item6Ptr => (Chain*) _item6Ptr; + + /// + /// Gets or sets item #6 in the chain. + /// + public T6 Item6 + { + get => Unsafe.AsRef((Chain*) _item6Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item6Ptr)->PNext; + Marshal.StructureToPtr(value, _item6Ptr, true); + ((Chain*) _item6Ptr)->PNext = nextPtr; + } + } + private IntPtr _item7Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item7Ptr => (Chain*) _item7Ptr; + + /// + /// Gets or sets item #7 in the chain. + /// + public T7 Item7 + { + get => Unsafe.AsRef((Chain*) _item7Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item7Ptr)->PNext; + Marshal.StructureToPtr(value, _item7Ptr, true); + ((Chain*) _item7Ptr)->PNext = nextPtr; + } + } + private IntPtr _item8Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item8Ptr => (Chain*) _item8Ptr; + + /// + /// Gets or sets item #8 in the chain. + /// + public T8 Item8 + { + get => Unsafe.AsRef((Chain*) _item8Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item8Ptr)->PNext; + Marshal.StructureToPtr(value, _item8Ptr, true); + ((Chain*) _item8Ptr)->PNext = nextPtr; + } + } + private IntPtr _item9Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item9Ptr => (Chain*) _item9Ptr; + + /// + /// Gets or sets item #9 in the chain. + /// + public T9 Item9 + { + get => Unsafe.AsRef((Chain*) _item9Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item9Ptr)->PNext; + Marshal.StructureToPtr(value, _item9Ptr, true); + ((Chain*) _item9Ptr)->PNext = nextPtr; + } + } + private IntPtr _item10Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item10Ptr => (Chain*) _item10Ptr; + + /// + /// Gets or sets item #10 in the chain. + /// + public T10 Item10 + { + get => Unsafe.AsRef((Chain*) _item10Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item10Ptr)->PNext; + Marshal.StructureToPtr(value, _item10Ptr, true); + ((Chain*) _item10Ptr)->PNext = nextPtr; + } + } + private IntPtr _item11Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item11Ptr => (Chain*) _item11Ptr; + + /// + /// Gets or sets item #11 in the chain. + /// + public T11 Item11 + { + get => Unsafe.AsRef((Chain*) _item11Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item11Ptr)->PNext; + Marshal.StructureToPtr(value, _item11Ptr, true); + ((Chain*) _item11Ptr)->PNext = nextPtr; + } + } + private IntPtr _item12Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item12Ptr => (Chain*) _item12Ptr; + + /// + /// Gets or sets item #12 in the chain. + /// + public T12 Item12 + { + get => Unsafe.AsRef((Chain*) _item12Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item12Ptr)->PNext; + Marshal.StructureToPtr(value, _item12Ptr, true); + ((Chain*) _item12Ptr)->PNext = nextPtr; + } + } + private IntPtr _item13Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item13Ptr => (Chain*) _item13Ptr; + + /// + /// Gets or sets item #13 in the chain. + /// + public T13 Item13 + { + get => Unsafe.AsRef((Chain*) _item13Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item13Ptr)->PNext; + Marshal.StructureToPtr(value, _item13Ptr, true); + ((Chain*) _item13Ptr)->PNext = nextPtr; + } + } + + /// + /// Creates a new with 14 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// Item 11. + /// Item 12. + /// Item 13. + public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default, T13 item13 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + var item6Size = Marshal.SizeOf(); + var item7Size = Marshal.SizeOf(); + var item8Size = Marshal.SizeOf(); + var item9Size = Marshal.SizeOf(); + var item10Size = Marshal.SizeOf(); + var item11Size = Marshal.SizeOf(); + var item12Size = Marshal.SizeOf(); + var item13Size = Marshal.SizeOf(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + item12Size + item13Size); + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + item1.StructureType(); + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + item2.StructureType(); + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + item3.StructureType(); + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + item4.StructureType(); + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + item5.StructureType(); + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + item6.StructureType(); + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + item7.StructureType(); + Marshal.StructureToPtr(item7, _item7Ptr, false); + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + item8.StructureType(); + Marshal.StructureToPtr(item8, _item8Ptr, false); + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + + _item9Ptr = _item8Ptr + item8Size; + item9.StructureType(); + Marshal.StructureToPtr(item9, _item9Ptr, false); + ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + + _item10Ptr = _item9Ptr + item9Size; + item10.StructureType(); + Marshal.StructureToPtr(item10, _item10Ptr, false); + ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; + + _item11Ptr = _item10Ptr + item10Size; + item11.StructureType(); + Marshal.StructureToPtr(item11, _item11Ptr, false); + ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; + + _item12Ptr = _item11Ptr + item11Size; + item12.StructureType(); + Marshal.StructureToPtr(item12, _item12Ptr, false); + ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; + + _item13Ptr = _item12Ptr + item12Size; + item13.StructureType(); + Marshal.StructureToPtr(item13, _item13Ptr, false); + ((Chain*) _item12Ptr)->PNext = (Chain*) _item13Ptr; + } + + /// + /// Creates a new with 14 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + public ManagedChain(out string errors, TChain chain) + { + // Load existing chain first, so any errors occur before we allocate memory + var head = chain; + var headSize = Marshal.SizeOf(); + var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); + StructureType expectedStructureType; + StringBuilder errorBuilder = new StringBuilder(); + + currentPtr = currentPtr->PNext; + T1 item1 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 14"); + else { + expectedStructureType = item1.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 2; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item1 = Unsafe.AsRef(currentPtr); + } + var item1Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T2 item2 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 14"); + else { + expectedStructureType = item2.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 3; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item2 = Unsafe.AsRef(currentPtr); + } + var item2Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T3 item3 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 14"); + else { + expectedStructureType = item3.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 4; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item3 = Unsafe.AsRef(currentPtr); + } + var item3Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T4 item4 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 14"); + else { + expectedStructureType = item4.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 5; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item4 = Unsafe.AsRef(currentPtr); + } + var item4Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T5 item5 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 14"); + else { + expectedStructureType = item5.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 6; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item5 = Unsafe.AsRef(currentPtr); + } + var item5Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T6 item6 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 14"); + else { + expectedStructureType = item6.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 7; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item6 = Unsafe.AsRef(currentPtr); + } + var item6Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T7 item7 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 14"); + else { + expectedStructureType = item7.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 8; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item7 = Unsafe.AsRef(currentPtr); + } + var item7Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T8 item8 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 14"); + else { + expectedStructureType = item8.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 9; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item8 = Unsafe.AsRef(currentPtr); + } + var item8Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T9 item9 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 9, expected length 14"); + else { + expectedStructureType = item9.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 10; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item9 = Unsafe.AsRef(currentPtr); + } + var item9Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T10 item10 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 10, expected length 14"); + else { + expectedStructureType = item10.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 11; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item10 = Unsafe.AsRef(currentPtr); + } + var item10Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T11 item11 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 11, expected length 14"); + else { + expectedStructureType = item11.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 12; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item11 = Unsafe.AsRef(currentPtr); + } + var item11Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T12 item12 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 12, expected length 14"); + else { + expectedStructureType = item12.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 13; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item12 = Unsafe.AsRef(currentPtr); + } + var item12Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T13 item13 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 13, expected length 14"); + else { + expectedStructureType = item13.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 14; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item13 = Unsafe.AsRef(currentPtr); + if (currentPtr->PNext is not null) + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 14"); + } + var item13Size = Marshal.SizeOf(); + + + // Create string of errors + errors = errorBuilder.ToString().Trim(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + item12Size + item13Size); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + Marshal.StructureToPtr(item2, _item2Ptr, false); + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + Marshal.StructureToPtr(item7, _item7Ptr, false); + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + Marshal.StructureToPtr(item8, _item8Ptr, false); + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + + _item9Ptr = _item8Ptr + item8Size; + Marshal.StructureToPtr(item9, _item9Ptr, false); + ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + + _item10Ptr = _item9Ptr + item9Size; + Marshal.StructureToPtr(item10, _item10Ptr, false); + ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; + + _item11Ptr = _item10Ptr + item10Size; + Marshal.StructureToPtr(item11, _item11Ptr, false); + ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; + + _item12Ptr = _item11Ptr + item11Size; + Marshal.StructureToPtr(item12, _item12Ptr, false); + ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; + + _item13Ptr = _item12Ptr + item12Size; + Marshal.StructureToPtr(item13, _item13Ptr, false); + ((Chain*) _item12Ptr)->PNext = (Chain*) _item13Ptr; + } + + /// + /// Creates a new with 14 items. + /// + /// The chain to append to. + /// Item 13. + /// + /// Do not forget to dispose the chain if you are no longer using it. + /// + public ManagedChain(ManagedChain previous, T13 item13 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + var item2Size = Marshal.SizeOf(); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + var item6Size = Marshal.SizeOf(); + var item7Size = Marshal.SizeOf(); + var item8Size = Marshal.SizeOf(); + var item9Size = Marshal.SizeOf(); + var item10Size = Marshal.SizeOf(); + var item11Size = Marshal.SizeOf(); + var item12Size = Marshal.SizeOf(); + var item13Size = Marshal.SizeOf(); + + var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + item12Size; + var newSize = originalSize + item13Size; + + _headPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + + _item1Ptr = _headPtr + headSize; + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + + _item2Ptr = _item1Ptr + item1Size; + ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + + _item9Ptr = _item8Ptr + item8Size; + ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + + _item10Ptr = _item9Ptr + item9Size; + ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; + + _item11Ptr = _item10Ptr + item10Size; + ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; + + _item12Ptr = _item11Ptr + item11Size; + ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; + + _item13Ptr = _item12Ptr + item12Size; + // Append the last structure + item13.StructureType(); + Marshal.StructureToPtr(item13, _item13Ptr, false); + ((Chain*) _item12Ptr)->PNext = (Chain*) _item13Ptr; + } + + /// + /// Creates a new with 15 items, by appending to + /// the end of this chain. + /// + /// Item 14. + /// Type of Item 14 + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Append(T14 item14 = default) + where T14: struct, IExtendsChain + { + return new ManagedChain(this, item14); + } + + /// + public override IEnumerator GetEnumerator() + { + yield return Head; + yield return Item1; + yield return Item2; + yield return Item3; + yield return Item4; + yield return Item5; + yield return Item6; + yield return Item7; + yield return Item8; + yield return Item9; + yield return Item10; + yield return Item11; + yield return Item12; + yield return Item13; + } + + /// + public override int Count => 14; + + /// + public override IChainable this[int index] + => index switch + { + 0 => Head, 1 => Item1, + 2 => Item2, + 3 => Item3, + 4 => Item4, + 5 => Item5, + 6 => Item6, + 7 => Item7, + 8 => Item8, + 9 => Item9, + 10 => Item10, + 11 => Item11, + 12 => Item12, + 13 => Item13, + _ => throw new IndexOutOfRangeException() + }; + + /// + /// Deconstructs this chain. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// Item 11. + /// Item 12. + /// Item 13. + public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6, out T7 item7, out T8 item8, out T9 item9, out T10 item10, out T11 item11, out T12 item12, out T13 item13) + { + head = Head; + item1 = Item1; + item2 = Item2; + item3 = Item3; + item4 = Item4; + item5 = Item5; + item6 = Item6; + item7 = Item7; + item8 = Item8; + item9 = Item9; + item10 = Item10; + item11 = Item11; + item12 = Item12; + item13 = Item13; + } + + /// + public override void Dispose() + { + var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); + if (headPtr == IntPtr.Zero) return; + + // Destroy all structures + Marshal.DestroyStructure(headPtr); + var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item1Ptr); + var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item2Ptr); + var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item3Ptr); + var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item4Ptr); + var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item5Ptr); + var item6Ptr = Interlocked.Exchange(ref _item6Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item6Ptr); + var item7Ptr = Interlocked.Exchange(ref _item7Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item7Ptr); + var item8Ptr = Interlocked.Exchange(ref _item8Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item8Ptr); + var item9Ptr = Interlocked.Exchange(ref _item9Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item9Ptr); + var item10Ptr = Interlocked.Exchange(ref _item10Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item10Ptr); + var item11Ptr = Interlocked.Exchange(ref _item11Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item11Ptr); + var item12Ptr = Interlocked.Exchange(ref _item12Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item12Ptr); + var item13Ptr = Interlocked.Exchange(ref _item13Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item13Ptr); + + // Free memory block + Marshal.FreeHGlobal(headPtr); + } } /// -/// A safely manages the pointers of a managed structure chain. +/// A safely manages the pointers of a managed structure chain. /// /// The chain type /// Type of Item 1. -public unsafe class ManagedChain : ManagedChain +/// Type of Item 2. +/// Type of Item 3. +/// Type of Item 4. +/// Type of Item 5. +/// Type of Item 6. +/// Type of Item 7. +/// Type of Item 8. +/// Type of Item 9. +/// Type of Item 10. +/// Type of Item 11. +/// Type of Item 12. +/// Type of Item 13. +/// Type of Item 14. +public unsafe class ManagedChain : ManagedChain where TChain : struct, IChainStart where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + where T13 : struct, IExtendsChain + where T14 : struct, IExtendsChain { private IntPtr _headPtr; @@ -274,223 +8667,318 @@ public T1 Item1 ((Chain*) _item1Ptr)->PNext = nextPtr; } } + private IntPtr _item2Ptr; /// - /// Creates a new with 2 items. + /// Gets a pointer to the second item in the chain. /// - /// The head of the chain. - /// Item 1. - public ManagedChain(TChain head = default, T1 item1 = default) - { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size); - head.StructureType(); - Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; - item1.StructureType(); - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - } + public Chain* Item2Ptr => (Chain*) _item2Ptr; /// - /// Creates a new with 2 items from an existing unmanaged chain. + /// Gets or sets item #2 in the chain. /// - /// Any errors loading the chain. - /// The unmanaged chain to use as the basis of this chain. - public ManagedChain(out string errors, TChain chain) + public T2 Item2 { - // Load existing chain first, so any errors occur before we allocate memory - var head = chain; - var headSize = Marshal.SizeOf(); - var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); - StructureType expectedStructureType; - StringBuilder errorBuilder = new StringBuilder(); - - currentPtr = currentPtr->PNext; - T1 item1 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 2"); - else { - expectedStructureType = item1.StructureType(); - if (currentPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 2; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else - item1 = Unsafe.AsRef(currentPtr); - if (currentPtr->PNext is not null) - errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 2"); + get => Unsafe.AsRef((Chain*) _item2Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item2Ptr)->PNext; + Marshal.StructureToPtr(value, _item2Ptr, true); + ((Chain*) _item2Ptr)->PNext = nextPtr; } - var item1Size = Marshal.SizeOf(); + } + private IntPtr _item3Ptr; + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item3Ptr => (Chain*) _item3Ptr; - // Create string of errors - errors = errorBuilder.ToString().Trim(); + /// + /// Gets or sets item #3 in the chain. + /// + public T3 Item3 + { + get => Unsafe.AsRef((Chain*) _item3Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item3Ptr)->PNext; + Marshal.StructureToPtr(value, _item3Ptr, true); + ((Chain*) _item3Ptr)->PNext = nextPtr; + } + } + private IntPtr _item4Ptr; - _headPtr = Marshal.AllocHGlobal(headSize + item1Size); - Marshal.StructureToPtr(head, _headPtr, false); + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item4Ptr => (Chain*) _item4Ptr; - _item1Ptr = _headPtr + headSize; - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + /// + /// Gets or sets item #4 in the chain. + /// + public T4 Item4 + { + get => Unsafe.AsRef((Chain*) _item4Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item4Ptr)->PNext; + Marshal.StructureToPtr(value, _item4Ptr, true); + ((Chain*) _item4Ptr)->PNext = nextPtr; + } } + private IntPtr _item5Ptr; /// - /// Creates a new with 3 items, by appending to - /// the end of this chain. + /// Gets a pointer to the second item in the chain. /// - /// Item 2. - /// Type of Item 2 - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Append(T2 item2 = default) - where T2: struct, IExtendsChain + public Chain* Item5Ptr => (Chain*) _item5Ptr; + + /// + /// Gets or sets item #5 in the chain. + /// + public T5 Item5 { - return new ManagedChain(this, item2); + get => Unsafe.AsRef((Chain*) _item5Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item5Ptr)->PNext; + Marshal.StructureToPtr(value, _item5Ptr, true); + ((Chain*) _item5Ptr)->PNext = nextPtr; + } } + private IntPtr _item6Ptr; - /// - public override IEnumerator GetEnumerator() + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item6Ptr => (Chain*) _item6Ptr; + + /// + /// Gets or sets item #6 in the chain. + /// + public T6 Item6 { - yield return Head; - yield return Item1; + get => Unsafe.AsRef((Chain*) _item6Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item6Ptr)->PNext; + Marshal.StructureToPtr(value, _item6Ptr, true); + ((Chain*) _item6Ptr)->PNext = nextPtr; + } } + private IntPtr _item7Ptr; - /// - public override int Count => 2; + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item7Ptr => (Chain*) _item7Ptr; - /// - public override IChainable this[int index] - => index switch + /// + /// Gets or sets item #7 in the chain. + /// + public T7 Item7 + { + get => Unsafe.AsRef((Chain*) _item7Ptr); + set { - 0 => Head, 1 => Item1, - _ => throw new IndexOutOfRangeException() - }; + value.StructureType(); + var nextPtr = ((Chain*) _item7Ptr)->PNext; + Marshal.StructureToPtr(value, _item7Ptr, true); + ((Chain*) _item7Ptr)->PNext = nextPtr; + } + } + private IntPtr _item8Ptr; /// - /// Deconstructs this chain. + /// Gets a pointer to the second item in the chain. /// - /// The head of the chain. - /// Item 1. - public void Deconstruct(out TChain head, out T1 item1) - { - head = Head; - item1 = Item1; - } + public Chain* Item8Ptr => (Chain*) _item8Ptr; - /// - public override void Dispose() + /// + /// Gets or sets item #8 in the chain. + /// + public T8 Item8 { - var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); - if (headPtr == IntPtr.Zero) return; + get => Unsafe.AsRef((Chain*) _item8Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item8Ptr)->PNext; + Marshal.StructureToPtr(value, _item8Ptr, true); + ((Chain*) _item8Ptr)->PNext = nextPtr; + } + } + private IntPtr _item9Ptr; - // Destroy all structures - Marshal.DestroyStructure(headPtr); - var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item1Ptr); + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item9Ptr => (Chain*) _item9Ptr; - // Free memory block - Marshal.FreeHGlobal(headPtr); + /// + /// Gets or sets item #9 in the chain. + /// + public T9 Item9 + { + get => Unsafe.AsRef((Chain*) _item9Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item9Ptr)->PNext; + Marshal.StructureToPtr(value, _item9Ptr, true); + ((Chain*) _item9Ptr)->PNext = nextPtr; + } } -} + private IntPtr _item10Ptr; -/// -/// A safely manages the pointers of a managed structure chain. -/// -/// The chain type -/// Type of Item 1. -/// Type of Item 2. -public unsafe class ManagedChain : ManagedChain - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain -{ - private IntPtr _headPtr; + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item10Ptr => (Chain*) _item10Ptr; + + /// + /// Gets or sets item #10 in the chain. + /// + public T10 Item10 + { + get => Unsafe.AsRef((Chain*) _item10Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item10Ptr)->PNext; + Marshal.StructureToPtr(value, _item10Ptr, true); + ((Chain*) _item10Ptr)->PNext = nextPtr; + } + } + private IntPtr _item11Ptr; /// - /// Gets a pointer to the current head. + /// Gets a pointer to the second item in the chain. /// - public Chain* HeadPtr => (Chain*) _headPtr; + public Chain* Item11Ptr => (Chain*) _item11Ptr; /// - /// Gets or sets the head of the chain. + /// Gets or sets item #11 in the chain. /// - public TChain Head + public T11 Item11 { - get => Unsafe.AsRef((Chain*) _headPtr); + get => Unsafe.AsRef((Chain*) _item11Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _headPtr)->PNext; - Marshal.StructureToPtr(value, _headPtr, true); - ((Chain*) _headPtr)->PNext = nextPtr; + var nextPtr = ((Chain*) _item11Ptr)->PNext; + Marshal.StructureToPtr(value, _item11Ptr, true); + ((Chain*) _item11Ptr)->PNext = nextPtr; } } + private IntPtr _item12Ptr; - private IntPtr _item1Ptr; + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item12Ptr => (Chain*) _item12Ptr; + + /// + /// Gets or sets item #12 in the chain. + /// + public T12 Item12 + { + get => Unsafe.AsRef((Chain*) _item12Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item12Ptr)->PNext; + Marshal.StructureToPtr(value, _item12Ptr, true); + ((Chain*) _item12Ptr)->PNext = nextPtr; + } + } + private IntPtr _item13Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item1Ptr => (Chain*) _item1Ptr; + public Chain* Item13Ptr => (Chain*) _item13Ptr; /// - /// Gets or sets item #1 in the chain. + /// Gets or sets item #13 in the chain. /// - public T1 Item1 + public T13 Item13 { - get => Unsafe.AsRef((Chain*) _item1Ptr); + get => Unsafe.AsRef((Chain*) _item13Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item1Ptr)->PNext; - Marshal.StructureToPtr(value, _item1Ptr, true); - ((Chain*) _item1Ptr)->PNext = nextPtr; + var nextPtr = ((Chain*) _item13Ptr)->PNext; + Marshal.StructureToPtr(value, _item13Ptr, true); + ((Chain*) _item13Ptr)->PNext = nextPtr; } } - private IntPtr _item2Ptr; + private IntPtr _item14Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item2Ptr => (Chain*) _item2Ptr; + public Chain* Item14Ptr => (Chain*) _item14Ptr; /// - /// Gets or sets item #2 in the chain. + /// Gets or sets item #14 in the chain. /// - public T2 Item2 + public T14 Item14 { - get => Unsafe.AsRef((Chain*) _item2Ptr); + get => Unsafe.AsRef((Chain*) _item14Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item2Ptr)->PNext; - Marshal.StructureToPtr(value, _item2Ptr, true); - ((Chain*) _item2Ptr)->PNext = nextPtr; + var nextPtr = ((Chain*) _item14Ptr)->PNext; + Marshal.StructureToPtr(value, _item14Ptr, true); + ((Chain*) _item14Ptr)->PNext = nextPtr; } } /// - /// Creates a new with 3 items. + /// Creates a new with 15 items. /// /// The head of the chain. /// Item 1. /// Item 2. - public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default) + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// Item 11. + /// Item 12. + /// Item 13. + /// Item 14. + public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default, T13 item13 = default, T14 item14 = default) { // Calculate memory requirements var headSize = Marshal.SizeOf(); var item1Size = Marshal.SizeOf(); var item2Size = Marshal.SizeOf(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size); + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + var item6Size = Marshal.SizeOf(); + var item7Size = Marshal.SizeOf(); + var item8Size = Marshal.SizeOf(); + var item9Size = Marshal.SizeOf(); + var item10Size = Marshal.SizeOf(); + var item11Size = Marshal.SizeOf(); + var item12Size = Marshal.SizeOf(); + var item13Size = Marshal.SizeOf(); + var item14Size = Marshal.SizeOf(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + item12Size + item13Size + item14Size); head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); @@ -503,10 +8991,70 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul item2.StructureType(); Marshal.StructureToPtr(item2, _item2Ptr, false); ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + item3.StructureType(); + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + item4.StructureType(); + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + item5.StructureType(); + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + item6.StructureType(); + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + item7.StructureType(); + Marshal.StructureToPtr(item7, _item7Ptr, false); + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + item8.StructureType(); + Marshal.StructureToPtr(item8, _item8Ptr, false); + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + + _item9Ptr = _item8Ptr + item8Size; + item9.StructureType(); + Marshal.StructureToPtr(item9, _item9Ptr, false); + ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + + _item10Ptr = _item9Ptr + item9Size; + item10.StructureType(); + Marshal.StructureToPtr(item10, _item10Ptr, false); + ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; + + _item11Ptr = _item10Ptr + item10Size; + item11.StructureType(); + Marshal.StructureToPtr(item11, _item11Ptr, false); + ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; + + _item12Ptr = _item11Ptr + item11Size; + item12.StructureType(); + Marshal.StructureToPtr(item12, _item12Ptr, false); + ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; + + _item13Ptr = _item12Ptr + item12Size; + item13.StructureType(); + Marshal.StructureToPtr(item13, _item13Ptr, false); + ((Chain*) _item12Ptr)->PNext = (Chain*) _item13Ptr; + + _item14Ptr = _item13Ptr + item13Size; + item14.StructureType(); + Marshal.StructureToPtr(item14, _item14Ptr, false); + ((Chain*) _item13Ptr)->PNext = (Chain*) _item14Ptr; } /// - /// Creates a new with 3 items from an existing unmanaged chain. + /// Creates a new with 15 items from an existing unmanaged chain. /// /// Any errors loading the chain. /// The unmanaged chain to use as the basis of this chain. @@ -522,7 +9070,7 @@ public ManagedChain(out string errors, TChain chain) currentPtr = currentPtr->PNext; T1 item1 = default; if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 3"); + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 15"); else { expectedStructureType = item1.StructureType(); if (currentPtr->SType != expectedStructureType) { @@ -539,7 +9087,7 @@ public ManagedChain(out string errors, TChain chain) currentPtr = currentPtr->PNext; T2 item2 = default; if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 3"); + errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 15"); else { expectedStructureType = item2.StructureType(); if (currentPtr->SType != expectedStructureType) { @@ -550,16 +9098,220 @@ public ManagedChain(out string errors, TChain chain) .AppendLine(); } else item2 = Unsafe.AsRef(currentPtr); - if (currentPtr->PNext is not null) - errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 3"); } var item2Size = Marshal.SizeOf(); + currentPtr = currentPtr->PNext; + T3 item3 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 15"); + else { + expectedStructureType = item3.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 4; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item3 = Unsafe.AsRef(currentPtr); + } + var item3Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T4 item4 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 15"); + else { + expectedStructureType = item4.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 5; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item4 = Unsafe.AsRef(currentPtr); + } + var item4Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T5 item5 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 15"); + else { + expectedStructureType = item5.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 6; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item5 = Unsafe.AsRef(currentPtr); + } + var item5Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T6 item6 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 15"); + else { + expectedStructureType = item6.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 7; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item6 = Unsafe.AsRef(currentPtr); + } + var item6Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T7 item7 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 15"); + else { + expectedStructureType = item7.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 8; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item7 = Unsafe.AsRef(currentPtr); + } + var item7Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T8 item8 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 15"); + else { + expectedStructureType = item8.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 9; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item8 = Unsafe.AsRef(currentPtr); + } + var item8Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T9 item9 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 9, expected length 15"); + else { + expectedStructureType = item9.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 10; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item9 = Unsafe.AsRef(currentPtr); + } + var item9Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T10 item10 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 10, expected length 15"); + else { + expectedStructureType = item10.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 11; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item10 = Unsafe.AsRef(currentPtr); + } + var item10Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T11 item11 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 11, expected length 15"); + else { + expectedStructureType = item11.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 12; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item11 = Unsafe.AsRef(currentPtr); + } + var item11Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T12 item12 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 12, expected length 15"); + else { + expectedStructureType = item12.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 13; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item12 = Unsafe.AsRef(currentPtr); + } + var item12Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T13 item13 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 13, expected length 15"); + else { + expectedStructureType = item13.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 14; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item13 = Unsafe.AsRef(currentPtr); + } + var item13Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T14 item14 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 14, expected length 15"); + else { + expectedStructureType = item14.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 15; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item14 = Unsafe.AsRef(currentPtr); + if (currentPtr->PNext is not null) + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 15"); + } + var item14Size = Marshal.SizeOf(); + // Create string of errors errors = errorBuilder.ToString().Trim(); - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size); + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + item12Size + item13Size + item14Size); Marshal.StructureToPtr(head, _headPtr, false); _item1Ptr = _headPtr + headSize; @@ -569,25 +9321,85 @@ public ManagedChain(out string errors, TChain chain) _item2Ptr = _item1Ptr + item1Size; Marshal.StructureToPtr(item2, _item2Ptr, false); ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + Marshal.StructureToPtr(item3, _item3Ptr, false); + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + Marshal.StructureToPtr(item4, _item4Ptr, false); + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + Marshal.StructureToPtr(item7, _item7Ptr, false); + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + Marshal.StructureToPtr(item8, _item8Ptr, false); + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + + _item9Ptr = _item8Ptr + item8Size; + Marshal.StructureToPtr(item9, _item9Ptr, false); + ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + + _item10Ptr = _item9Ptr + item9Size; + Marshal.StructureToPtr(item10, _item10Ptr, false); + ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; + + _item11Ptr = _item10Ptr + item10Size; + Marshal.StructureToPtr(item11, _item11Ptr, false); + ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; + + _item12Ptr = _item11Ptr + item11Size; + Marshal.StructureToPtr(item12, _item12Ptr, false); + ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; + + _item13Ptr = _item12Ptr + item12Size; + Marshal.StructureToPtr(item13, _item13Ptr, false); + ((Chain*) _item12Ptr)->PNext = (Chain*) _item13Ptr; + + _item14Ptr = _item13Ptr + item13Size; + Marshal.StructureToPtr(item14, _item14Ptr, false); + ((Chain*) _item13Ptr)->PNext = (Chain*) _item14Ptr; } /// - /// Creates a new with 3 items. + /// Creates a new with 15 items. /// /// The chain to append to. - /// Item 2. + /// Item 14. /// /// Do not forget to dispose the chain if you are no longer using it. /// - public ManagedChain(ManagedChain previous, T2 item2 = default) + public ManagedChain(ManagedChain previous, T14 item14 = default) { // Calculate memory requirements var headSize = Marshal.SizeOf(); var item1Size = Marshal.SizeOf(); var item2Size = Marshal.SizeOf(); - - var originalSize = headSize + item1Size; - var newSize = originalSize + item2Size; + var item3Size = Marshal.SizeOf(); + var item4Size = Marshal.SizeOf(); + var item5Size = Marshal.SizeOf(); + var item6Size = Marshal.SizeOf(); + var item7Size = Marshal.SizeOf(); + var item8Size = Marshal.SizeOf(); + var item9Size = Marshal.SizeOf(); + var item10Size = Marshal.SizeOf(); + var item11Size = Marshal.SizeOf(); + var item12Size = Marshal.SizeOf(); + var item13Size = Marshal.SizeOf(); + var item14Size = Marshal.SizeOf(); + + var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + item12Size + item13Size; + var newSize = originalSize + item14Size; _headPtr = Marshal.AllocHGlobal(newSize); // Block copy original struct data for speed @@ -597,25 +9409,61 @@ public ManagedChain(ManagedChain previous, T2 item2 = default) ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; _item2Ptr = _item1Ptr + item1Size; - // Append the last structure - item2.StructureType(); - Marshal.StructureToPtr(item2, _item2Ptr, false); ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + + _item3Ptr = _item2Ptr + item2Size; + ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + + _item4Ptr = _item3Ptr + item3Size; + ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + + _item9Ptr = _item8Ptr + item8Size; + ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + + _item10Ptr = _item9Ptr + item9Size; + ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; + + _item11Ptr = _item10Ptr + item10Size; + ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; + + _item12Ptr = _item11Ptr + item11Size; + ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; + + _item13Ptr = _item12Ptr + item12Size; + ((Chain*) _item12Ptr)->PNext = (Chain*) _item13Ptr; + + _item14Ptr = _item13Ptr + item13Size; + // Append the last structure + item14.StructureType(); + Marshal.StructureToPtr(item14, _item14Ptr, false); + ((Chain*) _item13Ptr)->PNext = (Chain*) _item14Ptr; } /// - /// Creates a new with 4 items, by appending to + /// Creates a new with 16 items, by appending to /// the end of this chain. /// - /// Item 3. - /// Type of Item 3 + /// Item 15. + /// Type of Item 15 /// /// Do not forget to dispose this chain if you are no longer using it. /// - public ManagedChain Append(T3 item3 = default) - where T3: struct, IExtendsChain + public ManagedChain Append(T15 item15 = default) + where T15: struct, IExtendsChain { - return new ManagedChain(this, item3); + return new ManagedChain(this, item15); } /// @@ -624,10 +9472,22 @@ public override IEnumerator GetEnumerator() yield return Head; yield return Item1; yield return Item2; + yield return Item3; + yield return Item4; + yield return Item5; + yield return Item6; + yield return Item7; + yield return Item8; + yield return Item9; + yield return Item10; + yield return Item11; + yield return Item12; + yield return Item13; + yield return Item14; } /// - public override int Count => 3; + public override int Count => 15; /// public override IChainable this[int index] @@ -635,6 +9495,18 @@ public override IChainable this[int index] { 0 => Head, 1 => Item1, 2 => Item2, + 3 => Item3, + 4 => Item4, + 5 => Item5, + 6 => Item6, + 7 => Item7, + 8 => Item8, + 9 => Item9, + 10 => Item10, + 11 => Item11, + 12 => Item12, + 13 => Item13, + 14 => Item14, _ => throw new IndexOutOfRangeException() }; @@ -644,11 +9516,35 @@ public override IChainable this[int index] /// The head of the chain. /// Item 1. /// Item 2. - public void Deconstruct(out TChain head, out T1 item1, out T2 item2) + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// Item 11. + /// Item 12. + /// Item 13. + /// Item 14. + public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6, out T7 item7, out T8 item8, out T9 item9, out T10 item10, out T11 item11, out T12 item12, out T13 item13, out T14 item14) { head = Head; item1 = Item1; item2 = Item2; + item3 = Item3; + item4 = Item4; + item5 = Item5; + item6 = Item6; + item7 = Item7; + item8 = Item8; + item9 = Item9; + item10 = Item10; + item11 = Item11; + item12 = Item12; + item13 = Item13; + item14 = Item14; } /// @@ -663,6 +9559,30 @@ public override void Dispose() Marshal.DestroyStructure(item1Ptr); var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); Marshal.DestroyStructure(item2Ptr); + var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item3Ptr); + var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item4Ptr); + var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item5Ptr); + var item6Ptr = Interlocked.Exchange(ref _item6Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item6Ptr); + var item7Ptr = Interlocked.Exchange(ref _item7Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item7Ptr); + var item8Ptr = Interlocked.Exchange(ref _item8Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item8Ptr); + var item9Ptr = Interlocked.Exchange(ref _item9Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item9Ptr); + var item10Ptr = Interlocked.Exchange(ref _item10Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item10Ptr); + var item11Ptr = Interlocked.Exchange(ref _item11Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item11Ptr); + var item12Ptr = Interlocked.Exchange(ref _item12Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item12Ptr); + var item13Ptr = Interlocked.Exchange(ref _item13Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item13Ptr); + var item14Ptr = Interlocked.Exchange(ref _item14Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item14Ptr); // Free memory block Marshal.FreeHGlobal(headPtr); @@ -670,17 +9590,41 @@ public override void Dispose() } /// -/// A safely manages the pointers of a managed structure chain. +/// A safely manages the pointers of a managed structure chain. /// /// The chain type /// Type of Item 1. /// Type of Item 2. /// Type of Item 3. -public unsafe class ManagedChain : ManagedChain +/// Type of Item 4. +/// Type of Item 5. +/// Type of Item 6. +/// Type of Item 7. +/// Type of Item 8. +/// Type of Item 9. +/// Type of Item 10. +/// Type of Item 11. +/// Type of Item 12. +/// Type of Item 13. +/// Type of Item 14. +/// Type of Item 15. +public unsafe class ManagedChain : ManagedChain where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + where T13 : struct, IExtendsChain + where T14 : struct, IExtendsChain + where T15 : struct, IExtendsChain { private IntPtr _headPtr; @@ -767,368 +9711,279 @@ public T3 Item3 ((Chain*) _item3Ptr)->PNext = nextPtr; } } + private IntPtr _item4Ptr; /// - /// Creates a new with 4 items. + /// Gets a pointer to the second item in the chain. /// - /// The head of the chain. - /// Item 1. - /// Item 2. - /// Item 3. - public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default) - { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size); - head.StructureType(); - Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; - item1.StructureType(); - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - item2.StructureType(); - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - item3.StructureType(); - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - } + public Chain* Item4Ptr => (Chain*) _item4Ptr; /// - /// Creates a new with 4 items from an existing unmanaged chain. + /// Gets or sets item #4 in the chain. /// - /// Any errors loading the chain. - /// The unmanaged chain to use as the basis of this chain. - public ManagedChain(out string errors, TChain chain) + public T4 Item4 { - // Load existing chain first, so any errors occur before we allocate memory - var head = chain; - var headSize = Marshal.SizeOf(); - var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); - StructureType expectedStructureType; - StringBuilder errorBuilder = new StringBuilder(); - - currentPtr = currentPtr->PNext; - T1 item1 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 4"); - else { - expectedStructureType = item1.StructureType(); - if (currentPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 2; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else - item1 = Unsafe.AsRef(currentPtr); + get => Unsafe.AsRef((Chain*) _item4Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item4Ptr)->PNext; + Marshal.StructureToPtr(value, _item4Ptr, true); + ((Chain*) _item4Ptr)->PNext = nextPtr; } - var item1Size = Marshal.SizeOf(); + } + private IntPtr _item5Ptr; - currentPtr = currentPtr->PNext; - T2 item2 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 4"); - else { - expectedStructureType = item2.StructureType(); - if (currentPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 3; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else - item2 = Unsafe.AsRef(currentPtr); - } - var item2Size = Marshal.SizeOf(); + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item5Ptr => (Chain*) _item5Ptr; - currentPtr = currentPtr->PNext; - T3 item3 = default; - if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 4"); - else { - expectedStructureType = item3.StructureType(); - if (currentPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) - .Append(" at position 4; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else - item3 = Unsafe.AsRef(currentPtr); - if (currentPtr->PNext is not null) - errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 4"); + /// + /// Gets or sets item #5 in the chain. + /// + public T5 Item5 + { + get => Unsafe.AsRef((Chain*) _item5Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item5Ptr)->PNext; + Marshal.StructureToPtr(value, _item5Ptr, true); + ((Chain*) _item5Ptr)->PNext = nextPtr; } - var item3Size = Marshal.SizeOf(); - - - // Create string of errors - errors = errorBuilder.ToString().Trim(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size); - Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; } + private IntPtr _item6Ptr; /// - /// Creates a new with 4 items. + /// Gets a pointer to the second item in the chain. /// - /// The chain to append to. - /// Item 3. - /// - /// Do not forget to dispose the chain if you are no longer using it. - /// - public ManagedChain(ManagedChain previous, T3 item3 = default) - { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - - var originalSize = headSize + item1Size + item2Size; - var newSize = originalSize + item3Size; - - _headPtr = Marshal.AllocHGlobal(newSize); - // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); - - _item1Ptr = _headPtr + headSize; - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - // Append the last structure - item3.StructureType(); - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - } + public Chain* Item6Ptr => (Chain*) _item6Ptr; /// - /// Creates a new with 5 items, by appending to - /// the end of this chain. + /// Gets or sets item #6 in the chain. /// - /// Item 4. - /// Type of Item 4 - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Append(T4 item4 = default) - where T4: struct, IExtendsChain + public T6 Item6 { - return new ManagedChain(this, item4); + get => Unsafe.AsRef((Chain*) _item6Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item6Ptr)->PNext; + Marshal.StructureToPtr(value, _item6Ptr, true); + ((Chain*) _item6Ptr)->PNext = nextPtr; + } } + private IntPtr _item7Ptr; - /// - public override IEnumerator GetEnumerator() + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item7Ptr => (Chain*) _item7Ptr; + + /// + /// Gets or sets item #7 in the chain. + /// + public T7 Item7 { - yield return Head; - yield return Item1; - yield return Item2; - yield return Item3; + get => Unsafe.AsRef((Chain*) _item7Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item7Ptr)->PNext; + Marshal.StructureToPtr(value, _item7Ptr, true); + ((Chain*) _item7Ptr)->PNext = nextPtr; + } } + private IntPtr _item8Ptr; - /// - public override int Count => 4; + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item8Ptr => (Chain*) _item8Ptr; - /// - public override IChainable this[int index] - => index switch + /// + /// Gets or sets item #8 in the chain. + /// + public T8 Item8 + { + get => Unsafe.AsRef((Chain*) _item8Ptr); + set { - 0 => Head, 1 => Item1, - 2 => Item2, - 3 => Item3, - _ => throw new IndexOutOfRangeException() - }; + value.StructureType(); + var nextPtr = ((Chain*) _item8Ptr)->PNext; + Marshal.StructureToPtr(value, _item8Ptr, true); + ((Chain*) _item8Ptr)->PNext = nextPtr; + } + } + private IntPtr _item9Ptr; /// - /// Deconstructs this chain. + /// Gets a pointer to the second item in the chain. /// - /// The head of the chain. - /// Item 1. - /// Item 2. - /// Item 3. - public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item3) - { - head = Head; - item1 = Item1; - item2 = Item2; - item3 = Item3; - } + public Chain* Item9Ptr => (Chain*) _item9Ptr; - /// - public override void Dispose() + /// + /// Gets or sets item #9 in the chain. + /// + public T9 Item9 { - var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); - if (headPtr == IntPtr.Zero) return; + get => Unsafe.AsRef((Chain*) _item9Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item9Ptr)->PNext; + Marshal.StructureToPtr(value, _item9Ptr, true); + ((Chain*) _item9Ptr)->PNext = nextPtr; + } + } + private IntPtr _item10Ptr; - // Destroy all structures - Marshal.DestroyStructure(headPtr); - var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item1Ptr); - var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item2Ptr); - var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item3Ptr); + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item10Ptr => (Chain*) _item10Ptr; - // Free memory block - Marshal.FreeHGlobal(headPtr); + /// + /// Gets or sets item #10 in the chain. + /// + public T10 Item10 + { + get => Unsafe.AsRef((Chain*) _item10Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item10Ptr)->PNext; + Marshal.StructureToPtr(value, _item10Ptr, true); + ((Chain*) _item10Ptr)->PNext = nextPtr; + } } -} - -/// -/// A safely manages the pointers of a managed structure chain. -/// -/// The chain type -/// Type of Item 1. -/// Type of Item 2. -/// Type of Item 3. -/// Type of Item 4. -public unsafe class ManagedChain : ManagedChain - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain -{ - private IntPtr _headPtr; + private IntPtr _item11Ptr; /// - /// Gets a pointer to the current head. + /// Gets a pointer to the second item in the chain. /// - public Chain* HeadPtr => (Chain*) _headPtr; + public Chain* Item11Ptr => (Chain*) _item11Ptr; /// - /// Gets or sets the head of the chain. + /// Gets or sets item #11 in the chain. /// - public TChain Head + public T11 Item11 { - get => Unsafe.AsRef((Chain*) _headPtr); + get => Unsafe.AsRef((Chain*) _item11Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _headPtr)->PNext; - Marshal.StructureToPtr(value, _headPtr, true); - ((Chain*) _headPtr)->PNext = nextPtr; + var nextPtr = ((Chain*) _item11Ptr)->PNext; + Marshal.StructureToPtr(value, _item11Ptr, true); + ((Chain*) _item11Ptr)->PNext = nextPtr; } } - - private IntPtr _item1Ptr; + private IntPtr _item12Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item1Ptr => (Chain*) _item1Ptr; + public Chain* Item12Ptr => (Chain*) _item12Ptr; /// - /// Gets or sets item #1 in the chain. + /// Gets or sets item #12 in the chain. /// - public T1 Item1 + public T12 Item12 { - get => Unsafe.AsRef((Chain*) _item1Ptr); + get => Unsafe.AsRef((Chain*) _item12Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item1Ptr)->PNext; - Marshal.StructureToPtr(value, _item1Ptr, true); - ((Chain*) _item1Ptr)->PNext = nextPtr; + var nextPtr = ((Chain*) _item12Ptr)->PNext; + Marshal.StructureToPtr(value, _item12Ptr, true); + ((Chain*) _item12Ptr)->PNext = nextPtr; } } - private IntPtr _item2Ptr; + private IntPtr _item13Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item2Ptr => (Chain*) _item2Ptr; + public Chain* Item13Ptr => (Chain*) _item13Ptr; /// - /// Gets or sets item #2 in the chain. + /// Gets or sets item #13 in the chain. /// - public T2 Item2 + public T13 Item13 { - get => Unsafe.AsRef((Chain*) _item2Ptr); + get => Unsafe.AsRef((Chain*) _item13Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item2Ptr)->PNext; - Marshal.StructureToPtr(value, _item2Ptr, true); - ((Chain*) _item2Ptr)->PNext = nextPtr; + var nextPtr = ((Chain*) _item13Ptr)->PNext; + Marshal.StructureToPtr(value, _item13Ptr, true); + ((Chain*) _item13Ptr)->PNext = nextPtr; } } - private IntPtr _item3Ptr; + private IntPtr _item14Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item3Ptr => (Chain*) _item3Ptr; + public Chain* Item14Ptr => (Chain*) _item14Ptr; /// - /// Gets or sets item #3 in the chain. + /// Gets or sets item #14 in the chain. /// - public T3 Item3 + public T14 Item14 { - get => Unsafe.AsRef((Chain*) _item3Ptr); + get => Unsafe.AsRef((Chain*) _item14Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item3Ptr)->PNext; - Marshal.StructureToPtr(value, _item3Ptr, true); - ((Chain*) _item3Ptr)->PNext = nextPtr; + var nextPtr = ((Chain*) _item14Ptr)->PNext; + Marshal.StructureToPtr(value, _item14Ptr, true); + ((Chain*) _item14Ptr)->PNext = nextPtr; } } - private IntPtr _item4Ptr; + private IntPtr _item15Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item4Ptr => (Chain*) _item4Ptr; + public Chain* Item15Ptr => (Chain*) _item15Ptr; /// - /// Gets or sets item #4 in the chain. + /// Gets or sets item #15 in the chain. /// - public T4 Item4 + public T15 Item15 { - get => Unsafe.AsRef((Chain*) _item4Ptr); + get => Unsafe.AsRef((Chain*) _item15Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item4Ptr)->PNext; - Marshal.StructureToPtr(value, _item4Ptr, true); - ((Chain*) _item4Ptr)->PNext = nextPtr; + var nextPtr = ((Chain*) _item15Ptr)->PNext; + Marshal.StructureToPtr(value, _item15Ptr, true); + ((Chain*) _item15Ptr)->PNext = nextPtr; } } /// - /// Creates a new with 5 items. + /// Creates a new with 16 items. /// /// The head of the chain. /// Item 1. /// Item 2. /// Item 3. /// Item 4. - public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default) + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// Item 11. + /// Item 12. + /// Item 13. + /// Item 14. + /// Item 15. + public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default, T13 item13 = default, T14 item14 = default, T15 item15 = default) { // Calculate memory requirements var headSize = Marshal.SizeOf(); @@ -1136,8 +9991,19 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul var item2Size = Marshal.SizeOf(); var item3Size = Marshal.SizeOf(); var item4Size = Marshal.SizeOf(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size); + var item5Size = Marshal.SizeOf(); + var item6Size = Marshal.SizeOf(); + var item7Size = Marshal.SizeOf(); + var item8Size = Marshal.SizeOf(); + var item9Size = Marshal.SizeOf(); + var item10Size = Marshal.SizeOf(); + var item11Size = Marshal.SizeOf(); + var item12Size = Marshal.SizeOf(); + var item13Size = Marshal.SizeOf(); + var item14Size = Marshal.SizeOf(); + var item15Size = Marshal.SizeOf(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + item12Size + item13Size + item14Size + item15Size); head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); @@ -1160,10 +10026,65 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul item4.StructureType(); Marshal.StructureToPtr(item4, _item4Ptr, false); ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + item5.StructureType(); + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + item6.StructureType(); + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + item7.StructureType(); + Marshal.StructureToPtr(item7, _item7Ptr, false); + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + item8.StructureType(); + Marshal.StructureToPtr(item8, _item8Ptr, false); + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + + _item9Ptr = _item8Ptr + item8Size; + item9.StructureType(); + Marshal.StructureToPtr(item9, _item9Ptr, false); + ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + + _item10Ptr = _item9Ptr + item9Size; + item10.StructureType(); + Marshal.StructureToPtr(item10, _item10Ptr, false); + ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; + + _item11Ptr = _item10Ptr + item10Size; + item11.StructureType(); + Marshal.StructureToPtr(item11, _item11Ptr, false); + ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; + + _item12Ptr = _item11Ptr + item11Size; + item12.StructureType(); + Marshal.StructureToPtr(item12, _item12Ptr, false); + ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; + + _item13Ptr = _item12Ptr + item12Size; + item13.StructureType(); + Marshal.StructureToPtr(item13, _item13Ptr, false); + ((Chain*) _item12Ptr)->PNext = (Chain*) _item13Ptr; + + _item14Ptr = _item13Ptr + item13Size; + item14.StructureType(); + Marshal.StructureToPtr(item14, _item14Ptr, false); + ((Chain*) _item13Ptr)->PNext = (Chain*) _item14Ptr; + + _item15Ptr = _item14Ptr + item14Size; + item15.StructureType(); + Marshal.StructureToPtr(item15, _item15Ptr, false); + ((Chain*) _item14Ptr)->PNext = (Chain*) _item15Ptr; } /// - /// Creates a new with 5 items from an existing unmanaged chain. + /// Creates a new with 16 items from an existing unmanaged chain. /// /// Any errors loading the chain. /// The unmanaged chain to use as the basis of this chain. @@ -1179,7 +10100,7 @@ public ManagedChain(out string errors, TChain chain) currentPtr = currentPtr->PNext; T1 item1 = default; if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 5"); + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 16"); else { expectedStructureType = item1.StructureType(); if (currentPtr->SType != expectedStructureType) { @@ -1196,7 +10117,7 @@ public ManagedChain(out string errors, TChain chain) currentPtr = currentPtr->PNext; T2 item2 = default; if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 5"); + errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 16"); else { expectedStructureType = item2.StructureType(); if (currentPtr->SType != expectedStructureType) { @@ -1213,7 +10134,7 @@ public ManagedChain(out string errors, TChain chain) currentPtr = currentPtr->PNext; T3 item3 = default; if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 5"); + errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 16"); else { expectedStructureType = item3.StructureType(); if (currentPtr->SType != expectedStructureType) { @@ -1230,7 +10151,7 @@ public ManagedChain(out string errors, TChain chain) currentPtr = currentPtr->PNext; T4 item4 = default; if (currentPtr is null) - errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 5"); + errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 16"); else { expectedStructureType = item4.StructureType(); if (currentPtr->SType != expectedStructureType) { @@ -1241,16 +10162,203 @@ public ManagedChain(out string errors, TChain chain) .AppendLine(); } else item4 = Unsafe.AsRef(currentPtr); - if (currentPtr->PNext is not null) - errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 5"); } var item4Size = Marshal.SizeOf(); + currentPtr = currentPtr->PNext; + T5 item5 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 16"); + else { + expectedStructureType = item5.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 6; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item5 = Unsafe.AsRef(currentPtr); + } + var item5Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T6 item6 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 16"); + else { + expectedStructureType = item6.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 7; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item6 = Unsafe.AsRef(currentPtr); + } + var item6Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T7 item7 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 16"); + else { + expectedStructureType = item7.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 8; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item7 = Unsafe.AsRef(currentPtr); + } + var item7Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T8 item8 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 16"); + else { + expectedStructureType = item8.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 9; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item8 = Unsafe.AsRef(currentPtr); + } + var item8Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T9 item9 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 9, expected length 16"); + else { + expectedStructureType = item9.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 10; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item9 = Unsafe.AsRef(currentPtr); + } + var item9Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T10 item10 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 10, expected length 16"); + else { + expectedStructureType = item10.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 11; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item10 = Unsafe.AsRef(currentPtr); + } + var item10Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T11 item11 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 11, expected length 16"); + else { + expectedStructureType = item11.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 12; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item11 = Unsafe.AsRef(currentPtr); + } + var item11Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T12 item12 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 12, expected length 16"); + else { + expectedStructureType = item12.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 13; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item12 = Unsafe.AsRef(currentPtr); + } + var item12Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T13 item13 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 13, expected length 16"); + else { + expectedStructureType = item13.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 14; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item13 = Unsafe.AsRef(currentPtr); + } + var item13Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T14 item14 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 14, expected length 16"); + else { + expectedStructureType = item14.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 15; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item14 = Unsafe.AsRef(currentPtr); + } + var item14Size = Marshal.SizeOf(); + + currentPtr = currentPtr->PNext; + T15 item15 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 15, expected length 16"); + else { + expectedStructureType = item15.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 16; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item15 = Unsafe.AsRef(currentPtr); + if (currentPtr->PNext is not null) + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 16"); + } + var item15Size = Marshal.SizeOf(); + // Create string of errors errors = errorBuilder.ToString().Trim(); - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size); + _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + item12Size + item13Size + item14Size + item15Size); Marshal.StructureToPtr(head, _headPtr, false); _item1Ptr = _headPtr + headSize; @@ -1268,17 +10376,61 @@ public ManagedChain(out string errors, TChain chain) _item4Ptr = _item3Ptr + item3Size; Marshal.StructureToPtr(item4, _item4Ptr, false); ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + Marshal.StructureToPtr(item5, _item5Ptr, false); + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + Marshal.StructureToPtr(item6, _item6Ptr, false); + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + Marshal.StructureToPtr(item7, _item7Ptr, false); + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + Marshal.StructureToPtr(item8, _item8Ptr, false); + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + + _item9Ptr = _item8Ptr + item8Size; + Marshal.StructureToPtr(item9, _item9Ptr, false); + ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + + _item10Ptr = _item9Ptr + item9Size; + Marshal.StructureToPtr(item10, _item10Ptr, false); + ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; + + _item11Ptr = _item10Ptr + item10Size; + Marshal.StructureToPtr(item11, _item11Ptr, false); + ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; + + _item12Ptr = _item11Ptr + item11Size; + Marshal.StructureToPtr(item12, _item12Ptr, false); + ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; + + _item13Ptr = _item12Ptr + item12Size; + Marshal.StructureToPtr(item13, _item13Ptr, false); + ((Chain*) _item12Ptr)->PNext = (Chain*) _item13Ptr; + + _item14Ptr = _item13Ptr + item13Size; + Marshal.StructureToPtr(item14, _item14Ptr, false); + ((Chain*) _item13Ptr)->PNext = (Chain*) _item14Ptr; + + _item15Ptr = _item14Ptr + item14Size; + Marshal.StructureToPtr(item15, _item15Ptr, false); + ((Chain*) _item14Ptr)->PNext = (Chain*) _item15Ptr; } /// - /// Creates a new with 5 items. + /// Creates a new with 16 items. /// /// The chain to append to. - /// Item 4. + /// Item 15. /// /// Do not forget to dispose the chain if you are no longer using it. /// - public ManagedChain(ManagedChain previous, T4 item4 = default) + public ManagedChain(ManagedChain previous, T15 item15 = default) { // Calculate memory requirements var headSize = Marshal.SizeOf(); @@ -1286,9 +10438,20 @@ public ManagedChain(ManagedChain previous, T4 item4 = defaul var item2Size = Marshal.SizeOf(); var item3Size = Marshal.SizeOf(); var item4Size = Marshal.SizeOf(); - - var originalSize = headSize + item1Size + item2Size + item3Size; - var newSize = originalSize + item4Size; + var item5Size = Marshal.SizeOf(); + var item6Size = Marshal.SizeOf(); + var item7Size = Marshal.SizeOf(); + var item8Size = Marshal.SizeOf(); + var item9Size = Marshal.SizeOf(); + var item10Size = Marshal.SizeOf(); + var item11Size = Marshal.SizeOf(); + var item12Size = Marshal.SizeOf(); + var item13Size = Marshal.SizeOf(); + var item14Size = Marshal.SizeOf(); + var item15Size = Marshal.SizeOf(); + + var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + item12Size + item13Size + item14Size; + var newSize = originalSize + item15Size; _headPtr = Marshal.AllocHGlobal(newSize); // Block copy original struct data for speed @@ -1304,10 +10467,43 @@ public ManagedChain(ManagedChain previous, T4 item4 = defaul ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; _item4Ptr = _item3Ptr + item3Size; - // Append the last structure - item4.StructureType(); - Marshal.StructureToPtr(item4, _item4Ptr, false); ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + + _item5Ptr = _item4Ptr + item4Size; + ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + + _item6Ptr = _item5Ptr + item5Size; + ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + + _item7Ptr = _item6Ptr + item6Size; + ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + + _item8Ptr = _item7Ptr + item7Size; + ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + + _item9Ptr = _item8Ptr + item8Size; + ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + + _item10Ptr = _item9Ptr + item9Size; + ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; + + _item11Ptr = _item10Ptr + item10Size; + ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; + + _item12Ptr = _item11Ptr + item11Size; + ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; + + _item13Ptr = _item12Ptr + item12Size; + ((Chain*) _item12Ptr)->PNext = (Chain*) _item13Ptr; + + _item14Ptr = _item13Ptr + item13Size; + ((Chain*) _item13Ptr)->PNext = (Chain*) _item14Ptr; + + _item15Ptr = _item14Ptr + item14Size; + // Append the last structure + item15.StructureType(); + Marshal.StructureToPtr(item15, _item15Ptr, false); + ((Chain*) _item14Ptr)->PNext = (Chain*) _item15Ptr; } /// @@ -1318,10 +10514,21 @@ public override IEnumerator GetEnumerator() yield return Item2; yield return Item3; yield return Item4; + yield return Item5; + yield return Item6; + yield return Item7; + yield return Item8; + yield return Item9; + yield return Item10; + yield return Item11; + yield return Item12; + yield return Item13; + yield return Item14; + yield return Item15; } /// - public override int Count => 5; + public override int Count => 16; /// public override IChainable this[int index] @@ -1331,6 +10538,17 @@ public override IChainable this[int index] 2 => Item2, 3 => Item3, 4 => Item4, + 5 => Item5, + 6 => Item6, + 7 => Item7, + 8 => Item8, + 9 => Item9, + 10 => Item10, + 11 => Item11, + 12 => Item12, + 13 => Item13, + 14 => Item14, + 15 => Item15, _ => throw new IndexOutOfRangeException() }; @@ -1342,13 +10560,35 @@ public override IChainable this[int index] /// Item 2. /// Item 3. /// Item 4. - public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item3, out T4 item4) + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// Item 11. + /// Item 12. + /// Item 13. + /// Item 14. + /// Item 15. + public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6, out T7 item7, out T8 item8, out T9 item9, out T10 item10, out T11 item11, out T12 item12, out T13 item13, out T14 item14, out T15 item15) { head = Head; item1 = Item1; item2 = Item2; item3 = Item3; item4 = Item4; + item5 = Item5; + item6 = Item6; + item7 = Item7; + item8 = Item8; + item9 = Item9; + item10 = Item10; + item11 = Item11; + item12 = Item12; + item13 = Item13; + item14 = Item14; + item15 = Item15; } /// @@ -1367,6 +10607,28 @@ public override void Dispose() Marshal.DestroyStructure(item3Ptr); var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); Marshal.DestroyStructure(item4Ptr); + var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item5Ptr); + var item6Ptr = Interlocked.Exchange(ref _item6Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item6Ptr); + var item7Ptr = Interlocked.Exchange(ref _item7Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item7Ptr); + var item8Ptr = Interlocked.Exchange(ref _item8Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item8Ptr); + var item9Ptr = Interlocked.Exchange(ref _item9Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item9Ptr); + var item10Ptr = Interlocked.Exchange(ref _item10Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item10Ptr); + var item11Ptr = Interlocked.Exchange(ref _item11Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item11Ptr); + var item12Ptr = Interlocked.Exchange(ref _item12Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item12Ptr); + var item13Ptr = Interlocked.Exchange(ref _item13Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item13Ptr); + var item14Ptr = Interlocked.Exchange(ref _item14Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item14Ptr); + var item15Ptr = Interlocked.Exchange(ref _item15Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item15Ptr); // Free memory block Marshal.FreeHGlobal(headPtr); diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.tt b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.tt index 3747a699c9..c6355fa39e 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.tt +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.tt @@ -2,7 +2,7 @@ <#@ import namespace="System.Text" #> <#@ import namespace="System.Collections.Generic" #> <# - var maximumItems = 5; // TODO use 16/32 in production + var maximumItems = 16; string parameterDocs(int index, string prefix) { diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PrototypeStructChaining.csproj b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PrototypeStructChaining.csproj index 5a7f851a90..643b5beaf5 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PrototypeStructChaining.csproj +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PrototypeStructChaining.csproj @@ -1,7 +1,7 @@ - netstandard2.0 + netstandard2.0;netstandard2.1;netcoreapp3.1;net5.0 10 enable enable From 1c8dbda2ac88e3e0b16e3e4dc86cfd21a54fb3ad Mon Sep 17 00:00:00 2001 From: Craig Dean Date: Sun, 7 Nov 2021 13:07:54 +0000 Subject: [PATCH 24/42] docs: Initial work on Managed Chaining Proposal. --- ...Struct Chaining - #2 Unmanaged Chaining.md | 4 + ...n Struct Chaining - #3 Managed Chaining.md | 280 +++++++++++++++++- 2 files changed, 282 insertions(+), 2 deletions(-) diff --git a/documentation/proposals/Proposal - Vulkan Struct Chaining - #2 Unmanaged Chaining.md b/documentation/proposals/Proposal - Vulkan Struct Chaining - #2 Unmanaged Chaining.md index baf8f809b6..b627be5c9a 100644 --- a/documentation/proposals/Proposal - Vulkan Struct Chaining - #2 Unmanaged Chaining.md +++ b/documentation/proposals/Proposal - Vulkan Struct Chaining - #2 Unmanaged Chaining.md @@ -1,5 +1,9 @@ # Summary +**_This proposal is dependent +on [Proposal - Vulkan Struct Chaining - #1 StructureType correction](Proposal%20-%20Vulkan%20Struct%20Chaining%20-%20%231%20StructureType%20correction.md) +._** + This proposal presents a lightweight mechanism for fluently building Vulkan Structure Chains. You may wish to start with the [Usage section below](#Usage) to aid understanding. There is also a fully working prototype [in the labs](../../src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/). diff --git a/documentation/proposals/Proposal - Vulkan Struct Chaining - #3 Managed Chaining.md b/documentation/proposals/Proposal - Vulkan Struct Chaining - #3 Managed Chaining.md index 6039b01fcd..7b8d3e8f6c 100644 --- a/documentation/proposals/Proposal - Vulkan Struct Chaining - #3 Managed Chaining.md +++ b/documentation/proposals/Proposal - Vulkan Struct Chaining - #3 Managed Chaining.md @@ -1,17 +1,293 @@ # Summary -TODO + +**_This proposal is dependent +on [Proposal - Vulkan Struct Chaining - #2 Unmanaged Chaining](Proposal%20-%20Vulkan%20Struct%20Chaining%20-%20%232%20Unmanaged%20Chaining.md) +._** + +This proposal presents a _managed_ mechanism for safely building, and storing, Vulkan Structure Chains. You may wish to +start with the [previous proposal](Proposal%20-%20Vulkan%20Struct%20Chaining%20-%20%232%20Unmanaged%20Chaining.md), +followed by the [Usage section below](#Usage) to aid understanding. There is also a fully working prototype +[in the labs](../../src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/). + +The [previous proposal](Proposal%20-%20Vulkan%20Struct%20Chaining%20-%20%232%20Unmanaged%20Chaining.md) provided a +lightweight mechanism for building structure chains, but the responsibility for ensuring that the provided structures +did not move remained with the consumer. This provided a useful mechanism for reducing bugs (through compile time and +run time validation of `SType` and `PNext`) and making more readable and compact code, whilst not sacrificing +performance. + +However, many consumers are uncomfortable with pointers, and are especially prone to introducing bugs when placing +structs onto the heap. This proposal provides a convenient `ManagedChain` class, and multiple +descendent `ManagedChain` classes to safely fix the structures in memory and prevent pointer bugs. + +Whenever a structure is loaded into the `ManagedChain` it's `SType` and `PNext` are forced to be correct, preventing +errors. Structures can be replaced at any time, and we be inserted efficiently into the chain as an O(1) operation. # Contributors + - [Craig Dean, DevDecoder](https://github.com/thargy) # Current Status + - [x] Proposed - [ ] Discussed with API Review Board (ARB) - [ ] Approved - [ ] Implemented # Design Decisions -TODO + +- There are no requirements to extend `BuildTools`, or add any additional information to the `IChainable` structures. +- Although the `ManagedChain` generic classes are auto-generated (for convenience) this is done using T4 + templating, an implementation of which is + provided [in the labs](../../src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.tt). + +Open questions: + +- Should we expose 8, 16 or 32 `ManagedChain` classes? +- Do we want to stick with `TChain chain, T1 item1`, or use `T1 item1, T2 item2` ala `Tuple`? +- Although the constructors used by `ManagedChain.Create` and `ManagedChain.Load` could be made `internal`, I don't + propose we do so. Primarily, the main benefit of the static methods is type inference, but, as chain building is + frequently done with defaults then direct constructor access does not have a disadvantage, and can take advantage of + implicit typing when assigning to an already typed field/property. Having both forms available is therefore + convenient. +- Currently `ManagedChain` is the smallest chain, there is a strong case to be made for + a `ManagedChain`. +- The current `Load` methods expect an unmanaged chain that matches the supplied type constraints, and is of the same + length. This is useful, as coders will normally expect a particular chain. We could additionally add more lax `Import` + methods that will import an unmanaged chain into a managed chain by populating any positions with structure types + found in the unmanaged chain, no matter at what position they are found. This is not entirely unreasonable as the + order of chains (after the start) is not fixed in Vulkan, and it will allow importing existing chains where the order + doesn't matter. +- Similar to `Append` do we want a `Truncate` method to trim the end of a chain? +- Similar to `Append` and `Truncate` we could also add `Insert` and `Remove` methods, however this is more complex, as + we'd have to generate multiples of each, for example: + +```csharp +pubilc class ManagedCache ... { + // There would of these methods (not too bad to be fair, the worst case would be maxsize -1 as we + // wouldn't add these methods to the largest possible ManagedCache) + public ManagedCache InsertBeforeHead(TChain newHead) {...} + public ManagedCache InsertBeforeItem1(TNew newValue) {...} + public ManagedCache InsertBeforeItem2(TNew newValue) {...} + + // There would be size-2 of these methods (so wouldn't exist on `ManagedCache`) + public ManagedCache RemoveItem1(out T1 removedValue) {...} + + // This is pretty trivial to add (also wouldn't exist on `ManagedCache`) + public ManagedCache Truncate(out T2 removedValue) {...} +} +``` + +# Usage + +### Creation + +For example: + +```csharp +using var chain = new ManagedChain(); + +// Ensure all STypes set correctly +Assert.Equal(StructureType.PhysicalDeviceFeatures2, chain.Head.SType); +Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, chain.Item1.SType); +Assert.Equal(StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr, chain.Item2.SType); + +// Ensure pointers set correctly +Assert.Equal((nint) chain.Item1Ptr, (nint) chain.Head.PNext); +Assert.Equal((nint) chain.Item2Ptr, (nint) chain.Item1.PNext); +Assert.Equal((nint) 0, (nint) chain.Item2.PNext); +``` + +The structures are held in unmanaged memory, preventing movement by the GC, and ensuring that the ptrs remain fixed. + +You can also use the `ManagedChain.Create(...)` static methods to create `ManagedChain`s. + +### Modifying values + +We can easily modify any value in the `ManagedChain`, and it will maintain the ptrs automatically, e.g.: + +```csharp +using var chain = new ManagedChain(item1: new PhysicalDeviceDescriptorIndexingFeatures +{ + // We can set any non-default values, note we do not need to set SType or PNext + // indeed they will be overwritten. + ShaderInputAttachmentArrayDynamicIndexing = true +}); + +// Ensure all STypes set correctly +Assert.Equal(StructureType.PhysicalDeviceFeatures2, chain.Head.SType); +Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, chain.Item1.SType); +Assert.Equal(StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr, chain.Item2.SType); + +// Ensure pointers set correctly +Assert.Equal((nint) chain.Item1Ptr, (nint) chain.Head.PNext); +Assert.Equal((nint) chain.Item2Ptr, (nint) chain.Item1.PNext); +Assert.Equal((nint) 0, (nint) chain.Item2.PNext); + +// Check our value was set +Assert.True(chain.Item1.ShaderInputAttachmentArrayDynamicIndexing); + +var item1Ptr = chain.Item1Ptr; + +// Overwrite Item1 +chain.Item1 = new PhysicalDeviceDescriptorIndexingFeatures +{ + // Again we do not need to set SType or PNext, which will be set to the correct values + ShaderInputAttachmentArrayDynamicIndexing = false +}; + +// Check our value was cleared +Assert.False(chain.Item1.ShaderInputAttachmentArrayDynamicIndexing); + +// Note all the pointers are still correct (and have not changed) +Assert.Equal((nint) chain.Item1Ptr, (nint) chain.Head.PNext); +Assert.Equal((nint) chain.Item2Ptr, (nint) chain.Item1.PNext); +Assert.Equal((nint) 0, (nint) chain.Item2.PNext); + +// As is the SType +Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, chain.Item1.SType); +``` + +**Note** When we update any item in the chain it overwrites the existing memory, so the ptrs remain fixed. It also +ensures the PNext value is maintained. + +### Appending to a chain + +You can call `Append` on a `ManagedChain` to efficiently create a new, larger, `ManagedChain` with a new item appended +to the end, e.g: + +```csharp +using var chain = new ManagedChain( + item1: new PhysicalDeviceDescriptorIndexingFeatures {ShaderInputAttachmentArrayDynamicIndexing = true}); + +// The new chain, will efficiently copy the old chain and append a new structure to the end +using var newChain = chain.Append(); +// You will usualy wish to dispose the old chain here, the two chains are now independent of each other. + +// Check the flag from the first chain is still set in the new chain. +Assert.True(newChain.Item1.ShaderInputAttachmentArrayDynamicIndexing); +``` + +### Loading from an unmanaged chain + +If you have created an unmanaged chain and would like to load that into a `ManagedChain` you can use one of the +`ManagedChain.Load` methods: + +```csharp +// Load an unmanaged chain +var indexingFeatures = new PhysicalDeviceDescriptorIndexingFeatures +{ + ShaderInputAttachmentArrayDynamicIndexing = true +}; +PhysicalDeviceFeatures2 +.Chain(out var unmanagedChain) +.SetNext(ref indexingFeatures) +.AddNext(out PhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeaturesKhr); + +// Loads a new managed chain from an unmanaged chain +using var managedChain = + ManagedChain.Load(unmanagedChain, out var errors); + +// Check we had no loading errors +Assert.Equal("", errors); + +// Check the flag still set +Assert.True(managedChain.Item1.ShaderInputAttachmentArrayDynamicIndexing); +``` + +The full version of the `Load` method returns an output parameter `errors` as it's first parameter. The `errors` +parameter will be `string.Empty` if there are no errors, otherwise each line will contain a separate error for each +issue found during loading. There is also an overload that accepts a single argument `chain` for when you don't care if +there are any errors. Either method always succeeds, even if the unmanaged chain doesn't match exactly - for example it +is shorter or longer than the chain being loaded, or if the managed chain has different structure types in any of the +positions. Any structure type in the expected position will always be loaded into the new `ManagedChain`. + +```csharp +var indexingFeatures = new PhysicalDeviceDescriptorIndexingFeatures +{ + ShaderInputAttachmentArrayDynamicIndexing = true +}; +// Load an unmanaged chain +DeviceCreateInfo + .Chain(out var unmanagedChain) + .AddNext(out PhysicalDeviceFeatures2 features2) + .SetNext(ref indexingFeatures) + .AddNext(out PhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeaturesKhr); + +// Loads a new managed chain from an unmanaged chain +using var managedChain = + new ManagedChain< + DeviceCreateInfo, + // Note we are supplied a PhysicalDeviceFeatures2 here from the unmanaged chain + PhysicalDeviceAccelerationStructureFeaturesKHR, + PhysicalDeviceDescriptorIndexingFeatures, + PhysicalDeviceAccelerationStructureFeaturesKHR, + // Note that the unmanaged chain did not supply a 5th entry + PhysicalDeviceFeatures2>(unmanagedChain, out var errors); + +// Check for errors +Assert.Equal( +@"The unmanaged chain has a structure type PhysicalDeviceFeatures2Khr at position 2; expected PhysicalDeviceAccelerationStructureFeaturesKhr +The unmanaged chain was length 4, expected length 5", + errors); + +// Despite the errors indexing features was at the right location so was loaded +Assert.True(managedChain.Item2.ShaderInputAttachmentArrayDynamicIndexing); +``` + +Notice that the above form use the constructor as an alternative. + +### IReadOnlyList + +All the fully generic `ManageChain` types extend `ManagedChain` which implements `IDisposable` +and `IReadOnlyList`. The latter allowing for easy consumption of any `ManagedChain`, e.g.: + +```csharp +using var chain = new ManagedChain(); + +Assert.Equal(3, chain.Count); + +// Ensure all STypes set correctly using indexer +Assert.Equal(StructureType.PhysicalDeviceFeatures2, chain[0].StructureType()); +Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, chain[1].StructureType()); +Assert.Equal(StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr, chain[2].StructureType()); + +Assert.Throws(() => chain[3]); + +// Get array using IEnumerable implementation +IChainable[] structures = chain.ToArray(); + +// Check concrete types +Assert.IsType(structures[0]); +Assert.IsType(structures[1]); +Assert.IsType(structures[2]); +``` + +### Deconstruction + +Each `ManageChain` has a corresponding deconstructor for convenience, e.g.: + +```csharp +using var chain = new ManagedChain(); + +var (physicalDeviceFeatures2, indexingFeatures, accelerationStructureFeaturesKhr) = chain; + +// Ensure all STypes set correctly +Assert.Equal(StructureType.PhysicalDeviceFeatures2, physicalDeviceFeatures2.SType); +Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, indexingFeatures.SType); +Assert.Equal(StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr, accelerationStructureFeaturesKhr.SType); +``` + +### Disposal + +As each `ManagedChain` holds the underlying structures in unmanaged memory (to prevent them being moved and their +pointers being invalidated), then it is critical you dispose them; either by calling `Dispose()` or by using a `using` +statement. # Proposed API + TODO \ No newline at end of file From af6c5a8905f1509dd7ada4ab08917fb19b939d36 Mon Sep 17 00:00:00 2001 From: Craig Dean Date: Sun, 7 Nov 2021 15:31:49 +0000 Subject: [PATCH 25/42] docs: Finished draft proposal for Managed Chains --- ...n Struct Chaining - #3 Managed Chaining.md | 352 +++++++++++++++--- 1 file changed, 308 insertions(+), 44 deletions(-) diff --git a/documentation/proposals/Proposal - Vulkan Struct Chaining - #3 Managed Chaining.md b/documentation/proposals/Proposal - Vulkan Struct Chaining - #3 Managed Chaining.md index 7b8d3e8f6c..8ffb1cb6e5 100644 --- a/documentation/proposals/Proposal - Vulkan Struct Chaining - #3 Managed Chaining.md +++ b/documentation/proposals/Proposal - Vulkan Struct Chaining - #3 Managed Chaining.md @@ -7,7 +7,7 @@ on [Proposal - Vulkan Struct Chaining - #2 Unmanaged Chaining](Proposal%20-%20Vu This proposal presents a _managed_ mechanism for safely building, and storing, Vulkan Structure Chains. You may wish to start with the [previous proposal](Proposal%20-%20Vulkan%20Struct%20Chaining%20-%20%232%20Unmanaged%20Chaining.md), followed by the [Usage section below](#Usage) to aid understanding. There is also a fully working prototype -[in the labs](../../src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/). +[in the labs](../../src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining). The [previous proposal](Proposal%20-%20Vulkan%20Struct%20Chaining%20-%20%232%20Unmanaged%20Chaining.md) provided a lightweight mechanism for building structure chains, but the responsibility for ensuring that the provided structures @@ -19,8 +19,8 @@ However, many consumers are uncomfortable with pointers, and are especially pron structs onto the heap. This proposal provides a convenient `ManagedChain` class, and multiple descendent `ManagedChain` classes to safely fix the structures in memory and prevent pointer bugs. -Whenever a structure is loaded into the `ManagedChain` it's `SType` and `PNext` are forced to be correct, preventing -errors. Structures can be replaced at any time, and we be inserted efficiently into the chain as an O(1) operation. +Whenever a structure is loaded into the `ManagedChain` its `SType` and `PNext` are forced to be correct, preventing +errors. Structures can be replaced at any time, and will be inserted efficiently into the chain as an O(1) operation. # Contributors @@ -39,6 +39,12 @@ errors. Structures can be replaced at any time, and we be inserted efficiently i - Although the `ManagedChain` generic classes are auto-generated (for convenience) this is done using T4 templating, an implementation of which is provided [in the labs](../../src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.tt). +- For improved performance, the chain's structures are held in a single block of contiguous unmanaged memory, as the + memory is unmanaged, the position of the structures remains fixed, even though the containing object can be safely + moved around by the GC in the heap. +- The structure accessors return a copy of the structures, and always correct the `SType` and `PNext` on input. Even + though the `PNext` values are exposed there is no way to modify them from outside the class, guaranteeing their + safety. Open questions: @@ -58,12 +64,14 @@ Open questions: order of chains (after the start) is not fixed in Vulkan, and it will allow importing existing chains where the order doesn't matter. - Similar to `Append` do we want a `Truncate` method to trim the end of a chain? -- Similar to `Append` and `Truncate` we could also add `Insert` and `Remove` methods, however this is more complex, as - we'd have to generate multiples of each, for example: +- Similar to `Append` and `Truncate` we could also add `Insert` and `Remove` methods, though slightly more complex, as + we'd have to generate multiples of each, it is not difficult to do, for example: ```csharp pubilc class ManagedCache ... { - // There would of these methods (not too bad to be fair, the worst case would be maxsize -1 as we + ... + + // There would be of these methods (not too bad to be fair, the worst case would be maxsize -1 as we // wouldn't add these methods to the largest possible ManagedCache) public ManagedCache InsertBeforeHead(TChain newHead) {...} public ManagedCache InsertBeforeItem1(TNew newValue) {...} @@ -81,7 +89,9 @@ pubilc class ManagedCache ... { ### Creation -For example: +The following will create a chain starting with `PhysicalDeviceFeatures2`, pointing +to `PhysicalDeviceDescriptorIndexingFeatures` and finishing with a `PhysicalDeviceAccelerationStructureFeaturesKHR` +structure: ```csharp using var chain = new ManagedChain(); +``` -You can also use the `ManagedChain.Create(...)` static methods to create `ManagedChain`s. +or, using generic type inference: + +```csharp +using var chain = ManagedChain.Create( + new DeviceCreateInfo { Flags = 1U }, + default(PhysicalDeviceFeatures2), + default(PhysicalDeviceDescriptorIndexingFeatures) +); +``` ### Modifying values -We can easily modify any value in the `ManagedChain`, and it will maintain the ptrs automatically, e.g.: +We can easily modify any value in the `ManagedChain`, and it will maintain the pointers automatically, e.g.: ```csharp -using var chain = new ManagedChain(item1: new PhysicalDeviceDescriptorIndexingFeatures -{ - // We can set any non-default values, note we do not need to set SType or PNext - // indeed they will be overwritten. - ShaderInputAttachmentArrayDynamicIndexing = true -}); +using var chain = ManagedChain.Create< + DeviceCreateInfo, + PhysicalDeviceFeatures2, + PhysicalDeviceDescriptorIndexingFeatures>(); // Ensure all STypes set correctly -Assert.Equal(StructureType.PhysicalDeviceFeatures2, chain.Head.SType); -Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, chain.Item1.SType); -Assert.Equal(StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr, chain.Item2.SType); +Assert.Equal(StructureType.DeviceCreateInfo, chain.Head.SType); +Assert.Equal(StructureType.PhysicalDeviceFeatures2, chain.Item1.SType); +Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, chain.Item2.SType); // Ensure pointers set correctly Assert.Equal((nint) chain.Item1Ptr, (nint) chain.Head.PNext); Assert.Equal((nint) chain.Item2Ptr, (nint) chain.Item1.PNext); Assert.Equal((nint) 0, (nint) chain.Item2.PNext); -// Check our value was set -Assert.True(chain.Item1.ShaderInputAttachmentArrayDynamicIndexing); +Assert.Equal(0U, chain.Head.Flags); -var item1Ptr = chain.Item1Ptr; +var headPtr = chain.HeadPtr; -// Overwrite Item1 -chain.Item1 = new PhysicalDeviceDescriptorIndexingFeatures -{ - // Again we do not need to set SType or PNext, which will be set to the correct values - ShaderInputAttachmentArrayDynamicIndexing = false -}; +// Get the current head (this is a copy) +var head = chain.Head; +// Update the flags +head.Flags = 1U; +// Update the chain +chain.Head = head; -// Check our value was cleared -Assert.False(chain.Item1.ShaderInputAttachmentArrayDynamicIndexing); +Assert.Equal(1U, chain.Head.Flags); -// Note all the pointers are still correct (and have not changed) +// The head ptr should not change, as we overwrite the same memory location with the new value +Assert.Equal((nint) headPtr, (nint) chain.HeadPtr); +// But the next pointer should not change Assert.Equal((nint) chain.Item1Ptr, (nint) chain.Head.PNext); -Assert.Equal((nint) chain.Item2Ptr, (nint) chain.Item1.PNext); -Assert.Equal((nint) 0, (nint) chain.Item2.PNext); - -// As is the SType -Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, chain.Item1.SType); ``` -**Note** When we update any item in the chain it overwrites the existing memory, so the ptrs remain fixed. It also -ensures the PNext value is maintained. +**Note** When we update any item in the chain it overwrites the existing memory, so the pointers remain fixed. It also +ensures the `PNext` value pointing to it is maintained. ### Appending to a chain @@ -169,6 +188,10 @@ using var newChain = chain.Append(unmanagedChain, out var errors); + PhysicalDeviceAccelerationStructureFeaturesKHR>(out var errors, unmanagedChain); // Check we had no loading errors -Assert.Equal("", errors); +Assert.Equal(string.Empty, errors); // Check the flag still set Assert.True(managedChain.Item1.ShaderInputAttachmentArrayDynamicIndexing); @@ -225,7 +248,7 @@ using var managedChain = PhysicalDeviceDescriptorIndexingFeatures, PhysicalDeviceAccelerationStructureFeaturesKHR, // Note that the unmanaged chain did not supply a 5th entry - PhysicalDeviceFeatures2>(unmanagedChain, out var errors); + PhysicalDeviceFeatures2>(out var errors, unmanagedChain ); // Check for errors Assert.Equal( @@ -237,7 +260,8 @@ The unmanaged chain was length 4, expected length 5", Assert.True(managedChain.Item2.ShaderInputAttachmentArrayDynamicIndexing); ``` -Notice that the above form use the constructor as an alternative. +Notice that the above form uses the equivalent constructor as an alternative to the `Load` method. There is no +equivalent constructor to `Load(TChain)` as that would be ambiguous. ### IReadOnlyList @@ -290,4 +314,244 @@ statement. # Proposed API -TODO \ No newline at end of file +## Abstract base class + +The `ManagedChain`, non-generic abstract base class provides an abstract implementation of `IReadOnlyList`, +and defines static `Create` and `Load` methods for each size of chain. + +```csharp +public abstract class ManagedChain : IReadOnlyList, IDisposable +{ + /// + public abstract IEnumerator GetEnumerator(); + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + + /// + public abstract int Count { get; } + + /// + public abstract IChainable this[int index] { get; } + + /// + public abstract void Dispose(); + + /// + /// Creates a new with 2 items. + /// + /// The head of the chain. + /// Item 1. + /// The chain type + /// Type of Item 1. + /// A new with 2 items. + public static ManagedChain Create(TChain head = default, T1 item1 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + { + return new(head, item1); + } + + /// + /// Loads a new with 2 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + /// A new with 2 items. + public static ManagedChain Load(out string errors, TChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + { + return new(out errors, chain); + } + + // Only showing one example of Create/Load methods + ... +} +``` + +## Concrete generic classes + +A class is generated for each valid size of a chain, here is one example: + +```csharp +/// +/// A safely manages the pointers of a managed structure chain. +/// +/// The chain type +/// Type of Item 1. +public unsafe class ManagedChain : ManagedChain + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain +{ + private IntPtr _headPtr; + + /// + /// Gets a pointer to the current head. + /// + public Chain* HeadPtr => (Chain*) _headPtr; + + /// + /// Gets or sets the head of the chain. + /// + public TChain Head + { + get => Unsafe.AsRef((Chain*) _headPtr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _headPtr)->PNext; + Marshal.StructureToPtr(value, _headPtr, true); + ((Chain*) _headPtr)->PNext = nextPtr; + } + } + + private IntPtr _item1Ptr; + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item1Ptr => (Chain*) _item1Ptr; + + /// + /// Gets or sets item #1 in the chain. + /// + public T1 Item1 + { + get => Unsafe.AsRef((Chain*) _item1Ptr); + set + { + value.StructureType(); + var nextPtr = ((Chain*) _item1Ptr)->PNext; + Marshal.StructureToPtr(value, _item1Ptr, true); + ((Chain*) _item1Ptr)->PNext = nextPtr; + } + } + + /// + /// Creates a new with 2 items. + /// + /// The head of the chain. + /// Item 1. + public ManagedChain(TChain head = default, T1 item1 = default) + { + // Calculate memory requirements + var headSize = Marshal.SizeOf(); + var item1Size = Marshal.SizeOf(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size); + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + item1.StructureType(); + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + } + + /// + /// Creates a new with 2 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + public ManagedChain(out string errors, TChain chain) + { + // Load existing chain first, so any errors occur before we allocate memory + var head = chain; + var headSize = Marshal.SizeOf(); + var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); + StructureType expectedStructureType; + StringBuilder errorBuilder = new StringBuilder(); + + currentPtr = currentPtr->PNext; + T1 item1 = default; + if (currentPtr is null) + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 2"); + else { + expectedStructureType = item1.StructureType(); + if (currentPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(currentPtr->SType) + .Append(" at position 2; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else + item1 = Unsafe.AsRef(currentPtr); + if (currentPtr->PNext is not null) + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 2"); + } + var item1Size = Marshal.SizeOf(); + + + // Create string of errors + errors = errorBuilder.ToString().Trim(); + + _headPtr = Marshal.AllocHGlobal(headSize + item1Size); + Marshal.StructureToPtr(head, _headPtr, false); + + _item1Ptr = _headPtr + headSize; + Marshal.StructureToPtr(item1, _item1Ptr, false); + ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + } + + /// + /// Creates a new with 3 items, by appending to + /// the end of this chain. + /// + /// Item 2. + /// Type of Item 2 + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Append(T2 item2 = default) + where T2: struct, IExtendsChain + { + return new ManagedChain(this, item2); + } + + /// + public override IEnumerator GetEnumerator() + { + yield return Head; + yield return Item1; + } + + /// + public override int Count => 2; + + /// + public override IChainable this[int index] + => index switch + { + 0 => Head, 1 => Item1, + _ => throw new IndexOutOfRangeException() + }; + + /// + /// Deconstructs this chain. + /// + /// The head of the chain. + /// Item 1. + public void Deconstruct(out TChain head, out T1 item1) + { + head = Head; + item1 = Item1; + } + + /// + public override void Dispose() + { + var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); + if (headPtr == IntPtr.Zero) return; + + // Destroy all structures + Marshal.DestroyStructure(headPtr); + var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); + Marshal.DestroyStructure(item1Ptr); + + // Free memory block + Marshal.FreeHGlobal(headPtr); + } +} +``` \ No newline at end of file From 75f03712e45e141f37933902d1bc50f1f04e37c0 Mon Sep 17 00:00:00 2001 From: Craig Dean Date: Sun, 7 Nov 2021 21:33:06 +0000 Subject: [PATCH 26/42] feat: Numerous enhancements to ManagedChains * IChainable now exposes `Chain* PNext` property. * Added `ManagedChain` as smallest chain (just the head) * All `IntPtr`s are replaced with `nint`s. * Pointer offsets are calculated once per chain type and stored in statics, meaning that a chain contains a single `nint` field internally, making it incredibly lightweight. Getting the sizes once may also improve the performance, and has simplified the code. * Various fixes to ensure tail always has `PNext` set to `null` (0). * Added `Truncate` instance methods. --- .../TestChains.cs | 16 +- .../TestCompilation.cs | 45 +- .../TestManagedChains.cs | 123 +- .../PrototypeStructChaining/Chain.cs | 8 + .../ChainExtensions.cs | 30 +- .../DeviceCreateInfo.cs | 29 +- .../PrototypeStructChaining/IChainStart.cs | 2 +- .../PrototypeStructChaining/IChainable.cs | 1 + .../IStructuredType.cs | 2 +- .../ManagedChain.gen.cs | 10242 +++++++++------- .../ManagedChain.gen.tt | 366 +- ...lDeviceAccelerationStructureFeaturesKHR.cs | 7 + ...hysicalDeviceDescriptorIndexingFeatures.cs | 7 + .../PhysicalDeviceFeatures2.cs | 7 + 14 files changed, 6539 insertions(+), 4346 deletions(-) diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChains.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChains.cs index 5d5080c6ff..0debaa5543 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChains.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChains.cs @@ -24,8 +24,11 @@ public unsafe void TestAddNext() // Ensure all STypes set correctly Assert.Equal(StructureType.PhysicalDeviceFeatures2, features2.SType); Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, indexingFeatures.SType); - Assert.Equal(StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr, - accelerationStructureFeaturesKhr.SType); + Assert.Equal + ( + StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr, + accelerationStructureFeaturesKhr.SType + ); // Check indices Assert.Equal(1, features2.IndexOf(ref indexingFeatures)); @@ -77,8 +80,11 @@ public unsafe void TestSetNext() Assert.Equal(StructureType.PhysicalDeviceFeatures2, features2.SType); Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, indexingFeatures.SType); - Assert.Equal(StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr, - accelerationStructureFeaturesKhr.SType); + Assert.Equal + ( + StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr, + accelerationStructureFeaturesKhr.SType + ); Assert.True(indexingFeatures.ShaderInputAttachmentArrayDynamicIndexing); Assert.True(accelerationStructureFeaturesKhr.AccelerationStructure); @@ -174,4 +180,4 @@ public unsafe void TestWithoutChain() Assert.Equal(1U, createInfo.Flags); } -} \ No newline at end of file +} diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestCompilation.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestCompilation.cs index 21ab41240c..0d4c192599 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestCompilation.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestCompilation.cs @@ -13,12 +13,14 @@ namespace PrototypeStructChaining.Test; public class TestCompilation { - private static readonly Lazy> References = new(() => - ((string?) AppContext.GetData("TRUSTED_PLATFORM_ASSEMBLIES") ?? string.Empty) - .Split(Path.PathSeparator) - .Select(r => MetadataReference.CreateFromFile(r)) - .Concat(new[] {MetadataReference.CreateFromFile(typeof(StructureType).Assembly.Location)}) - .ToArray() + private static readonly Lazy> References = new + ( + () => + ((string?) AppContext.GetData("TRUSTED_PLATFORM_ASSEMBLIES") ?? string.Empty) + .Split(Path.PathSeparator) + .Select(r => MetadataReference.CreateFromFile(r)) + .Concat(new[] {MetadataReference.CreateFromFile(typeof(StructureType).Assembly.Location)}) + .ToArray() ); private static readonly string CodeTemplate = @" @@ -36,31 +38,40 @@ public void DoTest() private IReadOnlyList CheckCompile(string code) { var assemblyName = Path.GetRandomFileName(); - var compilation = CSharpCompilation.Create( + var compilation = CSharpCompilation.Create + ( assemblyName, new[] {CSharpSyntaxTree.ParseText(string.Format(CodeTemplate, code))}, References.Value, - new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary)); + new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary) + ); using var ms = new MemoryStream(); var result = compilation.Emit(ms); if (result.Success) + { return Array.Empty(); + } - return result.Diagnostics.Where(diagnostic => - diagnostic.IsWarningAsError || - diagnostic.Severity == DiagnosticSeverity.Error) + return result.Diagnostics.Where + ( + diagnostic => + diagnostic.IsWarningAsError || + diagnostic.Severity == DiagnosticSeverity.Error + ) .ToArray(); } [Fact] public unsafe void TestCantAddUnsupportedNext() { - var diagnostics = CheckCompile( + var diagnostics = CheckCompile + ( @"PhysicalDeviceFeatures2 .Chain(out var features2) - .AddNext(out DeviceCreateInfo createInfo);"); + .AddNext(out DeviceCreateInfo createInfo);" + ); Assert.Single(diagnostics); var error = diagnostics.First(); @@ -71,11 +82,13 @@ public unsafe void TestCantAddUnsupportedNext() [Fact] public unsafe void TestCanAddSupportedNext() { - var diagnostics = CheckCompile( + var diagnostics = CheckCompile + ( @"DeviceCreateInfo .Chain(out var createInfo) - .AddNext(out PhysicalDeviceFeatures2 features2);"); + .AddNext(out PhysicalDeviceFeatures2 features2);" + ); Assert.Empty(diagnostics); } -} \ No newline at end of file +} diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestManagedChains.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestManagedChains.cs index 9e36831cbd..6f212a3d1b 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestManagedChains.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestManagedChains.cs @@ -63,12 +63,15 @@ public unsafe void TestManagedChainReplaceHead() public unsafe void TestManagedChainReplaceMiddle() { using var chain = new ManagedChain(item1: new PhysicalDeviceDescriptorIndexingFeatures - { - // We can set any non-default values, note we do not need to set SType or PNext - // indeed they will be overwritten. - ShaderInputAttachmentArrayDynamicIndexing = true - }); + PhysicalDeviceAccelerationStructureFeaturesKHR> + ( + item1: new PhysicalDeviceDescriptorIndexingFeatures + { + // We can set any non-default values, note we do not need to set SType or PNext + // indeed they will be overwritten. + ShaderInputAttachmentArrayDynamicIndexing = true + } + ); // Ensure all STypes set correctly Assert.Equal(StructureType.PhysicalDeviceFeatures2, chain.Head.SType); @@ -104,11 +107,50 @@ public unsafe void TestManagedChainReplaceMiddle() Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, chain.Item1.SType); } + [Fact] + public unsafe void TestManagedChainDuplicate() + { + using var chain = new ManagedChain + ( + item1: new PhysicalDeviceDescriptorIndexingFeatures {ShaderInputAttachmentArrayDynamicIndexing = true} + ); + + // Ensure all STypes set correctly + Assert.Equal(StructureType.PhysicalDeviceFeatures2, chain.Head.SType); + Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, chain.Item1.SType); + + // Ensure pointers set correctly + Assert.Equal((nint) chain.Item1Ptr, (nint) chain.Head.PNext); + Assert.Equal((nint) 0, (nint) chain.Item1.PNext); + + // Check flag set + Assert.True(chain.Item1.ShaderInputAttachmentArrayDynamicIndexing); + + using var newChain = chain.Duplicate(); + + // Ensure all STypes set correctly + Assert.Equal(StructureType.PhysicalDeviceFeatures2, chain.Head.SType); + Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, chain.Item1.SType); + + // Ensure pointers set correctly + Assert.Equal((nint) chain.Item1Ptr, (nint) chain.Head.PNext); + Assert.Equal((nint) 0, (nint) chain.Item1.PNext); + + // Check flag set + Assert.True(chain.Item1.ShaderInputAttachmentArrayDynamicIndexing); + + // Check we have new copies + Assert.NotEqual((nint) chain.HeadPtr, (nint) newChain.HeadPtr); + Assert.NotEqual((nint) chain.Item1Ptr, (nint) newChain.Item1Ptr); + } + [Fact] public unsafe void TestManagedChainAppend() { - using var chain = new ManagedChain( - item1: new PhysicalDeviceDescriptorIndexingFeatures {ShaderInputAttachmentArrayDynamicIndexing = true}); + using var chain = new ManagedChain + ( + item1: new PhysicalDeviceDescriptorIndexingFeatures {ShaderInputAttachmentArrayDynamicIndexing = true} + ); // Ensure all STypes set correctly Assert.Equal(StructureType.PhysicalDeviceFeatures2, chain.Head.SType); @@ -141,6 +183,52 @@ public unsafe void TestManagedChainAppend() Assert.NotEqual((nint) chain.Item1Ptr, (nint) newChain.Item1Ptr); } + [Fact] + public unsafe void TestManagedChainTruncate() + { + using var chain = + ManagedChain.Create< + PhysicalDeviceFeatures2, + PhysicalDeviceDescriptorIndexingFeatures, + PhysicalDeviceAccelerationStructureFeaturesKHR> + ( + item2: new PhysicalDeviceAccelerationStructureFeaturesKHR + {AccelerationStructure = true} + ); + + // Ensure all STypes set correctly + Assert.Equal(StructureType.PhysicalDeviceFeatures2, chain.Head.SType); + Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, chain.Item1.SType); + Assert.Equal(StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr, chain.Item2.SType); + + // Ensure pointers set correctly + Assert.Equal((nint) chain.Item1Ptr, (nint) chain.Head.PNext); + Assert.Equal((nint) chain.Item2Ptr, (nint) chain.Item1.PNext); + Assert.Equal((nint) 0, (nint) chain.Item2.PNext); + + // Check flag set + Assert.True(chain.Item2.AccelerationStructure); + + using var newChain = chain.Truncate(out var accelerationStructure); + + Assert.Equal(2, newChain.Count); + + // Ensure all STypes set correctly + Assert.Equal(StructureType.PhysicalDeviceFeatures2, newChain.Head.SType); + Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, newChain.Item1.SType); + + // Ensure pointers set correctly + Assert.Equal((nint) newChain.Item1Ptr, (nint) newChain.Head.PNext); + Assert.Equal((nint) 0, (nint) newChain.Item1.PNext); + + // Check removed type flag + Assert.True(accelerationStructure.AccelerationStructure); + + // Check we have new copies + Assert.NotEqual((nint) chain.HeadPtr, (nint) newChain.HeadPtr); + Assert.NotEqual((nint) chain.Item1Ptr, (nint) newChain.Item1Ptr); + } + [Fact] public unsafe void TestManagedChainLoad() { @@ -202,9 +290,11 @@ public unsafe void TestManagedChainLoadWithError() PhysicalDeviceFeatures2>(out var errors, unmanagedChain); // Check for errors - Assert.Equal( + Assert.Equal + ( @"The unmanaged chain has a structure type PhysicalDeviceFeatures2Khr at position 2; expected PhysicalDeviceAccelerationStructureFeaturesKhr -The unmanaged chain was length 4, expected length 5", errors); +The unmanaged chain was length 4, expected length 5", errors + ); // Despite the errors indexing features was at the right location so was loaded Assert.True(managedChain.Item2.ShaderInputAttachmentArrayDynamicIndexing); @@ -245,7 +335,7 @@ public unsafe void TestReadOnlyList() PhysicalDeviceAccelerationStructureFeaturesKHR>(); Assert.Equal(3, chain.Count); - + // Ensure all STypes set correctly using indexer Assert.Equal(StructureType.PhysicalDeviceFeatures2, chain[0].StructureType()); Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, chain[1].StructureType()); @@ -254,8 +344,8 @@ public unsafe void TestReadOnlyList() Assert.Throws(() => chain[3]); // Get array using IEnumerable implementation - IChainable[] structures = chain.ToArray(); - + var structures = chain.ToArray(); + // Check concrete types Assert.IsType(structures[0]); Assert.IsType(structures[1]); @@ -269,10 +359,11 @@ public unsafe void TestDeconstructor() PhysicalDeviceAccelerationStructureFeaturesKHR>(); var (physicalDeviceFeatures2, indexingFeatures, accelerationStructureFeaturesKhr) = chain; - + // Ensure all STypes set correctly Assert.Equal(StructureType.PhysicalDeviceFeatures2, physicalDeviceFeatures2.SType); Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, indexingFeatures.SType); - Assert.Equal(StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr, accelerationStructureFeaturesKhr.SType); + Assert.Equal + (StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr, accelerationStructureFeaturesKhr.SType); } -} \ No newline at end of file +} diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/Chain.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/Chain.cs index 78984e2678..4764a845bb 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/Chain.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/Chain.cs @@ -15,6 +15,7 @@ public struct Chain : IChainable /// The structure type. /// public StructureType SType; + /// /// The next struct in the chain, if any; otherwise . /// @@ -26,4 +27,11 @@ StructureType IStructuredType.StructureType() { return SType; } + + /// + unsafe Chain* IChainable.PNext + { + get => (Chain*) PNext; + set => PNext = value; + } } diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ChainExtensions.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ChainExtensions.cs index 4c0bf8ebde..51c36f6393 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ChainExtensions.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ChainExtensions.cs @@ -33,8 +33,12 @@ public static class ChainExtensions /// .SetNext(ref accelerationStructureFeaturesKhr); /// /// - public static unsafe ref TChain SetNext(this ref TChain chain, ref TNext value, - bool alwaysAdd = false) + public static unsafe ref TChain SetNext + ( + this ref TChain chain, + ref TNext value, + bool alwaysAdd = false + ) where TChain : struct, IChainStart where TNext : struct, IExtendsChain { @@ -52,7 +56,11 @@ public static unsafe ref TChain SetNext(this ref TChain chain, re if (!alwaysAdd && currentPtr->SType == structureType) { // We have an existing structure, replace it. - if (previousPtr is not null) previousPtr->PNext = valuePtr; + if (previousPtr is not null) + { + previousPtr->PNext = valuePtr; + } + valuePtr->PNext = nextPtr; return ref chain; @@ -98,7 +106,10 @@ public static unsafe ref TChain AddNext(this ref TChain chain, ou // Find end of chain var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); - while (currentPtr->PNext is not null) currentPtr = currentPtr->PNext; + while (currentPtr->PNext is not null) + { + currentPtr = currentPtr->PNext; + } // Create new entry and set it's structure type next = default; @@ -147,7 +158,11 @@ public static unsafe ref TChain TryAddNext(this ref TChain chain, } var nextPtr = currentPtr->PNext; - if (nextPtr is null) break; + if (nextPtr is null) + { + break; + } + currentPtr = nextPtr; } while (true); @@ -178,11 +193,14 @@ public static unsafe int IndexOf(this ref TChain chain, ref TNext do { if (currentPtr == valuePtr) + { return index; + } + currentPtr = currentPtr->PNext; index++; } while (currentPtr is not null); return -1; } -} \ No newline at end of file +} diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/DeviceCreateInfo.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/DeviceCreateInfo.cs index d6f477d8cb..292c2bb96f 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/DeviceCreateInfo.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/DeviceCreateInfo.cs @@ -14,18 +14,28 @@ public struct DeviceCreateInfo : IChainStart // NOTE Truncated for example - public unsafe DeviceCreateInfo( + public unsafe DeviceCreateInfo + ( StructureType? sType = StructureType.DeviceCreateInfo, void* pNext = null, - uint? flags = null) + uint? flags = null + ) : this() { if (sType.HasValue) + { SType = sType.Value; + } + if ((IntPtr) pNext != IntPtr.Zero) + { PNext = pNext; + } + if (flags.HasValue) + { Flags = flags.Value; + } // NOTE Truncated for example } @@ -36,8 +46,10 @@ public unsafe DeviceCreateInfo( /// /// The newly created chain root /// A reference to the newly created chain. - public static unsafe ref DeviceCreateInfo Chain( - out DeviceCreateInfo capture) + public static unsafe ref DeviceCreateInfo Chain + ( + out DeviceCreateInfo capture + ) { capture = new DeviceCreateInfo(StructureType.DeviceCreateInfo); return ref capture; @@ -49,5 +61,12 @@ StructureType IStructuredType.StructureType() return SType = StructureType.DeviceCreateInfo; } + /// + unsafe Chain* IChainable.PNext + { + get => (Chain*) PNext; + set => PNext = value; + } + #endregion -} \ No newline at end of file +} diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IChainStart.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IChainStart.cs index a86e8db5ea..4da9542556 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IChainStart.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IChainStart.cs @@ -7,4 +7,4 @@ namespace Silk.Net.Vulkan; /// convenience method. public interface IChainStart : IChainable { -} \ No newline at end of file +} diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IChainable.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IChainable.cs index 7b8df844f2..098fd169bc 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IChainable.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IChainable.cs @@ -8,4 +8,5 @@ namespace Silk.Net.Vulkan; /// to a pointer to a . public interface IChainable : IStructuredType { + unsafe Chain* PNext { get; set; } } diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IStructuredType.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IStructuredType.cs index aa6a7fdbc1..f34ad05399 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IStructuredType.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IStructuredType.cs @@ -13,4 +13,4 @@ public interface IStructuredType /// Retrieving the also ensures it is set to the correct value. /// StructureType StructureType(); -} \ No newline at end of file +} diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.cs index d06389fcad..def61ff87a 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.cs @@ -1,3 +1,4 @@ +// ReSharper disable StaticMemberInGenericType using System.Collections; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; @@ -26,6 +27,42 @@ IEnumerator IEnumerable.GetEnumerator() /// public abstract void Dispose(); + /// + /// Creates a new with 1 items. + /// + /// The head of the chain. + /// The chain type + /// A new with 1 items. + public static ManagedChain Create(TChain head = default) + where TChain : struct, IChainStart + { + return new(head); + } + + /// + /// Loads a new with 1 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + /// A new with 1 items. + public static ManagedChain Load(out string errors, TChain chain) + where TChain : struct, IChainStart + { + return new(out errors, chain); + } + + /// + /// Loads a new with 1 items from an existing unmanaged chain, + /// ignoring any errors. + /// + /// The unmanaged chain to use as the basis of this chain. + /// A new with 1 items. + public static ManagedChain Load(TChain chain) + where TChain : struct, IChainStart + { + return new(out var _, chain); + } + /// /// Creates a new with 2 items. /// @@ -1168,6 +1205,154 @@ public static ManagedChain +/// A safely manages the pointers of a managed structure chain. +/// +/// The chain type +public unsafe class ManagedChain : ManagedChain + where TChain : struct, IChainStart +{ + /// + /// Gets the size (in bytes) of the head structure. + /// + public static readonly int HeadSize = Marshal.SizeOf(); + + /// + /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. + /// + public static readonly int MemorySize = HeadSize; + + private nint _headPtr; + + /// + /// Gets a pointer to the current head. + /// + public Chain* HeadPtr => (Chain*) _headPtr; + + /// + /// Gets or sets the head of the chain. + /// + public TChain Head + { + get => Unsafe.AsRef((Chain*) _headPtr); + set + { + value.StructureType(); + var ptr = (Chain*) _headPtr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, _headPtr, true); + ptr->PNext = nextPtr; + } + } + + /// + /// Creates a new with 1 items from an existing memory block. + /// + /// The pointer to the head of the chain.. + /// + /// Callers are responsible for ensuring the size of the memory is correct. + /// + internal ManagedChain(nint headPtr) + { + _headPtr = headPtr; + } + + /// + /// Creates a new with 1 items. + /// + /// The head of the chain. + public ManagedChain(TChain head = default) + : this(Marshal.AllocHGlobal(MemorySize)) + { + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + HeadPtr->PNext = null; + } + + /// + /// Creates a new with 1 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + public ManagedChain(out string errors, TChain chain) + : this(Marshal.AllocHGlobal(MemorySize)) + { + chain.StructureType(); + Marshal.StructureToPtr(chain, _headPtr, false); + errors = string.Empty; + } + + /// + /// Creates a new with 1 by copying this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Duplicate() + { + var newHeadPtr = Marshal.AllocHGlobal(MemorySize); + // Block copy original struct data for speed + Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 2 items, by appending to + /// the end of this chain. + /// + /// Item 1. + /// Type of Item 1 + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Append(T1 item1 = default) + where T1: struct, IExtendsChain + { + return new ManagedChain(this, item1); + } + + /// + public override IEnumerator GetEnumerator() + { + yield return Head; + } + + /// + public override int Count => 1; + + /// + public override IChainable this[int index] + => index switch + { + 0 => Head, + _ => throw new IndexOutOfRangeException() + }; + + /// + /// Deconstructs this chain. + /// + /// The head of the chain. + public void Deconstruct(out TChain head) + { + head = Head; + } + + /// + public override void Dispose() + { + var headPtr = Interlocked.Exchange(ref _headPtr, (nint)0); + if (headPtr == (nint)0) { + return; + } + + // Destroy all structures + Marshal.DestroyStructure(headPtr); + + // Free memory block + Marshal.FreeHGlobal(headPtr); + } +} + /// /// A safely manages the pointers of a managed structure chain. /// @@ -1177,7 +1362,27 @@ public unsafe class ManagedChain : ManagedChain where TChain : struct, IChainStart where T1 : struct, IExtendsChain { - private IntPtr _headPtr; + /// + /// Gets the size (in bytes) of the head structure. + /// + public static readonly int HeadSize = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item1Offset = HeadSize; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item1Size = Marshal.SizeOf(); + + /// + /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. + /// + public static readonly int MemorySize = Item1Offset + Item1Size; + + private nint _headPtr; /// /// Gets a pointer to the current head. @@ -1193,53 +1398,61 @@ public TChain Head set { value.StructureType(); - var nextPtr = ((Chain*) _headPtr)->PNext; + var ptr = (Chain*) _headPtr; + var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, _headPtr, true); - ((Chain*) _headPtr)->PNext = nextPtr; + ptr->PNext = nextPtr; } } - private IntPtr _item1Ptr; - /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item1Ptr => (Chain*) _item1Ptr; + public Chain* Item1Ptr => (Chain*) (_headPtr + Item1Offset); /// /// Gets or sets item #1 in the chain. /// public T1 Item1 { - get => Unsafe.AsRef((Chain*) _item1Ptr); + get => Unsafe.AsRef(Item1Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item1Ptr)->PNext; - Marshal.StructureToPtr(value, _item1Ptr, true); - ((Chain*) _item1Ptr)->PNext = nextPtr; + var ptr = Item1Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } + /// + /// Creates a new with 2 items from an existing memory block. + /// + /// The pointer to the head of the chain.. + /// + /// Callers are responsible for ensuring the size of the memory is correct. + /// + internal ManagedChain(nint headPtr) + { + _headPtr = headPtr; + } + /// /// Creates a new with 2 items. /// /// The head of the chain. /// Item 1. public ManagedChain(TChain head = default, T1 item1 = default) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size); head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; + Chain* itemPtr = Item1Ptr; item1.StructureType(); - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + Marshal.StructureToPtr(item1, (nint)itemPtr, false); + HeadPtr->PNext = itemPtr; + Item1Ptr->PNext = null; } /// @@ -1248,43 +1461,114 @@ public ManagedChain(TChain head = default, T1 item1 = default) /// Any errors loading the chain. /// The unmanaged chain to use as the basis of this chain. public ManagedChain(out string errors, TChain chain) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Load existing chain first, so any errors occur before we allocate memory - var head = chain; - var headSize = Marshal.SizeOf(); - var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); - StructureType expectedStructureType; + chain.StructureType(); + Marshal.StructureToPtr(chain, _headPtr, false); StringBuilder errorBuilder = new StringBuilder(); + var existingPtr = (Chain*) Unsafe.AsPointer(ref chain); + var newPtr = (Chain*) _headPtr; + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item1Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T1 item1 = default; - if (currentPtr is null) + var expectedStructureType = item1.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 2"); - else { - expectedStructureType = item1.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 2; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item1 = Unsafe.AsRef(currentPtr); - if (currentPtr->PNext is not null) - errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 2"); + } else { + if (existingPtr->PNext is not null) { + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 2"); + existingPtr->PNext = null; + } + item1 = Unsafe.AsRef(existingPtr); + } } - var item1Size = Marshal.SizeOf(); - + Marshal.StructureToPtr(item1, (nint) newPtr, false); // Create string of errors errors = errorBuilder.ToString().Trim(); + } - _headPtr = Marshal.AllocHGlobal(headSize + item1Size); - Marshal.StructureToPtr(head, _headPtr, false); + /// + /// Creates a new with 2 by copying this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Duplicate() + { + var newHeadPtr = Marshal.AllocHGlobal(MemorySize); + // Block copy original struct data for speed + Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); + // Update all pointers + ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 2 items, by appending + /// to the end of this chain. + /// + /// The chain to append to. + /// Item 1. + /// + /// Do not forget to dispose the chain if you are no longer using it. + /// + public ManagedChain(ManagedChain previous, T1 item1 = default) + : this(Marshal.AllocHGlobal(MemorySize)) + { + var previousSize = MemorySize - Item1Size; + // Block copy original struct data for speed + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); + + // Append item 1 + item1.StructureType(); + Marshal.StructureToPtr(item1, _headPtr + previousSize, false); + + // Update all pointers + ((Chain*)_headPtr)->PNext = (Chain*) (_headPtr + Item1Offset); + ((Chain*)(_headPtr + previousSize))->PNext = null; + } + + /// + /// Creates a new with 1 items, by removing the last item + /// from this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Truncate() + { + return Truncate(out var _); + } - _item1Ptr = _headPtr + headSize; - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + /// + /// Creates a new with 1 items, by removing + /// from the end of this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Truncate(out T1 item1) + { + item1 = Item1; + + var newSize = MemorySize - Item1Size; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); + // Update all pointers + ((Chain*)newHeadPtr)->PNext = null; + return new ManagedChain(newHeadPtr); } /// @@ -1294,7 +1578,7 @@ public ManagedChain(out string errors, TChain chain) /// Item 2. /// Type of Item 2 /// - /// Do not forget to dispose this chain if you are no longer using it. + /// Do not forget to dispose this chain if you are no longer using it. /// public ManagedChain Append(T2 item2 = default) where T2: struct, IExtendsChain @@ -1316,7 +1600,8 @@ public override IEnumerator GetEnumerator() public override IChainable this[int index] => index switch { - 0 => Head, 1 => Item1, + 0 => Head, + 1 => Item1, _ => throw new IndexOutOfRangeException() }; @@ -1334,13 +1619,14 @@ public void Deconstruct(out TChain head, out T1 item1) /// public override void Dispose() { - var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); - if (headPtr == IntPtr.Zero) return; + var headPtr = Interlocked.Exchange(ref _headPtr, (nint)0); + if (headPtr == (nint)0) { + return; + } // Destroy all structures Marshal.DestroyStructure(headPtr); - var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item1Ptr); + Marshal.DestroyStructure(headPtr + Item1Offset); // Free memory block Marshal.FreeHGlobal(headPtr); @@ -1358,7 +1644,37 @@ public unsafe class ManagedChain : ManagedChain where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain { - private IntPtr _headPtr; + /// + /// Gets the size (in bytes) of the head structure. + /// + public static readonly int HeadSize = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item1Offset = HeadSize; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item1Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item2Offset = Item1Offset + Item1Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item2Size = Marshal.SizeOf(); + + /// + /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. + /// + public static readonly int MemorySize = Item2Offset + Item2Size; + + private nint _headPtr; /// /// Gets a pointer to the current head. @@ -1374,55 +1690,67 @@ public TChain Head set { value.StructureType(); - var nextPtr = ((Chain*) _headPtr)->PNext; + var ptr = (Chain*) _headPtr; + var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, _headPtr, true); - ((Chain*) _headPtr)->PNext = nextPtr; + ptr->PNext = nextPtr; } } - private IntPtr _item1Ptr; - /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item1Ptr => (Chain*) _item1Ptr; + public Chain* Item1Ptr => (Chain*) (_headPtr + Item1Offset); /// /// Gets or sets item #1 in the chain. /// public T1 Item1 { - get => Unsafe.AsRef((Chain*) _item1Ptr); + get => Unsafe.AsRef(Item1Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item1Ptr)->PNext; - Marshal.StructureToPtr(value, _item1Ptr, true); - ((Chain*) _item1Ptr)->PNext = nextPtr; + var ptr = Item1Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item2Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item2Ptr => (Chain*) _item2Ptr; + public Chain* Item2Ptr => (Chain*) (_headPtr + Item2Offset); /// /// Gets or sets item #2 in the chain. /// public T2 Item2 { - get => Unsafe.AsRef((Chain*) _item2Ptr); + get => Unsafe.AsRef(Item2Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item2Ptr)->PNext; - Marshal.StructureToPtr(value, _item2Ptr, true); - ((Chain*) _item2Ptr)->PNext = nextPtr; + var ptr = Item2Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } + /// + /// Creates a new with 3 items from an existing memory block. + /// + /// The pointer to the head of the chain.. + /// + /// Callers are responsible for ensuring the size of the memory is correct. + /// + internal ManagedChain(nint headPtr) + { + _headPtr = headPtr; + } + /// /// Creates a new with 3 items. /// @@ -1430,25 +1758,19 @@ public T2 Item2 /// Item 1. /// Item 2. public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size); head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; + Chain* itemPtr = Item1Ptr; item1.StructureType(); - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; + Marshal.StructureToPtr(item1, (nint)itemPtr, false); + HeadPtr->PNext = itemPtr; + itemPtr = Item2Ptr; item2.StructureType(); - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + Marshal.StructureToPtr(item2, (nint)itemPtr, false); + Item1Ptr->PNext = itemPtr; + Item2Ptr->PNext = null; } /// @@ -1457,68 +1779,84 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul /// Any errors loading the chain. /// The unmanaged chain to use as the basis of this chain. public ManagedChain(out string errors, TChain chain) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Load existing chain first, so any errors occur before we allocate memory - var head = chain; - var headSize = Marshal.SizeOf(); - var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); - StructureType expectedStructureType; + chain.StructureType(); + Marshal.StructureToPtr(chain, _headPtr, false); StringBuilder errorBuilder = new StringBuilder(); + var existingPtr = (Chain*) Unsafe.AsPointer(ref chain); + var newPtr = (Chain*) _headPtr; + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item1Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T1 item1 = default; - if (currentPtr is null) + var expectedStructureType = item1.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 3"); - else { - expectedStructureType = item1.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 2; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item1 = Unsafe.AsRef(currentPtr); + } else { + item1 = Unsafe.AsRef(existingPtr); + } } - var item1Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item1, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item2Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T2 item2 = default; - if (currentPtr is null) + expectedStructureType = item2.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 3"); - else { - expectedStructureType = item2.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 3; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item2 = Unsafe.AsRef(currentPtr); - if (currentPtr->PNext is not null) - errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 3"); + } else { + if (existingPtr->PNext is not null) { + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 3"); + existingPtr->PNext = null; + } + item2 = Unsafe.AsRef(existingPtr); + } } - var item2Size = Marshal.SizeOf(); - + Marshal.StructureToPtr(item2, (nint) newPtr, false); // Create string of errors errors = errorBuilder.ToString().Trim(); + } - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size); - Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + /// + /// Creates a new with 3 by copying this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Duplicate() + { + var newHeadPtr = Marshal.AllocHGlobal(MemorySize); + // Block copy original struct data for speed + Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); + // Update all pointers + ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); + ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); + return new ManagedChain(newHeadPtr); } /// - /// Creates a new with 3 items. + /// Creates a new with 3 items, by appending + /// to the end of this chain. /// /// The chain to append to. /// Item 2. @@ -1526,27 +1864,53 @@ public ManagedChain(out string errors, TChain chain) /// Do not forget to dispose the chain if you are no longer using it. /// public ManagedChain(ManagedChain previous, T2 item2 = default) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); + var previousSize = MemorySize - Item2Size; + // Block copy original struct data for speed + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); + + // Append item 2 + item2.StructureType(); + Marshal.StructureToPtr(item2, _headPtr + previousSize, false); - var originalSize = headSize + item1Size; - var newSize = originalSize + item2Size; + // Update all pointers + ((Chain*)_headPtr)->PNext = (Chain*) (_headPtr + Item1Offset); + ((Chain*)(_headPtr + Item1Offset))->PNext = (Chain*) (_headPtr + Item2Offset); + ((Chain*)(_headPtr + previousSize))->PNext = null; + } - _headPtr = Marshal.AllocHGlobal(newSize); - // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + /// + /// Creates a new with 2 items, by removing the last item + /// from this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Truncate() + { + return Truncate(out var _); + } - _item1Ptr = _headPtr + headSize; - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + /// + /// Creates a new with 2 items, by removing + /// from the end of this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Truncate(out T2 item2) + { + item2 = Item2; - _item2Ptr = _item1Ptr + item1Size; - // Append the last structure - item2.StructureType(); - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + var newSize = MemorySize - Item2Size; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); + // Update all pointers + ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); + ((Chain*)(newHeadPtr + Item1Offset))->PNext = null; + return new ManagedChain(newHeadPtr); } /// @@ -1556,7 +1920,7 @@ public ManagedChain(ManagedChain previous, T2 item2 = default) /// Item 3. /// Type of Item 3 /// - /// Do not forget to dispose this chain if you are no longer using it. + /// Do not forget to dispose this chain if you are no longer using it. /// public ManagedChain Append(T3 item3 = default) where T3: struct, IExtendsChain @@ -1579,7 +1943,8 @@ public override IEnumerator GetEnumerator() public override IChainable this[int index] => index switch { - 0 => Head, 1 => Item1, + 0 => Head, + 1 => Item1, 2 => Item2, _ => throw new IndexOutOfRangeException() }; @@ -1600,15 +1965,15 @@ public void Deconstruct(out TChain head, out T1 item1, out T2 item2) /// public override void Dispose() { - var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); - if (headPtr == IntPtr.Zero) return; + var headPtr = Interlocked.Exchange(ref _headPtr, (nint)0); + if (headPtr == (nint)0) { + return; + } // Destroy all structures Marshal.DestroyStructure(headPtr); - var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item1Ptr); - var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item2Ptr); + Marshal.DestroyStructure(headPtr + Item1Offset); + Marshal.DestroyStructure(headPtr + Item2Offset); // Free memory block Marshal.FreeHGlobal(headPtr); @@ -1628,15 +1993,55 @@ public unsafe class ManagedChain : ManagedChain where T2 : struct, IExtendsChain where T3 : struct, IExtendsChain { - private IntPtr _headPtr; - /// - /// Gets a pointer to the current head. + /// Gets the size (in bytes) of the head structure. /// - public Chain* HeadPtr => (Chain*) _headPtr; + public static readonly int HeadSize = Marshal.SizeOf(); /// - /// Gets or sets the head of the chain. + /// Gets the offset to the start of . + /// + public static readonly int Item1Offset = HeadSize; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item1Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item2Offset = Item1Offset + Item1Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item2Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item3Offset = Item2Offset + Item2Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item3Size = Marshal.SizeOf(); + + /// + /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. + /// + public static readonly int MemorySize = Item3Offset + Item3Size; + + private nint _headPtr; + + /// + /// Gets a pointer to the current head. + /// + public Chain* HeadPtr => (Chain*) _headPtr; + + /// + /// Gets or sets the head of the chain. /// public TChain Head { @@ -1644,76 +2049,88 @@ public TChain Head set { value.StructureType(); - var nextPtr = ((Chain*) _headPtr)->PNext; + var ptr = (Chain*) _headPtr; + var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, _headPtr, true); - ((Chain*) _headPtr)->PNext = nextPtr; + ptr->PNext = nextPtr; } } - private IntPtr _item1Ptr; - /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item1Ptr => (Chain*) _item1Ptr; + public Chain* Item1Ptr => (Chain*) (_headPtr + Item1Offset); /// /// Gets or sets item #1 in the chain. /// public T1 Item1 { - get => Unsafe.AsRef((Chain*) _item1Ptr); + get => Unsafe.AsRef(Item1Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item1Ptr)->PNext; - Marshal.StructureToPtr(value, _item1Ptr, true); - ((Chain*) _item1Ptr)->PNext = nextPtr; + var ptr = Item1Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item2Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item2Ptr => (Chain*) _item2Ptr; + public Chain* Item2Ptr => (Chain*) (_headPtr + Item2Offset); /// /// Gets or sets item #2 in the chain. /// public T2 Item2 { - get => Unsafe.AsRef((Chain*) _item2Ptr); + get => Unsafe.AsRef(Item2Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item2Ptr)->PNext; - Marshal.StructureToPtr(value, _item2Ptr, true); - ((Chain*) _item2Ptr)->PNext = nextPtr; + var ptr = Item2Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item3Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item3Ptr => (Chain*) _item3Ptr; + public Chain* Item3Ptr => (Chain*) (_headPtr + Item3Offset); /// /// Gets or sets item #3 in the chain. /// public T3 Item3 { - get => Unsafe.AsRef((Chain*) _item3Ptr); + get => Unsafe.AsRef(Item3Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item3Ptr)->PNext; - Marshal.StructureToPtr(value, _item3Ptr, true); - ((Chain*) _item3Ptr)->PNext = nextPtr; + var ptr = Item3Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } + /// + /// Creates a new with 4 items from an existing memory block. + /// + /// The pointer to the head of the chain.. + /// + /// Callers are responsible for ensuring the size of the memory is correct. + /// + internal ManagedChain(nint headPtr) + { + _headPtr = headPtr; + } + /// /// Creates a new with 4 items. /// @@ -1722,31 +2139,23 @@ public T3 Item3 /// Item 2. /// Item 3. public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size); head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; + Chain* itemPtr = Item1Ptr; item1.StructureType(); - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; + Marshal.StructureToPtr(item1, (nint)itemPtr, false); + HeadPtr->PNext = itemPtr; + itemPtr = Item2Ptr; item2.StructureType(); - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; + Marshal.StructureToPtr(item2, (nint)itemPtr, false); + Item1Ptr->PNext = itemPtr; + itemPtr = Item3Ptr; item3.StructureType(); - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + Marshal.StructureToPtr(item3, (nint)itemPtr, false); + Item2Ptr->PNext = itemPtr; + Item3Ptr->PNext = null; } /// @@ -1755,89 +2164,106 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul /// Any errors loading the chain. /// The unmanaged chain to use as the basis of this chain. public ManagedChain(out string errors, TChain chain) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Load existing chain first, so any errors occur before we allocate memory - var head = chain; - var headSize = Marshal.SizeOf(); - var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); - StructureType expectedStructureType; + chain.StructureType(); + Marshal.StructureToPtr(chain, _headPtr, false); StringBuilder errorBuilder = new StringBuilder(); + var existingPtr = (Chain*) Unsafe.AsPointer(ref chain); + var newPtr = (Chain*) _headPtr; + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item1Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T1 item1 = default; - if (currentPtr is null) + var expectedStructureType = item1.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 4"); - else { - expectedStructureType = item1.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 2; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item1 = Unsafe.AsRef(currentPtr); + } else { + item1 = Unsafe.AsRef(existingPtr); + } } - var item1Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item1, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item2Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T2 item2 = default; - if (currentPtr is null) + expectedStructureType = item2.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 4"); - else { - expectedStructureType = item2.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 3; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item2 = Unsafe.AsRef(currentPtr); + } else { + item2 = Unsafe.AsRef(existingPtr); + } } - var item2Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item2, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item3Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T3 item3 = default; - if (currentPtr is null) + expectedStructureType = item3.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 4"); - else { - expectedStructureType = item3.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 4; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item3 = Unsafe.AsRef(currentPtr); - if (currentPtr->PNext is not null) - errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 4"); + } else { + if (existingPtr->PNext is not null) { + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 4"); + existingPtr->PNext = null; + } + item3 = Unsafe.AsRef(existingPtr); + } } - var item3Size = Marshal.SizeOf(); - + Marshal.StructureToPtr(item3, (nint) newPtr, false); // Create string of errors errors = errorBuilder.ToString().Trim(); + } - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size); - Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + /// + /// Creates a new with 4 by copying this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Duplicate() + { + var newHeadPtr = Marshal.AllocHGlobal(MemorySize); + // Block copy original struct data for speed + Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); + // Update all pointers + ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); + ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); + ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); + return new ManagedChain(newHeadPtr); } /// - /// Creates a new with 4 items. + /// Creates a new with 4 items, by appending + /// to the end of this chain. /// /// The chain to append to. /// Item 3. @@ -1845,31 +2271,55 @@ public ManagedChain(out string errors, TChain chain) /// Do not forget to dispose the chain if you are no longer using it. /// public ManagedChain(ManagedChain previous, T3 item3 = default) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - - var originalSize = headSize + item1Size + item2Size; - var newSize = originalSize + item3Size; - - _headPtr = Marshal.AllocHGlobal(newSize); + var previousSize = MemorySize - Item3Size; // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); + + // Append item 3 + item3.StructureType(); + Marshal.StructureToPtr(item3, _headPtr + previousSize, false); + + // Update all pointers + ((Chain*)_headPtr)->PNext = (Chain*) (_headPtr + Item1Offset); + ((Chain*)(_headPtr + Item1Offset))->PNext = (Chain*) (_headPtr + Item2Offset); + ((Chain*)(_headPtr + Item2Offset))->PNext = (Chain*) (_headPtr + Item3Offset); + ((Chain*)(_headPtr + previousSize))->PNext = null; + } - _item1Ptr = _headPtr + headSize; - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + /// + /// Creates a new with 3 items, by removing the last item + /// from this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Truncate() + { + return Truncate(out var _); + } - _item2Ptr = _item1Ptr + item1Size; - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + /// + /// Creates a new with 3 items, by removing + /// from the end of this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Truncate(out T3 item3) + { + item3 = Item3; - _item3Ptr = _item2Ptr + item2Size; - // Append the last structure - item3.StructureType(); - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + var newSize = MemorySize - Item3Size; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); + // Update all pointers + ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); + ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); + ((Chain*)(newHeadPtr + Item2Offset))->PNext = null; + return new ManagedChain(newHeadPtr); } /// @@ -1879,7 +2329,7 @@ public ManagedChain(ManagedChain previous, T3 item3 = default) /// Item 4. /// Type of Item 4 /// - /// Do not forget to dispose this chain if you are no longer using it. + /// Do not forget to dispose this chain if you are no longer using it. /// public ManagedChain Append(T4 item4 = default) where T4: struct, IExtendsChain @@ -1903,7 +2353,8 @@ public override IEnumerator GetEnumerator() public override IChainable this[int index] => index switch { - 0 => Head, 1 => Item1, + 0 => Head, + 1 => Item1, 2 => Item2, 3 => Item3, _ => throw new IndexOutOfRangeException() @@ -1927,17 +2378,16 @@ public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item /// public override void Dispose() { - var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); - if (headPtr == IntPtr.Zero) return; + var headPtr = Interlocked.Exchange(ref _headPtr, (nint)0); + if (headPtr == (nint)0) { + return; + } // Destroy all structures Marshal.DestroyStructure(headPtr); - var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item1Ptr); - var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item2Ptr); - var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item3Ptr); + Marshal.DestroyStructure(headPtr + Item1Offset); + Marshal.DestroyStructure(headPtr + Item2Offset); + Marshal.DestroyStructure(headPtr + Item3Offset); // Free memory block Marshal.FreeHGlobal(headPtr); @@ -1959,7 +2409,57 @@ public unsafe class ManagedChain : ManagedChain where T3 : struct, IExtendsChain where T4 : struct, IExtendsChain { - private IntPtr _headPtr; + /// + /// Gets the size (in bytes) of the head structure. + /// + public static readonly int HeadSize = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item1Offset = HeadSize; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item1Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item2Offset = Item1Offset + Item1Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item2Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item3Offset = Item2Offset + Item2Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item3Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item4Offset = Item3Offset + Item3Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item4Size = Marshal.SizeOf(); + + /// + /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. + /// + public static readonly int MemorySize = Item4Offset + Item4Size; + + private nint _headPtr; /// /// Gets a pointer to the current head. @@ -1975,97 +2475,109 @@ public TChain Head set { value.StructureType(); - var nextPtr = ((Chain*) _headPtr)->PNext; + var ptr = (Chain*) _headPtr; + var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, _headPtr, true); - ((Chain*) _headPtr)->PNext = nextPtr; + ptr->PNext = nextPtr; } } - private IntPtr _item1Ptr; - /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item1Ptr => (Chain*) _item1Ptr; + public Chain* Item1Ptr => (Chain*) (_headPtr + Item1Offset); /// /// Gets or sets item #1 in the chain. /// public T1 Item1 { - get => Unsafe.AsRef((Chain*) _item1Ptr); + get => Unsafe.AsRef(Item1Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item1Ptr)->PNext; - Marshal.StructureToPtr(value, _item1Ptr, true); - ((Chain*) _item1Ptr)->PNext = nextPtr; + var ptr = Item1Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item2Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item2Ptr => (Chain*) _item2Ptr; + public Chain* Item2Ptr => (Chain*) (_headPtr + Item2Offset); /// /// Gets or sets item #2 in the chain. /// public T2 Item2 { - get => Unsafe.AsRef((Chain*) _item2Ptr); + get => Unsafe.AsRef(Item2Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item2Ptr)->PNext; - Marshal.StructureToPtr(value, _item2Ptr, true); - ((Chain*) _item2Ptr)->PNext = nextPtr; + var ptr = Item2Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item3Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item3Ptr => (Chain*) _item3Ptr; + public Chain* Item3Ptr => (Chain*) (_headPtr + Item3Offset); /// /// Gets or sets item #3 in the chain. /// public T3 Item3 { - get => Unsafe.AsRef((Chain*) _item3Ptr); + get => Unsafe.AsRef(Item3Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item3Ptr)->PNext; - Marshal.StructureToPtr(value, _item3Ptr, true); - ((Chain*) _item3Ptr)->PNext = nextPtr; + var ptr = Item3Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item4Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item4Ptr => (Chain*) _item4Ptr; + public Chain* Item4Ptr => (Chain*) (_headPtr + Item4Offset); /// /// Gets or sets item #4 in the chain. /// public T4 Item4 { - get => Unsafe.AsRef((Chain*) _item4Ptr); + get => Unsafe.AsRef(Item4Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item4Ptr)->PNext; - Marshal.StructureToPtr(value, _item4Ptr, true); - ((Chain*) _item4Ptr)->PNext = nextPtr; + var ptr = Item4Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } + /// + /// Creates a new with 5 items from an existing memory block. + /// + /// The pointer to the head of the chain.. + /// + /// Callers are responsible for ensuring the size of the memory is correct. + /// + internal ManagedChain(nint headPtr) + { + _headPtr = headPtr; + } + /// /// Creates a new with 5 items. /// @@ -2075,37 +2587,27 @@ public T4 Item4 /// Item 3. /// Item 4. public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size); head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; + Chain* itemPtr = Item1Ptr; item1.StructureType(); - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; + Marshal.StructureToPtr(item1, (nint)itemPtr, false); + HeadPtr->PNext = itemPtr; + itemPtr = Item2Ptr; item2.StructureType(); - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; + Marshal.StructureToPtr(item2, (nint)itemPtr, false); + Item1Ptr->PNext = itemPtr; + itemPtr = Item3Ptr; item3.StructureType(); - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; + Marshal.StructureToPtr(item3, (nint)itemPtr, false); + Item2Ptr->PNext = itemPtr; + itemPtr = Item4Ptr; item4.StructureType(); - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + Marshal.StructureToPtr(item4, (nint)itemPtr, false); + Item3Ptr->PNext = itemPtr; + Item4Ptr->PNext = null; } /// @@ -2114,110 +2616,128 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul /// Any errors loading the chain. /// The unmanaged chain to use as the basis of this chain. public ManagedChain(out string errors, TChain chain) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Load existing chain first, so any errors occur before we allocate memory - var head = chain; - var headSize = Marshal.SizeOf(); - var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); - StructureType expectedStructureType; + chain.StructureType(); + Marshal.StructureToPtr(chain, _headPtr, false); StringBuilder errorBuilder = new StringBuilder(); + var existingPtr = (Chain*) Unsafe.AsPointer(ref chain); + var newPtr = (Chain*) _headPtr; + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item1Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T1 item1 = default; - if (currentPtr is null) + var expectedStructureType = item1.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 5"); - else { - expectedStructureType = item1.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 2; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item1 = Unsafe.AsRef(currentPtr); + } else { + item1 = Unsafe.AsRef(existingPtr); + } } - var item1Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item1, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item2Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T2 item2 = default; - if (currentPtr is null) + expectedStructureType = item2.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 5"); - else { - expectedStructureType = item2.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 3; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item2 = Unsafe.AsRef(currentPtr); + } else { + item2 = Unsafe.AsRef(existingPtr); + } } - var item2Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item2, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item3Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T3 item3 = default; - if (currentPtr is null) + expectedStructureType = item3.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 5"); - else { - expectedStructureType = item3.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 4; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item3 = Unsafe.AsRef(currentPtr); + } else { + item3 = Unsafe.AsRef(existingPtr); + } } - var item3Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item3, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item4Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T4 item4 = default; - if (currentPtr is null) + expectedStructureType = item4.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 5"); - else { - expectedStructureType = item4.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 5; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item4 = Unsafe.AsRef(currentPtr); - if (currentPtr->PNext is not null) - errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 5"); + } else { + if (existingPtr->PNext is not null) { + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 5"); + existingPtr->PNext = null; + } + item4 = Unsafe.AsRef(existingPtr); + } } - var item4Size = Marshal.SizeOf(); - + Marshal.StructureToPtr(item4, (nint) newPtr, false); // Create string of errors errors = errorBuilder.ToString().Trim(); + } - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size); - Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + /// + /// Creates a new with 5 by copying this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Duplicate() + { + var newHeadPtr = Marshal.AllocHGlobal(MemorySize); + // Block copy original struct data for speed + Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); + // Update all pointers + ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); + ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); + ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); + ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); + return new ManagedChain(newHeadPtr); } /// - /// Creates a new with 5 items. + /// Creates a new with 5 items, by appending + /// to the end of this chain. /// /// The chain to append to. /// Item 4. @@ -2225,35 +2745,57 @@ public ManagedChain(out string errors, TChain chain) /// Do not forget to dispose the chain if you are no longer using it. /// public ManagedChain(ManagedChain previous, T4 item4 = default) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - - var originalSize = headSize + item1Size + item2Size + item3Size; - var newSize = originalSize + item4Size; - - _headPtr = Marshal.AllocHGlobal(newSize); + var previousSize = MemorySize - Item4Size; // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); + + // Append item 4 + item4.StructureType(); + Marshal.StructureToPtr(item4, _headPtr + previousSize, false); - _item1Ptr = _headPtr + headSize; - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + // Update all pointers + ((Chain*)_headPtr)->PNext = (Chain*) (_headPtr + Item1Offset); + ((Chain*)(_headPtr + Item1Offset))->PNext = (Chain*) (_headPtr + Item2Offset); + ((Chain*)(_headPtr + Item2Offset))->PNext = (Chain*) (_headPtr + Item3Offset); + ((Chain*)(_headPtr + Item3Offset))->PNext = (Chain*) (_headPtr + Item4Offset); + ((Chain*)(_headPtr + previousSize))->PNext = null; + } - _item2Ptr = _item1Ptr + item1Size; - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + /// + /// Creates a new with 4 items, by removing the last item + /// from this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Truncate() + { + return Truncate(out var _); + } - _item3Ptr = _item2Ptr + item2Size; - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + /// + /// Creates a new with 4 items, by removing + /// from the end of this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Truncate(out T4 item4) + { + item4 = Item4; - _item4Ptr = _item3Ptr + item3Size; - // Append the last structure - item4.StructureType(); - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + var newSize = MemorySize - Item4Size; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); + // Update all pointers + ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); + ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); + ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); + ((Chain*)(newHeadPtr + Item3Offset))->PNext = null; + return new ManagedChain(newHeadPtr); } /// @@ -2263,7 +2805,7 @@ public ManagedChain(ManagedChain previous, T4 item4 = defaul /// Item 5. /// Type of Item 5 /// - /// Do not forget to dispose this chain if you are no longer using it. + /// Do not forget to dispose this chain if you are no longer using it. /// public ManagedChain Append(T5 item5 = default) where T5: struct, IExtendsChain @@ -2288,7 +2830,8 @@ public override IEnumerator GetEnumerator() public override IChainable this[int index] => index switch { - 0 => Head, 1 => Item1, + 0 => Head, + 1 => Item1, 2 => Item2, 3 => Item3, 4 => Item4, @@ -2315,19 +2858,17 @@ public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item /// public override void Dispose() { - var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); - if (headPtr == IntPtr.Zero) return; + var headPtr = Interlocked.Exchange(ref _headPtr, (nint)0); + if (headPtr == (nint)0) { + return; + } // Destroy all structures Marshal.DestroyStructure(headPtr); - var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item1Ptr); - var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item2Ptr); - var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item3Ptr); - var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item4Ptr); + Marshal.DestroyStructure(headPtr + Item1Offset); + Marshal.DestroyStructure(headPtr + Item2Offset); + Marshal.DestroyStructure(headPtr + Item3Offset); + Marshal.DestroyStructure(headPtr + Item4Offset); // Free memory block Marshal.FreeHGlobal(headPtr); @@ -2351,7 +2892,67 @@ public unsafe class ManagedChain : ManagedChain where T4 : struct, IExtendsChain where T5 : struct, IExtendsChain { - private IntPtr _headPtr; + /// + /// Gets the size (in bytes) of the head structure. + /// + public static readonly int HeadSize = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item1Offset = HeadSize; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item1Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item2Offset = Item1Offset + Item1Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item2Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item3Offset = Item2Offset + Item2Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item3Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item4Offset = Item3Offset + Item3Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item4Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item5Offset = Item4Offset + Item4Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item5Size = Marshal.SizeOf(); + + /// + /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. + /// + public static readonly int MemorySize = Item5Offset + Item5Size; + + private nint _headPtr; /// /// Gets a pointer to the current head. @@ -2367,118 +2968,130 @@ public TChain Head set { value.StructureType(); - var nextPtr = ((Chain*) _headPtr)->PNext; + var ptr = (Chain*) _headPtr; + var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, _headPtr, true); - ((Chain*) _headPtr)->PNext = nextPtr; + ptr->PNext = nextPtr; } } - private IntPtr _item1Ptr; - /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item1Ptr => (Chain*) _item1Ptr; + public Chain* Item1Ptr => (Chain*) (_headPtr + Item1Offset); /// /// Gets or sets item #1 in the chain. /// public T1 Item1 { - get => Unsafe.AsRef((Chain*) _item1Ptr); + get => Unsafe.AsRef(Item1Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item1Ptr)->PNext; - Marshal.StructureToPtr(value, _item1Ptr, true); - ((Chain*) _item1Ptr)->PNext = nextPtr; + var ptr = Item1Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item2Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item2Ptr => (Chain*) _item2Ptr; + public Chain* Item2Ptr => (Chain*) (_headPtr + Item2Offset); /// /// Gets or sets item #2 in the chain. /// public T2 Item2 { - get => Unsafe.AsRef((Chain*) _item2Ptr); + get => Unsafe.AsRef(Item2Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item2Ptr)->PNext; - Marshal.StructureToPtr(value, _item2Ptr, true); - ((Chain*) _item2Ptr)->PNext = nextPtr; + var ptr = Item2Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item3Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item3Ptr => (Chain*) _item3Ptr; + public Chain* Item3Ptr => (Chain*) (_headPtr + Item3Offset); /// /// Gets or sets item #3 in the chain. /// public T3 Item3 { - get => Unsafe.AsRef((Chain*) _item3Ptr); + get => Unsafe.AsRef(Item3Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item3Ptr)->PNext; - Marshal.StructureToPtr(value, _item3Ptr, true); - ((Chain*) _item3Ptr)->PNext = nextPtr; + var ptr = Item3Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item4Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item4Ptr => (Chain*) _item4Ptr; + public Chain* Item4Ptr => (Chain*) (_headPtr + Item4Offset); /// /// Gets or sets item #4 in the chain. /// public T4 Item4 { - get => Unsafe.AsRef((Chain*) _item4Ptr); + get => Unsafe.AsRef(Item4Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item4Ptr)->PNext; - Marshal.StructureToPtr(value, _item4Ptr, true); - ((Chain*) _item4Ptr)->PNext = nextPtr; + var ptr = Item4Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item5Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item5Ptr => (Chain*) _item5Ptr; + public Chain* Item5Ptr => (Chain*) (_headPtr + Item5Offset); /// /// Gets or sets item #5 in the chain. /// public T5 Item5 { - get => Unsafe.AsRef((Chain*) _item5Ptr); + get => Unsafe.AsRef(Item5Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item5Ptr)->PNext; - Marshal.StructureToPtr(value, _item5Ptr, true); - ((Chain*) _item5Ptr)->PNext = nextPtr; + var ptr = Item5Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } + /// + /// Creates a new with 6 items from an existing memory block. + /// + /// The pointer to the head of the chain.. + /// + /// Callers are responsible for ensuring the size of the memory is correct. + /// + internal ManagedChain(nint headPtr) + { + _headPtr = headPtr; + } + /// /// Creates a new with 6 items. /// @@ -2489,43 +3102,31 @@ public T5 Item5 /// Item 4. /// Item 5. public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size); head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; + Chain* itemPtr = Item1Ptr; item1.StructureType(); - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; + Marshal.StructureToPtr(item1, (nint)itemPtr, false); + HeadPtr->PNext = itemPtr; + itemPtr = Item2Ptr; item2.StructureType(); - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; + Marshal.StructureToPtr(item2, (nint)itemPtr, false); + Item1Ptr->PNext = itemPtr; + itemPtr = Item3Ptr; item3.StructureType(); - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; + Marshal.StructureToPtr(item3, (nint)itemPtr, false); + Item2Ptr->PNext = itemPtr; + itemPtr = Item4Ptr; item4.StructureType(); - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; + Marshal.StructureToPtr(item4, (nint)itemPtr, false); + Item3Ptr->PNext = itemPtr; + itemPtr = Item5Ptr; item5.StructureType(); - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + Marshal.StructureToPtr(item5, (nint)itemPtr, false); + Item4Ptr->PNext = itemPtr; + Item5Ptr->PNext = null; } /// @@ -2534,131 +3135,150 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul /// Any errors loading the chain. /// The unmanaged chain to use as the basis of this chain. public ManagedChain(out string errors, TChain chain) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Load existing chain first, so any errors occur before we allocate memory - var head = chain; - var headSize = Marshal.SizeOf(); - var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); - StructureType expectedStructureType; + chain.StructureType(); + Marshal.StructureToPtr(chain, _headPtr, false); StringBuilder errorBuilder = new StringBuilder(); + var existingPtr = (Chain*) Unsafe.AsPointer(ref chain); + var newPtr = (Chain*) _headPtr; + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item1Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T1 item1 = default; - if (currentPtr is null) + var expectedStructureType = item1.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 6"); - else { - expectedStructureType = item1.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 2; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item1 = Unsafe.AsRef(currentPtr); + } else { + item1 = Unsafe.AsRef(existingPtr); + } } - var item1Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item1, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item2Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T2 item2 = default; - if (currentPtr is null) + expectedStructureType = item2.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 6"); - else { - expectedStructureType = item2.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 3; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item2 = Unsafe.AsRef(currentPtr); + } else { + item2 = Unsafe.AsRef(existingPtr); + } } - var item2Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item2, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item3Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T3 item3 = default; - if (currentPtr is null) + expectedStructureType = item3.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 6"); - else { - expectedStructureType = item3.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 4; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item3 = Unsafe.AsRef(currentPtr); + } else { + item3 = Unsafe.AsRef(existingPtr); + } } - var item3Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item3, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item4Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T4 item4 = default; - if (currentPtr is null) + expectedStructureType = item4.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 6"); - else { - expectedStructureType = item4.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 5; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item4 = Unsafe.AsRef(currentPtr); + } else { + item4 = Unsafe.AsRef(existingPtr); + } } - var item4Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item4, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item5Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T5 item5 = default; - if (currentPtr is null) + expectedStructureType = item5.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 6"); - else { - expectedStructureType = item5.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 6; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item5 = Unsafe.AsRef(currentPtr); - if (currentPtr->PNext is not null) - errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 6"); + } else { + if (existingPtr->PNext is not null) { + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 6"); + existingPtr->PNext = null; + } + item5 = Unsafe.AsRef(existingPtr); + } } - var item5Size = Marshal.SizeOf(); - + Marshal.StructureToPtr(item5, (nint) newPtr, false); // Create string of errors errors = errorBuilder.ToString().Trim(); + } - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size); - Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + /// + /// Creates a new with 6 by copying this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Duplicate() + { + var newHeadPtr = Marshal.AllocHGlobal(MemorySize); + // Block copy original struct data for speed + Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); + // Update all pointers + ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); + ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); + ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); + ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); + ((Chain*)(newHeadPtr + Item4Offset))->PNext = (Chain*) (newHeadPtr + Item5Offset); + return new ManagedChain(newHeadPtr); } /// - /// Creates a new with 6 items. + /// Creates a new with 6 items, by appending + /// to the end of this chain. /// /// The chain to append to. /// Item 5. @@ -2666,39 +3286,59 @@ public ManagedChain(out string errors, TChain chain) /// Do not forget to dispose the chain if you are no longer using it. /// public ManagedChain(ManagedChain previous, T5 item5 = default) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - - var originalSize = headSize + item1Size + item2Size + item3Size + item4Size; - var newSize = originalSize + item5Size; - - _headPtr = Marshal.AllocHGlobal(newSize); + var previousSize = MemorySize - Item5Size; // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); + + // Append item 5 + item5.StructureType(); + Marshal.StructureToPtr(item5, _headPtr + previousSize, false); - _item1Ptr = _headPtr + headSize; - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; + // Update all pointers + ((Chain*)_headPtr)->PNext = (Chain*) (_headPtr + Item1Offset); + ((Chain*)(_headPtr + Item1Offset))->PNext = (Chain*) (_headPtr + Item2Offset); + ((Chain*)(_headPtr + Item2Offset))->PNext = (Chain*) (_headPtr + Item3Offset); + ((Chain*)(_headPtr + Item3Offset))->PNext = (Chain*) (_headPtr + Item4Offset); + ((Chain*)(_headPtr + Item4Offset))->PNext = (Chain*) (_headPtr + Item5Offset); + ((Chain*)(_headPtr + previousSize))->PNext = null; + } - _item3Ptr = _item2Ptr + item2Size; - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + /// + /// Creates a new with 5 items, by removing the last item + /// from this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Truncate() + { + return Truncate(out var _); + } - _item4Ptr = _item3Ptr + item3Size; - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + /// + /// Creates a new with 5 items, by removing + /// from the end of this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Truncate(out T5 item5) + { + item5 = Item5; - _item5Ptr = _item4Ptr + item4Size; - // Append the last structure - item5.StructureType(); - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + var newSize = MemorySize - Item5Size; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); + // Update all pointers + ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); + ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); + ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); + ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); + ((Chain*)(newHeadPtr + Item4Offset))->PNext = null; + return new ManagedChain(newHeadPtr); } /// @@ -2708,7 +3348,7 @@ public ManagedChain(ManagedChain previous, T5 item5 = de /// Item 6. /// Type of Item 6 /// - /// Do not forget to dispose this chain if you are no longer using it. + /// Do not forget to dispose this chain if you are no longer using it. /// public ManagedChain Append(T6 item6 = default) where T6: struct, IExtendsChain @@ -2734,7 +3374,8 @@ public override IEnumerator GetEnumerator() public override IChainable this[int index] => index switch { - 0 => Head, 1 => Item1, + 0 => Head, + 1 => Item1, 2 => Item2, 3 => Item3, 4 => Item4, @@ -2764,21 +3405,18 @@ public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item /// public override void Dispose() { - var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); - if (headPtr == IntPtr.Zero) return; + var headPtr = Interlocked.Exchange(ref _headPtr, (nint)0); + if (headPtr == (nint)0) { + return; + } // Destroy all structures Marshal.DestroyStructure(headPtr); - var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item1Ptr); - var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item2Ptr); - var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item3Ptr); - var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item4Ptr); - var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item5Ptr); + Marshal.DestroyStructure(headPtr + Item1Offset); + Marshal.DestroyStructure(headPtr + Item2Offset); + Marshal.DestroyStructure(headPtr + Item3Offset); + Marshal.DestroyStructure(headPtr + Item4Offset); + Marshal.DestroyStructure(headPtr + Item5Offset); // Free memory block Marshal.FreeHGlobal(headPtr); @@ -2804,155 +3442,237 @@ public unsafe class ManagedChain : ManagedChain where T5 : struct, IExtendsChain where T6 : struct, IExtendsChain { - private IntPtr _headPtr; - /// - /// Gets a pointer to the current head. + /// Gets the size (in bytes) of the head structure. /// - public Chain* HeadPtr => (Chain*) _headPtr; + public static readonly int HeadSize = Marshal.SizeOf(); /// - /// Gets or sets the head of the chain. + /// Gets the offset to the start of . /// - public TChain Head - { - get => Unsafe.AsRef((Chain*) _headPtr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _headPtr)->PNext; - Marshal.StructureToPtr(value, _headPtr, true); - ((Chain*) _headPtr)->PNext = nextPtr; - } - } - - private IntPtr _item1Ptr; + public static readonly int Item1Offset = HeadSize; /// - /// Gets a pointer to the second item in the chain. + /// Gets the size (in bytes) of the Item 1. /// - public Chain* Item1Ptr => (Chain*) _item1Ptr; + public static readonly int Item1Size = Marshal.SizeOf(); /// - /// Gets or sets item #1 in the chain. + /// Gets the offset to the start of . + /// + public static readonly int Item2Offset = Item1Offset + Item1Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item2Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item3Offset = Item2Offset + Item2Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item3Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item4Offset = Item3Offset + Item3Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item4Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item5Offset = Item4Offset + Item4Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item5Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item6Offset = Item5Offset + Item5Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item6Size = Marshal.SizeOf(); + + /// + /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. + /// + public static readonly int MemorySize = Item6Offset + Item6Size; + + private nint _headPtr; + + /// + /// Gets a pointer to the current head. + /// + public Chain* HeadPtr => (Chain*) _headPtr; + + /// + /// Gets or sets the head of the chain. + /// + public TChain Head + { + get => Unsafe.AsRef((Chain*) _headPtr); + set + { + value.StructureType(); + var ptr = (Chain*) _headPtr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, _headPtr, true); + ptr->PNext = nextPtr; + } + } + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item1Ptr => (Chain*) (_headPtr + Item1Offset); + + /// + /// Gets or sets item #1 in the chain. /// public T1 Item1 { - get => Unsafe.AsRef((Chain*) _item1Ptr); + get => Unsafe.AsRef(Item1Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item1Ptr)->PNext; - Marshal.StructureToPtr(value, _item1Ptr, true); - ((Chain*) _item1Ptr)->PNext = nextPtr; + var ptr = Item1Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item2Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item2Ptr => (Chain*) _item2Ptr; + public Chain* Item2Ptr => (Chain*) (_headPtr + Item2Offset); /// /// Gets or sets item #2 in the chain. /// public T2 Item2 { - get => Unsafe.AsRef((Chain*) _item2Ptr); + get => Unsafe.AsRef(Item2Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item2Ptr)->PNext; - Marshal.StructureToPtr(value, _item2Ptr, true); - ((Chain*) _item2Ptr)->PNext = nextPtr; + var ptr = Item2Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item3Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item3Ptr => (Chain*) _item3Ptr; + public Chain* Item3Ptr => (Chain*) (_headPtr + Item3Offset); /// /// Gets or sets item #3 in the chain. /// public T3 Item3 { - get => Unsafe.AsRef((Chain*) _item3Ptr); + get => Unsafe.AsRef(Item3Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item3Ptr)->PNext; - Marshal.StructureToPtr(value, _item3Ptr, true); - ((Chain*) _item3Ptr)->PNext = nextPtr; + var ptr = Item3Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item4Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item4Ptr => (Chain*) _item4Ptr; + public Chain* Item4Ptr => (Chain*) (_headPtr + Item4Offset); /// /// Gets or sets item #4 in the chain. /// public T4 Item4 { - get => Unsafe.AsRef((Chain*) _item4Ptr); + get => Unsafe.AsRef(Item4Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item4Ptr)->PNext; - Marshal.StructureToPtr(value, _item4Ptr, true); - ((Chain*) _item4Ptr)->PNext = nextPtr; + var ptr = Item4Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item5Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item5Ptr => (Chain*) _item5Ptr; + public Chain* Item5Ptr => (Chain*) (_headPtr + Item5Offset); /// /// Gets or sets item #5 in the chain. /// public T5 Item5 { - get => Unsafe.AsRef((Chain*) _item5Ptr); + get => Unsafe.AsRef(Item5Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item5Ptr)->PNext; - Marshal.StructureToPtr(value, _item5Ptr, true); - ((Chain*) _item5Ptr)->PNext = nextPtr; + var ptr = Item5Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item6Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item6Ptr => (Chain*) _item6Ptr; + public Chain* Item6Ptr => (Chain*) (_headPtr + Item6Offset); /// /// Gets or sets item #6 in the chain. /// public T6 Item6 { - get => Unsafe.AsRef((Chain*) _item6Ptr); + get => Unsafe.AsRef(Item6Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item6Ptr)->PNext; - Marshal.StructureToPtr(value, _item6Ptr, true); - ((Chain*) _item6Ptr)->PNext = nextPtr; + var ptr = Item6Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } + /// + /// Creates a new with 7 items from an existing memory block. + /// + /// The pointer to the head of the chain.. + /// + /// Callers are responsible for ensuring the size of the memory is correct. + /// + internal ManagedChain(nint headPtr) + { + _headPtr = headPtr; + } + /// /// Creates a new with 7 items. /// @@ -2964,49 +3684,35 @@ public T6 Item6 /// Item 5. /// Item 6. public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - var item6Size = Marshal.SizeOf(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size); head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; + Chain* itemPtr = Item1Ptr; item1.StructureType(); - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; + Marshal.StructureToPtr(item1, (nint)itemPtr, false); + HeadPtr->PNext = itemPtr; + itemPtr = Item2Ptr; item2.StructureType(); - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; + Marshal.StructureToPtr(item2, (nint)itemPtr, false); + Item1Ptr->PNext = itemPtr; + itemPtr = Item3Ptr; item3.StructureType(); - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; + Marshal.StructureToPtr(item3, (nint)itemPtr, false); + Item2Ptr->PNext = itemPtr; + itemPtr = Item4Ptr; item4.StructureType(); - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; + Marshal.StructureToPtr(item4, (nint)itemPtr, false); + Item3Ptr->PNext = itemPtr; + itemPtr = Item5Ptr; item5.StructureType(); - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; + Marshal.StructureToPtr(item5, (nint)itemPtr, false); + Item4Ptr->PNext = itemPtr; + itemPtr = Item6Ptr; item6.StructureType(); - Marshal.StructureToPtr(item6, _item6Ptr, false); - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + Marshal.StructureToPtr(item6, (nint)itemPtr, false); + Item5Ptr->PNext = itemPtr; + Item6Ptr->PNext = null; } /// @@ -3015,152 +3721,172 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul /// Any errors loading the chain. /// The unmanaged chain to use as the basis of this chain. public ManagedChain(out string errors, TChain chain) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Load existing chain first, so any errors occur before we allocate memory - var head = chain; - var headSize = Marshal.SizeOf(); - var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); - StructureType expectedStructureType; + chain.StructureType(); + Marshal.StructureToPtr(chain, _headPtr, false); StringBuilder errorBuilder = new StringBuilder(); + var existingPtr = (Chain*) Unsafe.AsPointer(ref chain); + var newPtr = (Chain*) _headPtr; + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item1Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T1 item1 = default; - if (currentPtr is null) + var expectedStructureType = item1.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 7"); - else { - expectedStructureType = item1.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 2; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item1 = Unsafe.AsRef(currentPtr); + } else { + item1 = Unsafe.AsRef(existingPtr); + } } - var item1Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item1, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item2Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T2 item2 = default; - if (currentPtr is null) + expectedStructureType = item2.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 7"); - else { - expectedStructureType = item2.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 3; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item2 = Unsafe.AsRef(currentPtr); + } else { + item2 = Unsafe.AsRef(existingPtr); + } } - var item2Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item2, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item3Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T3 item3 = default; - if (currentPtr is null) + expectedStructureType = item3.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 7"); - else { - expectedStructureType = item3.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 4; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item3 = Unsafe.AsRef(currentPtr); + } else { + item3 = Unsafe.AsRef(existingPtr); + } } - var item3Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item3, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item4Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T4 item4 = default; - if (currentPtr is null) + expectedStructureType = item4.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 7"); - else { - expectedStructureType = item4.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 5; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item4 = Unsafe.AsRef(currentPtr); + } else { + item4 = Unsafe.AsRef(existingPtr); + } } - var item4Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item4, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item5Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T5 item5 = default; - if (currentPtr is null) + expectedStructureType = item5.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 7"); - else { - expectedStructureType = item5.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 6; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item5 = Unsafe.AsRef(currentPtr); + } else { + item5 = Unsafe.AsRef(existingPtr); + } } - var item5Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item5, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item6Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T6 item6 = default; - if (currentPtr is null) + expectedStructureType = item6.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 7"); - else { - expectedStructureType = item6.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 7; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item6 = Unsafe.AsRef(currentPtr); - if (currentPtr->PNext is not null) - errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 7"); + } else { + if (existingPtr->PNext is not null) { + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 7"); + existingPtr->PNext = null; + } + item6 = Unsafe.AsRef(existingPtr); + } } - var item6Size = Marshal.SizeOf(); - + Marshal.StructureToPtr(item6, (nint) newPtr, false); // Create string of errors errors = errorBuilder.ToString().Trim(); + } - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size); - Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - Marshal.StructureToPtr(item6, _item6Ptr, false); - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + /// + /// Creates a new with 7 by copying this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Duplicate() + { + var newHeadPtr = Marshal.AllocHGlobal(MemorySize); + // Block copy original struct data for speed + Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); + // Update all pointers + ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); + ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); + ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); + ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); + ((Chain*)(newHeadPtr + Item4Offset))->PNext = (Chain*) (newHeadPtr + Item5Offset); + ((Chain*)(newHeadPtr + Item5Offset))->PNext = (Chain*) (newHeadPtr + Item6Offset); + return new ManagedChain(newHeadPtr); } /// - /// Creates a new with 7 items. + /// Creates a new with 7 items, by appending + /// to the end of this chain. /// /// The chain to append to. /// Item 6. @@ -3168,43 +3894,61 @@ public ManagedChain(out string errors, TChain chain) /// Do not forget to dispose the chain if you are no longer using it. /// public ManagedChain(ManagedChain previous, T6 item6 = default) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - var item6Size = Marshal.SizeOf(); - - var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size; - var newSize = originalSize + item6Size; - - _headPtr = Marshal.AllocHGlobal(newSize); + var previousSize = MemorySize - Item6Size; // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); - - _item1Ptr = _headPtr + headSize; - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); + + // Append item 6 + item6.StructureType(); + Marshal.StructureToPtr(item6, _headPtr + previousSize, false); - _item2Ptr = _item1Ptr + item1Size; - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + // Update all pointers + ((Chain*)_headPtr)->PNext = (Chain*) (_headPtr + Item1Offset); + ((Chain*)(_headPtr + Item1Offset))->PNext = (Chain*) (_headPtr + Item2Offset); + ((Chain*)(_headPtr + Item2Offset))->PNext = (Chain*) (_headPtr + Item3Offset); + ((Chain*)(_headPtr + Item3Offset))->PNext = (Chain*) (_headPtr + Item4Offset); + ((Chain*)(_headPtr + Item4Offset))->PNext = (Chain*) (_headPtr + Item5Offset); + ((Chain*)(_headPtr + Item5Offset))->PNext = (Chain*) (_headPtr + Item6Offset); + ((Chain*)(_headPtr + previousSize))->PNext = null; + } - _item4Ptr = _item3Ptr + item3Size; - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + /// + /// Creates a new with 6 items, by removing the last item + /// from this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Truncate() + { + return Truncate(out var _); + } - _item5Ptr = _item4Ptr + item4Size; - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + /// + /// Creates a new with 6 items, by removing + /// from the end of this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Truncate(out T6 item6) + { + item6 = Item6; - _item6Ptr = _item5Ptr + item5Size; - // Append the last structure - item6.StructureType(); - Marshal.StructureToPtr(item6, _item6Ptr, false); - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + var newSize = MemorySize - Item6Size; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); + // Update all pointers + ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); + ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); + ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); + ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); + ((Chain*)(newHeadPtr + Item4Offset))->PNext = (Chain*) (newHeadPtr + Item5Offset); + ((Chain*)(newHeadPtr + Item5Offset))->PNext = null; + return new ManagedChain(newHeadPtr); } /// @@ -3214,7 +3958,7 @@ public ManagedChain(ManagedChain previous, T6 item6 /// Item 7. /// Type of Item 7 /// - /// Do not forget to dispose this chain if you are no longer using it. + /// Do not forget to dispose this chain if you are no longer using it. /// public ManagedChain Append(T7 item7 = default) where T7: struct, IExtendsChain @@ -3241,7 +3985,8 @@ public override IEnumerator GetEnumerator() public override IChainable this[int index] => index switch { - 0 => Head, 1 => Item1, + 0 => Head, + 1 => Item1, 2 => Item2, 3 => Item3, 4 => Item4, @@ -3274,23 +4019,19 @@ public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item /// public override void Dispose() { - var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); - if (headPtr == IntPtr.Zero) return; + var headPtr = Interlocked.Exchange(ref _headPtr, (nint)0); + if (headPtr == (nint)0) { + return; + } // Destroy all structures Marshal.DestroyStructure(headPtr); - var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item1Ptr); - var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item2Ptr); - var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item3Ptr); - var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item4Ptr); - var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item5Ptr); - var item6Ptr = Interlocked.Exchange(ref _item6Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item6Ptr); + Marshal.DestroyStructure(headPtr + Item1Offset); + Marshal.DestroyStructure(headPtr + Item2Offset); + Marshal.DestroyStructure(headPtr + Item3Offset); + Marshal.DestroyStructure(headPtr + Item4Offset); + Marshal.DestroyStructure(headPtr + Item5Offset); + Marshal.DestroyStructure(headPtr + Item6Offset); // Free memory block Marshal.FreeHGlobal(headPtr); @@ -3318,7 +4059,87 @@ public unsafe class ManagedChain : ManagedCh where T6 : struct, IExtendsChain where T7 : struct, IExtendsChain { - private IntPtr _headPtr; + /// + /// Gets the size (in bytes) of the head structure. + /// + public static readonly int HeadSize = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item1Offset = HeadSize; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item1Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item2Offset = Item1Offset + Item1Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item2Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item3Offset = Item2Offset + Item2Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item3Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item4Offset = Item3Offset + Item3Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item4Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item5Offset = Item4Offset + Item4Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item5Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item6Offset = Item5Offset + Item5Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item6Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item7Offset = Item6Offset + Item6Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item7Size = Marshal.SizeOf(); + + /// + /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. + /// + public static readonly int MemorySize = Item7Offset + Item7Size; + + private nint _headPtr; /// /// Gets a pointer to the current head. @@ -3334,160 +4155,172 @@ public TChain Head set { value.StructureType(); - var nextPtr = ((Chain*) _headPtr)->PNext; + var ptr = (Chain*) _headPtr; + var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, _headPtr, true); - ((Chain*) _headPtr)->PNext = nextPtr; + ptr->PNext = nextPtr; } } - private IntPtr _item1Ptr; - /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item1Ptr => (Chain*) _item1Ptr; + public Chain* Item1Ptr => (Chain*) (_headPtr + Item1Offset); /// /// Gets or sets item #1 in the chain. /// public T1 Item1 { - get => Unsafe.AsRef((Chain*) _item1Ptr); + get => Unsafe.AsRef(Item1Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item1Ptr)->PNext; - Marshal.StructureToPtr(value, _item1Ptr, true); - ((Chain*) _item1Ptr)->PNext = nextPtr; + var ptr = Item1Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item2Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item2Ptr => (Chain*) _item2Ptr; + public Chain* Item2Ptr => (Chain*) (_headPtr + Item2Offset); /// /// Gets or sets item #2 in the chain. /// public T2 Item2 { - get => Unsafe.AsRef((Chain*) _item2Ptr); + get => Unsafe.AsRef(Item2Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item2Ptr)->PNext; - Marshal.StructureToPtr(value, _item2Ptr, true); - ((Chain*) _item2Ptr)->PNext = nextPtr; + var ptr = Item2Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item3Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item3Ptr => (Chain*) _item3Ptr; + public Chain* Item3Ptr => (Chain*) (_headPtr + Item3Offset); /// /// Gets or sets item #3 in the chain. /// public T3 Item3 { - get => Unsafe.AsRef((Chain*) _item3Ptr); + get => Unsafe.AsRef(Item3Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item3Ptr)->PNext; - Marshal.StructureToPtr(value, _item3Ptr, true); - ((Chain*) _item3Ptr)->PNext = nextPtr; + var ptr = Item3Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item4Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item4Ptr => (Chain*) _item4Ptr; + public Chain* Item4Ptr => (Chain*) (_headPtr + Item4Offset); /// /// Gets or sets item #4 in the chain. /// public T4 Item4 { - get => Unsafe.AsRef((Chain*) _item4Ptr); + get => Unsafe.AsRef(Item4Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item4Ptr)->PNext; - Marshal.StructureToPtr(value, _item4Ptr, true); - ((Chain*) _item4Ptr)->PNext = nextPtr; + var ptr = Item4Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item5Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item5Ptr => (Chain*) _item5Ptr; + public Chain* Item5Ptr => (Chain*) (_headPtr + Item5Offset); /// /// Gets or sets item #5 in the chain. /// public T5 Item5 { - get => Unsafe.AsRef((Chain*) _item5Ptr); + get => Unsafe.AsRef(Item5Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item5Ptr)->PNext; - Marshal.StructureToPtr(value, _item5Ptr, true); - ((Chain*) _item5Ptr)->PNext = nextPtr; + var ptr = Item5Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item6Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item6Ptr => (Chain*) _item6Ptr; + public Chain* Item6Ptr => (Chain*) (_headPtr + Item6Offset); /// /// Gets or sets item #6 in the chain. /// public T6 Item6 { - get => Unsafe.AsRef((Chain*) _item6Ptr); + get => Unsafe.AsRef(Item6Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item6Ptr)->PNext; - Marshal.StructureToPtr(value, _item6Ptr, true); - ((Chain*) _item6Ptr)->PNext = nextPtr; + var ptr = Item6Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item7Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item7Ptr => (Chain*) _item7Ptr; + public Chain* Item7Ptr => (Chain*) (_headPtr + Item7Offset); /// /// Gets or sets item #7 in the chain. /// public T7 Item7 { - get => Unsafe.AsRef((Chain*) _item7Ptr); + get => Unsafe.AsRef(Item7Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item7Ptr)->PNext; - Marshal.StructureToPtr(value, _item7Ptr, true); - ((Chain*) _item7Ptr)->PNext = nextPtr; + var ptr = Item7Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } + /// + /// Creates a new with 8 items from an existing memory block. + /// + /// The pointer to the head of the chain.. + /// + /// Callers are responsible for ensuring the size of the memory is correct. + /// + internal ManagedChain(nint headPtr) + { + _headPtr = headPtr; + } + /// /// Creates a new with 8 items. /// @@ -3500,55 +4333,39 @@ public T7 Item7 /// Item 6. /// Item 7. public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - var item6Size = Marshal.SizeOf(); - var item7Size = Marshal.SizeOf(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size); head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; + Chain* itemPtr = Item1Ptr; item1.StructureType(); - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; + Marshal.StructureToPtr(item1, (nint)itemPtr, false); + HeadPtr->PNext = itemPtr; + itemPtr = Item2Ptr; item2.StructureType(); - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; + Marshal.StructureToPtr(item2, (nint)itemPtr, false); + Item1Ptr->PNext = itemPtr; + itemPtr = Item3Ptr; item3.StructureType(); - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; + Marshal.StructureToPtr(item3, (nint)itemPtr, false); + Item2Ptr->PNext = itemPtr; + itemPtr = Item4Ptr; item4.StructureType(); - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; + Marshal.StructureToPtr(item4, (nint)itemPtr, false); + Item3Ptr->PNext = itemPtr; + itemPtr = Item5Ptr; item5.StructureType(); - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; + Marshal.StructureToPtr(item5, (nint)itemPtr, false); + Item4Ptr->PNext = itemPtr; + itemPtr = Item6Ptr; item6.StructureType(); - Marshal.StructureToPtr(item6, _item6Ptr, false); - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; + Marshal.StructureToPtr(item6, (nint)itemPtr, false); + Item5Ptr->PNext = itemPtr; + itemPtr = Item7Ptr; item7.StructureType(); - Marshal.StructureToPtr(item7, _item7Ptr, false); - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + Marshal.StructureToPtr(item7, (nint)itemPtr, false); + Item6Ptr->PNext = itemPtr; + Item7Ptr->PNext = null; } /// @@ -3557,173 +4374,194 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul /// Any errors loading the chain. /// The unmanaged chain to use as the basis of this chain. public ManagedChain(out string errors, TChain chain) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Load existing chain first, so any errors occur before we allocate memory - var head = chain; - var headSize = Marshal.SizeOf(); - var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); - StructureType expectedStructureType; + chain.StructureType(); + Marshal.StructureToPtr(chain, _headPtr, false); StringBuilder errorBuilder = new StringBuilder(); + var existingPtr = (Chain*) Unsafe.AsPointer(ref chain); + var newPtr = (Chain*) _headPtr; + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item1Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T1 item1 = default; - if (currentPtr is null) + var expectedStructureType = item1.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 8"); - else { - expectedStructureType = item1.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 2; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item1 = Unsafe.AsRef(currentPtr); + } else { + item1 = Unsafe.AsRef(existingPtr); + } } - var item1Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item1, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item2Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T2 item2 = default; - if (currentPtr is null) + expectedStructureType = item2.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 8"); - else { - expectedStructureType = item2.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 3; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item2 = Unsafe.AsRef(currentPtr); + } else { + item2 = Unsafe.AsRef(existingPtr); + } } - var item2Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item2, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item3Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T3 item3 = default; - if (currentPtr is null) + expectedStructureType = item3.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 8"); - else { - expectedStructureType = item3.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 4; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item3 = Unsafe.AsRef(currentPtr); + } else { + item3 = Unsafe.AsRef(existingPtr); + } } - var item3Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item3, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item4Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T4 item4 = default; - if (currentPtr is null) + expectedStructureType = item4.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 8"); - else { - expectedStructureType = item4.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 5; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item4 = Unsafe.AsRef(currentPtr); + } else { + item4 = Unsafe.AsRef(existingPtr); + } } - var item4Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item4, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item5Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T5 item5 = default; - if (currentPtr is null) + expectedStructureType = item5.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 8"); - else { - expectedStructureType = item5.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 6; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item5 = Unsafe.AsRef(currentPtr); + } else { + item5 = Unsafe.AsRef(existingPtr); + } } - var item5Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item5, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item6Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T6 item6 = default; - if (currentPtr is null) + expectedStructureType = item6.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 8"); - else { - expectedStructureType = item6.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 7; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item6 = Unsafe.AsRef(currentPtr); + } else { + item6 = Unsafe.AsRef(existingPtr); + } } - var item6Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item6, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item7Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T7 item7 = default; - if (currentPtr is null) + expectedStructureType = item7.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 8"); - else { - expectedStructureType = item7.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 8; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item7 = Unsafe.AsRef(currentPtr); - if (currentPtr->PNext is not null) - errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 8"); + } else { + if (existingPtr->PNext is not null) { + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 8"); + existingPtr->PNext = null; + } + item7 = Unsafe.AsRef(existingPtr); + } } - var item7Size = Marshal.SizeOf(); - + Marshal.StructureToPtr(item7, (nint) newPtr, false); // Create string of errors errors = errorBuilder.ToString().Trim(); + } - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size); - Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - Marshal.StructureToPtr(item6, _item6Ptr, false); - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - Marshal.StructureToPtr(item7, _item7Ptr, false); - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + /// + /// Creates a new with 8 by copying this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Duplicate() + { + var newHeadPtr = Marshal.AllocHGlobal(MemorySize); + // Block copy original struct data for speed + Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); + // Update all pointers + ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); + ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); + ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); + ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); + ((Chain*)(newHeadPtr + Item4Offset))->PNext = (Chain*) (newHeadPtr + Item5Offset); + ((Chain*)(newHeadPtr + Item5Offset))->PNext = (Chain*) (newHeadPtr + Item6Offset); + ((Chain*)(newHeadPtr + Item6Offset))->PNext = (Chain*) (newHeadPtr + Item7Offset); + return new ManagedChain(newHeadPtr); } /// - /// Creates a new with 8 items. + /// Creates a new with 8 items, by appending + /// to the end of this chain. /// /// The chain to append to. /// Item 7. @@ -3731,47 +4569,63 @@ public ManagedChain(out string errors, TChain chain) /// Do not forget to dispose the chain if you are no longer using it. /// public ManagedChain(ManagedChain previous, T7 item7 = default) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - var item6Size = Marshal.SizeOf(); - var item7Size = Marshal.SizeOf(); - - var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size; - var newSize = originalSize + item7Size; - - _headPtr = Marshal.AllocHGlobal(newSize); + var previousSize = MemorySize - Item7Size; // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); - - _item1Ptr = _headPtr + headSize; - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); + + // Append item 7 + item7.StructureType(); + Marshal.StructureToPtr(item7, _headPtr + previousSize, false); - _item4Ptr = _item3Ptr + item3Size; - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; + // Update all pointers + ((Chain*)_headPtr)->PNext = (Chain*) (_headPtr + Item1Offset); + ((Chain*)(_headPtr + Item1Offset))->PNext = (Chain*) (_headPtr + Item2Offset); + ((Chain*)(_headPtr + Item2Offset))->PNext = (Chain*) (_headPtr + Item3Offset); + ((Chain*)(_headPtr + Item3Offset))->PNext = (Chain*) (_headPtr + Item4Offset); + ((Chain*)(_headPtr + Item4Offset))->PNext = (Chain*) (_headPtr + Item5Offset); + ((Chain*)(_headPtr + Item5Offset))->PNext = (Chain*) (_headPtr + Item6Offset); + ((Chain*)(_headPtr + Item6Offset))->PNext = (Chain*) (_headPtr + Item7Offset); + ((Chain*)(_headPtr + previousSize))->PNext = null; + } - _item5Ptr = _item4Ptr + item4Size; - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + /// + /// Creates a new with 7 items, by removing the last item + /// from this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Truncate() + { + return Truncate(out var _); + } - _item6Ptr = _item5Ptr + item5Size; - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + /// + /// Creates a new with 7 items, by removing + /// from the end of this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Truncate(out T7 item7) + { + item7 = Item7; - _item7Ptr = _item6Ptr + item6Size; - // Append the last structure - item7.StructureType(); - Marshal.StructureToPtr(item7, _item7Ptr, false); - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + var newSize = MemorySize - Item7Size; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); + // Update all pointers + ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); + ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); + ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); + ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); + ((Chain*)(newHeadPtr + Item4Offset))->PNext = (Chain*) (newHeadPtr + Item5Offset); + ((Chain*)(newHeadPtr + Item5Offset))->PNext = (Chain*) (newHeadPtr + Item6Offset); + ((Chain*)(newHeadPtr + Item6Offset))->PNext = null; + return new ManagedChain(newHeadPtr); } /// @@ -3781,7 +4635,7 @@ public ManagedChain(ManagedChain previous, T7 it /// Item 8. /// Type of Item 8 /// - /// Do not forget to dispose this chain if you are no longer using it. + /// Do not forget to dispose this chain if you are no longer using it. /// public ManagedChain Append(T8 item8 = default) where T8: struct, IExtendsChain @@ -3809,7 +4663,8 @@ public override IEnumerator GetEnumerator() public override IChainable this[int index] => index switch { - 0 => Head, 1 => Item1, + 0 => Head, + 1 => Item1, 2 => Item2, 3 => Item3, 4 => Item4, @@ -3845,25 +4700,20 @@ public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item /// public override void Dispose() { - var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); - if (headPtr == IntPtr.Zero) return; + var headPtr = Interlocked.Exchange(ref _headPtr, (nint)0); + if (headPtr == (nint)0) { + return; + } // Destroy all structures Marshal.DestroyStructure(headPtr); - var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item1Ptr); - var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item2Ptr); - var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item3Ptr); - var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item4Ptr); - var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item5Ptr); - var item6Ptr = Interlocked.Exchange(ref _item6Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item6Ptr); - var item7Ptr = Interlocked.Exchange(ref _item7Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item7Ptr); + Marshal.DestroyStructure(headPtr + Item1Offset); + Marshal.DestroyStructure(headPtr + Item2Offset); + Marshal.DestroyStructure(headPtr + Item3Offset); + Marshal.DestroyStructure(headPtr + Item4Offset); + Marshal.DestroyStructure(headPtr + Item5Offset); + Marshal.DestroyStructure(headPtr + Item6Offset); + Marshal.DestroyStructure(headPtr + Item7Offset); // Free memory block Marshal.FreeHGlobal(headPtr); @@ -3893,197 +4743,299 @@ public unsafe class ManagedChain : Manag where T7 : struct, IExtendsChain where T8 : struct, IExtendsChain { - private IntPtr _headPtr; + /// + /// Gets the size (in bytes) of the head structure. + /// + public static readonly int HeadSize = Marshal.SizeOf(); /// - /// Gets a pointer to the current head. + /// Gets the offset to the start of . /// - public Chain* HeadPtr => (Chain*) _headPtr; + public static readonly int Item1Offset = HeadSize; /// - /// Gets or sets the head of the chain. + /// Gets the size (in bytes) of the Item 1. /// - public TChain Head - { - get => Unsafe.AsRef((Chain*) _headPtr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _headPtr)->PNext; - Marshal.StructureToPtr(value, _headPtr, true); - ((Chain*) _headPtr)->PNext = nextPtr; - } - } + public static readonly int Item1Size = Marshal.SizeOf(); - private IntPtr _item1Ptr; + /// + /// Gets the offset to the start of . + /// + public static readonly int Item2Offset = Item1Offset + Item1Size; /// - /// Gets a pointer to the second item in the chain. + /// Gets the size (in bytes) of the Item 1. /// - public Chain* Item1Ptr => (Chain*) _item1Ptr; + public static readonly int Item2Size = Marshal.SizeOf(); /// - /// Gets or sets item #1 in the chain. + /// Gets the offset to the start of . /// - public T1 Item1 - { - get => Unsafe.AsRef((Chain*) _item1Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item1Ptr)->PNext; - Marshal.StructureToPtr(value, _item1Ptr, true); - ((Chain*) _item1Ptr)->PNext = nextPtr; - } - } - private IntPtr _item2Ptr; + public static readonly int Item3Offset = Item2Offset + Item2Size; /// - /// Gets a pointer to the second item in the chain. + /// Gets the size (in bytes) of the Item 1. /// - public Chain* Item2Ptr => (Chain*) _item2Ptr; + public static readonly int Item3Size = Marshal.SizeOf(); /// - /// Gets or sets item #2 in the chain. + /// Gets the offset to the start of . /// - public T2 Item2 - { - get => Unsafe.AsRef((Chain*) _item2Ptr); - set - { - value.StructureType(); - var nextPtr = ((Chain*) _item2Ptr)->PNext; - Marshal.StructureToPtr(value, _item2Ptr, true); - ((Chain*) _item2Ptr)->PNext = nextPtr; - } - } - private IntPtr _item3Ptr; + public static readonly int Item4Offset = Item3Offset + Item3Size; /// - /// Gets a pointer to the second item in the chain. + /// Gets the size (in bytes) of the Item 1. /// - public Chain* Item3Ptr => (Chain*) _item3Ptr; + public static readonly int Item4Size = Marshal.SizeOf(); /// - /// Gets or sets item #3 in the chain. + /// Gets the offset to the start of . /// - public T3 Item3 + public static readonly int Item5Offset = Item4Offset + Item4Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item5Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item6Offset = Item5Offset + Item5Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item6Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item7Offset = Item6Offset + Item6Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item7Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item8Offset = Item7Offset + Item7Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item8Size = Marshal.SizeOf(); + + /// + /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. + /// + public static readonly int MemorySize = Item8Offset + Item8Size; + + private nint _headPtr; + + /// + /// Gets a pointer to the current head. + /// + public Chain* HeadPtr => (Chain*) _headPtr; + + /// + /// Gets or sets the head of the chain. + /// + public TChain Head + { + get => Unsafe.AsRef((Chain*) _headPtr); + set + { + value.StructureType(); + var ptr = (Chain*) _headPtr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, _headPtr, true); + ptr->PNext = nextPtr; + } + } + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item1Ptr => (Chain*) (_headPtr + Item1Offset); + + /// + /// Gets or sets item #1 in the chain. + /// + public T1 Item1 + { + get => Unsafe.AsRef(Item1Ptr); + set + { + value.StructureType(); + var ptr = Item1Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } + } + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item2Ptr => (Chain*) (_headPtr + Item2Offset); + + /// + /// Gets or sets item #2 in the chain. + /// + public T2 Item2 + { + get => Unsafe.AsRef(Item2Ptr); + set + { + value.StructureType(); + var ptr = Item2Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } + } + + /// + /// Gets a pointer to the second item in the chain. + /// + public Chain* Item3Ptr => (Chain*) (_headPtr + Item3Offset); + + /// + /// Gets or sets item #3 in the chain. + /// + public T3 Item3 { - get => Unsafe.AsRef((Chain*) _item3Ptr); + get => Unsafe.AsRef(Item3Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item3Ptr)->PNext; - Marshal.StructureToPtr(value, _item3Ptr, true); - ((Chain*) _item3Ptr)->PNext = nextPtr; + var ptr = Item3Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item4Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item4Ptr => (Chain*) _item4Ptr; + public Chain* Item4Ptr => (Chain*) (_headPtr + Item4Offset); /// /// Gets or sets item #4 in the chain. /// public T4 Item4 { - get => Unsafe.AsRef((Chain*) _item4Ptr); + get => Unsafe.AsRef(Item4Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item4Ptr)->PNext; - Marshal.StructureToPtr(value, _item4Ptr, true); - ((Chain*) _item4Ptr)->PNext = nextPtr; + var ptr = Item4Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item5Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item5Ptr => (Chain*) _item5Ptr; + public Chain* Item5Ptr => (Chain*) (_headPtr + Item5Offset); /// /// Gets or sets item #5 in the chain. /// public T5 Item5 { - get => Unsafe.AsRef((Chain*) _item5Ptr); + get => Unsafe.AsRef(Item5Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item5Ptr)->PNext; - Marshal.StructureToPtr(value, _item5Ptr, true); - ((Chain*) _item5Ptr)->PNext = nextPtr; + var ptr = Item5Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item6Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item6Ptr => (Chain*) _item6Ptr; + public Chain* Item6Ptr => (Chain*) (_headPtr + Item6Offset); /// /// Gets or sets item #6 in the chain. /// public T6 Item6 { - get => Unsafe.AsRef((Chain*) _item6Ptr); + get => Unsafe.AsRef(Item6Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item6Ptr)->PNext; - Marshal.StructureToPtr(value, _item6Ptr, true); - ((Chain*) _item6Ptr)->PNext = nextPtr; + var ptr = Item6Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item7Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item7Ptr => (Chain*) _item7Ptr; + public Chain* Item7Ptr => (Chain*) (_headPtr + Item7Offset); /// /// Gets or sets item #7 in the chain. /// public T7 Item7 { - get => Unsafe.AsRef((Chain*) _item7Ptr); + get => Unsafe.AsRef(Item7Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item7Ptr)->PNext; - Marshal.StructureToPtr(value, _item7Ptr, true); - ((Chain*) _item7Ptr)->PNext = nextPtr; + var ptr = Item7Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item8Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item8Ptr => (Chain*) _item8Ptr; + public Chain* Item8Ptr => (Chain*) (_headPtr + Item8Offset); /// /// Gets or sets item #8 in the chain. /// public T8 Item8 { - get => Unsafe.AsRef((Chain*) _item8Ptr); + get => Unsafe.AsRef(Item8Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item8Ptr)->PNext; - Marshal.StructureToPtr(value, _item8Ptr, true); - ((Chain*) _item8Ptr)->PNext = nextPtr; + var ptr = Item8Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } + /// + /// Creates a new with 9 items from an existing memory block. + /// + /// The pointer to the head of the chain.. + /// + /// Callers are responsible for ensuring the size of the memory is correct. + /// + internal ManagedChain(nint headPtr) + { + _headPtr = headPtr; + } + /// /// Creates a new with 9 items. /// @@ -4097,61 +5049,43 @@ public T8 Item8 /// Item 7. /// Item 8. public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - var item6Size = Marshal.SizeOf(); - var item7Size = Marshal.SizeOf(); - var item8Size = Marshal.SizeOf(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size); head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; + Chain* itemPtr = Item1Ptr; item1.StructureType(); - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; + Marshal.StructureToPtr(item1, (nint)itemPtr, false); + HeadPtr->PNext = itemPtr; + itemPtr = Item2Ptr; item2.StructureType(); - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; + Marshal.StructureToPtr(item2, (nint)itemPtr, false); + Item1Ptr->PNext = itemPtr; + itemPtr = Item3Ptr; item3.StructureType(); - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; + Marshal.StructureToPtr(item3, (nint)itemPtr, false); + Item2Ptr->PNext = itemPtr; + itemPtr = Item4Ptr; item4.StructureType(); - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; + Marshal.StructureToPtr(item4, (nint)itemPtr, false); + Item3Ptr->PNext = itemPtr; + itemPtr = Item5Ptr; item5.StructureType(); - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; + Marshal.StructureToPtr(item5, (nint)itemPtr, false); + Item4Ptr->PNext = itemPtr; + itemPtr = Item6Ptr; item6.StructureType(); - Marshal.StructureToPtr(item6, _item6Ptr, false); - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; + Marshal.StructureToPtr(item6, (nint)itemPtr, false); + Item5Ptr->PNext = itemPtr; + itemPtr = Item7Ptr; item7.StructureType(); - Marshal.StructureToPtr(item7, _item7Ptr, false); - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; + Marshal.StructureToPtr(item7, (nint)itemPtr, false); + Item6Ptr->PNext = itemPtr; + itemPtr = Item8Ptr; item8.StructureType(); - Marshal.StructureToPtr(item8, _item8Ptr, false); - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + Marshal.StructureToPtr(item8, (nint)itemPtr, false); + Item7Ptr->PNext = itemPtr; + Item8Ptr->PNext = null; } /// @@ -4160,194 +5094,216 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul /// Any errors loading the chain. /// The unmanaged chain to use as the basis of this chain. public ManagedChain(out string errors, TChain chain) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Load existing chain first, so any errors occur before we allocate memory - var head = chain; - var headSize = Marshal.SizeOf(); - var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); - StructureType expectedStructureType; + chain.StructureType(); + Marshal.StructureToPtr(chain, _headPtr, false); StringBuilder errorBuilder = new StringBuilder(); + var existingPtr = (Chain*) Unsafe.AsPointer(ref chain); + var newPtr = (Chain*) _headPtr; + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item1Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T1 item1 = default; - if (currentPtr is null) + var expectedStructureType = item1.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 9"); - else { - expectedStructureType = item1.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 2; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item1 = Unsafe.AsRef(currentPtr); + } else { + item1 = Unsafe.AsRef(existingPtr); + } } - var item1Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item1, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item2Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T2 item2 = default; - if (currentPtr is null) + expectedStructureType = item2.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 9"); - else { - expectedStructureType = item2.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 3; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item2 = Unsafe.AsRef(currentPtr); + } else { + item2 = Unsafe.AsRef(existingPtr); + } } - var item2Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item2, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item3Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T3 item3 = default; - if (currentPtr is null) + expectedStructureType = item3.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 9"); - else { - expectedStructureType = item3.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 4; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item3 = Unsafe.AsRef(currentPtr); + } else { + item3 = Unsafe.AsRef(existingPtr); + } } - var item3Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item3, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item4Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T4 item4 = default; - if (currentPtr is null) + expectedStructureType = item4.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 9"); - else { - expectedStructureType = item4.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 5; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item4 = Unsafe.AsRef(currentPtr); + } else { + item4 = Unsafe.AsRef(existingPtr); + } } - var item4Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item4, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item5Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T5 item5 = default; - if (currentPtr is null) + expectedStructureType = item5.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 9"); - else { - expectedStructureType = item5.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 6; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item5 = Unsafe.AsRef(currentPtr); + } else { + item5 = Unsafe.AsRef(existingPtr); + } } - var item5Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item5, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item6Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T6 item6 = default; - if (currentPtr is null) + expectedStructureType = item6.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 9"); - else { - expectedStructureType = item6.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 7; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item6 = Unsafe.AsRef(currentPtr); + } else { + item6 = Unsafe.AsRef(existingPtr); + } } - var item6Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item6, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item7Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T7 item7 = default; - if (currentPtr is null) + expectedStructureType = item7.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 9"); - else { - expectedStructureType = item7.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 8; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item7 = Unsafe.AsRef(currentPtr); + } else { + item7 = Unsafe.AsRef(existingPtr); + } } - var item7Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item7, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item8Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T8 item8 = default; - if (currentPtr is null) + expectedStructureType = item8.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 9"); - else { - expectedStructureType = item8.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 9; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item8 = Unsafe.AsRef(currentPtr); - if (currentPtr->PNext is not null) - errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 9"); + } else { + if (existingPtr->PNext is not null) { + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 9"); + existingPtr->PNext = null; + } + item8 = Unsafe.AsRef(existingPtr); + } } - var item8Size = Marshal.SizeOf(); - + Marshal.StructureToPtr(item8, (nint) newPtr, false); // Create string of errors errors = errorBuilder.ToString().Trim(); + } - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size); - Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - Marshal.StructureToPtr(item6, _item6Ptr, false); - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - Marshal.StructureToPtr(item7, _item7Ptr, false); - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; - Marshal.StructureToPtr(item8, _item8Ptr, false); - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + /// + /// Creates a new with 9 by copying this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Duplicate() + { + var newHeadPtr = Marshal.AllocHGlobal(MemorySize); + // Block copy original struct data for speed + Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); + // Update all pointers + ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); + ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); + ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); + ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); + ((Chain*)(newHeadPtr + Item4Offset))->PNext = (Chain*) (newHeadPtr + Item5Offset); + ((Chain*)(newHeadPtr + Item5Offset))->PNext = (Chain*) (newHeadPtr + Item6Offset); + ((Chain*)(newHeadPtr + Item6Offset))->PNext = (Chain*) (newHeadPtr + Item7Offset); + ((Chain*)(newHeadPtr + Item7Offset))->PNext = (Chain*) (newHeadPtr + Item8Offset); + return new ManagedChain(newHeadPtr); } /// - /// Creates a new with 9 items. + /// Creates a new with 9 items, by appending + /// to the end of this chain. /// /// The chain to append to. /// Item 8. @@ -4355,51 +5311,65 @@ public ManagedChain(out string errors, TChain chain) /// Do not forget to dispose the chain if you are no longer using it. /// public ManagedChain(ManagedChain previous, T8 item8 = default) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - var item6Size = Marshal.SizeOf(); - var item7Size = Marshal.SizeOf(); - var item8Size = Marshal.SizeOf(); - - var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size; - var newSize = originalSize + item8Size; - - _headPtr = Marshal.AllocHGlobal(newSize); + var previousSize = MemorySize - Item8Size; // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); - - _item1Ptr = _headPtr + headSize; - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); + + // Append item 8 + item8.StructureType(); + Marshal.StructureToPtr(item8, _headPtr + previousSize, false); - _item2Ptr = _item1Ptr + item1Size; - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; + // Update all pointers + ((Chain*)_headPtr)->PNext = (Chain*) (_headPtr + Item1Offset); + ((Chain*)(_headPtr + Item1Offset))->PNext = (Chain*) (_headPtr + Item2Offset); + ((Chain*)(_headPtr + Item2Offset))->PNext = (Chain*) (_headPtr + Item3Offset); + ((Chain*)(_headPtr + Item3Offset))->PNext = (Chain*) (_headPtr + Item4Offset); + ((Chain*)(_headPtr + Item4Offset))->PNext = (Chain*) (_headPtr + Item5Offset); + ((Chain*)(_headPtr + Item5Offset))->PNext = (Chain*) (_headPtr + Item6Offset); + ((Chain*)(_headPtr + Item6Offset))->PNext = (Chain*) (_headPtr + Item7Offset); + ((Chain*)(_headPtr + Item7Offset))->PNext = (Chain*) (_headPtr + Item8Offset); + ((Chain*)(_headPtr + previousSize))->PNext = null; + } - _item6Ptr = _item5Ptr + item5Size; - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; + /// + /// Creates a new with 8 items, by removing the last item + /// from this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Truncate() + { + return Truncate(out var _); + } - _item7Ptr = _item6Ptr + item6Size; - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; + /// + /// Creates a new with 8 items, by removing + /// from the end of this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Truncate(out T8 item8) + { + item8 = Item8; - _item8Ptr = _item7Ptr + item7Size; - // Append the last structure - item8.StructureType(); - Marshal.StructureToPtr(item8, _item8Ptr, false); - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + var newSize = MemorySize - Item8Size; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); + // Update all pointers + ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); + ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); + ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); + ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); + ((Chain*)(newHeadPtr + Item4Offset))->PNext = (Chain*) (newHeadPtr + Item5Offset); + ((Chain*)(newHeadPtr + Item5Offset))->PNext = (Chain*) (newHeadPtr + Item6Offset); + ((Chain*)(newHeadPtr + Item6Offset))->PNext = (Chain*) (newHeadPtr + Item7Offset); + ((Chain*)(newHeadPtr + Item7Offset))->PNext = null; + return new ManagedChain(newHeadPtr); } /// @@ -4409,7 +5379,7 @@ public ManagedChain(ManagedChain previous, T /// Item 9. /// Type of Item 9 /// - /// Do not forget to dispose this chain if you are no longer using it. + /// Do not forget to dispose this chain if you are no longer using it. /// public ManagedChain Append(T9 item9 = default) where T9: struct, IExtendsChain @@ -4438,7 +5408,8 @@ public override IEnumerator GetEnumerator() public override IChainable this[int index] => index switch { - 0 => Head, 1 => Item1, + 0 => Head, + 1 => Item1, 2 => Item2, 3 => Item3, 4 => Item4, @@ -4477,27 +5448,21 @@ public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item /// public override void Dispose() { - var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); - if (headPtr == IntPtr.Zero) return; + var headPtr = Interlocked.Exchange(ref _headPtr, (nint)0); + if (headPtr == (nint)0) { + return; + } // Destroy all structures Marshal.DestroyStructure(headPtr); - var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item1Ptr); - var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item2Ptr); - var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item3Ptr); - var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item4Ptr); - var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item5Ptr); - var item6Ptr = Interlocked.Exchange(ref _item6Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item6Ptr); - var item7Ptr = Interlocked.Exchange(ref _item7Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item7Ptr); - var item8Ptr = Interlocked.Exchange(ref _item8Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item8Ptr); + Marshal.DestroyStructure(headPtr + Item1Offset); + Marshal.DestroyStructure(headPtr + Item2Offset); + Marshal.DestroyStructure(headPtr + Item3Offset); + Marshal.DestroyStructure(headPtr + Item4Offset); + Marshal.DestroyStructure(headPtr + Item5Offset); + Marshal.DestroyStructure(headPtr + Item6Offset); + Marshal.DestroyStructure(headPtr + Item7Offset); + Marshal.DestroyStructure(headPtr + Item8Offset); // Free memory block Marshal.FreeHGlobal(headPtr); @@ -4529,7 +5494,107 @@ public unsafe class ManagedChain : M where T8 : struct, IExtendsChain where T9 : struct, IExtendsChain { - private IntPtr _headPtr; + /// + /// Gets the size (in bytes) of the head structure. + /// + public static readonly int HeadSize = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item1Offset = HeadSize; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item1Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item2Offset = Item1Offset + Item1Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item2Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item3Offset = Item2Offset + Item2Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item3Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item4Offset = Item3Offset + Item3Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item4Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item5Offset = Item4Offset + Item4Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item5Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item6Offset = Item5Offset + Item5Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item6Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item7Offset = Item6Offset + Item6Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item7Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item8Offset = Item7Offset + Item7Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item8Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item9Offset = Item8Offset + Item8Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item9Size = Marshal.SizeOf(); + + /// + /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. + /// + public static readonly int MemorySize = Item9Offset + Item9Size; + + private nint _headPtr; /// /// Gets a pointer to the current head. @@ -4545,202 +5610,214 @@ public TChain Head set { value.StructureType(); - var nextPtr = ((Chain*) _headPtr)->PNext; + var ptr = (Chain*) _headPtr; + var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, _headPtr, true); - ((Chain*) _headPtr)->PNext = nextPtr; + ptr->PNext = nextPtr; } } - private IntPtr _item1Ptr; - /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item1Ptr => (Chain*) _item1Ptr; + public Chain* Item1Ptr => (Chain*) (_headPtr + Item1Offset); /// /// Gets or sets item #1 in the chain. /// public T1 Item1 { - get => Unsafe.AsRef((Chain*) _item1Ptr); + get => Unsafe.AsRef(Item1Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item1Ptr)->PNext; - Marshal.StructureToPtr(value, _item1Ptr, true); - ((Chain*) _item1Ptr)->PNext = nextPtr; + var ptr = Item1Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item2Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item2Ptr => (Chain*) _item2Ptr; + public Chain* Item2Ptr => (Chain*) (_headPtr + Item2Offset); /// /// Gets or sets item #2 in the chain. /// public T2 Item2 { - get => Unsafe.AsRef((Chain*) _item2Ptr); + get => Unsafe.AsRef(Item2Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item2Ptr)->PNext; - Marshal.StructureToPtr(value, _item2Ptr, true); - ((Chain*) _item2Ptr)->PNext = nextPtr; + var ptr = Item2Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item3Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item3Ptr => (Chain*) _item3Ptr; + public Chain* Item3Ptr => (Chain*) (_headPtr + Item3Offset); /// /// Gets or sets item #3 in the chain. /// public T3 Item3 { - get => Unsafe.AsRef((Chain*) _item3Ptr); + get => Unsafe.AsRef(Item3Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item3Ptr)->PNext; - Marshal.StructureToPtr(value, _item3Ptr, true); - ((Chain*) _item3Ptr)->PNext = nextPtr; + var ptr = Item3Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item4Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item4Ptr => (Chain*) _item4Ptr; + public Chain* Item4Ptr => (Chain*) (_headPtr + Item4Offset); /// /// Gets or sets item #4 in the chain. /// public T4 Item4 { - get => Unsafe.AsRef((Chain*) _item4Ptr); + get => Unsafe.AsRef(Item4Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item4Ptr)->PNext; - Marshal.StructureToPtr(value, _item4Ptr, true); - ((Chain*) _item4Ptr)->PNext = nextPtr; + var ptr = Item4Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item5Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item5Ptr => (Chain*) _item5Ptr; + public Chain* Item5Ptr => (Chain*) (_headPtr + Item5Offset); /// /// Gets or sets item #5 in the chain. /// public T5 Item5 { - get => Unsafe.AsRef((Chain*) _item5Ptr); + get => Unsafe.AsRef(Item5Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item5Ptr)->PNext; - Marshal.StructureToPtr(value, _item5Ptr, true); - ((Chain*) _item5Ptr)->PNext = nextPtr; + var ptr = Item5Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item6Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item6Ptr => (Chain*) _item6Ptr; + public Chain* Item6Ptr => (Chain*) (_headPtr + Item6Offset); /// /// Gets or sets item #6 in the chain. /// public T6 Item6 { - get => Unsafe.AsRef((Chain*) _item6Ptr); + get => Unsafe.AsRef(Item6Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item6Ptr)->PNext; - Marshal.StructureToPtr(value, _item6Ptr, true); - ((Chain*) _item6Ptr)->PNext = nextPtr; + var ptr = Item6Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item7Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item7Ptr => (Chain*) _item7Ptr; + public Chain* Item7Ptr => (Chain*) (_headPtr + Item7Offset); /// /// Gets or sets item #7 in the chain. /// public T7 Item7 { - get => Unsafe.AsRef((Chain*) _item7Ptr); + get => Unsafe.AsRef(Item7Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item7Ptr)->PNext; - Marshal.StructureToPtr(value, _item7Ptr, true); - ((Chain*) _item7Ptr)->PNext = nextPtr; + var ptr = Item7Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item8Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item8Ptr => (Chain*) _item8Ptr; + public Chain* Item8Ptr => (Chain*) (_headPtr + Item8Offset); /// /// Gets or sets item #8 in the chain. /// public T8 Item8 { - get => Unsafe.AsRef((Chain*) _item8Ptr); + get => Unsafe.AsRef(Item8Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item8Ptr)->PNext; - Marshal.StructureToPtr(value, _item8Ptr, true); - ((Chain*) _item8Ptr)->PNext = nextPtr; + var ptr = Item8Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item9Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item9Ptr => (Chain*) _item9Ptr; + public Chain* Item9Ptr => (Chain*) (_headPtr + Item9Offset); /// /// Gets or sets item #9 in the chain. /// public T9 Item9 { - get => Unsafe.AsRef((Chain*) _item9Ptr); + get => Unsafe.AsRef(Item9Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item9Ptr)->PNext; - Marshal.StructureToPtr(value, _item9Ptr, true); - ((Chain*) _item9Ptr)->PNext = nextPtr; + var ptr = Item9Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } + /// + /// Creates a new with 10 items from an existing memory block. + /// + /// The pointer to the head of the chain.. + /// + /// Callers are responsible for ensuring the size of the memory is correct. + /// + internal ManagedChain(nint headPtr) + { + _headPtr = headPtr; + } + /// /// Creates a new with 10 items. /// @@ -4755,67 +5832,47 @@ public T9 Item9 /// Item 8. /// Item 9. public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - var item6Size = Marshal.SizeOf(); - var item7Size = Marshal.SizeOf(); - var item8Size = Marshal.SizeOf(); - var item9Size = Marshal.SizeOf(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size); head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; + Chain* itemPtr = Item1Ptr; item1.StructureType(); - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; + Marshal.StructureToPtr(item1, (nint)itemPtr, false); + HeadPtr->PNext = itemPtr; + itemPtr = Item2Ptr; item2.StructureType(); - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; + Marshal.StructureToPtr(item2, (nint)itemPtr, false); + Item1Ptr->PNext = itemPtr; + itemPtr = Item3Ptr; item3.StructureType(); - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; + Marshal.StructureToPtr(item3, (nint)itemPtr, false); + Item2Ptr->PNext = itemPtr; + itemPtr = Item4Ptr; item4.StructureType(); - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; + Marshal.StructureToPtr(item4, (nint)itemPtr, false); + Item3Ptr->PNext = itemPtr; + itemPtr = Item5Ptr; item5.StructureType(); - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; + Marshal.StructureToPtr(item5, (nint)itemPtr, false); + Item4Ptr->PNext = itemPtr; + itemPtr = Item6Ptr; item6.StructureType(); - Marshal.StructureToPtr(item6, _item6Ptr, false); - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; + Marshal.StructureToPtr(item6, (nint)itemPtr, false); + Item5Ptr->PNext = itemPtr; + itemPtr = Item7Ptr; item7.StructureType(); - Marshal.StructureToPtr(item7, _item7Ptr, false); - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; + Marshal.StructureToPtr(item7, (nint)itemPtr, false); + Item6Ptr->PNext = itemPtr; + itemPtr = Item8Ptr; item8.StructureType(); - Marshal.StructureToPtr(item8, _item8Ptr, false); - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - - _item9Ptr = _item8Ptr + item8Size; + Marshal.StructureToPtr(item8, (nint)itemPtr, false); + Item7Ptr->PNext = itemPtr; + itemPtr = Item9Ptr; item9.StructureType(); - Marshal.StructureToPtr(item9, _item9Ptr, false); - ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + Marshal.StructureToPtr(item9, (nint)itemPtr, false); + Item8Ptr->PNext = itemPtr; + Item9Ptr->PNext = null; } /// @@ -4824,215 +5881,238 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul /// Any errors loading the chain. /// The unmanaged chain to use as the basis of this chain. public ManagedChain(out string errors, TChain chain) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Load existing chain first, so any errors occur before we allocate memory - var head = chain; - var headSize = Marshal.SizeOf(); - var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); - StructureType expectedStructureType; + chain.StructureType(); + Marshal.StructureToPtr(chain, _headPtr, false); StringBuilder errorBuilder = new StringBuilder(); + var existingPtr = (Chain*) Unsafe.AsPointer(ref chain); + var newPtr = (Chain*) _headPtr; + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item1Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T1 item1 = default; - if (currentPtr is null) + var expectedStructureType = item1.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 10"); - else { - expectedStructureType = item1.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 2; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item1 = Unsafe.AsRef(currentPtr); + } else { + item1 = Unsafe.AsRef(existingPtr); + } } - var item1Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item1, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item2Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T2 item2 = default; - if (currentPtr is null) + expectedStructureType = item2.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 10"); - else { - expectedStructureType = item2.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 3; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item2 = Unsafe.AsRef(currentPtr); + } else { + item2 = Unsafe.AsRef(existingPtr); + } } - var item2Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item2, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item3Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T3 item3 = default; - if (currentPtr is null) + expectedStructureType = item3.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 10"); - else { - expectedStructureType = item3.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 4; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item3 = Unsafe.AsRef(currentPtr); + } else { + item3 = Unsafe.AsRef(existingPtr); + } } - var item3Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item3, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item4Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T4 item4 = default; - if (currentPtr is null) + expectedStructureType = item4.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 10"); - else { - expectedStructureType = item4.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 5; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item4 = Unsafe.AsRef(currentPtr); + } else { + item4 = Unsafe.AsRef(existingPtr); + } } - var item4Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item4, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item5Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T5 item5 = default; - if (currentPtr is null) + expectedStructureType = item5.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 10"); - else { - expectedStructureType = item5.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 6; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item5 = Unsafe.AsRef(currentPtr); + } else { + item5 = Unsafe.AsRef(existingPtr); + } } - var item5Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item5, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item6Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T6 item6 = default; - if (currentPtr is null) + expectedStructureType = item6.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 10"); - else { - expectedStructureType = item6.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 7; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item6 = Unsafe.AsRef(currentPtr); + } else { + item6 = Unsafe.AsRef(existingPtr); + } } - var item6Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item6, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item7Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T7 item7 = default; - if (currentPtr is null) + expectedStructureType = item7.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 10"); - else { - expectedStructureType = item7.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 8; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item7 = Unsafe.AsRef(currentPtr); + } else { + item7 = Unsafe.AsRef(existingPtr); + } } - var item7Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item7, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item8Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T8 item8 = default; - if (currentPtr is null) + expectedStructureType = item8.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 10"); - else { - expectedStructureType = item8.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 9; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item8 = Unsafe.AsRef(currentPtr); + } else { + item8 = Unsafe.AsRef(existingPtr); + } } - var item8Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item8, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item9Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T9 item9 = default; - if (currentPtr is null) + expectedStructureType = item9.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 9, expected length 10"); - else { - expectedStructureType = item9.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 10; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item9 = Unsafe.AsRef(currentPtr); - if (currentPtr->PNext is not null) - errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 10"); + } else { + if (existingPtr->PNext is not null) { + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 10"); + existingPtr->PNext = null; + } + item9 = Unsafe.AsRef(existingPtr); + } } - var item9Size = Marshal.SizeOf(); - + Marshal.StructureToPtr(item9, (nint) newPtr, false); // Create string of errors errors = errorBuilder.ToString().Trim(); + } - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size); - Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - Marshal.StructureToPtr(item6, _item6Ptr, false); - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - Marshal.StructureToPtr(item7, _item7Ptr, false); - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; - Marshal.StructureToPtr(item8, _item8Ptr, false); - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - - _item9Ptr = _item8Ptr + item8Size; - Marshal.StructureToPtr(item9, _item9Ptr, false); - ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + /// + /// Creates a new with 10 by copying this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Duplicate() + { + var newHeadPtr = Marshal.AllocHGlobal(MemorySize); + // Block copy original struct data for speed + Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); + // Update all pointers + ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); + ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); + ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); + ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); + ((Chain*)(newHeadPtr + Item4Offset))->PNext = (Chain*) (newHeadPtr + Item5Offset); + ((Chain*)(newHeadPtr + Item5Offset))->PNext = (Chain*) (newHeadPtr + Item6Offset); + ((Chain*)(newHeadPtr + Item6Offset))->PNext = (Chain*) (newHeadPtr + Item7Offset); + ((Chain*)(newHeadPtr + Item7Offset))->PNext = (Chain*) (newHeadPtr + Item8Offset); + ((Chain*)(newHeadPtr + Item8Offset))->PNext = (Chain*) (newHeadPtr + Item9Offset); + return new ManagedChain(newHeadPtr); } /// - /// Creates a new with 10 items. + /// Creates a new with 10 items, by appending + /// to the end of this chain. /// /// The chain to append to. /// Item 9. @@ -5040,55 +6120,67 @@ public ManagedChain(out string errors, TChain chain) /// Do not forget to dispose the chain if you are no longer using it. /// public ManagedChain(ManagedChain previous, T9 item9 = default) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - var item6Size = Marshal.SizeOf(); - var item7Size = Marshal.SizeOf(); - var item8Size = Marshal.SizeOf(); - var item9Size = Marshal.SizeOf(); - - var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size; - var newSize = originalSize + item9Size; - - _headPtr = Marshal.AllocHGlobal(newSize); + var previousSize = MemorySize - Item9Size; // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); - - _item1Ptr = _headPtr + headSize; - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); + + // Append item 9 + item9.StructureType(); + Marshal.StructureToPtr(item9, _headPtr + previousSize, false); - _item2Ptr = _item1Ptr + item1Size; - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - - _item9Ptr = _item8Ptr + item8Size; - // Append the last structure - item9.StructureType(); - Marshal.StructureToPtr(item9, _item9Ptr, false); - ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + // Update all pointers + ((Chain*)_headPtr)->PNext = (Chain*) (_headPtr + Item1Offset); + ((Chain*)(_headPtr + Item1Offset))->PNext = (Chain*) (_headPtr + Item2Offset); + ((Chain*)(_headPtr + Item2Offset))->PNext = (Chain*) (_headPtr + Item3Offset); + ((Chain*)(_headPtr + Item3Offset))->PNext = (Chain*) (_headPtr + Item4Offset); + ((Chain*)(_headPtr + Item4Offset))->PNext = (Chain*) (_headPtr + Item5Offset); + ((Chain*)(_headPtr + Item5Offset))->PNext = (Chain*) (_headPtr + Item6Offset); + ((Chain*)(_headPtr + Item6Offset))->PNext = (Chain*) (_headPtr + Item7Offset); + ((Chain*)(_headPtr + Item7Offset))->PNext = (Chain*) (_headPtr + Item8Offset); + ((Chain*)(_headPtr + Item8Offset))->PNext = (Chain*) (_headPtr + Item9Offset); + ((Chain*)(_headPtr + previousSize))->PNext = null; + } + + /// + /// Creates a new with 9 items, by removing the last item + /// from this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Truncate() + { + return Truncate(out var _); + } + + /// + /// Creates a new with 9 items, by removing + /// from the end of this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Truncate(out T9 item9) + { + item9 = Item9; + + var newSize = MemorySize - Item9Size; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); + // Update all pointers + ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); + ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); + ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); + ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); + ((Chain*)(newHeadPtr + Item4Offset))->PNext = (Chain*) (newHeadPtr + Item5Offset); + ((Chain*)(newHeadPtr + Item5Offset))->PNext = (Chain*) (newHeadPtr + Item6Offset); + ((Chain*)(newHeadPtr + Item6Offset))->PNext = (Chain*) (newHeadPtr + Item7Offset); + ((Chain*)(newHeadPtr + Item7Offset))->PNext = (Chain*) (newHeadPtr + Item8Offset); + ((Chain*)(newHeadPtr + Item8Offset))->PNext = null; + return new ManagedChain(newHeadPtr); } /// @@ -5098,7 +6190,7 @@ public ManagedChain(ManagedChain previou /// Item 10. /// Type of Item 10 /// - /// Do not forget to dispose this chain if you are no longer using it. + /// Do not forget to dispose this chain if you are no longer using it. /// public ManagedChain Append(T10 item10 = default) where T10: struct, IExtendsChain @@ -5128,7 +6220,8 @@ public override IEnumerator GetEnumerator() public override IChainable this[int index] => index switch { - 0 => Head, 1 => Item1, + 0 => Head, + 1 => Item1, 2 => Item2, 3 => Item3, 4 => Item4, @@ -5170,29 +6263,22 @@ public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item /// public override void Dispose() { - var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); - if (headPtr == IntPtr.Zero) return; + var headPtr = Interlocked.Exchange(ref _headPtr, (nint)0); + if (headPtr == (nint)0) { + return; + } // Destroy all structures Marshal.DestroyStructure(headPtr); - var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item1Ptr); - var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item2Ptr); - var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item3Ptr); - var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item4Ptr); - var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item5Ptr); - var item6Ptr = Interlocked.Exchange(ref _item6Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item6Ptr); - var item7Ptr = Interlocked.Exchange(ref _item7Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item7Ptr); - var item8Ptr = Interlocked.Exchange(ref _item8Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item8Ptr); - var item9Ptr = Interlocked.Exchange(ref _item9Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item9Ptr); + Marshal.DestroyStructure(headPtr + Item1Offset); + Marshal.DestroyStructure(headPtr + Item2Offset); + Marshal.DestroyStructure(headPtr + Item3Offset); + Marshal.DestroyStructure(headPtr + Item4Offset); + Marshal.DestroyStructure(headPtr + Item5Offset); + Marshal.DestroyStructure(headPtr + Item6Offset); + Marshal.DestroyStructure(headPtr + Item7Offset); + Marshal.DestroyStructure(headPtr + Item8Offset); + Marshal.DestroyStructure(headPtr + Item9Offset); // Free memory block Marshal.FreeHGlobal(headPtr); @@ -5226,7 +6312,117 @@ public unsafe class ManagedChain where T10 : struct, IExtendsChain { - private IntPtr _headPtr; + /// + /// Gets the size (in bytes) of the head structure. + /// + public static readonly int HeadSize = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item1Offset = HeadSize; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item1Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item2Offset = Item1Offset + Item1Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item2Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item3Offset = Item2Offset + Item2Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item3Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item4Offset = Item3Offset + Item3Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item4Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item5Offset = Item4Offset + Item4Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item5Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item6Offset = Item5Offset + Item5Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item6Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item7Offset = Item6Offset + Item6Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item7Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item8Offset = Item7Offset + Item7Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item8Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item9Offset = Item8Offset + Item8Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item9Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item10Offset = Item9Offset + Item9Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item10Size = Marshal.SizeOf(); + + /// + /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. + /// + public static readonly int MemorySize = Item10Offset + Item10Size; + + private nint _headPtr; /// /// Gets a pointer to the current head. @@ -5242,223 +6438,235 @@ public TChain Head set { value.StructureType(); - var nextPtr = ((Chain*) _headPtr)->PNext; + var ptr = (Chain*) _headPtr; + var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, _headPtr, true); - ((Chain*) _headPtr)->PNext = nextPtr; + ptr->PNext = nextPtr; } } - private IntPtr _item1Ptr; - /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item1Ptr => (Chain*) _item1Ptr; + public Chain* Item1Ptr => (Chain*) (_headPtr + Item1Offset); /// /// Gets or sets item #1 in the chain. /// public T1 Item1 { - get => Unsafe.AsRef((Chain*) _item1Ptr); + get => Unsafe.AsRef(Item1Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item1Ptr)->PNext; - Marshal.StructureToPtr(value, _item1Ptr, true); - ((Chain*) _item1Ptr)->PNext = nextPtr; + var ptr = Item1Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item2Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item2Ptr => (Chain*) _item2Ptr; + public Chain* Item2Ptr => (Chain*) (_headPtr + Item2Offset); /// /// Gets or sets item #2 in the chain. /// public T2 Item2 { - get => Unsafe.AsRef((Chain*) _item2Ptr); + get => Unsafe.AsRef(Item2Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item2Ptr)->PNext; - Marshal.StructureToPtr(value, _item2Ptr, true); - ((Chain*) _item2Ptr)->PNext = nextPtr; + var ptr = Item2Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item3Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item3Ptr => (Chain*) _item3Ptr; + public Chain* Item3Ptr => (Chain*) (_headPtr + Item3Offset); /// /// Gets or sets item #3 in the chain. /// public T3 Item3 { - get => Unsafe.AsRef((Chain*) _item3Ptr); + get => Unsafe.AsRef(Item3Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item3Ptr)->PNext; - Marshal.StructureToPtr(value, _item3Ptr, true); - ((Chain*) _item3Ptr)->PNext = nextPtr; + var ptr = Item3Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item4Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item4Ptr => (Chain*) _item4Ptr; + public Chain* Item4Ptr => (Chain*) (_headPtr + Item4Offset); /// /// Gets or sets item #4 in the chain. /// public T4 Item4 { - get => Unsafe.AsRef((Chain*) _item4Ptr); + get => Unsafe.AsRef(Item4Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item4Ptr)->PNext; - Marshal.StructureToPtr(value, _item4Ptr, true); - ((Chain*) _item4Ptr)->PNext = nextPtr; + var ptr = Item4Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item5Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item5Ptr => (Chain*) _item5Ptr; + public Chain* Item5Ptr => (Chain*) (_headPtr + Item5Offset); /// /// Gets or sets item #5 in the chain. /// public T5 Item5 { - get => Unsafe.AsRef((Chain*) _item5Ptr); + get => Unsafe.AsRef(Item5Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item5Ptr)->PNext; - Marshal.StructureToPtr(value, _item5Ptr, true); - ((Chain*) _item5Ptr)->PNext = nextPtr; + var ptr = Item5Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item6Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item6Ptr => (Chain*) _item6Ptr; + public Chain* Item6Ptr => (Chain*) (_headPtr + Item6Offset); /// /// Gets or sets item #6 in the chain. /// public T6 Item6 { - get => Unsafe.AsRef((Chain*) _item6Ptr); + get => Unsafe.AsRef(Item6Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item6Ptr)->PNext; - Marshal.StructureToPtr(value, _item6Ptr, true); - ((Chain*) _item6Ptr)->PNext = nextPtr; + var ptr = Item6Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item7Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item7Ptr => (Chain*) _item7Ptr; + public Chain* Item7Ptr => (Chain*) (_headPtr + Item7Offset); /// /// Gets or sets item #7 in the chain. /// public T7 Item7 { - get => Unsafe.AsRef((Chain*) _item7Ptr); + get => Unsafe.AsRef(Item7Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item7Ptr)->PNext; - Marshal.StructureToPtr(value, _item7Ptr, true); - ((Chain*) _item7Ptr)->PNext = nextPtr; + var ptr = Item7Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item8Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item8Ptr => (Chain*) _item8Ptr; + public Chain* Item8Ptr => (Chain*) (_headPtr + Item8Offset); /// /// Gets or sets item #8 in the chain. /// public T8 Item8 { - get => Unsafe.AsRef((Chain*) _item8Ptr); + get => Unsafe.AsRef(Item8Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item8Ptr)->PNext; - Marshal.StructureToPtr(value, _item8Ptr, true); - ((Chain*) _item8Ptr)->PNext = nextPtr; + var ptr = Item8Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item9Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item9Ptr => (Chain*) _item9Ptr; + public Chain* Item9Ptr => (Chain*) (_headPtr + Item9Offset); /// /// Gets or sets item #9 in the chain. /// public T9 Item9 { - get => Unsafe.AsRef((Chain*) _item9Ptr); + get => Unsafe.AsRef(Item9Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item9Ptr)->PNext; - Marshal.StructureToPtr(value, _item9Ptr, true); - ((Chain*) _item9Ptr)->PNext = nextPtr; + var ptr = Item9Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item10Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item10Ptr => (Chain*) _item10Ptr; + public Chain* Item10Ptr => (Chain*) (_headPtr + Item10Offset); /// /// Gets or sets item #10 in the chain. /// public T10 Item10 { - get => Unsafe.AsRef((Chain*) _item10Ptr); + get => Unsafe.AsRef(Item10Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item10Ptr)->PNext; - Marshal.StructureToPtr(value, _item10Ptr, true); - ((Chain*) _item10Ptr)->PNext = nextPtr; + var ptr = Item10Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } + /// + /// Creates a new with 11 items from an existing memory block. + /// + /// The pointer to the head of the chain.. + /// + /// Callers are responsible for ensuring the size of the memory is correct. + /// + internal ManagedChain(nint headPtr) + { + _headPtr = headPtr; + } + /// /// Creates a new with 11 items. /// @@ -5474,73 +6682,51 @@ public T10 Item10 /// Item 9. /// Item 10. public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - var item6Size = Marshal.SizeOf(); - var item7Size = Marshal.SizeOf(); - var item8Size = Marshal.SizeOf(); - var item9Size = Marshal.SizeOf(); - var item10Size = Marshal.SizeOf(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size); head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; + Chain* itemPtr = Item1Ptr; item1.StructureType(); - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; + Marshal.StructureToPtr(item1, (nint)itemPtr, false); + HeadPtr->PNext = itemPtr; + itemPtr = Item2Ptr; item2.StructureType(); - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; + Marshal.StructureToPtr(item2, (nint)itemPtr, false); + Item1Ptr->PNext = itemPtr; + itemPtr = Item3Ptr; item3.StructureType(); - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; + Marshal.StructureToPtr(item3, (nint)itemPtr, false); + Item2Ptr->PNext = itemPtr; + itemPtr = Item4Ptr; item4.StructureType(); - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; + Marshal.StructureToPtr(item4, (nint)itemPtr, false); + Item3Ptr->PNext = itemPtr; + itemPtr = Item5Ptr; item5.StructureType(); - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; + Marshal.StructureToPtr(item5, (nint)itemPtr, false); + Item4Ptr->PNext = itemPtr; + itemPtr = Item6Ptr; item6.StructureType(); - Marshal.StructureToPtr(item6, _item6Ptr, false); - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; + Marshal.StructureToPtr(item6, (nint)itemPtr, false); + Item5Ptr->PNext = itemPtr; + itemPtr = Item7Ptr; item7.StructureType(); - Marshal.StructureToPtr(item7, _item7Ptr, false); - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; + Marshal.StructureToPtr(item7, (nint)itemPtr, false); + Item6Ptr->PNext = itemPtr; + itemPtr = Item8Ptr; item8.StructureType(); - Marshal.StructureToPtr(item8, _item8Ptr, false); - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - - _item9Ptr = _item8Ptr + item8Size; + Marshal.StructureToPtr(item8, (nint)itemPtr, false); + Item7Ptr->PNext = itemPtr; + itemPtr = Item9Ptr; item9.StructureType(); - Marshal.StructureToPtr(item9, _item9Ptr, false); - ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; - - _item10Ptr = _item9Ptr + item9Size; + Marshal.StructureToPtr(item9, (nint)itemPtr, false); + Item8Ptr->PNext = itemPtr; + itemPtr = Item10Ptr; item10.StructureType(); - Marshal.StructureToPtr(item10, _item10Ptr, false); - ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; + Marshal.StructureToPtr(item10, (nint)itemPtr, false); + Item9Ptr->PNext = itemPtr; + Item10Ptr->PNext = null; } /// @@ -5549,236 +6735,260 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul /// Any errors loading the chain. /// The unmanaged chain to use as the basis of this chain. public ManagedChain(out string errors, TChain chain) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Load existing chain first, so any errors occur before we allocate memory - var head = chain; - var headSize = Marshal.SizeOf(); - var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); - StructureType expectedStructureType; + chain.StructureType(); + Marshal.StructureToPtr(chain, _headPtr, false); StringBuilder errorBuilder = new StringBuilder(); + var existingPtr = (Chain*) Unsafe.AsPointer(ref chain); + var newPtr = (Chain*) _headPtr; + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item1Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T1 item1 = default; - if (currentPtr is null) + var expectedStructureType = item1.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 11"); - else { - expectedStructureType = item1.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 2; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item1 = Unsafe.AsRef(currentPtr); + } else { + item1 = Unsafe.AsRef(existingPtr); + } } - var item1Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item1, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item2Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T2 item2 = default; - if (currentPtr is null) + expectedStructureType = item2.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 11"); - else { - expectedStructureType = item2.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 3; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item2 = Unsafe.AsRef(currentPtr); + } else { + item2 = Unsafe.AsRef(existingPtr); + } } - var item2Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item2, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item3Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T3 item3 = default; - if (currentPtr is null) + expectedStructureType = item3.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 11"); - else { - expectedStructureType = item3.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 4; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item3 = Unsafe.AsRef(currentPtr); + } else { + item3 = Unsafe.AsRef(existingPtr); + } } - var item3Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item3, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item4Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T4 item4 = default; - if (currentPtr is null) + expectedStructureType = item4.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 11"); - else { - expectedStructureType = item4.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 5; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item4 = Unsafe.AsRef(currentPtr); + } else { + item4 = Unsafe.AsRef(existingPtr); + } } - var item4Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item4, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item5Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T5 item5 = default; - if (currentPtr is null) + expectedStructureType = item5.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 11"); - else { - expectedStructureType = item5.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 6; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item5 = Unsafe.AsRef(currentPtr); + } else { + item5 = Unsafe.AsRef(existingPtr); + } } - var item5Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item5, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item6Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T6 item6 = default; - if (currentPtr is null) + expectedStructureType = item6.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 11"); - else { - expectedStructureType = item6.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 7; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item6 = Unsafe.AsRef(currentPtr); + } else { + item6 = Unsafe.AsRef(existingPtr); + } } - var item6Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item6, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item7Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T7 item7 = default; - if (currentPtr is null) + expectedStructureType = item7.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 11"); - else { - expectedStructureType = item7.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 8; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item7 = Unsafe.AsRef(currentPtr); + } else { + item7 = Unsafe.AsRef(existingPtr); + } } - var item7Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item7, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item8Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T8 item8 = default; - if (currentPtr is null) + expectedStructureType = item8.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 11"); - else { - expectedStructureType = item8.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 9; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item8 = Unsafe.AsRef(currentPtr); + } else { + item8 = Unsafe.AsRef(existingPtr); + } } - var item8Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item8, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item9Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T9 item9 = default; - if (currentPtr is null) + expectedStructureType = item9.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 9, expected length 11"); - else { - expectedStructureType = item9.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 10; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item9 = Unsafe.AsRef(currentPtr); + } else { + item9 = Unsafe.AsRef(existingPtr); + } } - var item9Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item9, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item10Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T10 item10 = default; - if (currentPtr is null) + expectedStructureType = item10.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 10, expected length 11"); - else { - expectedStructureType = item10.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 11; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item10 = Unsafe.AsRef(currentPtr); - if (currentPtr->PNext is not null) - errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 11"); + } else { + if (existingPtr->PNext is not null) { + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 11"); + existingPtr->PNext = null; + } + item10 = Unsafe.AsRef(existingPtr); + } } - var item10Size = Marshal.SizeOf(); - + Marshal.StructureToPtr(item10, (nint) newPtr, false); // Create string of errors errors = errorBuilder.ToString().Trim(); + } - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size); - Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - Marshal.StructureToPtr(item6, _item6Ptr, false); - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - Marshal.StructureToPtr(item7, _item7Ptr, false); - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; - Marshal.StructureToPtr(item8, _item8Ptr, false); - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - - _item9Ptr = _item8Ptr + item8Size; - Marshal.StructureToPtr(item9, _item9Ptr, false); - ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; - - _item10Ptr = _item9Ptr + item9Size; - Marshal.StructureToPtr(item10, _item10Ptr, false); - ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; + /// + /// Creates a new with 11 by copying this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Duplicate() + { + var newHeadPtr = Marshal.AllocHGlobal(MemorySize); + // Block copy original struct data for speed + Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); + // Update all pointers + ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); + ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); + ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); + ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); + ((Chain*)(newHeadPtr + Item4Offset))->PNext = (Chain*) (newHeadPtr + Item5Offset); + ((Chain*)(newHeadPtr + Item5Offset))->PNext = (Chain*) (newHeadPtr + Item6Offset); + ((Chain*)(newHeadPtr + Item6Offset))->PNext = (Chain*) (newHeadPtr + Item7Offset); + ((Chain*)(newHeadPtr + Item7Offset))->PNext = (Chain*) (newHeadPtr + Item8Offset); + ((Chain*)(newHeadPtr + Item8Offset))->PNext = (Chain*) (newHeadPtr + Item9Offset); + ((Chain*)(newHeadPtr + Item9Offset))->PNext = (Chain*) (newHeadPtr + Item10Offset); + return new ManagedChain(newHeadPtr); } /// - /// Creates a new with 11 items. + /// Creates a new with 11 items, by appending + /// to the end of this chain. /// /// The chain to append to. /// Item 10. @@ -5786,59 +6996,69 @@ public ManagedChain(out string errors, TChain chain) /// Do not forget to dispose the chain if you are no longer using it. /// public ManagedChain(ManagedChain previous, T10 item10 = default) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - var item6Size = Marshal.SizeOf(); - var item7Size = Marshal.SizeOf(); - var item8Size = Marshal.SizeOf(); - var item9Size = Marshal.SizeOf(); - var item10Size = Marshal.SizeOf(); - - var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size; - var newSize = originalSize + item10Size; - - _headPtr = Marshal.AllocHGlobal(newSize); + var previousSize = MemorySize - Item10Size; // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); - - _item1Ptr = _headPtr + headSize; - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); + + // Append item 10 + item10.StructureType(); + Marshal.StructureToPtr(item10, _headPtr + previousSize, false); + + // Update all pointers + ((Chain*)_headPtr)->PNext = (Chain*) (_headPtr + Item1Offset); + ((Chain*)(_headPtr + Item1Offset))->PNext = (Chain*) (_headPtr + Item2Offset); + ((Chain*)(_headPtr + Item2Offset))->PNext = (Chain*) (_headPtr + Item3Offset); + ((Chain*)(_headPtr + Item3Offset))->PNext = (Chain*) (_headPtr + Item4Offset); + ((Chain*)(_headPtr + Item4Offset))->PNext = (Chain*) (_headPtr + Item5Offset); + ((Chain*)(_headPtr + Item5Offset))->PNext = (Chain*) (_headPtr + Item6Offset); + ((Chain*)(_headPtr + Item6Offset))->PNext = (Chain*) (_headPtr + Item7Offset); + ((Chain*)(_headPtr + Item7Offset))->PNext = (Chain*) (_headPtr + Item8Offset); + ((Chain*)(_headPtr + Item8Offset))->PNext = (Chain*) (_headPtr + Item9Offset); + ((Chain*)(_headPtr + Item9Offset))->PNext = (Chain*) (_headPtr + Item10Offset); + ((Chain*)(_headPtr + previousSize))->PNext = null; + } + + /// + /// Creates a new with 10 items, by removing the last item + /// from this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Truncate() + { + return Truncate(out var _); + } - _item9Ptr = _item8Ptr + item8Size; - ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + /// + /// Creates a new with 10 items, by removing + /// from the end of this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Truncate(out T10 item10) + { + item10 = Item10; - _item10Ptr = _item9Ptr + item9Size; - // Append the last structure - item10.StructureType(); - Marshal.StructureToPtr(item10, _item10Ptr, false); - ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; + var newSize = MemorySize - Item10Size; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); + // Update all pointers + ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); + ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); + ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); + ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); + ((Chain*)(newHeadPtr + Item4Offset))->PNext = (Chain*) (newHeadPtr + Item5Offset); + ((Chain*)(newHeadPtr + Item5Offset))->PNext = (Chain*) (newHeadPtr + Item6Offset); + ((Chain*)(newHeadPtr + Item6Offset))->PNext = (Chain*) (newHeadPtr + Item7Offset); + ((Chain*)(newHeadPtr + Item7Offset))->PNext = (Chain*) (newHeadPtr + Item8Offset); + ((Chain*)(newHeadPtr + Item8Offset))->PNext = (Chain*) (newHeadPtr + Item9Offset); + ((Chain*)(newHeadPtr + Item9Offset))->PNext = null; + return new ManagedChain(newHeadPtr); } /// @@ -5848,7 +7068,7 @@ public ManagedChain(ManagedChain pre /// Item 11. /// Type of Item 11 /// - /// Do not forget to dispose this chain if you are no longer using it. + /// Do not forget to dispose this chain if you are no longer using it. /// public ManagedChain Append(T11 item11 = default) where T11: struct, IExtendsChain @@ -5879,7 +7099,8 @@ public override IEnumerator GetEnumerator() public override IChainable this[int index] => index switch { - 0 => Head, 1 => Item1, + 0 => Head, + 1 => Item1, 2 => Item2, 3 => Item3, 4 => Item4, @@ -5924,31 +7145,23 @@ public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item /// public override void Dispose() { - var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); - if (headPtr == IntPtr.Zero) return; + var headPtr = Interlocked.Exchange(ref _headPtr, (nint)0); + if (headPtr == (nint)0) { + return; + } // Destroy all structures Marshal.DestroyStructure(headPtr); - var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item1Ptr); - var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item2Ptr); - var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item3Ptr); - var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item4Ptr); - var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item5Ptr); - var item6Ptr = Interlocked.Exchange(ref _item6Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item6Ptr); - var item7Ptr = Interlocked.Exchange(ref _item7Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item7Ptr); - var item8Ptr = Interlocked.Exchange(ref _item8Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item8Ptr); - var item9Ptr = Interlocked.Exchange(ref _item9Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item9Ptr); - var item10Ptr = Interlocked.Exchange(ref _item10Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item10Ptr); + Marshal.DestroyStructure(headPtr + Item1Offset); + Marshal.DestroyStructure(headPtr + Item2Offset); + Marshal.DestroyStructure(headPtr + Item3Offset); + Marshal.DestroyStructure(headPtr + Item4Offset); + Marshal.DestroyStructure(headPtr + Item5Offset); + Marshal.DestroyStructure(headPtr + Item6Offset); + Marshal.DestroyStructure(headPtr + Item7Offset); + Marshal.DestroyStructure(headPtr + Item8Offset); + Marshal.DestroyStructure(headPtr + Item9Offset); + Marshal.DestroyStructure(headPtr + Item10Offset); // Free memory block Marshal.FreeHGlobal(headPtr); @@ -5984,7 +7197,127 @@ public unsafe class ManagedChain where T11 : struct, IExtendsChain { - private IntPtr _headPtr; + /// + /// Gets the size (in bytes) of the head structure. + /// + public static readonly int HeadSize = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item1Offset = HeadSize; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item1Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item2Offset = Item1Offset + Item1Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item2Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item3Offset = Item2Offset + Item2Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item3Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item4Offset = Item3Offset + Item3Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item4Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item5Offset = Item4Offset + Item4Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item5Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item6Offset = Item5Offset + Item5Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item6Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item7Offset = Item6Offset + Item6Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item7Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item8Offset = Item7Offset + Item7Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item8Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item9Offset = Item8Offset + Item8Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item9Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item10Offset = Item9Offset + Item9Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item10Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item11Offset = Item10Offset + Item10Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item11Size = Marshal.SizeOf(); + + /// + /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. + /// + public static readonly int MemorySize = Item11Offset + Item11Size; + + private nint _headPtr; /// /// Gets a pointer to the current head. @@ -6000,244 +7333,256 @@ public TChain Head set { value.StructureType(); - var nextPtr = ((Chain*) _headPtr)->PNext; + var ptr = (Chain*) _headPtr; + var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, _headPtr, true); - ((Chain*) _headPtr)->PNext = nextPtr; + ptr->PNext = nextPtr; } } - private IntPtr _item1Ptr; - /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item1Ptr => (Chain*) _item1Ptr; + public Chain* Item1Ptr => (Chain*) (_headPtr + Item1Offset); /// /// Gets or sets item #1 in the chain. /// public T1 Item1 { - get => Unsafe.AsRef((Chain*) _item1Ptr); + get => Unsafe.AsRef(Item1Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item1Ptr)->PNext; - Marshal.StructureToPtr(value, _item1Ptr, true); - ((Chain*) _item1Ptr)->PNext = nextPtr; + var ptr = Item1Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item2Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item2Ptr => (Chain*) _item2Ptr; + public Chain* Item2Ptr => (Chain*) (_headPtr + Item2Offset); /// /// Gets or sets item #2 in the chain. /// public T2 Item2 { - get => Unsafe.AsRef((Chain*) _item2Ptr); + get => Unsafe.AsRef(Item2Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item2Ptr)->PNext; - Marshal.StructureToPtr(value, _item2Ptr, true); - ((Chain*) _item2Ptr)->PNext = nextPtr; + var ptr = Item2Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item3Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item3Ptr => (Chain*) _item3Ptr; + public Chain* Item3Ptr => (Chain*) (_headPtr + Item3Offset); /// /// Gets or sets item #3 in the chain. /// public T3 Item3 { - get => Unsafe.AsRef((Chain*) _item3Ptr); + get => Unsafe.AsRef(Item3Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item3Ptr)->PNext; - Marshal.StructureToPtr(value, _item3Ptr, true); - ((Chain*) _item3Ptr)->PNext = nextPtr; + var ptr = Item3Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item4Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item4Ptr => (Chain*) _item4Ptr; + public Chain* Item4Ptr => (Chain*) (_headPtr + Item4Offset); /// /// Gets or sets item #4 in the chain. /// public T4 Item4 { - get => Unsafe.AsRef((Chain*) _item4Ptr); + get => Unsafe.AsRef(Item4Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item4Ptr)->PNext; - Marshal.StructureToPtr(value, _item4Ptr, true); - ((Chain*) _item4Ptr)->PNext = nextPtr; + var ptr = Item4Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item5Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item5Ptr => (Chain*) _item5Ptr; + public Chain* Item5Ptr => (Chain*) (_headPtr + Item5Offset); /// /// Gets or sets item #5 in the chain. /// public T5 Item5 { - get => Unsafe.AsRef((Chain*) _item5Ptr); + get => Unsafe.AsRef(Item5Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item5Ptr)->PNext; - Marshal.StructureToPtr(value, _item5Ptr, true); - ((Chain*) _item5Ptr)->PNext = nextPtr; + var ptr = Item5Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item6Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item6Ptr => (Chain*) _item6Ptr; + public Chain* Item6Ptr => (Chain*) (_headPtr + Item6Offset); /// /// Gets or sets item #6 in the chain. /// public T6 Item6 { - get => Unsafe.AsRef((Chain*) _item6Ptr); + get => Unsafe.AsRef(Item6Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item6Ptr)->PNext; - Marshal.StructureToPtr(value, _item6Ptr, true); - ((Chain*) _item6Ptr)->PNext = nextPtr; + var ptr = Item6Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item7Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item7Ptr => (Chain*) _item7Ptr; + public Chain* Item7Ptr => (Chain*) (_headPtr + Item7Offset); /// /// Gets or sets item #7 in the chain. /// public T7 Item7 { - get => Unsafe.AsRef((Chain*) _item7Ptr); + get => Unsafe.AsRef(Item7Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item7Ptr)->PNext; - Marshal.StructureToPtr(value, _item7Ptr, true); - ((Chain*) _item7Ptr)->PNext = nextPtr; + var ptr = Item7Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item8Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item8Ptr => (Chain*) _item8Ptr; + public Chain* Item8Ptr => (Chain*) (_headPtr + Item8Offset); /// /// Gets or sets item #8 in the chain. /// public T8 Item8 { - get => Unsafe.AsRef((Chain*) _item8Ptr); + get => Unsafe.AsRef(Item8Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item8Ptr)->PNext; - Marshal.StructureToPtr(value, _item8Ptr, true); - ((Chain*) _item8Ptr)->PNext = nextPtr; + var ptr = Item8Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item9Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item9Ptr => (Chain*) _item9Ptr; + public Chain* Item9Ptr => (Chain*) (_headPtr + Item9Offset); /// /// Gets or sets item #9 in the chain. /// public T9 Item9 { - get => Unsafe.AsRef((Chain*) _item9Ptr); + get => Unsafe.AsRef(Item9Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item9Ptr)->PNext; - Marshal.StructureToPtr(value, _item9Ptr, true); - ((Chain*) _item9Ptr)->PNext = nextPtr; + var ptr = Item9Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item10Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item10Ptr => (Chain*) _item10Ptr; + public Chain* Item10Ptr => (Chain*) (_headPtr + Item10Offset); /// /// Gets or sets item #10 in the chain. /// public T10 Item10 { - get => Unsafe.AsRef((Chain*) _item10Ptr); + get => Unsafe.AsRef(Item10Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item10Ptr)->PNext; - Marshal.StructureToPtr(value, _item10Ptr, true); - ((Chain*) _item10Ptr)->PNext = nextPtr; + var ptr = Item10Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item11Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item11Ptr => (Chain*) _item11Ptr; + public Chain* Item11Ptr => (Chain*) (_headPtr + Item11Offset); /// /// Gets or sets item #11 in the chain. /// public T11 Item11 { - get => Unsafe.AsRef((Chain*) _item11Ptr); + get => Unsafe.AsRef(Item11Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item11Ptr)->PNext; - Marshal.StructureToPtr(value, _item11Ptr, true); - ((Chain*) _item11Ptr)->PNext = nextPtr; + var ptr = Item11Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } + /// + /// Creates a new with 12 items from an existing memory block. + /// + /// The pointer to the head of the chain.. + /// + /// Callers are responsible for ensuring the size of the memory is correct. + /// + internal ManagedChain(nint headPtr) + { + _headPtr = headPtr; + } + /// /// Creates a new with 12 items. /// @@ -6254,79 +7599,55 @@ public T11 Item11 /// Item 10. /// Item 11. public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - var item6Size = Marshal.SizeOf(); - var item7Size = Marshal.SizeOf(); - var item8Size = Marshal.SizeOf(); - var item9Size = Marshal.SizeOf(); - var item10Size = Marshal.SizeOf(); - var item11Size = Marshal.SizeOf(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size); head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; + Chain* itemPtr = Item1Ptr; item1.StructureType(); - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; + Marshal.StructureToPtr(item1, (nint)itemPtr, false); + HeadPtr->PNext = itemPtr; + itemPtr = Item2Ptr; item2.StructureType(); - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; + Marshal.StructureToPtr(item2, (nint)itemPtr, false); + Item1Ptr->PNext = itemPtr; + itemPtr = Item3Ptr; item3.StructureType(); - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; + Marshal.StructureToPtr(item3, (nint)itemPtr, false); + Item2Ptr->PNext = itemPtr; + itemPtr = Item4Ptr; item4.StructureType(); - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; + Marshal.StructureToPtr(item4, (nint)itemPtr, false); + Item3Ptr->PNext = itemPtr; + itemPtr = Item5Ptr; item5.StructureType(); - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; + Marshal.StructureToPtr(item5, (nint)itemPtr, false); + Item4Ptr->PNext = itemPtr; + itemPtr = Item6Ptr; item6.StructureType(); - Marshal.StructureToPtr(item6, _item6Ptr, false); - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; + Marshal.StructureToPtr(item6, (nint)itemPtr, false); + Item5Ptr->PNext = itemPtr; + itemPtr = Item7Ptr; item7.StructureType(); - Marshal.StructureToPtr(item7, _item7Ptr, false); - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; + Marshal.StructureToPtr(item7, (nint)itemPtr, false); + Item6Ptr->PNext = itemPtr; + itemPtr = Item8Ptr; item8.StructureType(); - Marshal.StructureToPtr(item8, _item8Ptr, false); - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - - _item9Ptr = _item8Ptr + item8Size; + Marshal.StructureToPtr(item8, (nint)itemPtr, false); + Item7Ptr->PNext = itemPtr; + itemPtr = Item9Ptr; item9.StructureType(); - Marshal.StructureToPtr(item9, _item9Ptr, false); - ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; - - _item10Ptr = _item9Ptr + item9Size; + Marshal.StructureToPtr(item9, (nint)itemPtr, false); + Item8Ptr->PNext = itemPtr; + itemPtr = Item10Ptr; item10.StructureType(); - Marshal.StructureToPtr(item10, _item10Ptr, false); - ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; - - _item11Ptr = _item10Ptr + item10Size; + Marshal.StructureToPtr(item10, (nint)itemPtr, false); + Item9Ptr->PNext = itemPtr; + itemPtr = Item11Ptr; item11.StructureType(); - Marshal.StructureToPtr(item11, _item11Ptr, false); - ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; + Marshal.StructureToPtr(item11, (nint)itemPtr, false); + Item10Ptr->PNext = itemPtr; + Item11Ptr->PNext = null; } /// @@ -6335,257 +7656,282 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul /// Any errors loading the chain. /// The unmanaged chain to use as the basis of this chain. public ManagedChain(out string errors, TChain chain) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Load existing chain first, so any errors occur before we allocate memory - var head = chain; - var headSize = Marshal.SizeOf(); - var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); - StructureType expectedStructureType; + chain.StructureType(); + Marshal.StructureToPtr(chain, _headPtr, false); StringBuilder errorBuilder = new StringBuilder(); + var existingPtr = (Chain*) Unsafe.AsPointer(ref chain); + var newPtr = (Chain*) _headPtr; + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item1Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T1 item1 = default; - if (currentPtr is null) + var expectedStructureType = item1.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 12"); - else { - expectedStructureType = item1.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 2; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item1 = Unsafe.AsRef(currentPtr); + } else { + item1 = Unsafe.AsRef(existingPtr); + } } - var item1Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item1, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item2Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T2 item2 = default; - if (currentPtr is null) + expectedStructureType = item2.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 12"); - else { - expectedStructureType = item2.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 3; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item2 = Unsafe.AsRef(currentPtr); + } else { + item2 = Unsafe.AsRef(existingPtr); + } } - var item2Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item2, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item3Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T3 item3 = default; - if (currentPtr is null) + expectedStructureType = item3.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 12"); - else { - expectedStructureType = item3.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 4; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item3 = Unsafe.AsRef(currentPtr); + } else { + item3 = Unsafe.AsRef(existingPtr); + } } - var item3Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item3, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item4Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T4 item4 = default; - if (currentPtr is null) + expectedStructureType = item4.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 12"); - else { - expectedStructureType = item4.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 5; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item4 = Unsafe.AsRef(currentPtr); + } else { + item4 = Unsafe.AsRef(existingPtr); + } } - var item4Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item4, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item5Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T5 item5 = default; - if (currentPtr is null) + expectedStructureType = item5.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 12"); - else { - expectedStructureType = item5.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 6; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item5 = Unsafe.AsRef(currentPtr); + } else { + item5 = Unsafe.AsRef(existingPtr); + } } - var item5Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item5, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item6Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T6 item6 = default; - if (currentPtr is null) + expectedStructureType = item6.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 12"); - else { - expectedStructureType = item6.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 7; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item6 = Unsafe.AsRef(currentPtr); + } else { + item6 = Unsafe.AsRef(existingPtr); + } } - var item6Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item6, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item7Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T7 item7 = default; - if (currentPtr is null) + expectedStructureType = item7.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 12"); - else { - expectedStructureType = item7.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 8; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item7 = Unsafe.AsRef(currentPtr); + } else { + item7 = Unsafe.AsRef(existingPtr); + } } - var item7Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item7, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item8Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T8 item8 = default; - if (currentPtr is null) + expectedStructureType = item8.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 12"); - else { - expectedStructureType = item8.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 9; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item8 = Unsafe.AsRef(currentPtr); + } else { + item8 = Unsafe.AsRef(existingPtr); + } } - var item8Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item8, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item9Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T9 item9 = default; - if (currentPtr is null) + expectedStructureType = item9.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 9, expected length 12"); - else { - expectedStructureType = item9.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 10; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item9 = Unsafe.AsRef(currentPtr); + } else { + item9 = Unsafe.AsRef(existingPtr); + } } - var item9Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item9, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item10Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T10 item10 = default; - if (currentPtr is null) + expectedStructureType = item10.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 10, expected length 12"); - else { - expectedStructureType = item10.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 11; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item10 = Unsafe.AsRef(currentPtr); + } else { + item10 = Unsafe.AsRef(existingPtr); + } } - var item10Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item10, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item11Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T11 item11 = default; - if (currentPtr is null) + expectedStructureType = item11.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 11, expected length 12"); - else { - expectedStructureType = item11.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 12; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item11 = Unsafe.AsRef(currentPtr); - if (currentPtr->PNext is not null) - errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 12"); + } else { + if (existingPtr->PNext is not null) { + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 12"); + existingPtr->PNext = null; + } + item11 = Unsafe.AsRef(existingPtr); + } } - var item11Size = Marshal.SizeOf(); - + Marshal.StructureToPtr(item11, (nint) newPtr, false); // Create string of errors errors = errorBuilder.ToString().Trim(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size); - Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - Marshal.StructureToPtr(item6, _item6Ptr, false); - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - Marshal.StructureToPtr(item7, _item7Ptr, false); - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; - Marshal.StructureToPtr(item8, _item8Ptr, false); - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - - _item9Ptr = _item8Ptr + item8Size; - Marshal.StructureToPtr(item9, _item9Ptr, false); - ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; - - _item10Ptr = _item9Ptr + item9Size; - Marshal.StructureToPtr(item10, _item10Ptr, false); - ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; - - _item11Ptr = _item10Ptr + item10Size; - Marshal.StructureToPtr(item11, _item11Ptr, false); - ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; - } + } /// - /// Creates a new with 12 items. + /// Creates a new with 12 by copying this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Duplicate() + { + var newHeadPtr = Marshal.AllocHGlobal(MemorySize); + // Block copy original struct data for speed + Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); + // Update all pointers + ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); + ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); + ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); + ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); + ((Chain*)(newHeadPtr + Item4Offset))->PNext = (Chain*) (newHeadPtr + Item5Offset); + ((Chain*)(newHeadPtr + Item5Offset))->PNext = (Chain*) (newHeadPtr + Item6Offset); + ((Chain*)(newHeadPtr + Item6Offset))->PNext = (Chain*) (newHeadPtr + Item7Offset); + ((Chain*)(newHeadPtr + Item7Offset))->PNext = (Chain*) (newHeadPtr + Item8Offset); + ((Chain*)(newHeadPtr + Item8Offset))->PNext = (Chain*) (newHeadPtr + Item9Offset); + ((Chain*)(newHeadPtr + Item9Offset))->PNext = (Chain*) (newHeadPtr + Item10Offset); + ((Chain*)(newHeadPtr + Item10Offset))->PNext = (Chain*) (newHeadPtr + Item11Offset); + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 12 items, by appending + /// to the end of this chain. /// /// The chain to append to. /// Item 11. @@ -6593,63 +7939,71 @@ public ManagedChain(out string errors, TChain chain) /// Do not forget to dispose the chain if you are no longer using it. /// public ManagedChain(ManagedChain previous, T11 item11 = default) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - var item6Size = Marshal.SizeOf(); - var item7Size = Marshal.SizeOf(); - var item8Size = Marshal.SizeOf(); - var item9Size = Marshal.SizeOf(); - var item10Size = Marshal.SizeOf(); - var item11Size = Marshal.SizeOf(); - - var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size; - var newSize = originalSize + item11Size; - - _headPtr = Marshal.AllocHGlobal(newSize); + var previousSize = MemorySize - Item11Size; // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); - - _item1Ptr = _headPtr + headSize; - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - - _item9Ptr = _item8Ptr + item8Size; - ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); + + // Append item 11 + item11.StructureType(); + Marshal.StructureToPtr(item11, _headPtr + previousSize, false); + + // Update all pointers + ((Chain*)_headPtr)->PNext = (Chain*) (_headPtr + Item1Offset); + ((Chain*)(_headPtr + Item1Offset))->PNext = (Chain*) (_headPtr + Item2Offset); + ((Chain*)(_headPtr + Item2Offset))->PNext = (Chain*) (_headPtr + Item3Offset); + ((Chain*)(_headPtr + Item3Offset))->PNext = (Chain*) (_headPtr + Item4Offset); + ((Chain*)(_headPtr + Item4Offset))->PNext = (Chain*) (_headPtr + Item5Offset); + ((Chain*)(_headPtr + Item5Offset))->PNext = (Chain*) (_headPtr + Item6Offset); + ((Chain*)(_headPtr + Item6Offset))->PNext = (Chain*) (_headPtr + Item7Offset); + ((Chain*)(_headPtr + Item7Offset))->PNext = (Chain*) (_headPtr + Item8Offset); + ((Chain*)(_headPtr + Item8Offset))->PNext = (Chain*) (_headPtr + Item9Offset); + ((Chain*)(_headPtr + Item9Offset))->PNext = (Chain*) (_headPtr + Item10Offset); + ((Chain*)(_headPtr + Item10Offset))->PNext = (Chain*) (_headPtr + Item11Offset); + ((Chain*)(_headPtr + previousSize))->PNext = null; + } + + /// + /// Creates a new with 11 items, by removing the last item + /// from this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Truncate() + { + return Truncate(out var _); + } - _item10Ptr = _item9Ptr + item9Size; - ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; + /// + /// Creates a new with 11 items, by removing + /// from the end of this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Truncate(out T11 item11) + { + item11 = Item11; - _item11Ptr = _item10Ptr + item10Size; - // Append the last structure - item11.StructureType(); - Marshal.StructureToPtr(item11, _item11Ptr, false); - ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; + var newSize = MemorySize - Item11Size; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); + // Update all pointers + ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); + ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); + ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); + ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); + ((Chain*)(newHeadPtr + Item4Offset))->PNext = (Chain*) (newHeadPtr + Item5Offset); + ((Chain*)(newHeadPtr + Item5Offset))->PNext = (Chain*) (newHeadPtr + Item6Offset); + ((Chain*)(newHeadPtr + Item6Offset))->PNext = (Chain*) (newHeadPtr + Item7Offset); + ((Chain*)(newHeadPtr + Item7Offset))->PNext = (Chain*) (newHeadPtr + Item8Offset); + ((Chain*)(newHeadPtr + Item8Offset))->PNext = (Chain*) (newHeadPtr + Item9Offset); + ((Chain*)(newHeadPtr + Item9Offset))->PNext = (Chain*) (newHeadPtr + Item10Offset); + ((Chain*)(newHeadPtr + Item10Offset))->PNext = null; + return new ManagedChain(newHeadPtr); } /// @@ -6659,7 +8013,7 @@ public ManagedChain(ManagedChainItem 12. /// Type of Item 12 /// - /// Do not forget to dispose this chain if you are no longer using it. + /// Do not forget to dispose this chain if you are no longer using it. /// public ManagedChain Append(T12 item12 = default) where T12: struct, IExtendsChain @@ -6691,7 +8045,8 @@ public override IEnumerator GetEnumerator() public override IChainable this[int index] => index switch { - 0 => Head, 1 => Item1, + 0 => Head, + 1 => Item1, 2 => Item2, 3 => Item3, 4 => Item4, @@ -6739,33 +8094,24 @@ public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item /// public override void Dispose() { - var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); - if (headPtr == IntPtr.Zero) return; + var headPtr = Interlocked.Exchange(ref _headPtr, (nint)0); + if (headPtr == (nint)0) { + return; + } // Destroy all structures Marshal.DestroyStructure(headPtr); - var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item1Ptr); - var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item2Ptr); - var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item3Ptr); - var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item4Ptr); - var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item5Ptr); - var item6Ptr = Interlocked.Exchange(ref _item6Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item6Ptr); - var item7Ptr = Interlocked.Exchange(ref _item7Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item7Ptr); - var item8Ptr = Interlocked.Exchange(ref _item8Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item8Ptr); - var item9Ptr = Interlocked.Exchange(ref _item9Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item9Ptr); - var item10Ptr = Interlocked.Exchange(ref _item10Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item10Ptr); - var item11Ptr = Interlocked.Exchange(ref _item11Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item11Ptr); + Marshal.DestroyStructure(headPtr + Item1Offset); + Marshal.DestroyStructure(headPtr + Item2Offset); + Marshal.DestroyStructure(headPtr + Item3Offset); + Marshal.DestroyStructure(headPtr + Item4Offset); + Marshal.DestroyStructure(headPtr + Item5Offset); + Marshal.DestroyStructure(headPtr + Item6Offset); + Marshal.DestroyStructure(headPtr + Item7Offset); + Marshal.DestroyStructure(headPtr + Item8Offset); + Marshal.DestroyStructure(headPtr + Item9Offset); + Marshal.DestroyStructure(headPtr + Item10Offset); + Marshal.DestroyStructure(headPtr + Item11Offset); // Free memory block Marshal.FreeHGlobal(headPtr); @@ -6803,7 +8149,137 @@ public unsafe class ManagedChain where T12 : struct, IExtendsChain { - private IntPtr _headPtr; + /// + /// Gets the size (in bytes) of the head structure. + /// + public static readonly int HeadSize = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item1Offset = HeadSize; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item1Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item2Offset = Item1Offset + Item1Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item2Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item3Offset = Item2Offset + Item2Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item3Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item4Offset = Item3Offset + Item3Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item4Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item5Offset = Item4Offset + Item4Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item5Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item6Offset = Item5Offset + Item5Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item6Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item7Offset = Item6Offset + Item6Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item7Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item8Offset = Item7Offset + Item7Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item8Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item9Offset = Item8Offset + Item8Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item9Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item10Offset = Item9Offset + Item9Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item10Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item11Offset = Item10Offset + Item10Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item11Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item12Offset = Item11Offset + Item11Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item12Size = Marshal.SizeOf(); + + /// + /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. + /// + public static readonly int MemorySize = Item12Offset + Item12Size; + + private nint _headPtr; /// /// Gets a pointer to the current head. @@ -6819,265 +8295,277 @@ public TChain Head set { value.StructureType(); - var nextPtr = ((Chain*) _headPtr)->PNext; + var ptr = (Chain*) _headPtr; + var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, _headPtr, true); - ((Chain*) _headPtr)->PNext = nextPtr; + ptr->PNext = nextPtr; } } - private IntPtr _item1Ptr; - /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item1Ptr => (Chain*) _item1Ptr; + public Chain* Item1Ptr => (Chain*) (_headPtr + Item1Offset); /// /// Gets or sets item #1 in the chain. /// public T1 Item1 { - get => Unsafe.AsRef((Chain*) _item1Ptr); + get => Unsafe.AsRef(Item1Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item1Ptr)->PNext; - Marshal.StructureToPtr(value, _item1Ptr, true); - ((Chain*) _item1Ptr)->PNext = nextPtr; + var ptr = Item1Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item2Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item2Ptr => (Chain*) _item2Ptr; + public Chain* Item2Ptr => (Chain*) (_headPtr + Item2Offset); /// /// Gets or sets item #2 in the chain. /// public T2 Item2 { - get => Unsafe.AsRef((Chain*) _item2Ptr); + get => Unsafe.AsRef(Item2Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item2Ptr)->PNext; - Marshal.StructureToPtr(value, _item2Ptr, true); - ((Chain*) _item2Ptr)->PNext = nextPtr; + var ptr = Item2Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item3Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item3Ptr => (Chain*) _item3Ptr; + public Chain* Item3Ptr => (Chain*) (_headPtr + Item3Offset); /// /// Gets or sets item #3 in the chain. /// public T3 Item3 { - get => Unsafe.AsRef((Chain*) _item3Ptr); + get => Unsafe.AsRef(Item3Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item3Ptr)->PNext; - Marshal.StructureToPtr(value, _item3Ptr, true); - ((Chain*) _item3Ptr)->PNext = nextPtr; + var ptr = Item3Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item4Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item4Ptr => (Chain*) _item4Ptr; + public Chain* Item4Ptr => (Chain*) (_headPtr + Item4Offset); /// /// Gets or sets item #4 in the chain. /// public T4 Item4 { - get => Unsafe.AsRef((Chain*) _item4Ptr); + get => Unsafe.AsRef(Item4Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item4Ptr)->PNext; - Marshal.StructureToPtr(value, _item4Ptr, true); - ((Chain*) _item4Ptr)->PNext = nextPtr; + var ptr = Item4Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item5Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item5Ptr => (Chain*) _item5Ptr; + public Chain* Item5Ptr => (Chain*) (_headPtr + Item5Offset); /// /// Gets or sets item #5 in the chain. /// public T5 Item5 { - get => Unsafe.AsRef((Chain*) _item5Ptr); + get => Unsafe.AsRef(Item5Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item5Ptr)->PNext; - Marshal.StructureToPtr(value, _item5Ptr, true); - ((Chain*) _item5Ptr)->PNext = nextPtr; + var ptr = Item5Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item6Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item6Ptr => (Chain*) _item6Ptr; + public Chain* Item6Ptr => (Chain*) (_headPtr + Item6Offset); /// /// Gets or sets item #6 in the chain. /// public T6 Item6 { - get => Unsafe.AsRef((Chain*) _item6Ptr); + get => Unsafe.AsRef(Item6Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item6Ptr)->PNext; - Marshal.StructureToPtr(value, _item6Ptr, true); - ((Chain*) _item6Ptr)->PNext = nextPtr; + var ptr = Item6Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item7Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item7Ptr => (Chain*) _item7Ptr; + public Chain* Item7Ptr => (Chain*) (_headPtr + Item7Offset); /// /// Gets or sets item #7 in the chain. /// public T7 Item7 { - get => Unsafe.AsRef((Chain*) _item7Ptr); + get => Unsafe.AsRef(Item7Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item7Ptr)->PNext; - Marshal.StructureToPtr(value, _item7Ptr, true); - ((Chain*) _item7Ptr)->PNext = nextPtr; + var ptr = Item7Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item8Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item8Ptr => (Chain*) _item8Ptr; + public Chain* Item8Ptr => (Chain*) (_headPtr + Item8Offset); /// /// Gets or sets item #8 in the chain. /// public T8 Item8 { - get => Unsafe.AsRef((Chain*) _item8Ptr); + get => Unsafe.AsRef(Item8Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item8Ptr)->PNext; - Marshal.StructureToPtr(value, _item8Ptr, true); - ((Chain*) _item8Ptr)->PNext = nextPtr; + var ptr = Item8Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item9Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item9Ptr => (Chain*) _item9Ptr; + public Chain* Item9Ptr => (Chain*) (_headPtr + Item9Offset); /// /// Gets or sets item #9 in the chain. /// public T9 Item9 { - get => Unsafe.AsRef((Chain*) _item9Ptr); + get => Unsafe.AsRef(Item9Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item9Ptr)->PNext; - Marshal.StructureToPtr(value, _item9Ptr, true); - ((Chain*) _item9Ptr)->PNext = nextPtr; + var ptr = Item9Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item10Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item10Ptr => (Chain*) _item10Ptr; + public Chain* Item10Ptr => (Chain*) (_headPtr + Item10Offset); /// /// Gets or sets item #10 in the chain. /// public T10 Item10 { - get => Unsafe.AsRef((Chain*) _item10Ptr); + get => Unsafe.AsRef(Item10Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item10Ptr)->PNext; - Marshal.StructureToPtr(value, _item10Ptr, true); - ((Chain*) _item10Ptr)->PNext = nextPtr; + var ptr = Item10Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item11Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item11Ptr => (Chain*) _item11Ptr; + public Chain* Item11Ptr => (Chain*) (_headPtr + Item11Offset); /// /// Gets or sets item #11 in the chain. /// public T11 Item11 { - get => Unsafe.AsRef((Chain*) _item11Ptr); + get => Unsafe.AsRef(Item11Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item11Ptr)->PNext; - Marshal.StructureToPtr(value, _item11Ptr, true); - ((Chain*) _item11Ptr)->PNext = nextPtr; + var ptr = Item11Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item12Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item12Ptr => (Chain*) _item12Ptr; + public Chain* Item12Ptr => (Chain*) (_headPtr + Item12Offset); /// /// Gets or sets item #12 in the chain. /// public T12 Item12 { - get => Unsafe.AsRef((Chain*) _item12Ptr); + get => Unsafe.AsRef(Item12Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item12Ptr)->PNext; - Marshal.StructureToPtr(value, _item12Ptr, true); - ((Chain*) _item12Ptr)->PNext = nextPtr; + var ptr = Item12Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } + /// + /// Creates a new with 13 items from an existing memory block. + /// + /// The pointer to the head of the chain.. + /// + /// Callers are responsible for ensuring the size of the memory is correct. + /// + internal ManagedChain(nint headPtr) + { + _headPtr = headPtr; + } + /// /// Creates a new with 13 items. /// @@ -7095,85 +8583,59 @@ public T12 Item12 /// Item 11. /// Item 12. public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - var item6Size = Marshal.SizeOf(); - var item7Size = Marshal.SizeOf(); - var item8Size = Marshal.SizeOf(); - var item9Size = Marshal.SizeOf(); - var item10Size = Marshal.SizeOf(); - var item11Size = Marshal.SizeOf(); - var item12Size = Marshal.SizeOf(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + item12Size); head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; + Chain* itemPtr = Item1Ptr; item1.StructureType(); - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; + Marshal.StructureToPtr(item1, (nint)itemPtr, false); + HeadPtr->PNext = itemPtr; + itemPtr = Item2Ptr; item2.StructureType(); - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; + Marshal.StructureToPtr(item2, (nint)itemPtr, false); + Item1Ptr->PNext = itemPtr; + itemPtr = Item3Ptr; item3.StructureType(); - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; + Marshal.StructureToPtr(item3, (nint)itemPtr, false); + Item2Ptr->PNext = itemPtr; + itemPtr = Item4Ptr; item4.StructureType(); - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; + Marshal.StructureToPtr(item4, (nint)itemPtr, false); + Item3Ptr->PNext = itemPtr; + itemPtr = Item5Ptr; item5.StructureType(); - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; + Marshal.StructureToPtr(item5, (nint)itemPtr, false); + Item4Ptr->PNext = itemPtr; + itemPtr = Item6Ptr; item6.StructureType(); - Marshal.StructureToPtr(item6, _item6Ptr, false); - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; + Marshal.StructureToPtr(item6, (nint)itemPtr, false); + Item5Ptr->PNext = itemPtr; + itemPtr = Item7Ptr; item7.StructureType(); - Marshal.StructureToPtr(item7, _item7Ptr, false); - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; + Marshal.StructureToPtr(item7, (nint)itemPtr, false); + Item6Ptr->PNext = itemPtr; + itemPtr = Item8Ptr; item8.StructureType(); - Marshal.StructureToPtr(item8, _item8Ptr, false); - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - - _item9Ptr = _item8Ptr + item8Size; + Marshal.StructureToPtr(item8, (nint)itemPtr, false); + Item7Ptr->PNext = itemPtr; + itemPtr = Item9Ptr; item9.StructureType(); - Marshal.StructureToPtr(item9, _item9Ptr, false); - ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; - - _item10Ptr = _item9Ptr + item9Size; + Marshal.StructureToPtr(item9, (nint)itemPtr, false); + Item8Ptr->PNext = itemPtr; + itemPtr = Item10Ptr; item10.StructureType(); - Marshal.StructureToPtr(item10, _item10Ptr, false); - ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; - - _item11Ptr = _item10Ptr + item10Size; + Marshal.StructureToPtr(item10, (nint)itemPtr, false); + Item9Ptr->PNext = itemPtr; + itemPtr = Item11Ptr; item11.StructureType(); - Marshal.StructureToPtr(item11, _item11Ptr, false); - ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; - - _item12Ptr = _item11Ptr + item11Size; + Marshal.StructureToPtr(item11, (nint)itemPtr, false); + Item10Ptr->PNext = itemPtr; + itemPtr = Item12Ptr; item12.StructureType(); - Marshal.StructureToPtr(item12, _item12Ptr, false); - ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; + Marshal.StructureToPtr(item12, (nint)itemPtr, false); + Item11Ptr->PNext = itemPtr; + Item12Ptr->PNext = null; } /// @@ -7182,278 +8644,304 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul /// Any errors loading the chain. /// The unmanaged chain to use as the basis of this chain. public ManagedChain(out string errors, TChain chain) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Load existing chain first, so any errors occur before we allocate memory - var head = chain; - var headSize = Marshal.SizeOf(); - var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); - StructureType expectedStructureType; + chain.StructureType(); + Marshal.StructureToPtr(chain, _headPtr, false); StringBuilder errorBuilder = new StringBuilder(); + var existingPtr = (Chain*) Unsafe.AsPointer(ref chain); + var newPtr = (Chain*) _headPtr; + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item1Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T1 item1 = default; - if (currentPtr is null) + var expectedStructureType = item1.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 13"); - else { - expectedStructureType = item1.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 2; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item1 = Unsafe.AsRef(currentPtr); + } else { + item1 = Unsafe.AsRef(existingPtr); + } } - var item1Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item1, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item2Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T2 item2 = default; - if (currentPtr is null) + expectedStructureType = item2.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 13"); - else { - expectedStructureType = item2.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 3; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item2 = Unsafe.AsRef(currentPtr); + } else { + item2 = Unsafe.AsRef(existingPtr); + } } - var item2Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item2, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item3Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T3 item3 = default; - if (currentPtr is null) + expectedStructureType = item3.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 13"); - else { - expectedStructureType = item3.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 4; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item3 = Unsafe.AsRef(currentPtr); + } else { + item3 = Unsafe.AsRef(existingPtr); + } } - var item3Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item3, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item4Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T4 item4 = default; - if (currentPtr is null) + expectedStructureType = item4.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 13"); - else { - expectedStructureType = item4.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 5; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item4 = Unsafe.AsRef(currentPtr); + } else { + item4 = Unsafe.AsRef(existingPtr); + } } - var item4Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item4, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item5Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T5 item5 = default; - if (currentPtr is null) + expectedStructureType = item5.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 13"); - else { - expectedStructureType = item5.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 6; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item5 = Unsafe.AsRef(currentPtr); + } else { + item5 = Unsafe.AsRef(existingPtr); + } } - var item5Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item5, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item6Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T6 item6 = default; - if (currentPtr is null) + expectedStructureType = item6.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 13"); - else { - expectedStructureType = item6.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 7; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item6 = Unsafe.AsRef(currentPtr); + } else { + item6 = Unsafe.AsRef(existingPtr); + } } - var item6Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item6, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item7Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T7 item7 = default; - if (currentPtr is null) + expectedStructureType = item7.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 13"); - else { - expectedStructureType = item7.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 8; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item7 = Unsafe.AsRef(currentPtr); + } else { + item7 = Unsafe.AsRef(existingPtr); + } } - var item7Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item7, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item8Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T8 item8 = default; - if (currentPtr is null) + expectedStructureType = item8.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 13"); - else { - expectedStructureType = item8.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 9; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item8 = Unsafe.AsRef(currentPtr); + } else { + item8 = Unsafe.AsRef(existingPtr); + } } - var item8Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item8, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item9Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T9 item9 = default; - if (currentPtr is null) + expectedStructureType = item9.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 9, expected length 13"); - else { - expectedStructureType = item9.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 10; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item9 = Unsafe.AsRef(currentPtr); + } else { + item9 = Unsafe.AsRef(existingPtr); + } } - var item9Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item9, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item10Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T10 item10 = default; - if (currentPtr is null) + expectedStructureType = item10.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 10, expected length 13"); - else { - expectedStructureType = item10.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 11; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item10 = Unsafe.AsRef(currentPtr); + } else { + item10 = Unsafe.AsRef(existingPtr); + } } - var item10Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item10, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item11Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T11 item11 = default; - if (currentPtr is null) + expectedStructureType = item11.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 11, expected length 13"); - else { - expectedStructureType = item11.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 12; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item11 = Unsafe.AsRef(currentPtr); + } else { + item11 = Unsafe.AsRef(existingPtr); + } } - var item11Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item11, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item12Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T12 item12 = default; - if (currentPtr is null) + expectedStructureType = item12.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 12, expected length 13"); - else { - expectedStructureType = item12.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 13; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item12 = Unsafe.AsRef(currentPtr); - if (currentPtr->PNext is not null) - errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 13"); + } else { + if (existingPtr->PNext is not null) { + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 13"); + existingPtr->PNext = null; + } + item12 = Unsafe.AsRef(existingPtr); + } } - var item12Size = Marshal.SizeOf(); - + Marshal.StructureToPtr(item12, (nint) newPtr, false); // Create string of errors errors = errorBuilder.ToString().Trim(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + item12Size); - Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - Marshal.StructureToPtr(item6, _item6Ptr, false); - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - Marshal.StructureToPtr(item7, _item7Ptr, false); - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; - Marshal.StructureToPtr(item8, _item8Ptr, false); - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - - _item9Ptr = _item8Ptr + item8Size; - Marshal.StructureToPtr(item9, _item9Ptr, false); - ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; - - _item10Ptr = _item9Ptr + item9Size; - Marshal.StructureToPtr(item10, _item10Ptr, false); - ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; - - _item11Ptr = _item10Ptr + item10Size; - Marshal.StructureToPtr(item11, _item11Ptr, false); - ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; - - _item12Ptr = _item11Ptr + item11Size; - Marshal.StructureToPtr(item12, _item12Ptr, false); - ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; } /// - /// Creates a new with 13 items. + /// Creates a new with 13 by copying this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Duplicate() + { + var newHeadPtr = Marshal.AllocHGlobal(MemorySize); + // Block copy original struct data for speed + Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); + // Update all pointers + ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); + ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); + ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); + ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); + ((Chain*)(newHeadPtr + Item4Offset))->PNext = (Chain*) (newHeadPtr + Item5Offset); + ((Chain*)(newHeadPtr + Item5Offset))->PNext = (Chain*) (newHeadPtr + Item6Offset); + ((Chain*)(newHeadPtr + Item6Offset))->PNext = (Chain*) (newHeadPtr + Item7Offset); + ((Chain*)(newHeadPtr + Item7Offset))->PNext = (Chain*) (newHeadPtr + Item8Offset); + ((Chain*)(newHeadPtr + Item8Offset))->PNext = (Chain*) (newHeadPtr + Item9Offset); + ((Chain*)(newHeadPtr + Item9Offset))->PNext = (Chain*) (newHeadPtr + Item10Offset); + ((Chain*)(newHeadPtr + Item10Offset))->PNext = (Chain*) (newHeadPtr + Item11Offset); + ((Chain*)(newHeadPtr + Item11Offset))->PNext = (Chain*) (newHeadPtr + Item12Offset); + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 13 items, by appending + /// to the end of this chain. /// /// The chain to append to. /// Item 12. @@ -7461,67 +8949,73 @@ public ManagedChain(out string errors, TChain chain) /// Do not forget to dispose the chain if you are no longer using it. /// public ManagedChain(ManagedChain previous, T12 item12 = default) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - var item6Size = Marshal.SizeOf(); - var item7Size = Marshal.SizeOf(); - var item8Size = Marshal.SizeOf(); - var item9Size = Marshal.SizeOf(); - var item10Size = Marshal.SizeOf(); - var item11Size = Marshal.SizeOf(); - var item12Size = Marshal.SizeOf(); - - var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size; - var newSize = originalSize + item12Size; - - _headPtr = Marshal.AllocHGlobal(newSize); + var previousSize = MemorySize - Item12Size; // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); - - _item1Ptr = _headPtr + headSize; - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - - _item9Ptr = _item8Ptr + item8Size; - ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; - - _item10Ptr = _item9Ptr + item9Size; - ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); + + // Append item 12 + item12.StructureType(); + Marshal.StructureToPtr(item12, _headPtr + previousSize, false); + + // Update all pointers + ((Chain*)_headPtr)->PNext = (Chain*) (_headPtr + Item1Offset); + ((Chain*)(_headPtr + Item1Offset))->PNext = (Chain*) (_headPtr + Item2Offset); + ((Chain*)(_headPtr + Item2Offset))->PNext = (Chain*) (_headPtr + Item3Offset); + ((Chain*)(_headPtr + Item3Offset))->PNext = (Chain*) (_headPtr + Item4Offset); + ((Chain*)(_headPtr + Item4Offset))->PNext = (Chain*) (_headPtr + Item5Offset); + ((Chain*)(_headPtr + Item5Offset))->PNext = (Chain*) (_headPtr + Item6Offset); + ((Chain*)(_headPtr + Item6Offset))->PNext = (Chain*) (_headPtr + Item7Offset); + ((Chain*)(_headPtr + Item7Offset))->PNext = (Chain*) (_headPtr + Item8Offset); + ((Chain*)(_headPtr + Item8Offset))->PNext = (Chain*) (_headPtr + Item9Offset); + ((Chain*)(_headPtr + Item9Offset))->PNext = (Chain*) (_headPtr + Item10Offset); + ((Chain*)(_headPtr + Item10Offset))->PNext = (Chain*) (_headPtr + Item11Offset); + ((Chain*)(_headPtr + Item11Offset))->PNext = (Chain*) (_headPtr + Item12Offset); + ((Chain*)(_headPtr + previousSize))->PNext = null; + } + + /// + /// Creates a new with 12 items, by removing the last item + /// from this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Truncate() + { + return Truncate(out var _); + } - _item11Ptr = _item10Ptr + item10Size; - ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; + /// + /// Creates a new with 12 items, by removing + /// from the end of this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Truncate(out T12 item12) + { + item12 = Item12; - _item12Ptr = _item11Ptr + item11Size; - // Append the last structure - item12.StructureType(); - Marshal.StructureToPtr(item12, _item12Ptr, false); - ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; + var newSize = MemorySize - Item12Size; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); + // Update all pointers + ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); + ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); + ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); + ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); + ((Chain*)(newHeadPtr + Item4Offset))->PNext = (Chain*) (newHeadPtr + Item5Offset); + ((Chain*)(newHeadPtr + Item5Offset))->PNext = (Chain*) (newHeadPtr + Item6Offset); + ((Chain*)(newHeadPtr + Item6Offset))->PNext = (Chain*) (newHeadPtr + Item7Offset); + ((Chain*)(newHeadPtr + Item7Offset))->PNext = (Chain*) (newHeadPtr + Item8Offset); + ((Chain*)(newHeadPtr + Item8Offset))->PNext = (Chain*) (newHeadPtr + Item9Offset); + ((Chain*)(newHeadPtr + Item9Offset))->PNext = (Chain*) (newHeadPtr + Item10Offset); + ((Chain*)(newHeadPtr + Item10Offset))->PNext = (Chain*) (newHeadPtr + Item11Offset); + ((Chain*)(newHeadPtr + Item11Offset))->PNext = null; + return new ManagedChain(newHeadPtr); } /// @@ -7531,7 +9025,7 @@ public ManagedChain(ManagedChainItem 13. /// Type of Item 13 /// - /// Do not forget to dispose this chain if you are no longer using it. + /// Do not forget to dispose this chain if you are no longer using it. /// public ManagedChain Append(T13 item13 = default) where T13: struct, IExtendsChain @@ -7564,7 +9058,8 @@ public override IEnumerator GetEnumerator() public override IChainable this[int index] => index switch { - 0 => Head, 1 => Item1, + 0 => Head, + 1 => Item1, 2 => Item2, 3 => Item3, 4 => Item4, @@ -7612,78 +9107,208 @@ public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item item12 = Item12; } - /// - public override void Dispose() - { - var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); - if (headPtr == IntPtr.Zero) return; + /// + public override void Dispose() + { + var headPtr = Interlocked.Exchange(ref _headPtr, (nint)0); + if (headPtr == (nint)0) { + return; + } + + // Destroy all structures + Marshal.DestroyStructure(headPtr); + Marshal.DestroyStructure(headPtr + Item1Offset); + Marshal.DestroyStructure(headPtr + Item2Offset); + Marshal.DestroyStructure(headPtr + Item3Offset); + Marshal.DestroyStructure(headPtr + Item4Offset); + Marshal.DestroyStructure(headPtr + Item5Offset); + Marshal.DestroyStructure(headPtr + Item6Offset); + Marshal.DestroyStructure(headPtr + Item7Offset); + Marshal.DestroyStructure(headPtr + Item8Offset); + Marshal.DestroyStructure(headPtr + Item9Offset); + Marshal.DestroyStructure(headPtr + Item10Offset); + Marshal.DestroyStructure(headPtr + Item11Offset); + Marshal.DestroyStructure(headPtr + Item12Offset); + + // Free memory block + Marshal.FreeHGlobal(headPtr); + } +} + +/// +/// A safely manages the pointers of a managed structure chain. +/// +/// The chain type +/// Type of Item 1. +/// Type of Item 2. +/// Type of Item 3. +/// Type of Item 4. +/// Type of Item 5. +/// Type of Item 6. +/// Type of Item 7. +/// Type of Item 8. +/// Type of Item 9. +/// Type of Item 10. +/// Type of Item 11. +/// Type of Item 12. +/// Type of Item 13. +public unsafe class ManagedChain : ManagedChain + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + where T13 : struct, IExtendsChain +{ + /// + /// Gets the size (in bytes) of the head structure. + /// + public static readonly int HeadSize = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item1Offset = HeadSize; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item1Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item2Offset = Item1Offset + Item1Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item2Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item3Offset = Item2Offset + Item2Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item3Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item4Offset = Item3Offset + Item3Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item4Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item5Offset = Item4Offset + Item4Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item5Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item6Offset = Item5Offset + Item5Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item6Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item7Offset = Item6Offset + Item6Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item7Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item8Offset = Item7Offset + Item7Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item8Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item9Offset = Item8Offset + Item8Size; - // Destroy all structures - Marshal.DestroyStructure(headPtr); - var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item1Ptr); - var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item2Ptr); - var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item3Ptr); - var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item4Ptr); - var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item5Ptr); - var item6Ptr = Interlocked.Exchange(ref _item6Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item6Ptr); - var item7Ptr = Interlocked.Exchange(ref _item7Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item7Ptr); - var item8Ptr = Interlocked.Exchange(ref _item8Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item8Ptr); - var item9Ptr = Interlocked.Exchange(ref _item9Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item9Ptr); - var item10Ptr = Interlocked.Exchange(ref _item10Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item10Ptr); - var item11Ptr = Interlocked.Exchange(ref _item11Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item11Ptr); - var item12Ptr = Interlocked.Exchange(ref _item12Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item12Ptr); + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item9Size = Marshal.SizeOf(); - // Free memory block - Marshal.FreeHGlobal(headPtr); - } -} + /// + /// Gets the offset to the start of . + /// + public static readonly int Item10Offset = Item9Offset + Item9Size; -/// -/// A safely manages the pointers of a managed structure chain. -/// -/// The chain type -/// Type of Item 1. -/// Type of Item 2. -/// Type of Item 3. -/// Type of Item 4. -/// Type of Item 5. -/// Type of Item 6. -/// Type of Item 7. -/// Type of Item 8. -/// Type of Item 9. -/// Type of Item 10. -/// Type of Item 11. -/// Type of Item 12. -/// Type of Item 13. -public unsafe class ManagedChain : ManagedChain - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain - where T8 : struct, IExtendsChain - where T9 : struct, IExtendsChain - where T10 : struct, IExtendsChain - where T11 : struct, IExtendsChain - where T12 : struct, IExtendsChain - where T13 : struct, IExtendsChain -{ - private IntPtr _headPtr; + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item10Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item11Offset = Item10Offset + Item10Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item11Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item12Offset = Item11Offset + Item11Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item12Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item13Offset = Item12Offset + Item12Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item13Size = Marshal.SizeOf(); + + /// + /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. + /// + public static readonly int MemorySize = Item13Offset + Item13Size; + + private nint _headPtr; /// /// Gets a pointer to the current head. @@ -7699,286 +9324,298 @@ public TChain Head set { value.StructureType(); - var nextPtr = ((Chain*) _headPtr)->PNext; + var ptr = (Chain*) _headPtr; + var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, _headPtr, true); - ((Chain*) _headPtr)->PNext = nextPtr; + ptr->PNext = nextPtr; } } - private IntPtr _item1Ptr; - /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item1Ptr => (Chain*) _item1Ptr; + public Chain* Item1Ptr => (Chain*) (_headPtr + Item1Offset); /// /// Gets or sets item #1 in the chain. /// public T1 Item1 { - get => Unsafe.AsRef((Chain*) _item1Ptr); + get => Unsafe.AsRef(Item1Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item1Ptr)->PNext; - Marshal.StructureToPtr(value, _item1Ptr, true); - ((Chain*) _item1Ptr)->PNext = nextPtr; + var ptr = Item1Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item2Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item2Ptr => (Chain*) _item2Ptr; + public Chain* Item2Ptr => (Chain*) (_headPtr + Item2Offset); /// /// Gets or sets item #2 in the chain. /// public T2 Item2 { - get => Unsafe.AsRef((Chain*) _item2Ptr); + get => Unsafe.AsRef(Item2Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item2Ptr)->PNext; - Marshal.StructureToPtr(value, _item2Ptr, true); - ((Chain*) _item2Ptr)->PNext = nextPtr; + var ptr = Item2Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item3Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item3Ptr => (Chain*) _item3Ptr; + public Chain* Item3Ptr => (Chain*) (_headPtr + Item3Offset); /// /// Gets or sets item #3 in the chain. /// public T3 Item3 { - get => Unsafe.AsRef((Chain*) _item3Ptr); + get => Unsafe.AsRef(Item3Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item3Ptr)->PNext; - Marshal.StructureToPtr(value, _item3Ptr, true); - ((Chain*) _item3Ptr)->PNext = nextPtr; + var ptr = Item3Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item4Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item4Ptr => (Chain*) _item4Ptr; + public Chain* Item4Ptr => (Chain*) (_headPtr + Item4Offset); /// /// Gets or sets item #4 in the chain. /// public T4 Item4 { - get => Unsafe.AsRef((Chain*) _item4Ptr); + get => Unsafe.AsRef(Item4Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item4Ptr)->PNext; - Marshal.StructureToPtr(value, _item4Ptr, true); - ((Chain*) _item4Ptr)->PNext = nextPtr; + var ptr = Item4Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item5Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item5Ptr => (Chain*) _item5Ptr; + public Chain* Item5Ptr => (Chain*) (_headPtr + Item5Offset); /// /// Gets or sets item #5 in the chain. /// public T5 Item5 { - get => Unsafe.AsRef((Chain*) _item5Ptr); + get => Unsafe.AsRef(Item5Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item5Ptr)->PNext; - Marshal.StructureToPtr(value, _item5Ptr, true); - ((Chain*) _item5Ptr)->PNext = nextPtr; + var ptr = Item5Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item6Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item6Ptr => (Chain*) _item6Ptr; + public Chain* Item6Ptr => (Chain*) (_headPtr + Item6Offset); /// /// Gets or sets item #6 in the chain. /// public T6 Item6 { - get => Unsafe.AsRef((Chain*) _item6Ptr); + get => Unsafe.AsRef(Item6Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item6Ptr)->PNext; - Marshal.StructureToPtr(value, _item6Ptr, true); - ((Chain*) _item6Ptr)->PNext = nextPtr; + var ptr = Item6Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item7Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item7Ptr => (Chain*) _item7Ptr; + public Chain* Item7Ptr => (Chain*) (_headPtr + Item7Offset); /// /// Gets or sets item #7 in the chain. /// public T7 Item7 { - get => Unsafe.AsRef((Chain*) _item7Ptr); + get => Unsafe.AsRef(Item7Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item7Ptr)->PNext; - Marshal.StructureToPtr(value, _item7Ptr, true); - ((Chain*) _item7Ptr)->PNext = nextPtr; + var ptr = Item7Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item8Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item8Ptr => (Chain*) _item8Ptr; + public Chain* Item8Ptr => (Chain*) (_headPtr + Item8Offset); /// /// Gets or sets item #8 in the chain. /// public T8 Item8 { - get => Unsafe.AsRef((Chain*) _item8Ptr); + get => Unsafe.AsRef(Item8Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item8Ptr)->PNext; - Marshal.StructureToPtr(value, _item8Ptr, true); - ((Chain*) _item8Ptr)->PNext = nextPtr; + var ptr = Item8Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item9Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item9Ptr => (Chain*) _item9Ptr; + public Chain* Item9Ptr => (Chain*) (_headPtr + Item9Offset); /// /// Gets or sets item #9 in the chain. /// public T9 Item9 { - get => Unsafe.AsRef((Chain*) _item9Ptr); + get => Unsafe.AsRef(Item9Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item9Ptr)->PNext; - Marshal.StructureToPtr(value, _item9Ptr, true); - ((Chain*) _item9Ptr)->PNext = nextPtr; + var ptr = Item9Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item10Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item10Ptr => (Chain*) _item10Ptr; + public Chain* Item10Ptr => (Chain*) (_headPtr + Item10Offset); /// /// Gets or sets item #10 in the chain. /// public T10 Item10 { - get => Unsafe.AsRef((Chain*) _item10Ptr); + get => Unsafe.AsRef(Item10Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item10Ptr)->PNext; - Marshal.StructureToPtr(value, _item10Ptr, true); - ((Chain*) _item10Ptr)->PNext = nextPtr; + var ptr = Item10Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item11Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item11Ptr => (Chain*) _item11Ptr; + public Chain* Item11Ptr => (Chain*) (_headPtr + Item11Offset); /// /// Gets or sets item #11 in the chain. /// public T11 Item11 { - get => Unsafe.AsRef((Chain*) _item11Ptr); + get => Unsafe.AsRef(Item11Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item11Ptr)->PNext; - Marshal.StructureToPtr(value, _item11Ptr, true); - ((Chain*) _item11Ptr)->PNext = nextPtr; + var ptr = Item11Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item12Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item12Ptr => (Chain*) _item12Ptr; + public Chain* Item12Ptr => (Chain*) (_headPtr + Item12Offset); /// /// Gets or sets item #12 in the chain. /// public T12 Item12 { - get => Unsafe.AsRef((Chain*) _item12Ptr); + get => Unsafe.AsRef(Item12Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item12Ptr)->PNext; - Marshal.StructureToPtr(value, _item12Ptr, true); - ((Chain*) _item12Ptr)->PNext = nextPtr; + var ptr = Item12Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item13Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item13Ptr => (Chain*) _item13Ptr; + public Chain* Item13Ptr => (Chain*) (_headPtr + Item13Offset); /// /// Gets or sets item #13 in the chain. /// public T13 Item13 { - get => Unsafe.AsRef((Chain*) _item13Ptr); + get => Unsafe.AsRef(Item13Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item13Ptr)->PNext; - Marshal.StructureToPtr(value, _item13Ptr, true); - ((Chain*) _item13Ptr)->PNext = nextPtr; + var ptr = Item13Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } + /// + /// Creates a new with 14 items from an existing memory block. + /// + /// The pointer to the head of the chain.. + /// + /// Callers are responsible for ensuring the size of the memory is correct. + /// + internal ManagedChain(nint headPtr) + { + _headPtr = headPtr; + } + /// /// Creates a new with 14 items. /// @@ -7997,91 +9634,63 @@ public T13 Item13 /// Item 12. /// Item 13. public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default, T13 item13 = default) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - var item6Size = Marshal.SizeOf(); - var item7Size = Marshal.SizeOf(); - var item8Size = Marshal.SizeOf(); - var item9Size = Marshal.SizeOf(); - var item10Size = Marshal.SizeOf(); - var item11Size = Marshal.SizeOf(); - var item12Size = Marshal.SizeOf(); - var item13Size = Marshal.SizeOf(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + item12Size + item13Size); head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; + Chain* itemPtr = Item1Ptr; item1.StructureType(); - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; + Marshal.StructureToPtr(item1, (nint)itemPtr, false); + HeadPtr->PNext = itemPtr; + itemPtr = Item2Ptr; item2.StructureType(); - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; + Marshal.StructureToPtr(item2, (nint)itemPtr, false); + Item1Ptr->PNext = itemPtr; + itemPtr = Item3Ptr; item3.StructureType(); - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; + Marshal.StructureToPtr(item3, (nint)itemPtr, false); + Item2Ptr->PNext = itemPtr; + itemPtr = Item4Ptr; item4.StructureType(); - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; + Marshal.StructureToPtr(item4, (nint)itemPtr, false); + Item3Ptr->PNext = itemPtr; + itemPtr = Item5Ptr; item5.StructureType(); - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; + Marshal.StructureToPtr(item5, (nint)itemPtr, false); + Item4Ptr->PNext = itemPtr; + itemPtr = Item6Ptr; item6.StructureType(); - Marshal.StructureToPtr(item6, _item6Ptr, false); - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; + Marshal.StructureToPtr(item6, (nint)itemPtr, false); + Item5Ptr->PNext = itemPtr; + itemPtr = Item7Ptr; item7.StructureType(); - Marshal.StructureToPtr(item7, _item7Ptr, false); - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; + Marshal.StructureToPtr(item7, (nint)itemPtr, false); + Item6Ptr->PNext = itemPtr; + itemPtr = Item8Ptr; item8.StructureType(); - Marshal.StructureToPtr(item8, _item8Ptr, false); - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - - _item9Ptr = _item8Ptr + item8Size; + Marshal.StructureToPtr(item8, (nint)itemPtr, false); + Item7Ptr->PNext = itemPtr; + itemPtr = Item9Ptr; item9.StructureType(); - Marshal.StructureToPtr(item9, _item9Ptr, false); - ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; - - _item10Ptr = _item9Ptr + item9Size; + Marshal.StructureToPtr(item9, (nint)itemPtr, false); + Item8Ptr->PNext = itemPtr; + itemPtr = Item10Ptr; item10.StructureType(); - Marshal.StructureToPtr(item10, _item10Ptr, false); - ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; - - _item11Ptr = _item10Ptr + item10Size; + Marshal.StructureToPtr(item10, (nint)itemPtr, false); + Item9Ptr->PNext = itemPtr; + itemPtr = Item11Ptr; item11.StructureType(); - Marshal.StructureToPtr(item11, _item11Ptr, false); - ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; - - _item12Ptr = _item11Ptr + item11Size; + Marshal.StructureToPtr(item11, (nint)itemPtr, false); + Item10Ptr->PNext = itemPtr; + itemPtr = Item12Ptr; item12.StructureType(); - Marshal.StructureToPtr(item12, _item12Ptr, false); - ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; - - _item13Ptr = _item12Ptr + item12Size; + Marshal.StructureToPtr(item12, (nint)itemPtr, false); + Item11Ptr->PNext = itemPtr; + itemPtr = Item13Ptr; item13.StructureType(); - Marshal.StructureToPtr(item13, _item13Ptr, false); - ((Chain*) _item12Ptr)->PNext = (Chain*) _item13Ptr; + Marshal.StructureToPtr(item13, (nint)itemPtr, false); + Item12Ptr->PNext = itemPtr; + Item13Ptr->PNext = null; } /// @@ -8090,299 +9699,326 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul /// Any errors loading the chain. /// The unmanaged chain to use as the basis of this chain. public ManagedChain(out string errors, TChain chain) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Load existing chain first, so any errors occur before we allocate memory - var head = chain; - var headSize = Marshal.SizeOf(); - var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); - StructureType expectedStructureType; + chain.StructureType(); + Marshal.StructureToPtr(chain, _headPtr, false); StringBuilder errorBuilder = new StringBuilder(); + var existingPtr = (Chain*) Unsafe.AsPointer(ref chain); + var newPtr = (Chain*) _headPtr; + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item1Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T1 item1 = default; - if (currentPtr is null) + var expectedStructureType = item1.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 14"); - else { - expectedStructureType = item1.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 2; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item1 = Unsafe.AsRef(currentPtr); + } else { + item1 = Unsafe.AsRef(existingPtr); + } } - var item1Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item1, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item2Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T2 item2 = default; - if (currentPtr is null) + expectedStructureType = item2.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 14"); - else { - expectedStructureType = item2.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 3; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item2 = Unsafe.AsRef(currentPtr); + } else { + item2 = Unsafe.AsRef(existingPtr); + } } - var item2Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item2, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item3Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T3 item3 = default; - if (currentPtr is null) + expectedStructureType = item3.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 14"); - else { - expectedStructureType = item3.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 4; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item3 = Unsafe.AsRef(currentPtr); + } else { + item3 = Unsafe.AsRef(existingPtr); + } } - var item3Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item3, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item4Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T4 item4 = default; - if (currentPtr is null) + expectedStructureType = item4.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 14"); - else { - expectedStructureType = item4.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 5; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item4 = Unsafe.AsRef(currentPtr); + } else { + item4 = Unsafe.AsRef(existingPtr); + } } - var item4Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item4, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item5Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T5 item5 = default; - if (currentPtr is null) + expectedStructureType = item5.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 14"); - else { - expectedStructureType = item5.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 6; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item5 = Unsafe.AsRef(currentPtr); + } else { + item5 = Unsafe.AsRef(existingPtr); + } } - var item5Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item5, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item6Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T6 item6 = default; - if (currentPtr is null) + expectedStructureType = item6.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 14"); - else { - expectedStructureType = item6.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 7; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item6 = Unsafe.AsRef(currentPtr); + } else { + item6 = Unsafe.AsRef(existingPtr); + } } - var item6Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item6, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item7Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T7 item7 = default; - if (currentPtr is null) + expectedStructureType = item7.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 14"); - else { - expectedStructureType = item7.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 8; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item7 = Unsafe.AsRef(currentPtr); + } else { + item7 = Unsafe.AsRef(existingPtr); + } } - var item7Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item7, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item8Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T8 item8 = default; - if (currentPtr is null) + expectedStructureType = item8.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 14"); - else { - expectedStructureType = item8.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 9; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item8 = Unsafe.AsRef(currentPtr); + } else { + item8 = Unsafe.AsRef(existingPtr); + } } - var item8Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item8, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item9Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T9 item9 = default; - if (currentPtr is null) + expectedStructureType = item9.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 9, expected length 14"); - else { - expectedStructureType = item9.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 10; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item9 = Unsafe.AsRef(currentPtr); + } else { + item9 = Unsafe.AsRef(existingPtr); + } } - var item9Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item9, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item10Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T10 item10 = default; - if (currentPtr is null) + expectedStructureType = item10.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 10, expected length 14"); - else { - expectedStructureType = item10.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 11; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item10 = Unsafe.AsRef(currentPtr); + } else { + item10 = Unsafe.AsRef(existingPtr); + } } - var item10Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item10, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item11Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T11 item11 = default; - if (currentPtr is null) + expectedStructureType = item11.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 11, expected length 14"); - else { - expectedStructureType = item11.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 12; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item11 = Unsafe.AsRef(currentPtr); + } else { + item11 = Unsafe.AsRef(existingPtr); + } } - var item11Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item11, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item12Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T12 item12 = default; - if (currentPtr is null) + expectedStructureType = item12.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 12, expected length 14"); - else { - expectedStructureType = item12.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 13; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item12 = Unsafe.AsRef(currentPtr); + } else { + item12 = Unsafe.AsRef(existingPtr); + } } - var item12Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item12, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item13Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T13 item13 = default; - if (currentPtr is null) + expectedStructureType = item13.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 13, expected length 14"); - else { - expectedStructureType = item13.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 14; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item13 = Unsafe.AsRef(currentPtr); - if (currentPtr->PNext is not null) - errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 14"); + } else { + if (existingPtr->PNext is not null) { + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 14"); + existingPtr->PNext = null; + } + item13 = Unsafe.AsRef(existingPtr); + } } - var item13Size = Marshal.SizeOf(); - + Marshal.StructureToPtr(item13, (nint) newPtr, false); // Create string of errors errors = errorBuilder.ToString().Trim(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + item12Size + item13Size); - Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - Marshal.StructureToPtr(item6, _item6Ptr, false); - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - Marshal.StructureToPtr(item7, _item7Ptr, false); - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; - Marshal.StructureToPtr(item8, _item8Ptr, false); - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - - _item9Ptr = _item8Ptr + item8Size; - Marshal.StructureToPtr(item9, _item9Ptr, false); - ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; - - _item10Ptr = _item9Ptr + item9Size; - Marshal.StructureToPtr(item10, _item10Ptr, false); - ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; - - _item11Ptr = _item10Ptr + item10Size; - Marshal.StructureToPtr(item11, _item11Ptr, false); - ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; - - _item12Ptr = _item11Ptr + item11Size; - Marshal.StructureToPtr(item12, _item12Ptr, false); - ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; - - _item13Ptr = _item12Ptr + item12Size; - Marshal.StructureToPtr(item13, _item13Ptr, false); - ((Chain*) _item12Ptr)->PNext = (Chain*) _item13Ptr; } /// - /// Creates a new with 14 items. + /// Creates a new with 14 by copying this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Duplicate() + { + var newHeadPtr = Marshal.AllocHGlobal(MemorySize); + // Block copy original struct data for speed + Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); + // Update all pointers + ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); + ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); + ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); + ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); + ((Chain*)(newHeadPtr + Item4Offset))->PNext = (Chain*) (newHeadPtr + Item5Offset); + ((Chain*)(newHeadPtr + Item5Offset))->PNext = (Chain*) (newHeadPtr + Item6Offset); + ((Chain*)(newHeadPtr + Item6Offset))->PNext = (Chain*) (newHeadPtr + Item7Offset); + ((Chain*)(newHeadPtr + Item7Offset))->PNext = (Chain*) (newHeadPtr + Item8Offset); + ((Chain*)(newHeadPtr + Item8Offset))->PNext = (Chain*) (newHeadPtr + Item9Offset); + ((Chain*)(newHeadPtr + Item9Offset))->PNext = (Chain*) (newHeadPtr + Item10Offset); + ((Chain*)(newHeadPtr + Item10Offset))->PNext = (Chain*) (newHeadPtr + Item11Offset); + ((Chain*)(newHeadPtr + Item11Offset))->PNext = (Chain*) (newHeadPtr + Item12Offset); + ((Chain*)(newHeadPtr + Item12Offset))->PNext = (Chain*) (newHeadPtr + Item13Offset); + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 14 items, by appending + /// to the end of this chain. /// /// The chain to append to. /// Item 13. @@ -8390,71 +10026,75 @@ public ManagedChain(out string errors, TChain chain) /// Do not forget to dispose the chain if you are no longer using it. /// public ManagedChain(ManagedChain previous, T13 item13 = default) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - var item6Size = Marshal.SizeOf(); - var item7Size = Marshal.SizeOf(); - var item8Size = Marshal.SizeOf(); - var item9Size = Marshal.SizeOf(); - var item10Size = Marshal.SizeOf(); - var item11Size = Marshal.SizeOf(); - var item12Size = Marshal.SizeOf(); - var item13Size = Marshal.SizeOf(); - - var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + item12Size; - var newSize = originalSize + item13Size; - - _headPtr = Marshal.AllocHGlobal(newSize); + var previousSize = MemorySize - Item13Size; // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); - - _item1Ptr = _headPtr + headSize; - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - - _item9Ptr = _item8Ptr + item8Size; - ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; - - _item10Ptr = _item9Ptr + item9Size; - ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; - - _item11Ptr = _item10Ptr + item10Size; - ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); + + // Append item 13 + item13.StructureType(); + Marshal.StructureToPtr(item13, _headPtr + previousSize, false); + + // Update all pointers + ((Chain*)_headPtr)->PNext = (Chain*) (_headPtr + Item1Offset); + ((Chain*)(_headPtr + Item1Offset))->PNext = (Chain*) (_headPtr + Item2Offset); + ((Chain*)(_headPtr + Item2Offset))->PNext = (Chain*) (_headPtr + Item3Offset); + ((Chain*)(_headPtr + Item3Offset))->PNext = (Chain*) (_headPtr + Item4Offset); + ((Chain*)(_headPtr + Item4Offset))->PNext = (Chain*) (_headPtr + Item5Offset); + ((Chain*)(_headPtr + Item5Offset))->PNext = (Chain*) (_headPtr + Item6Offset); + ((Chain*)(_headPtr + Item6Offset))->PNext = (Chain*) (_headPtr + Item7Offset); + ((Chain*)(_headPtr + Item7Offset))->PNext = (Chain*) (_headPtr + Item8Offset); + ((Chain*)(_headPtr + Item8Offset))->PNext = (Chain*) (_headPtr + Item9Offset); + ((Chain*)(_headPtr + Item9Offset))->PNext = (Chain*) (_headPtr + Item10Offset); + ((Chain*)(_headPtr + Item10Offset))->PNext = (Chain*) (_headPtr + Item11Offset); + ((Chain*)(_headPtr + Item11Offset))->PNext = (Chain*) (_headPtr + Item12Offset); + ((Chain*)(_headPtr + Item12Offset))->PNext = (Chain*) (_headPtr + Item13Offset); + ((Chain*)(_headPtr + previousSize))->PNext = null; + } + + /// + /// Creates a new with 13 items, by removing the last item + /// from this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Truncate() + { + return Truncate(out var _); + } - _item12Ptr = _item11Ptr + item11Size; - ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; + /// + /// Creates a new with 13 items, by removing + /// from the end of this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Truncate(out T13 item13) + { + item13 = Item13; - _item13Ptr = _item12Ptr + item12Size; - // Append the last structure - item13.StructureType(); - Marshal.StructureToPtr(item13, _item13Ptr, false); - ((Chain*) _item12Ptr)->PNext = (Chain*) _item13Ptr; + var newSize = MemorySize - Item13Size; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); + // Update all pointers + ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); + ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); + ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); + ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); + ((Chain*)(newHeadPtr + Item4Offset))->PNext = (Chain*) (newHeadPtr + Item5Offset); + ((Chain*)(newHeadPtr + Item5Offset))->PNext = (Chain*) (newHeadPtr + Item6Offset); + ((Chain*)(newHeadPtr + Item6Offset))->PNext = (Chain*) (newHeadPtr + Item7Offset); + ((Chain*)(newHeadPtr + Item7Offset))->PNext = (Chain*) (newHeadPtr + Item8Offset); + ((Chain*)(newHeadPtr + Item8Offset))->PNext = (Chain*) (newHeadPtr + Item9Offset); + ((Chain*)(newHeadPtr + Item9Offset))->PNext = (Chain*) (newHeadPtr + Item10Offset); + ((Chain*)(newHeadPtr + Item10Offset))->PNext = (Chain*) (newHeadPtr + Item11Offset); + ((Chain*)(newHeadPtr + Item11Offset))->PNext = (Chain*) (newHeadPtr + Item12Offset); + ((Chain*)(newHeadPtr + Item12Offset))->PNext = null; + return new ManagedChain(newHeadPtr); } /// @@ -8464,7 +10104,7 @@ public ManagedChain(ManagedChainItem 14. /// Type of Item 14 /// - /// Do not forget to dispose this chain if you are no longer using it. + /// Do not forget to dispose this chain if you are no longer using it. /// public ManagedChain Append(T14 item14 = default) where T14: struct, IExtendsChain @@ -8498,7 +10138,8 @@ public override IEnumerator GetEnumerator() public override IChainable this[int index] => index switch { - 0 => Head, 1 => Item1, + 0 => Head, + 1 => Item1, 2 => Item2, 3 => Item3, 4 => Item4, @@ -8552,37 +10193,26 @@ public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item /// public override void Dispose() { - var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); - if (headPtr == IntPtr.Zero) return; + var headPtr = Interlocked.Exchange(ref _headPtr, (nint)0); + if (headPtr == (nint)0) { + return; + } // Destroy all structures Marshal.DestroyStructure(headPtr); - var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item1Ptr); - var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item2Ptr); - var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item3Ptr); - var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item4Ptr); - var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item5Ptr); - var item6Ptr = Interlocked.Exchange(ref _item6Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item6Ptr); - var item7Ptr = Interlocked.Exchange(ref _item7Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item7Ptr); - var item8Ptr = Interlocked.Exchange(ref _item8Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item8Ptr); - var item9Ptr = Interlocked.Exchange(ref _item9Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item9Ptr); - var item10Ptr = Interlocked.Exchange(ref _item10Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item10Ptr); - var item11Ptr = Interlocked.Exchange(ref _item11Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item11Ptr); - var item12Ptr = Interlocked.Exchange(ref _item12Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item12Ptr); - var item13Ptr = Interlocked.Exchange(ref _item13Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item13Ptr); + Marshal.DestroyStructure(headPtr + Item1Offset); + Marshal.DestroyStructure(headPtr + Item2Offset); + Marshal.DestroyStructure(headPtr + Item3Offset); + Marshal.DestroyStructure(headPtr + Item4Offset); + Marshal.DestroyStructure(headPtr + Item5Offset); + Marshal.DestroyStructure(headPtr + Item6Offset); + Marshal.DestroyStructure(headPtr + Item7Offset); + Marshal.DestroyStructure(headPtr + Item8Offset); + Marshal.DestroyStructure(headPtr + Item9Offset); + Marshal.DestroyStructure(headPtr + Item10Offset); + Marshal.DestroyStructure(headPtr + Item11Offset); + Marshal.DestroyStructure(headPtr + Item12Offset); + Marshal.DestroyStructure(headPtr + Item13Offset); // Free memory block Marshal.FreeHGlobal(headPtr); @@ -8624,7 +10254,157 @@ public unsafe class ManagedChain where T14 : struct, IExtendsChain { - private IntPtr _headPtr; + /// + /// Gets the size (in bytes) of the head structure. + /// + public static readonly int HeadSize = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item1Offset = HeadSize; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item1Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item2Offset = Item1Offset + Item1Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item2Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item3Offset = Item2Offset + Item2Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item3Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item4Offset = Item3Offset + Item3Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item4Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item5Offset = Item4Offset + Item4Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item5Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item6Offset = Item5Offset + Item5Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item6Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item7Offset = Item6Offset + Item6Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item7Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item8Offset = Item7Offset + Item7Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item8Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item9Offset = Item8Offset + Item8Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item9Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item10Offset = Item9Offset + Item9Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item10Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item11Offset = Item10Offset + Item10Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item11Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item12Offset = Item11Offset + Item11Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item12Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item13Offset = Item12Offset + Item12Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item13Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item14Offset = Item13Offset + Item13Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item14Size = Marshal.SizeOf(); + + /// + /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. + /// + public static readonly int MemorySize = Item14Offset + Item14Size; + + private nint _headPtr; /// /// Gets a pointer to the current head. @@ -8640,307 +10420,319 @@ public TChain Head set { value.StructureType(); - var nextPtr = ((Chain*) _headPtr)->PNext; + var ptr = (Chain*) _headPtr; + var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, _headPtr, true); - ((Chain*) _headPtr)->PNext = nextPtr; + ptr->PNext = nextPtr; } } - private IntPtr _item1Ptr; - /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item1Ptr => (Chain*) _item1Ptr; + public Chain* Item1Ptr => (Chain*) (_headPtr + Item1Offset); /// /// Gets or sets item #1 in the chain. /// public T1 Item1 { - get => Unsafe.AsRef((Chain*) _item1Ptr); + get => Unsafe.AsRef(Item1Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item1Ptr)->PNext; - Marshal.StructureToPtr(value, _item1Ptr, true); - ((Chain*) _item1Ptr)->PNext = nextPtr; + var ptr = Item1Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item2Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item2Ptr => (Chain*) _item2Ptr; + public Chain* Item2Ptr => (Chain*) (_headPtr + Item2Offset); /// /// Gets or sets item #2 in the chain. /// public T2 Item2 { - get => Unsafe.AsRef((Chain*) _item2Ptr); + get => Unsafe.AsRef(Item2Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item2Ptr)->PNext; - Marshal.StructureToPtr(value, _item2Ptr, true); - ((Chain*) _item2Ptr)->PNext = nextPtr; + var ptr = Item2Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item3Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item3Ptr => (Chain*) _item3Ptr; + public Chain* Item3Ptr => (Chain*) (_headPtr + Item3Offset); /// /// Gets or sets item #3 in the chain. /// public T3 Item3 { - get => Unsafe.AsRef((Chain*) _item3Ptr); + get => Unsafe.AsRef(Item3Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item3Ptr)->PNext; - Marshal.StructureToPtr(value, _item3Ptr, true); - ((Chain*) _item3Ptr)->PNext = nextPtr; + var ptr = Item3Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item4Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item4Ptr => (Chain*) _item4Ptr; + public Chain* Item4Ptr => (Chain*) (_headPtr + Item4Offset); /// /// Gets or sets item #4 in the chain. /// public T4 Item4 { - get => Unsafe.AsRef((Chain*) _item4Ptr); + get => Unsafe.AsRef(Item4Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item4Ptr)->PNext; - Marshal.StructureToPtr(value, _item4Ptr, true); - ((Chain*) _item4Ptr)->PNext = nextPtr; + var ptr = Item4Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item5Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item5Ptr => (Chain*) _item5Ptr; + public Chain* Item5Ptr => (Chain*) (_headPtr + Item5Offset); /// /// Gets or sets item #5 in the chain. /// public T5 Item5 { - get => Unsafe.AsRef((Chain*) _item5Ptr); + get => Unsafe.AsRef(Item5Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item5Ptr)->PNext; - Marshal.StructureToPtr(value, _item5Ptr, true); - ((Chain*) _item5Ptr)->PNext = nextPtr; + var ptr = Item5Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item6Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item6Ptr => (Chain*) _item6Ptr; + public Chain* Item6Ptr => (Chain*) (_headPtr + Item6Offset); /// /// Gets or sets item #6 in the chain. /// public T6 Item6 { - get => Unsafe.AsRef((Chain*) _item6Ptr); + get => Unsafe.AsRef(Item6Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item6Ptr)->PNext; - Marshal.StructureToPtr(value, _item6Ptr, true); - ((Chain*) _item6Ptr)->PNext = nextPtr; + var ptr = Item6Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item7Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item7Ptr => (Chain*) _item7Ptr; + public Chain* Item7Ptr => (Chain*) (_headPtr + Item7Offset); /// /// Gets or sets item #7 in the chain. /// public T7 Item7 { - get => Unsafe.AsRef((Chain*) _item7Ptr); + get => Unsafe.AsRef(Item7Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item7Ptr)->PNext; - Marshal.StructureToPtr(value, _item7Ptr, true); - ((Chain*) _item7Ptr)->PNext = nextPtr; + var ptr = Item7Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item8Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item8Ptr => (Chain*) _item8Ptr; + public Chain* Item8Ptr => (Chain*) (_headPtr + Item8Offset); /// /// Gets or sets item #8 in the chain. /// public T8 Item8 { - get => Unsafe.AsRef((Chain*) _item8Ptr); + get => Unsafe.AsRef(Item8Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item8Ptr)->PNext; - Marshal.StructureToPtr(value, _item8Ptr, true); - ((Chain*) _item8Ptr)->PNext = nextPtr; + var ptr = Item8Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item9Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item9Ptr => (Chain*) _item9Ptr; + public Chain* Item9Ptr => (Chain*) (_headPtr + Item9Offset); /// /// Gets or sets item #9 in the chain. /// public T9 Item9 { - get => Unsafe.AsRef((Chain*) _item9Ptr); + get => Unsafe.AsRef(Item9Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item9Ptr)->PNext; - Marshal.StructureToPtr(value, _item9Ptr, true); - ((Chain*) _item9Ptr)->PNext = nextPtr; + var ptr = Item9Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item10Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item10Ptr => (Chain*) _item10Ptr; + public Chain* Item10Ptr => (Chain*) (_headPtr + Item10Offset); /// /// Gets or sets item #10 in the chain. /// public T10 Item10 { - get => Unsafe.AsRef((Chain*) _item10Ptr); + get => Unsafe.AsRef(Item10Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item10Ptr)->PNext; - Marshal.StructureToPtr(value, _item10Ptr, true); - ((Chain*) _item10Ptr)->PNext = nextPtr; + var ptr = Item10Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item11Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item11Ptr => (Chain*) _item11Ptr; + public Chain* Item11Ptr => (Chain*) (_headPtr + Item11Offset); /// /// Gets or sets item #11 in the chain. /// public T11 Item11 { - get => Unsafe.AsRef((Chain*) _item11Ptr); + get => Unsafe.AsRef(Item11Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item11Ptr)->PNext; - Marshal.StructureToPtr(value, _item11Ptr, true); - ((Chain*) _item11Ptr)->PNext = nextPtr; + var ptr = Item11Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item12Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item12Ptr => (Chain*) _item12Ptr; + public Chain* Item12Ptr => (Chain*) (_headPtr + Item12Offset); /// /// Gets or sets item #12 in the chain. /// public T12 Item12 { - get => Unsafe.AsRef((Chain*) _item12Ptr); + get => Unsafe.AsRef(Item12Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item12Ptr)->PNext; - Marshal.StructureToPtr(value, _item12Ptr, true); - ((Chain*) _item12Ptr)->PNext = nextPtr; + var ptr = Item12Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item13Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item13Ptr => (Chain*) _item13Ptr; + public Chain* Item13Ptr => (Chain*) (_headPtr + Item13Offset); /// /// Gets or sets item #13 in the chain. /// public T13 Item13 { - get => Unsafe.AsRef((Chain*) _item13Ptr); + get => Unsafe.AsRef(Item13Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item13Ptr)->PNext; - Marshal.StructureToPtr(value, _item13Ptr, true); - ((Chain*) _item13Ptr)->PNext = nextPtr; + var ptr = Item13Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item14Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item14Ptr => (Chain*) _item14Ptr; + public Chain* Item14Ptr => (Chain*) (_headPtr + Item14Offset); /// /// Gets or sets item #14 in the chain. /// public T14 Item14 { - get => Unsafe.AsRef((Chain*) _item14Ptr); + get => Unsafe.AsRef(Item14Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item14Ptr)->PNext; - Marshal.StructureToPtr(value, _item14Ptr, true); - ((Chain*) _item14Ptr)->PNext = nextPtr; + var ptr = Item14Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } + /// + /// Creates a new with 15 items from an existing memory block. + /// + /// The pointer to the head of the chain.. + /// + /// Callers are responsible for ensuring the size of the memory is correct. + /// + internal ManagedChain(nint headPtr) + { + _headPtr = headPtr; + } + /// /// Creates a new with 15 items. /// @@ -8960,97 +10752,67 @@ public T14 Item14 /// Item 13. /// Item 14. public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default, T13 item13 = default, T14 item14 = default) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - var item6Size = Marshal.SizeOf(); - var item7Size = Marshal.SizeOf(); - var item8Size = Marshal.SizeOf(); - var item9Size = Marshal.SizeOf(); - var item10Size = Marshal.SizeOf(); - var item11Size = Marshal.SizeOf(); - var item12Size = Marshal.SizeOf(); - var item13Size = Marshal.SizeOf(); - var item14Size = Marshal.SizeOf(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + item12Size + item13Size + item14Size); head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; + Chain* itemPtr = Item1Ptr; item1.StructureType(); - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; + Marshal.StructureToPtr(item1, (nint)itemPtr, false); + HeadPtr->PNext = itemPtr; + itemPtr = Item2Ptr; item2.StructureType(); - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; + Marshal.StructureToPtr(item2, (nint)itemPtr, false); + Item1Ptr->PNext = itemPtr; + itemPtr = Item3Ptr; item3.StructureType(); - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; + Marshal.StructureToPtr(item3, (nint)itemPtr, false); + Item2Ptr->PNext = itemPtr; + itemPtr = Item4Ptr; item4.StructureType(); - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; + Marshal.StructureToPtr(item4, (nint)itemPtr, false); + Item3Ptr->PNext = itemPtr; + itemPtr = Item5Ptr; item5.StructureType(); - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; + Marshal.StructureToPtr(item5, (nint)itemPtr, false); + Item4Ptr->PNext = itemPtr; + itemPtr = Item6Ptr; item6.StructureType(); - Marshal.StructureToPtr(item6, _item6Ptr, false); - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; + Marshal.StructureToPtr(item6, (nint)itemPtr, false); + Item5Ptr->PNext = itemPtr; + itemPtr = Item7Ptr; item7.StructureType(); - Marshal.StructureToPtr(item7, _item7Ptr, false); - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; + Marshal.StructureToPtr(item7, (nint)itemPtr, false); + Item6Ptr->PNext = itemPtr; + itemPtr = Item8Ptr; item8.StructureType(); - Marshal.StructureToPtr(item8, _item8Ptr, false); - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - - _item9Ptr = _item8Ptr + item8Size; + Marshal.StructureToPtr(item8, (nint)itemPtr, false); + Item7Ptr->PNext = itemPtr; + itemPtr = Item9Ptr; item9.StructureType(); - Marshal.StructureToPtr(item9, _item9Ptr, false); - ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; - - _item10Ptr = _item9Ptr + item9Size; + Marshal.StructureToPtr(item9, (nint)itemPtr, false); + Item8Ptr->PNext = itemPtr; + itemPtr = Item10Ptr; item10.StructureType(); - Marshal.StructureToPtr(item10, _item10Ptr, false); - ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; - - _item11Ptr = _item10Ptr + item10Size; + Marshal.StructureToPtr(item10, (nint)itemPtr, false); + Item9Ptr->PNext = itemPtr; + itemPtr = Item11Ptr; item11.StructureType(); - Marshal.StructureToPtr(item11, _item11Ptr, false); - ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; - - _item12Ptr = _item11Ptr + item11Size; + Marshal.StructureToPtr(item11, (nint)itemPtr, false); + Item10Ptr->PNext = itemPtr; + itemPtr = Item12Ptr; item12.StructureType(); - Marshal.StructureToPtr(item12, _item12Ptr, false); - ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; - - _item13Ptr = _item12Ptr + item12Size; + Marshal.StructureToPtr(item12, (nint)itemPtr, false); + Item11Ptr->PNext = itemPtr; + itemPtr = Item13Ptr; item13.StructureType(); - Marshal.StructureToPtr(item13, _item13Ptr, false); - ((Chain*) _item12Ptr)->PNext = (Chain*) _item13Ptr; - - _item14Ptr = _item13Ptr + item13Size; + Marshal.StructureToPtr(item13, (nint)itemPtr, false); + Item12Ptr->PNext = itemPtr; + itemPtr = Item14Ptr; item14.StructureType(); - Marshal.StructureToPtr(item14, _item14Ptr, false); - ((Chain*) _item13Ptr)->PNext = (Chain*) _item14Ptr; + Marshal.StructureToPtr(item14, (nint)itemPtr, false); + Item13Ptr->PNext = itemPtr; + Item14Ptr->PNext = null; } /// @@ -9059,320 +10821,348 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul /// Any errors loading the chain. /// The unmanaged chain to use as the basis of this chain. public ManagedChain(out string errors, TChain chain) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Load existing chain first, so any errors occur before we allocate memory - var head = chain; - var headSize = Marshal.SizeOf(); - var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); - StructureType expectedStructureType; + chain.StructureType(); + Marshal.StructureToPtr(chain, _headPtr, false); StringBuilder errorBuilder = new StringBuilder(); + var existingPtr = (Chain*) Unsafe.AsPointer(ref chain); + var newPtr = (Chain*) _headPtr; + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item1Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T1 item1 = default; - if (currentPtr is null) + var expectedStructureType = item1.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 15"); - else { - expectedStructureType = item1.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 2; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item1 = Unsafe.AsRef(currentPtr); + } else { + item1 = Unsafe.AsRef(existingPtr); + } } - var item1Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item1, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item2Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T2 item2 = default; - if (currentPtr is null) + expectedStructureType = item2.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 15"); - else { - expectedStructureType = item2.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 3; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item2 = Unsafe.AsRef(currentPtr); + } else { + item2 = Unsafe.AsRef(existingPtr); + } } - var item2Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item2, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item3Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T3 item3 = default; - if (currentPtr is null) + expectedStructureType = item3.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 15"); - else { - expectedStructureType = item3.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 4; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item3 = Unsafe.AsRef(currentPtr); + } else { + item3 = Unsafe.AsRef(existingPtr); + } } - var item3Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item3, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item4Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T4 item4 = default; - if (currentPtr is null) + expectedStructureType = item4.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 15"); - else { - expectedStructureType = item4.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 5; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item4 = Unsafe.AsRef(currentPtr); + } else { + item4 = Unsafe.AsRef(existingPtr); + } } - var item4Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item4, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item5Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T5 item5 = default; - if (currentPtr is null) + expectedStructureType = item5.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 15"); - else { - expectedStructureType = item5.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 6; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item5 = Unsafe.AsRef(currentPtr); + } else { + item5 = Unsafe.AsRef(existingPtr); + } } - var item5Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item5, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item6Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T6 item6 = default; - if (currentPtr is null) + expectedStructureType = item6.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 15"); - else { - expectedStructureType = item6.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 7; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item6 = Unsafe.AsRef(currentPtr); + } else { + item6 = Unsafe.AsRef(existingPtr); + } } - var item6Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item6, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item7Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T7 item7 = default; - if (currentPtr is null) + expectedStructureType = item7.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 15"); - else { - expectedStructureType = item7.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 8; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item7 = Unsafe.AsRef(currentPtr); + } else { + item7 = Unsafe.AsRef(existingPtr); + } } - var item7Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item7, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item8Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T8 item8 = default; - if (currentPtr is null) + expectedStructureType = item8.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 15"); - else { - expectedStructureType = item8.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 9; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item8 = Unsafe.AsRef(currentPtr); + } else { + item8 = Unsafe.AsRef(existingPtr); + } } - var item8Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item8, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item9Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T9 item9 = default; - if (currentPtr is null) + expectedStructureType = item9.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 9, expected length 15"); - else { - expectedStructureType = item9.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 10; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item9 = Unsafe.AsRef(currentPtr); + } else { + item9 = Unsafe.AsRef(existingPtr); + } } - var item9Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item9, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item10Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T10 item10 = default; - if (currentPtr is null) + expectedStructureType = item10.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 10, expected length 15"); - else { - expectedStructureType = item10.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 11; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item10 = Unsafe.AsRef(currentPtr); + } else { + item10 = Unsafe.AsRef(existingPtr); + } } - var item10Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item10, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item11Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T11 item11 = default; - if (currentPtr is null) + expectedStructureType = item11.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 11, expected length 15"); - else { - expectedStructureType = item11.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 12; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item11 = Unsafe.AsRef(currentPtr); + } else { + item11 = Unsafe.AsRef(existingPtr); + } } - var item11Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item11, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item12Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T12 item12 = default; - if (currentPtr is null) + expectedStructureType = item12.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 12, expected length 15"); - else { - expectedStructureType = item12.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 13; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item12 = Unsafe.AsRef(currentPtr); + } else { + item12 = Unsafe.AsRef(existingPtr); + } } - var item12Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item12, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item13Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T13 item13 = default; - if (currentPtr is null) + expectedStructureType = item13.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 13, expected length 15"); - else { - expectedStructureType = item13.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 14; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item13 = Unsafe.AsRef(currentPtr); + } else { + item13 = Unsafe.AsRef(existingPtr); + } } - var item13Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item13, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item14Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T14 item14 = default; - if (currentPtr is null) + expectedStructureType = item14.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 14, expected length 15"); - else { - expectedStructureType = item14.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 15; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item14 = Unsafe.AsRef(currentPtr); - if (currentPtr->PNext is not null) - errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 15"); + } else { + if (existingPtr->PNext is not null) { + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 15"); + existingPtr->PNext = null; + } + item14 = Unsafe.AsRef(existingPtr); + } } - var item14Size = Marshal.SizeOf(); - + Marshal.StructureToPtr(item14, (nint) newPtr, false); // Create string of errors errors = errorBuilder.ToString().Trim(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + item12Size + item13Size + item14Size); - Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - Marshal.StructureToPtr(item6, _item6Ptr, false); - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - Marshal.StructureToPtr(item7, _item7Ptr, false); - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; - Marshal.StructureToPtr(item8, _item8Ptr, false); - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - - _item9Ptr = _item8Ptr + item8Size; - Marshal.StructureToPtr(item9, _item9Ptr, false); - ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; - - _item10Ptr = _item9Ptr + item9Size; - Marshal.StructureToPtr(item10, _item10Ptr, false); - ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; - - _item11Ptr = _item10Ptr + item10Size; - Marshal.StructureToPtr(item11, _item11Ptr, false); - ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; - - _item12Ptr = _item11Ptr + item11Size; - Marshal.StructureToPtr(item12, _item12Ptr, false); - ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; - - _item13Ptr = _item12Ptr + item12Size; - Marshal.StructureToPtr(item13, _item13Ptr, false); - ((Chain*) _item12Ptr)->PNext = (Chain*) _item13Ptr; - - _item14Ptr = _item13Ptr + item13Size; - Marshal.StructureToPtr(item14, _item14Ptr, false); - ((Chain*) _item13Ptr)->PNext = (Chain*) _item14Ptr; } /// - /// Creates a new with 15 items. + /// Creates a new with 15 by copying this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Duplicate() + { + var newHeadPtr = Marshal.AllocHGlobal(MemorySize); + // Block copy original struct data for speed + Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); + // Update all pointers + ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); + ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); + ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); + ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); + ((Chain*)(newHeadPtr + Item4Offset))->PNext = (Chain*) (newHeadPtr + Item5Offset); + ((Chain*)(newHeadPtr + Item5Offset))->PNext = (Chain*) (newHeadPtr + Item6Offset); + ((Chain*)(newHeadPtr + Item6Offset))->PNext = (Chain*) (newHeadPtr + Item7Offset); + ((Chain*)(newHeadPtr + Item7Offset))->PNext = (Chain*) (newHeadPtr + Item8Offset); + ((Chain*)(newHeadPtr + Item8Offset))->PNext = (Chain*) (newHeadPtr + Item9Offset); + ((Chain*)(newHeadPtr + Item9Offset))->PNext = (Chain*) (newHeadPtr + Item10Offset); + ((Chain*)(newHeadPtr + Item10Offset))->PNext = (Chain*) (newHeadPtr + Item11Offset); + ((Chain*)(newHeadPtr + Item11Offset))->PNext = (Chain*) (newHeadPtr + Item12Offset); + ((Chain*)(newHeadPtr + Item12Offset))->PNext = (Chain*) (newHeadPtr + Item13Offset); + ((Chain*)(newHeadPtr + Item13Offset))->PNext = (Chain*) (newHeadPtr + Item14Offset); + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 15 items, by appending + /// to the end of this chain. /// /// The chain to append to. /// Item 14. @@ -9380,75 +11170,77 @@ public ManagedChain(out string errors, TChain chain) /// Do not forget to dispose the chain if you are no longer using it. /// public ManagedChain(ManagedChain previous, T14 item14 = default) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - var item6Size = Marshal.SizeOf(); - var item7Size = Marshal.SizeOf(); - var item8Size = Marshal.SizeOf(); - var item9Size = Marshal.SizeOf(); - var item10Size = Marshal.SizeOf(); - var item11Size = Marshal.SizeOf(); - var item12Size = Marshal.SizeOf(); - var item13Size = Marshal.SizeOf(); - var item14Size = Marshal.SizeOf(); - - var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + item12Size + item13Size; - var newSize = originalSize + item14Size; - - _headPtr = Marshal.AllocHGlobal(newSize); + var previousSize = MemorySize - Item14Size; // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); - - _item1Ptr = _headPtr + headSize; - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - - _item9Ptr = _item8Ptr + item8Size; - ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; - - _item10Ptr = _item9Ptr + item9Size; - ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; - - _item11Ptr = _item10Ptr + item10Size; - ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; - - _item12Ptr = _item11Ptr + item11Size; - ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); + + // Append item 14 + item14.StructureType(); + Marshal.StructureToPtr(item14, _headPtr + previousSize, false); + + // Update all pointers + ((Chain*)_headPtr)->PNext = (Chain*) (_headPtr + Item1Offset); + ((Chain*)(_headPtr + Item1Offset))->PNext = (Chain*) (_headPtr + Item2Offset); + ((Chain*)(_headPtr + Item2Offset))->PNext = (Chain*) (_headPtr + Item3Offset); + ((Chain*)(_headPtr + Item3Offset))->PNext = (Chain*) (_headPtr + Item4Offset); + ((Chain*)(_headPtr + Item4Offset))->PNext = (Chain*) (_headPtr + Item5Offset); + ((Chain*)(_headPtr + Item5Offset))->PNext = (Chain*) (_headPtr + Item6Offset); + ((Chain*)(_headPtr + Item6Offset))->PNext = (Chain*) (_headPtr + Item7Offset); + ((Chain*)(_headPtr + Item7Offset))->PNext = (Chain*) (_headPtr + Item8Offset); + ((Chain*)(_headPtr + Item8Offset))->PNext = (Chain*) (_headPtr + Item9Offset); + ((Chain*)(_headPtr + Item9Offset))->PNext = (Chain*) (_headPtr + Item10Offset); + ((Chain*)(_headPtr + Item10Offset))->PNext = (Chain*) (_headPtr + Item11Offset); + ((Chain*)(_headPtr + Item11Offset))->PNext = (Chain*) (_headPtr + Item12Offset); + ((Chain*)(_headPtr + Item12Offset))->PNext = (Chain*) (_headPtr + Item13Offset); + ((Chain*)(_headPtr + Item13Offset))->PNext = (Chain*) (_headPtr + Item14Offset); + ((Chain*)(_headPtr + previousSize))->PNext = null; + } + + /// + /// Creates a new with 14 items, by removing the last item + /// from this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Truncate() + { + return Truncate(out var _); + } - _item13Ptr = _item12Ptr + item12Size; - ((Chain*) _item12Ptr)->PNext = (Chain*) _item13Ptr; + /// + /// Creates a new with 14 items, by removing + /// from the end of this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Truncate(out T14 item14) + { + item14 = Item14; - _item14Ptr = _item13Ptr + item13Size; - // Append the last structure - item14.StructureType(); - Marshal.StructureToPtr(item14, _item14Ptr, false); - ((Chain*) _item13Ptr)->PNext = (Chain*) _item14Ptr; + var newSize = MemorySize - Item14Size; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); + // Update all pointers + ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); + ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); + ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); + ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); + ((Chain*)(newHeadPtr + Item4Offset))->PNext = (Chain*) (newHeadPtr + Item5Offset); + ((Chain*)(newHeadPtr + Item5Offset))->PNext = (Chain*) (newHeadPtr + Item6Offset); + ((Chain*)(newHeadPtr + Item6Offset))->PNext = (Chain*) (newHeadPtr + Item7Offset); + ((Chain*)(newHeadPtr + Item7Offset))->PNext = (Chain*) (newHeadPtr + Item8Offset); + ((Chain*)(newHeadPtr + Item8Offset))->PNext = (Chain*) (newHeadPtr + Item9Offset); + ((Chain*)(newHeadPtr + Item9Offset))->PNext = (Chain*) (newHeadPtr + Item10Offset); + ((Chain*)(newHeadPtr + Item10Offset))->PNext = (Chain*) (newHeadPtr + Item11Offset); + ((Chain*)(newHeadPtr + Item11Offset))->PNext = (Chain*) (newHeadPtr + Item12Offset); + ((Chain*)(newHeadPtr + Item12Offset))->PNext = (Chain*) (newHeadPtr + Item13Offset); + ((Chain*)(newHeadPtr + Item13Offset))->PNext = null; + return new ManagedChain(newHeadPtr); } /// @@ -9458,7 +11250,7 @@ public ManagedChain(ManagedChainItem 15. /// Type of Item 15 /// - /// Do not forget to dispose this chain if you are no longer using it. + /// Do not forget to dispose this chain if you are no longer using it. /// public ManagedChain Append(T15 item15 = default) where T15: struct, IExtendsChain @@ -9493,7 +11285,8 @@ public override IEnumerator GetEnumerator() public override IChainable this[int index] => index switch { - 0 => Head, 1 => Item1, + 0 => Head, + 1 => Item1, 2 => Item2, 3 => Item3, 4 => Item4, @@ -9550,39 +11343,27 @@ public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item /// public override void Dispose() { - var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); - if (headPtr == IntPtr.Zero) return; + var headPtr = Interlocked.Exchange(ref _headPtr, (nint)0); + if (headPtr == (nint)0) { + return; + } // Destroy all structures Marshal.DestroyStructure(headPtr); - var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item1Ptr); - var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item2Ptr); - var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item3Ptr); - var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item4Ptr); - var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item5Ptr); - var item6Ptr = Interlocked.Exchange(ref _item6Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item6Ptr); - var item7Ptr = Interlocked.Exchange(ref _item7Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item7Ptr); - var item8Ptr = Interlocked.Exchange(ref _item8Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item8Ptr); - var item9Ptr = Interlocked.Exchange(ref _item9Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item9Ptr); - var item10Ptr = Interlocked.Exchange(ref _item10Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item10Ptr); - var item11Ptr = Interlocked.Exchange(ref _item11Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item11Ptr); - var item12Ptr = Interlocked.Exchange(ref _item12Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item12Ptr); - var item13Ptr = Interlocked.Exchange(ref _item13Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item13Ptr); - var item14Ptr = Interlocked.Exchange(ref _item14Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item14Ptr); + Marshal.DestroyStructure(headPtr + Item1Offset); + Marshal.DestroyStructure(headPtr + Item2Offset); + Marshal.DestroyStructure(headPtr + Item3Offset); + Marshal.DestroyStructure(headPtr + Item4Offset); + Marshal.DestroyStructure(headPtr + Item5Offset); + Marshal.DestroyStructure(headPtr + Item6Offset); + Marshal.DestroyStructure(headPtr + Item7Offset); + Marshal.DestroyStructure(headPtr + Item8Offset); + Marshal.DestroyStructure(headPtr + Item9Offset); + Marshal.DestroyStructure(headPtr + Item10Offset); + Marshal.DestroyStructure(headPtr + Item11Offset); + Marshal.DestroyStructure(headPtr + Item12Offset); + Marshal.DestroyStructure(headPtr + Item13Offset); + Marshal.DestroyStructure(headPtr + Item14Offset); // Free memory block Marshal.FreeHGlobal(headPtr); @@ -9626,7 +11407,167 @@ public unsafe class ManagedChain where T15 : struct, IExtendsChain { - private IntPtr _headPtr; + /// + /// Gets the size (in bytes) of the head structure. + /// + public static readonly int HeadSize = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item1Offset = HeadSize; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item1Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item2Offset = Item1Offset + Item1Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item2Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item3Offset = Item2Offset + Item2Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item3Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item4Offset = Item3Offset + Item3Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item4Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item5Offset = Item4Offset + Item4Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item5Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item6Offset = Item5Offset + Item5Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item6Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item7Offset = Item6Offset + Item6Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item7Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item8Offset = Item7Offset + Item7Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item8Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item9Offset = Item8Offset + Item8Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item9Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item10Offset = Item9Offset + Item9Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item10Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item11Offset = Item10Offset + Item10Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item11Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item12Offset = Item11Offset + Item11Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item12Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item13Offset = Item12Offset + Item12Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item13Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item14Offset = Item13Offset + Item13Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item14Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item15Offset = Item14Offset + Item14Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item15Size = Marshal.SizeOf(); + + /// + /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. + /// + public static readonly int MemorySize = Item15Offset + Item15Size; + + private nint _headPtr; /// /// Gets a pointer to the current head. @@ -9642,328 +11583,340 @@ public TChain Head set { value.StructureType(); - var nextPtr = ((Chain*) _headPtr)->PNext; + var ptr = (Chain*) _headPtr; + var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, _headPtr, true); - ((Chain*) _headPtr)->PNext = nextPtr; + ptr->PNext = nextPtr; } } - private IntPtr _item1Ptr; - /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item1Ptr => (Chain*) _item1Ptr; + public Chain* Item1Ptr => (Chain*) (_headPtr + Item1Offset); /// /// Gets or sets item #1 in the chain. /// public T1 Item1 { - get => Unsafe.AsRef((Chain*) _item1Ptr); + get => Unsafe.AsRef(Item1Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item1Ptr)->PNext; - Marshal.StructureToPtr(value, _item1Ptr, true); - ((Chain*) _item1Ptr)->PNext = nextPtr; + var ptr = Item1Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item2Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item2Ptr => (Chain*) _item2Ptr; + public Chain* Item2Ptr => (Chain*) (_headPtr + Item2Offset); /// /// Gets or sets item #2 in the chain. /// public T2 Item2 { - get => Unsafe.AsRef((Chain*) _item2Ptr); + get => Unsafe.AsRef(Item2Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item2Ptr)->PNext; - Marshal.StructureToPtr(value, _item2Ptr, true); - ((Chain*) _item2Ptr)->PNext = nextPtr; + var ptr = Item2Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item3Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item3Ptr => (Chain*) _item3Ptr; + public Chain* Item3Ptr => (Chain*) (_headPtr + Item3Offset); /// /// Gets or sets item #3 in the chain. /// public T3 Item3 { - get => Unsafe.AsRef((Chain*) _item3Ptr); + get => Unsafe.AsRef(Item3Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item3Ptr)->PNext; - Marshal.StructureToPtr(value, _item3Ptr, true); - ((Chain*) _item3Ptr)->PNext = nextPtr; + var ptr = Item3Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item4Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item4Ptr => (Chain*) _item4Ptr; + public Chain* Item4Ptr => (Chain*) (_headPtr + Item4Offset); /// /// Gets or sets item #4 in the chain. /// public T4 Item4 { - get => Unsafe.AsRef((Chain*) _item4Ptr); + get => Unsafe.AsRef(Item4Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item4Ptr)->PNext; - Marshal.StructureToPtr(value, _item4Ptr, true); - ((Chain*) _item4Ptr)->PNext = nextPtr; + var ptr = Item4Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item5Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item5Ptr => (Chain*) _item5Ptr; + public Chain* Item5Ptr => (Chain*) (_headPtr + Item5Offset); /// /// Gets or sets item #5 in the chain. /// public T5 Item5 { - get => Unsafe.AsRef((Chain*) _item5Ptr); + get => Unsafe.AsRef(Item5Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item5Ptr)->PNext; - Marshal.StructureToPtr(value, _item5Ptr, true); - ((Chain*) _item5Ptr)->PNext = nextPtr; + var ptr = Item5Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item6Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item6Ptr => (Chain*) _item6Ptr; + public Chain* Item6Ptr => (Chain*) (_headPtr + Item6Offset); /// /// Gets or sets item #6 in the chain. /// public T6 Item6 { - get => Unsafe.AsRef((Chain*) _item6Ptr); + get => Unsafe.AsRef(Item6Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item6Ptr)->PNext; - Marshal.StructureToPtr(value, _item6Ptr, true); - ((Chain*) _item6Ptr)->PNext = nextPtr; + var ptr = Item6Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item7Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item7Ptr => (Chain*) _item7Ptr; + public Chain* Item7Ptr => (Chain*) (_headPtr + Item7Offset); /// /// Gets or sets item #7 in the chain. /// public T7 Item7 { - get => Unsafe.AsRef((Chain*) _item7Ptr); + get => Unsafe.AsRef(Item7Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item7Ptr)->PNext; - Marshal.StructureToPtr(value, _item7Ptr, true); - ((Chain*) _item7Ptr)->PNext = nextPtr; + var ptr = Item7Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item8Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item8Ptr => (Chain*) _item8Ptr; + public Chain* Item8Ptr => (Chain*) (_headPtr + Item8Offset); /// /// Gets or sets item #8 in the chain. /// public T8 Item8 { - get => Unsafe.AsRef((Chain*) _item8Ptr); + get => Unsafe.AsRef(Item8Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item8Ptr)->PNext; - Marshal.StructureToPtr(value, _item8Ptr, true); - ((Chain*) _item8Ptr)->PNext = nextPtr; + var ptr = Item8Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item9Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item9Ptr => (Chain*) _item9Ptr; + public Chain* Item9Ptr => (Chain*) (_headPtr + Item9Offset); /// /// Gets or sets item #9 in the chain. /// public T9 Item9 { - get => Unsafe.AsRef((Chain*) _item9Ptr); + get => Unsafe.AsRef(Item9Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item9Ptr)->PNext; - Marshal.StructureToPtr(value, _item9Ptr, true); - ((Chain*) _item9Ptr)->PNext = nextPtr; + var ptr = Item9Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item10Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item10Ptr => (Chain*) _item10Ptr; + public Chain* Item10Ptr => (Chain*) (_headPtr + Item10Offset); /// /// Gets or sets item #10 in the chain. /// public T10 Item10 { - get => Unsafe.AsRef((Chain*) _item10Ptr); + get => Unsafe.AsRef(Item10Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item10Ptr)->PNext; - Marshal.StructureToPtr(value, _item10Ptr, true); - ((Chain*) _item10Ptr)->PNext = nextPtr; + var ptr = Item10Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item11Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item11Ptr => (Chain*) _item11Ptr; + public Chain* Item11Ptr => (Chain*) (_headPtr + Item11Offset); /// /// Gets or sets item #11 in the chain. /// public T11 Item11 { - get => Unsafe.AsRef((Chain*) _item11Ptr); + get => Unsafe.AsRef(Item11Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item11Ptr)->PNext; - Marshal.StructureToPtr(value, _item11Ptr, true); - ((Chain*) _item11Ptr)->PNext = nextPtr; + var ptr = Item11Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item12Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item12Ptr => (Chain*) _item12Ptr; + public Chain* Item12Ptr => (Chain*) (_headPtr + Item12Offset); /// /// Gets or sets item #12 in the chain. /// public T12 Item12 { - get => Unsafe.AsRef((Chain*) _item12Ptr); + get => Unsafe.AsRef(Item12Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item12Ptr)->PNext; - Marshal.StructureToPtr(value, _item12Ptr, true); - ((Chain*) _item12Ptr)->PNext = nextPtr; + var ptr = Item12Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item13Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item13Ptr => (Chain*) _item13Ptr; + public Chain* Item13Ptr => (Chain*) (_headPtr + Item13Offset); /// /// Gets or sets item #13 in the chain. /// public T13 Item13 { - get => Unsafe.AsRef((Chain*) _item13Ptr); + get => Unsafe.AsRef(Item13Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item13Ptr)->PNext; - Marshal.StructureToPtr(value, _item13Ptr, true); - ((Chain*) _item13Ptr)->PNext = nextPtr; + var ptr = Item13Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item14Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item14Ptr => (Chain*) _item14Ptr; + public Chain* Item14Ptr => (Chain*) (_headPtr + Item14Offset); /// /// Gets or sets item #14 in the chain. /// public T14 Item14 { - get => Unsafe.AsRef((Chain*) _item14Ptr); + get => Unsafe.AsRef(Item14Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item14Ptr)->PNext; - Marshal.StructureToPtr(value, _item14Ptr, true); - ((Chain*) _item14Ptr)->PNext = nextPtr; + var ptr = Item14Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } - private IntPtr _item15Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item15Ptr => (Chain*) _item15Ptr; + public Chain* Item15Ptr => (Chain*) (_headPtr + Item15Offset); /// /// Gets or sets item #15 in the chain. /// public T15 Item15 { - get => Unsafe.AsRef((Chain*) _item15Ptr); + get => Unsafe.AsRef(Item15Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item15Ptr)->PNext; - Marshal.StructureToPtr(value, _item15Ptr, true); - ((Chain*) _item15Ptr)->PNext = nextPtr; + var ptr = Item15Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } + /// + /// Creates a new with 16 items from an existing memory block. + /// + /// The pointer to the head of the chain.. + /// + /// Callers are responsible for ensuring the size of the memory is correct. + /// + internal ManagedChain(nint headPtr) + { + _headPtr = headPtr; + } + /// /// Creates a new with 16 items. /// @@ -9984,103 +11937,71 @@ public T15 Item15 /// Item 14. /// Item 15. public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default, T13 item13 = default, T14 item14 = default, T15 item15 = default) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - var item6Size = Marshal.SizeOf(); - var item7Size = Marshal.SizeOf(); - var item8Size = Marshal.SizeOf(); - var item9Size = Marshal.SizeOf(); - var item10Size = Marshal.SizeOf(); - var item11Size = Marshal.SizeOf(); - var item12Size = Marshal.SizeOf(); - var item13Size = Marshal.SizeOf(); - var item14Size = Marshal.SizeOf(); - var item15Size = Marshal.SizeOf(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + item12Size + item13Size + item14Size + item15Size); head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; + Chain* itemPtr = Item1Ptr; item1.StructureType(); - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; + Marshal.StructureToPtr(item1, (nint)itemPtr, false); + HeadPtr->PNext = itemPtr; + itemPtr = Item2Ptr; item2.StructureType(); - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; + Marshal.StructureToPtr(item2, (nint)itemPtr, false); + Item1Ptr->PNext = itemPtr; + itemPtr = Item3Ptr; item3.StructureType(); - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; + Marshal.StructureToPtr(item3, (nint)itemPtr, false); + Item2Ptr->PNext = itemPtr; + itemPtr = Item4Ptr; item4.StructureType(); - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; + Marshal.StructureToPtr(item4, (nint)itemPtr, false); + Item3Ptr->PNext = itemPtr; + itemPtr = Item5Ptr; item5.StructureType(); - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; + Marshal.StructureToPtr(item5, (nint)itemPtr, false); + Item4Ptr->PNext = itemPtr; + itemPtr = Item6Ptr; item6.StructureType(); - Marshal.StructureToPtr(item6, _item6Ptr, false); - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; + Marshal.StructureToPtr(item6, (nint)itemPtr, false); + Item5Ptr->PNext = itemPtr; + itemPtr = Item7Ptr; item7.StructureType(); - Marshal.StructureToPtr(item7, _item7Ptr, false); - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; + Marshal.StructureToPtr(item7, (nint)itemPtr, false); + Item6Ptr->PNext = itemPtr; + itemPtr = Item8Ptr; item8.StructureType(); - Marshal.StructureToPtr(item8, _item8Ptr, false); - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - - _item9Ptr = _item8Ptr + item8Size; + Marshal.StructureToPtr(item8, (nint)itemPtr, false); + Item7Ptr->PNext = itemPtr; + itemPtr = Item9Ptr; item9.StructureType(); - Marshal.StructureToPtr(item9, _item9Ptr, false); - ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; - - _item10Ptr = _item9Ptr + item9Size; + Marshal.StructureToPtr(item9, (nint)itemPtr, false); + Item8Ptr->PNext = itemPtr; + itemPtr = Item10Ptr; item10.StructureType(); - Marshal.StructureToPtr(item10, _item10Ptr, false); - ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; - - _item11Ptr = _item10Ptr + item10Size; + Marshal.StructureToPtr(item10, (nint)itemPtr, false); + Item9Ptr->PNext = itemPtr; + itemPtr = Item11Ptr; item11.StructureType(); - Marshal.StructureToPtr(item11, _item11Ptr, false); - ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; - - _item12Ptr = _item11Ptr + item11Size; + Marshal.StructureToPtr(item11, (nint)itemPtr, false); + Item10Ptr->PNext = itemPtr; + itemPtr = Item12Ptr; item12.StructureType(); - Marshal.StructureToPtr(item12, _item12Ptr, false); - ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; - - _item13Ptr = _item12Ptr + item12Size; + Marshal.StructureToPtr(item12, (nint)itemPtr, false); + Item11Ptr->PNext = itemPtr; + itemPtr = Item13Ptr; item13.StructureType(); - Marshal.StructureToPtr(item13, _item13Ptr, false); - ((Chain*) _item12Ptr)->PNext = (Chain*) _item13Ptr; - - _item14Ptr = _item13Ptr + item13Size; + Marshal.StructureToPtr(item13, (nint)itemPtr, false); + Item12Ptr->PNext = itemPtr; + itemPtr = Item14Ptr; item14.StructureType(); - Marshal.StructureToPtr(item14, _item14Ptr, false); - ((Chain*) _item13Ptr)->PNext = (Chain*) _item14Ptr; - - _item15Ptr = _item14Ptr + item14Size; + Marshal.StructureToPtr(item14, (nint)itemPtr, false); + Item13Ptr->PNext = itemPtr; + itemPtr = Item15Ptr; item15.StructureType(); - Marshal.StructureToPtr(item15, _item15Ptr, false); - ((Chain*) _item14Ptr)->PNext = (Chain*) _item15Ptr; + Marshal.StructureToPtr(item15, (nint)itemPtr, false); + Item14Ptr->PNext = itemPtr; + Item15Ptr->PNext = null; } /// @@ -10089,341 +12010,370 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul /// Any errors loading the chain. /// The unmanaged chain to use as the basis of this chain. public ManagedChain(out string errors, TChain chain) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Load existing chain first, so any errors occur before we allocate memory - var head = chain; - var headSize = Marshal.SizeOf(); - var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); - StructureType expectedStructureType; + chain.StructureType(); + Marshal.StructureToPtr(chain, _headPtr, false); StringBuilder errorBuilder = new StringBuilder(); + var existingPtr = (Chain*) Unsafe.AsPointer(ref chain); + var newPtr = (Chain*) _headPtr; + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item1Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T1 item1 = default; - if (currentPtr is null) + var expectedStructureType = item1.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 16"); - else { - expectedStructureType = item1.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 2; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item1 = Unsafe.AsRef(currentPtr); + } else { + item1 = Unsafe.AsRef(existingPtr); + } } - var item1Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item1, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item2Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T2 item2 = default; - if (currentPtr is null) + expectedStructureType = item2.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 16"); - else { - expectedStructureType = item2.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 3; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item2 = Unsafe.AsRef(currentPtr); + } else { + item2 = Unsafe.AsRef(existingPtr); + } } - var item2Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item2, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item3Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T3 item3 = default; - if (currentPtr is null) + expectedStructureType = item3.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 16"); - else { - expectedStructureType = item3.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 4; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item3 = Unsafe.AsRef(currentPtr); + } else { + item3 = Unsafe.AsRef(existingPtr); + } } - var item3Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item3, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item4Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T4 item4 = default; - if (currentPtr is null) + expectedStructureType = item4.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 16"); - else { - expectedStructureType = item4.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 5; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item4 = Unsafe.AsRef(currentPtr); + } else { + item4 = Unsafe.AsRef(existingPtr); + } } - var item4Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item4, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item5Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T5 item5 = default; - if (currentPtr is null) + expectedStructureType = item5.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 16"); - else { - expectedStructureType = item5.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 6; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item5 = Unsafe.AsRef(currentPtr); + } else { + item5 = Unsafe.AsRef(existingPtr); + } } - var item5Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item5, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item6Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T6 item6 = default; - if (currentPtr is null) + expectedStructureType = item6.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 16"); - else { - expectedStructureType = item6.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 7; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item6 = Unsafe.AsRef(currentPtr); + } else { + item6 = Unsafe.AsRef(existingPtr); + } } - var item6Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item6, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item7Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T7 item7 = default; - if (currentPtr is null) + expectedStructureType = item7.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 16"); - else { - expectedStructureType = item7.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 8; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item7 = Unsafe.AsRef(currentPtr); + } else { + item7 = Unsafe.AsRef(existingPtr); + } } - var item7Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item7, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item8Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T8 item8 = default; - if (currentPtr is null) + expectedStructureType = item8.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 16"); - else { - expectedStructureType = item8.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 9; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item8 = Unsafe.AsRef(currentPtr); + } else { + item8 = Unsafe.AsRef(existingPtr); + } } - var item8Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item8, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item9Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T9 item9 = default; - if (currentPtr is null) + expectedStructureType = item9.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 9, expected length 16"); - else { - expectedStructureType = item9.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 10; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item9 = Unsafe.AsRef(currentPtr); + } else { + item9 = Unsafe.AsRef(existingPtr); + } } - var item9Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item9, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item10Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T10 item10 = default; - if (currentPtr is null) + expectedStructureType = item10.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 10, expected length 16"); - else { - expectedStructureType = item10.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 11; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item10 = Unsafe.AsRef(currentPtr); + } else { + item10 = Unsafe.AsRef(existingPtr); + } } - var item10Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item10, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item11Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T11 item11 = default; - if (currentPtr is null) + expectedStructureType = item11.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 11, expected length 16"); - else { - expectedStructureType = item11.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 12; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item11 = Unsafe.AsRef(currentPtr); + } else { + item11 = Unsafe.AsRef(existingPtr); + } } - var item11Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item11, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item12Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T12 item12 = default; - if (currentPtr is null) + expectedStructureType = item12.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 12, expected length 16"); - else { - expectedStructureType = item12.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 13; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item12 = Unsafe.AsRef(currentPtr); + } else { + item12 = Unsafe.AsRef(existingPtr); + } } - var item12Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item12, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item13Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T13 item13 = default; - if (currentPtr is null) + expectedStructureType = item13.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 13, expected length 16"); - else { - expectedStructureType = item13.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 14; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item13 = Unsafe.AsRef(currentPtr); + } else { + item13 = Unsafe.AsRef(existingPtr); + } } - var item13Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item13, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item14Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T14 item14 = default; - if (currentPtr is null) + expectedStructureType = item14.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 14, expected length 16"); - else { - expectedStructureType = item14.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 15; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item14 = Unsafe.AsRef(currentPtr); + } else { + item14 = Unsafe.AsRef(existingPtr); + } } - var item14Size = Marshal.SizeOf(); + Marshal.StructureToPtr(item14, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item15Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T15 item15 = default; - if (currentPtr is null) + expectedStructureType = item15.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 15, expected length 16"); - else { - expectedStructureType = item15.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 16; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item15 = Unsafe.AsRef(currentPtr); - if (currentPtr->PNext is not null) - errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 16"); + } else { + if (existingPtr->PNext is not null) { + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 16"); + existingPtr->PNext = null; + } + item15 = Unsafe.AsRef(existingPtr); + } } - var item15Size = Marshal.SizeOf(); - + Marshal.StructureToPtr(item15, (nint) newPtr, false); // Create string of errors errors = errorBuilder.ToString().Trim(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + item12Size + item13Size + item14Size + item15Size); - Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - Marshal.StructureToPtr(item2, _item2Ptr, false); - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - Marshal.StructureToPtr(item3, _item3Ptr, false); - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - Marshal.StructureToPtr(item4, _item4Ptr, false); - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - Marshal.StructureToPtr(item5, _item5Ptr, false); - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - Marshal.StructureToPtr(item6, _item6Ptr, false); - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - Marshal.StructureToPtr(item7, _item7Ptr, false); - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; - Marshal.StructureToPtr(item8, _item8Ptr, false); - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - - _item9Ptr = _item8Ptr + item8Size; - Marshal.StructureToPtr(item9, _item9Ptr, false); - ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; - - _item10Ptr = _item9Ptr + item9Size; - Marshal.StructureToPtr(item10, _item10Ptr, false); - ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; - - _item11Ptr = _item10Ptr + item10Size; - Marshal.StructureToPtr(item11, _item11Ptr, false); - ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; - - _item12Ptr = _item11Ptr + item11Size; - Marshal.StructureToPtr(item12, _item12Ptr, false); - ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; - - _item13Ptr = _item12Ptr + item12Size; - Marshal.StructureToPtr(item13, _item13Ptr, false); - ((Chain*) _item12Ptr)->PNext = (Chain*) _item13Ptr; - - _item14Ptr = _item13Ptr + item13Size; - Marshal.StructureToPtr(item14, _item14Ptr, false); - ((Chain*) _item13Ptr)->PNext = (Chain*) _item14Ptr; - - _item15Ptr = _item14Ptr + item14Size; - Marshal.StructureToPtr(item15, _item15Ptr, false); - ((Chain*) _item14Ptr)->PNext = (Chain*) _item15Ptr; } /// - /// Creates a new with 16 items. + /// Creates a new with 16 by copying this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Duplicate() + { + var newHeadPtr = Marshal.AllocHGlobal(MemorySize); + // Block copy original struct data for speed + Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); + // Update all pointers + ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); + ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); + ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); + ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); + ((Chain*)(newHeadPtr + Item4Offset))->PNext = (Chain*) (newHeadPtr + Item5Offset); + ((Chain*)(newHeadPtr + Item5Offset))->PNext = (Chain*) (newHeadPtr + Item6Offset); + ((Chain*)(newHeadPtr + Item6Offset))->PNext = (Chain*) (newHeadPtr + Item7Offset); + ((Chain*)(newHeadPtr + Item7Offset))->PNext = (Chain*) (newHeadPtr + Item8Offset); + ((Chain*)(newHeadPtr + Item8Offset))->PNext = (Chain*) (newHeadPtr + Item9Offset); + ((Chain*)(newHeadPtr + Item9Offset))->PNext = (Chain*) (newHeadPtr + Item10Offset); + ((Chain*)(newHeadPtr + Item10Offset))->PNext = (Chain*) (newHeadPtr + Item11Offset); + ((Chain*)(newHeadPtr + Item11Offset))->PNext = (Chain*) (newHeadPtr + Item12Offset); + ((Chain*)(newHeadPtr + Item12Offset))->PNext = (Chain*) (newHeadPtr + Item13Offset); + ((Chain*)(newHeadPtr + Item13Offset))->PNext = (Chain*) (newHeadPtr + Item14Offset); + ((Chain*)(newHeadPtr + Item14Offset))->PNext = (Chain*) (newHeadPtr + Item15Offset); + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 16 items, by appending + /// to the end of this chain. /// /// The chain to append to. /// Item 15. @@ -10431,79 +12381,79 @@ public ManagedChain(out string errors, TChain chain) /// Do not forget to dispose the chain if you are no longer using it. /// public ManagedChain(ManagedChain previous, T15 item15 = default) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - var item2Size = Marshal.SizeOf(); - var item3Size = Marshal.SizeOf(); - var item4Size = Marshal.SizeOf(); - var item5Size = Marshal.SizeOf(); - var item6Size = Marshal.SizeOf(); - var item7Size = Marshal.SizeOf(); - var item8Size = Marshal.SizeOf(); - var item9Size = Marshal.SizeOf(); - var item10Size = Marshal.SizeOf(); - var item11Size = Marshal.SizeOf(); - var item12Size = Marshal.SizeOf(); - var item13Size = Marshal.SizeOf(); - var item14Size = Marshal.SizeOf(); - var item15Size = Marshal.SizeOf(); - - var originalSize = headSize + item1Size + item2Size + item3Size + item4Size + item5Size + item6Size + item7Size + item8Size + item9Size + item10Size + item11Size + item12Size + item13Size + item14Size; - var newSize = originalSize + item15Size; - - _headPtr = Marshal.AllocHGlobal(newSize); + var previousSize = MemorySize - Item15Size; // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); - - _item1Ptr = _headPtr + headSize; - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; - - _item2Ptr = _item1Ptr + item1Size; - ((Chain*) _item1Ptr)->PNext = (Chain*) _item2Ptr; - - _item3Ptr = _item2Ptr + item2Size; - ((Chain*) _item2Ptr)->PNext = (Chain*) _item3Ptr; - - _item4Ptr = _item3Ptr + item3Size; - ((Chain*) _item3Ptr)->PNext = (Chain*) _item4Ptr; - - _item5Ptr = _item4Ptr + item4Size; - ((Chain*) _item4Ptr)->PNext = (Chain*) _item5Ptr; - - _item6Ptr = _item5Ptr + item5Size; - ((Chain*) _item5Ptr)->PNext = (Chain*) _item6Ptr; - - _item7Ptr = _item6Ptr + item6Size; - ((Chain*) _item6Ptr)->PNext = (Chain*) _item7Ptr; - - _item8Ptr = _item7Ptr + item7Size; - ((Chain*) _item7Ptr)->PNext = (Chain*) _item8Ptr; - - _item9Ptr = _item8Ptr + item8Size; - ((Chain*) _item8Ptr)->PNext = (Chain*) _item9Ptr; - - _item10Ptr = _item9Ptr + item9Size; - ((Chain*) _item9Ptr)->PNext = (Chain*) _item10Ptr; - - _item11Ptr = _item10Ptr + item10Size; - ((Chain*) _item10Ptr)->PNext = (Chain*) _item11Ptr; - - _item12Ptr = _item11Ptr + item11Size; - ((Chain*) _item11Ptr)->PNext = (Chain*) _item12Ptr; - - _item13Ptr = _item12Ptr + item12Size; - ((Chain*) _item12Ptr)->PNext = (Chain*) _item13Ptr; + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); + + // Append item 15 + item15.StructureType(); + Marshal.StructureToPtr(item15, _headPtr + previousSize, false); + + // Update all pointers + ((Chain*)_headPtr)->PNext = (Chain*) (_headPtr + Item1Offset); + ((Chain*)(_headPtr + Item1Offset))->PNext = (Chain*) (_headPtr + Item2Offset); + ((Chain*)(_headPtr + Item2Offset))->PNext = (Chain*) (_headPtr + Item3Offset); + ((Chain*)(_headPtr + Item3Offset))->PNext = (Chain*) (_headPtr + Item4Offset); + ((Chain*)(_headPtr + Item4Offset))->PNext = (Chain*) (_headPtr + Item5Offset); + ((Chain*)(_headPtr + Item5Offset))->PNext = (Chain*) (_headPtr + Item6Offset); + ((Chain*)(_headPtr + Item6Offset))->PNext = (Chain*) (_headPtr + Item7Offset); + ((Chain*)(_headPtr + Item7Offset))->PNext = (Chain*) (_headPtr + Item8Offset); + ((Chain*)(_headPtr + Item8Offset))->PNext = (Chain*) (_headPtr + Item9Offset); + ((Chain*)(_headPtr + Item9Offset))->PNext = (Chain*) (_headPtr + Item10Offset); + ((Chain*)(_headPtr + Item10Offset))->PNext = (Chain*) (_headPtr + Item11Offset); + ((Chain*)(_headPtr + Item11Offset))->PNext = (Chain*) (_headPtr + Item12Offset); + ((Chain*)(_headPtr + Item12Offset))->PNext = (Chain*) (_headPtr + Item13Offset); + ((Chain*)(_headPtr + Item13Offset))->PNext = (Chain*) (_headPtr + Item14Offset); + ((Chain*)(_headPtr + Item14Offset))->PNext = (Chain*) (_headPtr + Item15Offset); + ((Chain*)(_headPtr + previousSize))->PNext = null; + } + + /// + /// Creates a new with 15 items, by removing the last item + /// from this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Truncate() + { + return Truncate(out var _); + } - _item14Ptr = _item13Ptr + item13Size; - ((Chain*) _item13Ptr)->PNext = (Chain*) _item14Ptr; + /// + /// Creates a new with 15 items, by removing + /// from the end of this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Truncate(out T15 item15) + { + item15 = Item15; - _item15Ptr = _item14Ptr + item14Size; - // Append the last structure - item15.StructureType(); - Marshal.StructureToPtr(item15, _item15Ptr, false); - ((Chain*) _item14Ptr)->PNext = (Chain*) _item15Ptr; + var newSize = MemorySize - Item15Size; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); + // Update all pointers + ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); + ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); + ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); + ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); + ((Chain*)(newHeadPtr + Item4Offset))->PNext = (Chain*) (newHeadPtr + Item5Offset); + ((Chain*)(newHeadPtr + Item5Offset))->PNext = (Chain*) (newHeadPtr + Item6Offset); + ((Chain*)(newHeadPtr + Item6Offset))->PNext = (Chain*) (newHeadPtr + Item7Offset); + ((Chain*)(newHeadPtr + Item7Offset))->PNext = (Chain*) (newHeadPtr + Item8Offset); + ((Chain*)(newHeadPtr + Item8Offset))->PNext = (Chain*) (newHeadPtr + Item9Offset); + ((Chain*)(newHeadPtr + Item9Offset))->PNext = (Chain*) (newHeadPtr + Item10Offset); + ((Chain*)(newHeadPtr + Item10Offset))->PNext = (Chain*) (newHeadPtr + Item11Offset); + ((Chain*)(newHeadPtr + Item11Offset))->PNext = (Chain*) (newHeadPtr + Item12Offset); + ((Chain*)(newHeadPtr + Item12Offset))->PNext = (Chain*) (newHeadPtr + Item13Offset); + ((Chain*)(newHeadPtr + Item13Offset))->PNext = (Chain*) (newHeadPtr + Item14Offset); + ((Chain*)(newHeadPtr + Item14Offset))->PNext = null; + return new ManagedChain(newHeadPtr); } /// @@ -10534,7 +12484,8 @@ public override IEnumerator GetEnumerator() public override IChainable this[int index] => index switch { - 0 => Head, 1 => Item1, + 0 => Head, + 1 => Item1, 2 => Item2, 3 => Item3, 4 => Item4, @@ -10594,41 +12545,28 @@ public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item /// public override void Dispose() { - var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); - if (headPtr == IntPtr.Zero) return; + var headPtr = Interlocked.Exchange(ref _headPtr, (nint)0); + if (headPtr == (nint)0) { + return; + } // Destroy all structures Marshal.DestroyStructure(headPtr); - var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item1Ptr); - var item2Ptr = Interlocked.Exchange(ref _item2Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item2Ptr); - var item3Ptr = Interlocked.Exchange(ref _item3Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item3Ptr); - var item4Ptr = Interlocked.Exchange(ref _item4Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item4Ptr); - var item5Ptr = Interlocked.Exchange(ref _item5Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item5Ptr); - var item6Ptr = Interlocked.Exchange(ref _item6Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item6Ptr); - var item7Ptr = Interlocked.Exchange(ref _item7Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item7Ptr); - var item8Ptr = Interlocked.Exchange(ref _item8Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item8Ptr); - var item9Ptr = Interlocked.Exchange(ref _item9Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item9Ptr); - var item10Ptr = Interlocked.Exchange(ref _item10Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item10Ptr); - var item11Ptr = Interlocked.Exchange(ref _item11Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item11Ptr); - var item12Ptr = Interlocked.Exchange(ref _item12Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item12Ptr); - var item13Ptr = Interlocked.Exchange(ref _item13Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item13Ptr); - var item14Ptr = Interlocked.Exchange(ref _item14Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item14Ptr); - var item15Ptr = Interlocked.Exchange(ref _item15Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item15Ptr); + Marshal.DestroyStructure(headPtr + Item1Offset); + Marshal.DestroyStructure(headPtr + Item2Offset); + Marshal.DestroyStructure(headPtr + Item3Offset); + Marshal.DestroyStructure(headPtr + Item4Offset); + Marshal.DestroyStructure(headPtr + Item5Offset); + Marshal.DestroyStructure(headPtr + Item6Offset); + Marshal.DestroyStructure(headPtr + Item7Offset); + Marshal.DestroyStructure(headPtr + Item8Offset); + Marshal.DestroyStructure(headPtr + Item9Offset); + Marshal.DestroyStructure(headPtr + Item10Offset); + Marshal.DestroyStructure(headPtr + Item11Offset); + Marshal.DestroyStructure(headPtr + Item12Offset); + Marshal.DestroyStructure(headPtr + Item13Offset); + Marshal.DestroyStructure(headPtr + Item14Offset); + Marshal.DestroyStructure(headPtr + Item15Offset); // Free memory block Marshal.FreeHGlobal(headPtr); diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.tt b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.tt index c6355fa39e..42f5120923 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.tt +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.tt @@ -1,10 +1,9 @@ <#@ template language="C#" #> <#@ import namespace="System.Text" #> -<#@ import namespace="System.Collections.Generic" #> <# var maximumItems = 16; - string parameterDocs(int index, string prefix) + string ParameterDocs(int index, string prefix) { var builder = new StringBuilder(prefix); builder.Append("The head of the chain."); @@ -22,7 +21,7 @@ return builder.ToString(); } - string parameterTypeDocs(int index, string prefix) + string ParameterTypeDocs(int index, string prefix) { var builder = new StringBuilder(prefix); builder.Append("The chain type"); @@ -40,7 +39,7 @@ return builder.ToString(); } - string typeList(int index) + string TypeList(int index) { var builder = new StringBuilder("TChain"); for (var i = 1; i < index; i++) @@ -52,7 +51,7 @@ return builder.ToString(); } - string paramList(int index) + string ParamList(int index) { var builder = new StringBuilder("TChain head = default"); for (var i = 1; i < index; i++) @@ -67,7 +66,7 @@ return builder.ToString(); } - string argList(int index) + string ArgList(int index) { var builder = new StringBuilder("head"); for (var i = 1; i < index; i++) @@ -79,7 +78,7 @@ return builder.ToString(); } - string constraintList(int index, string prefix) + string ConstraintList(int index, string prefix) { var builder = new StringBuilder(prefix); builder.Append("where TChain : struct, IChainStart"); @@ -95,6 +94,7 @@ return builder.ToString(); } #> +// ReSharper disable StaticMemberInGenericType using System.Collections; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; @@ -124,20 +124,20 @@ public abstract class ManagedChain : IReadOnlyList, IDisposable public abstract void Dispose(); <# - for (var i = 2; i <= maximumItems; i++) + for (var i = 1; i <= maximumItems; i++) { - var tList = typeList(i); + var tList = TypeList(i); #> /// /// Creates a new with <#= i #> items. /// -<#= parameterDocs(i, " /// ") #> -<#= parameterTypeDocs(i, " /// ") #> +<#= ParameterDocs(i, " /// ") #> +<#= ParameterTypeDocs(i, " /// ") #> /// A new with <#= i #> items. - public static ManagedChain<<#= tList #>> Create<<#= tList #>>(<#= paramList(i) #>) -<#= constraintList(i, " ") #> + public static ManagedChain<<#= tList #>> Create<<#= tList #>>(<#= ParamList(i) #>) +<#= ConstraintList(i, " ") #> { - return new(<#= argList(i) #>); + return new(<#= ArgList(i) #>); } /// @@ -147,7 +147,7 @@ public abstract class ManagedChain : IReadOnlyList, IDisposable /// The unmanaged chain to use as the basis of this chain. /// A new with <#= i #> items. public static ManagedChain<<#= tList #>> Load<<#= tList #>>(out string errors, TChain chain) -<#= constraintList(i, " ") #> +<#= ConstraintList(i, " ") #> { return new(out errors, chain); } @@ -159,29 +159,56 @@ public abstract class ManagedChain : IReadOnlyList, IDisposable /// The unmanaged chain to use as the basis of this chain. /// A new with <#= i #> items. public static ManagedChain<<#= tList #>> Load<<#= tList #>>(TChain chain) -<#= constraintList(i, " ") #> +<#= ConstraintList(i, " ") #> { return new(out var _, chain); } <# - } // for (var 2 = 1; i <= maximumItems; i++) { + } // for (var i = 1; i <= maximumItems; i++) #> } <# - for (var i = 2; i <= maximumItems; i++) + for (var i = 1; i <= maximumItems; i++) { - var tList = typeList(i); + var tList = TypeList(i); #> /// /// A safely manages the pointers of a managed structure chain. /// -<#= parameterTypeDocs(i, "/// ") #> +<#= ParameterTypeDocs(i, "/// ") #> public unsafe class ManagedChain<<#= tList #>> : ManagedChain -<#= constraintList(i, " ") #> +<#= ConstraintList(i, " ") #> { - private IntPtr _headPtr; + /// + /// Gets the size (in bytes) of the head structure. + /// + public static readonly int HeadSize = Marshal.SizeOf(); +<# + for (var j = 1; j < i; j++) + { +#> + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item<#= j #>Offset = <#= j == 1 ? "HeadSize" : $"Item{j - 1}Offset + Item{j - 1}Size" #>; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item<#= j #>Size = Marshal.SizeOf>(); +<# + } // for (int j = 1; j < i; j++) { +#> + + /// + /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. + /// + public static readonly int MemorySize = <#= i == 1 ? "HeadSize" : $"Item{i - 1}Offset + Item{i - 1}Size" #>; + + private nint _headPtr; /// /// Gets a pointer to the current head. @@ -197,35 +224,35 @@ public unsafe class ManagedChain<<#= tList #>> : ManagedChain set { value.StructureType(); - var nextPtr = ((Chain*) _headPtr)->PNext; + var ptr = (Chain*) _headPtr; + var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, _headPtr, true); - ((Chain*) _headPtr)->PNext = nextPtr; + ptr->PNext = nextPtr; } } - <# for (var j = 1; j < i; j++) { #> - private IntPtr _item<#= j #>Ptr; /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item<#= j #>Ptr => (Chain*) _item<#= j #>Ptr; + public Chain* Item<#= j #>Ptr => (Chain*) (_headPtr + Item<#= j #>Offset); /// /// Gets or sets item #<#= j #> in the chain. /// public T<#= j #> Item<#= j #> { - get => Unsafe.AsRef>((Chain*) _item<#= j #>Ptr); + get => Unsafe.AsRef>(Item<#= j #>Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item<#= j #>Ptr)->PNext; - Marshal.StructureToPtr(value, _item<#= j #>Ptr, true); - ((Chain*) _item<#= j #>Ptr)->PNext = nextPtr; + var ptr = Item<#= j #>Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } <# @@ -233,45 +260,38 @@ public unsafe class ManagedChain<<#= tList #>> : ManagedChain #> /// - /// Creates a new with <#= i #> items. + /// Creates a new with <#= i #> items from an existing memory block. /// -<#= parameterDocs(i, " /// ") #> - public ManagedChain(<#= paramList(i) #>) + /// The pointer to the head of the chain.. + /// + /// Callers are responsible for ensuring the size of the memory is correct. + /// + internal ManagedChain(nint headPtr) { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); -<# - for (var j = 1; j < i; j++) - { -#> - var item<#= j #>Size = Marshal.SizeOf>(); -<# - } // for (int j = 1; j < i; j++) { -#> + _headPtr = headPtr; + } - _headPtr = Marshal.AllocHGlobal(headSize<# - for (var j = 1; j < i; j++) - { -#> + item<#= j #>Size<# - } // for (int j = 1; j < i; j++) { -#>); + /// + /// Creates a new with <#= i #> items. + /// +<#= ParameterDocs(i, " /// ") #> + public ManagedChain(<#= ParamList(i) #>) + : this(Marshal.AllocHGlobal(MemorySize)) + { head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); <# for (var j = 1; j < i; j++) { - var prevItem = j > 1 - ? $"item{j - 1}" - : "head"; #> - - _item<#= j #>Ptr = _<#= prevItem #>Ptr + <#= prevItem #>Size; + <#= j == 1 ? "Chain* " : "" #>itemPtr = Item<#= j #>Ptr; item<#= j #>.StructureType(); - Marshal.StructureToPtr(item<#= j #>, _item<#= j #>Ptr, false); - ((Chain*) _<#= prevItem #>Ptr)->PNext = (Chain*) _item<#= j #>Ptr; + Marshal.StructureToPtr(item<#= j #>, (nint)itemPtr, false); + <#= j == 1 ? "HeadPtr" : $"Item{j - 1}Ptr" #>->PNext = itemPtr; <# } // for (int j = 1; j < i; j++) { #> + <#= i == 1 ? "HeadPtr" : $"Item{i - 1}Ptr" #>->PNext = null; } /// @@ -280,139 +300,195 @@ public unsafe class ManagedChain<<#= tList #>> : ManagedChain /// Any errors loading the chain. /// The unmanaged chain to use as the basis of this chain. public ManagedChain(out string errors, TChain chain) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Load existing chain first, so any errors occur before we allocate memory - var head = chain; - var headSize = Marshal.SizeOf(); - var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); - StructureType expectedStructureType; - StringBuilder errorBuilder = new StringBuilder(); - + chain.StructureType(); + Marshal.StructureToPtr(chain, _headPtr, false); <# - for (var j = 1; j < i; j++) + if (i == 1) { #> - currentPtr = currentPtr->PNext; + errors = string.Empty; +<# + } + else + { +#> + StringBuilder errorBuilder = new StringBuilder(); + var existingPtr = (Chain*) Unsafe.AsPointer(ref chain); + var newPtr = (Chain*) _headPtr; +<# + for (var j = 1; j < i; j++) + { +#> + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item<#= j #>Offset); + newPtr = newPtr->PNext; + T<#= j #> item<#= j #> = default; - if (currentPtr is null) + <#= j == 1 ? "var " : "" #>expectedStructureType = item<#= j #>.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length <#= j #>, expected length <#= i #>"); - else { - expectedStructureType = item<#= j #>.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position <#= j + 1 #>; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item<#= j #> = Unsafe.AsRef>(currentPtr); + } else { <# - if (j == i -1) - { + if (j == i - 1) + { #> - if (currentPtr->PNext is not null) - errorBuilder.AppendLine("The unmanaged chain was longer than the expected length <#= i #>"); + if (existingPtr->PNext is not null) { + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length <#= i #>"); + existingPtr->PNext = null; + } <# - } // if (j == i -1) + } // if (j == i -1) #> + item<#= j #> = Unsafe.AsRef>(existingPtr); + } } - var item<#= j #>Size = Marshal.SizeOf>(); - + Marshal.StructureToPtr(item<#= j #>, (nint) newPtr, false); <# - } // for (int j = 1; j < i; j++) { + } // for (int j = 1; j < i; j++) { #> // Create string of errors errors = errorBuilder.ToString().Trim(); +<# + } // if (i == 1) {} else {... +#> + } - _headPtr = Marshal.AllocHGlobal(headSize<# - for (var j = 1; j < i; j++) + /// + /// Creates a new with <#= i #> by copying this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain<<#= tList #>> Duplicate() + { + var newHeadPtr = Marshal.AllocHGlobal(MemorySize); + // Block copy original struct data for speed + Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); +<# + if (i > 1) { -#> + item<#= j #>Size<# - } // for (int j = 1; j < i; j++) { -#>); - Marshal.StructureToPtr(head, _headPtr, false); +#> + // Update all pointers + ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); <# - for (var j = 1; j < i; j++) + } // if (i > 1) +#> +<# + for (var j = 2; j < i; j++) { - var prevItem = j > 1 - ? $"item{j - 1}" - : "head"; #> - - _item<#= j #>Ptr = _<#= prevItem #>Ptr + <#= prevItem #>Size; - Marshal.StructureToPtr(item<#= j #>, _item<#= j #>Ptr, false); - ((Chain*) _<#= prevItem #>Ptr)->PNext = (Chain*) _item<#= j #>Ptr; + ((Chain*)(newHeadPtr + Item<#= j - 1 #>Offset))->PNext = (Chain*) (newHeadPtr + Item<#= j #>Offset); <# } // for (int j = 1; j < i; j++) { #> + return new ManagedChain<<#= tList #>>(newHeadPtr); } <# - if (i > 2) + if (i > 1) { + var shortTList = TypeList(i - 1); #> /// - /// Creates a new with <#= i #> items. + /// Creates a new with <#= i #> items, by appending + /// to the end of this chain. /// /// The chain to append to. /// Item <#= i - 1 #>. /// /// Do not forget to dispose the chain if you are no longer using it. /// - public ManagedChain(ManagedChain<<#= typeList(i - 1) #>> previous, T<#= i - 1 #> item<#= i - 1 #> = default) + public ManagedChain(ManagedChain<<#= shortTList #>> previous, T<#= i - 1 #> item<#= i - 1 #> = default) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); + var previousSize = MemorySize - Item<#= i - 1 #>Size; + // Block copy original struct data for speed + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); + + // Append item <#= i - 1 #> + item<#= i - 1 #>.StructureType(); + Marshal.StructureToPtr(item<#= i - 1 #>, _headPtr + previousSize, false); + + // Update all pointers + ((Chain*)_headPtr)->PNext = (Chain*) (_headPtr + Item1Offset); <# - for (var j = 1; j < i; j++) + for (var j = 2; j < i; j++) { #> - var item<#= j #>Size = Marshal.SizeOf>(); + ((Chain*)(_headPtr + Item<#= j - 1 #>Offset))->PNext = (Chain*) (_headPtr + Item<#= j #>Offset); <# } // for (int j = 1; j < i; j++) { #> + ((Chain*)(_headPtr + previousSize))->PNext = null; + } - var originalSize = headSize<# - for (var j = 1; j < i - 1; j++) - { -#> + item<#= j #>Size<# - } // for (int j = 1; j < i; j++) { -#>; - var newSize = originalSize + item<#= i - 1 #>Size; + /// + /// Creates a new with <#= i - 1 #> items, by removing the last item + /// from this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain<<#= shortTList #>> Truncate() + { + return Truncate(out var _); + } + + /// + /// Creates a new with <#= i - 1 #> items, by removing + /// from the end of this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain<<#= shortTList #>> Truncate(out T<#= i - 1 #> item<#= i - 1 #>) + { + item<#= i - 1 #> = Item<#= i - 1 #>; - _headPtr = Marshal.AllocHGlobal(newSize); + var newSize = MemorySize - Item<#= i - 1 #>Size; + var newHeadPtr = Marshal.AllocHGlobal(newSize); // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, originalSize, originalSize); + Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); + // Update all pointers <# - for (var j = 1; j < i; j++) + if (i > 2) { - var prevItem = j > 1 - ? $"item{j - 1}" - : "head"; #> - - _item<#= j #>Ptr = _<#= prevItem #>Ptr + <#= prevItem #>Size; + ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); <# - if (j == i - 1) + for (var j = 2; j < i; j++) { #> - // Append the last structure - item<#= j #>.StructureType(); - Marshal.StructureToPtr(item<#= j #>, _item<#= j #>Ptr, false); + ((Chain*)(newHeadPtr + Item<#= j - 1 #>Offset))->PNext = <#= j == i -1 ? "null" : $"(Chain*) (newHeadPtr + Item{j}Offset)"#>; <# - } // if (j == i - 1) -#> - ((Chain*) _<#= prevItem #>Ptr)->PNext = (Chain*) _item<#= j #>Ptr; + } // for (int j = 1; j < i - 1; j++) + } + else // if (i > 1) + { + #> + ((Chain*)newHeadPtr)->PNext = null; <# - } // for (int j = 1; j < i; j++) { + } #> + return new ManagedChain<<#= shortTList #>>(newHeadPtr); } <# - } //if (i > 2) + } // if (i > 1) if (i < maximumItems) { + var bigTList = TypeList(i + 1); #> /// @@ -422,9 +498,9 @@ public unsafe class ManagedChain<<#= tList #>> : ManagedChain /// Item <#= i #>. /// Type of Item <#= i #> /// - /// Do not forget to dispose this chain if you are no longer using it. + /// Do not forget to dispose this chain if you are no longer using it. /// - public ManagedChain<<#= tList #>, T<#= i #>> Append>(T<#= i #> item<#= i #> = default) + public ManagedChain<<#= bigTList #>> Append>(T<#= i #> item<#= i #> = default) where T<#= i #>: struct, IExtendsChain { return new ManagedChain<<#= tList #>, T<#= i #>>(this, item<#= i #>); @@ -454,13 +530,14 @@ public unsafe class ManagedChain<<#= tList #>> : ManagedChain public override IChainable this[int index] => index switch { - 0 => Head,<# - for (var j = 1; j < i; j++) - { + 0 => Head, +<# + for (var j = 1; j < i; j++) + { #> <#= j #> => Item<#= j #>, <# - } // for (int j = 1; j < i; j++) { + } // for (int j = 1; j < i; j++) { #> _ => throw new IndexOutOfRangeException() }; @@ -468,30 +545,32 @@ public unsafe class ManagedChain<<#= tList #>> : ManagedChain /// /// Deconstructs this chain. /// -<#= parameterDocs(i, " /// ") #> +<#= ParameterDocs(i, " /// ") #> public void Deconstruct(out TChain head<# - for (var j = 1; j < i; j++) - { + for (var j = 1; j < i; j++) + { #>, out T<#= j #> item<#= j #><# - } // for (int j = 1; j < i; j++) { + } // for (int j = 1; j < i; j++) { #>) { head = Head; <# - for (var j = 1; j < i; j++) - { + for (var j = 1; j < i; j++) + { #> item<#= j #> = Item<#= j #>; <# - } // for (int j = 1; j < i; j++) { + } // for (int j = 1; j < i; j++) { #> } /// public override void Dispose() { - var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); - if (headPtr == IntPtr.Zero) return; + var headPtr = Interlocked.Exchange(ref _headPtr, (nint)0); + if (headPtr == (nint)0) { + return; + } // Destroy all structures Marshal.DestroyStructure(headPtr); @@ -499,8 +578,7 @@ public unsafe class ManagedChain<<#= tList #>> : ManagedChain for (var j = 1; j < i; j++) { #> - var item<#= j #>Ptr = Interlocked.Exchange(ref _item<#= j #>Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item<#= j #>Ptr); + Marshal.DestroyStructure>(headPtr + Item<#= j #>Offset); <# } // for (int j = 1; j < i; j++) { #> @@ -510,5 +588,5 @@ public unsafe class ManagedChain<<#= tList #>> : ManagedChain } } <# - } // for (var i = 2; i <= maximumItems; i++) { + } // for (var i = 1; i <= maximumItems; i++) #> \ No newline at end of file diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceAccelerationStructureFeaturesKHR.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceAccelerationStructureFeaturesKHR.cs index 9a2fa6ecf8..bd7fdeb97e 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceAccelerationStructureFeaturesKHR.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceAccelerationStructureFeaturesKHR.cs @@ -39,5 +39,12 @@ StructureType IStructuredType.StructureType() return SType = StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr; } + /// + unsafe Chain* IChainable.PNext + { + get => (Chain*) PNext; + set => PNext = value; + } + #endregion } \ No newline at end of file diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceDescriptorIndexingFeatures.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceDescriptorIndexingFeatures.cs index 5f30fcd144..9e9bf8ac5d 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceDescriptorIndexingFeatures.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceDescriptorIndexingFeatures.cs @@ -39,5 +39,12 @@ StructureType IStructuredType.StructureType() return SType = StructureType.PhysicalDeviceDescriptorIndexingFeaturesExt; } + /// + unsafe Chain* IChainable.PNext + { + get => (Chain*) PNext; + set => PNext = value; + } + #endregion } \ No newline at end of file diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceFeatures2.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceFeatures2.cs index f9aae21d47..9b12590611 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceFeatures2.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceFeatures2.cs @@ -43,5 +43,12 @@ StructureType IStructuredType.StructureType() return SType = StructureType.PhysicalDeviceFeatures2; } + /// + unsafe Chain* IChainable.PNext + { + get => (Chain*) PNext; + set => PNext = value; + } + #endregion } \ No newline at end of file From d1ced738e8179afcadcccf4346cd522a310b950c Mon Sep 17 00:00:00 2001 From: Craig Dean Date: Sun, 7 Nov 2021 21:57:43 +0000 Subject: [PATCH 27/42] docs: Updated Chaining proposals to match new functionality. Also cleaned up some tests. --- ...Struct Chaining - #2 Unmanaged Chaining.md | 34 +-- ...n Struct Chaining - #3 Managed Chaining.md | 241 +++++++++++++----- .../TestChains.cs | 14 +- .../TestCompilation.cs | 4 +- .../TestManagedChains.cs | 30 +-- .../PrototypeStructChaining.csproj | 15 +- 6 files changed, 228 insertions(+), 110 deletions(-) diff --git a/documentation/proposals/Proposal - Vulkan Struct Chaining - #2 Unmanaged Chaining.md b/documentation/proposals/Proposal - Vulkan Struct Chaining - #2 Unmanaged Chaining.md index b627be5c9a..513cd4487d 100644 --- a/documentation/proposals/Proposal - Vulkan Struct Chaining - #2 Unmanaged Chaining.md +++ b/documentation/proposals/Proposal - Vulkan Struct Chaining - #2 Unmanaged Chaining.md @@ -18,7 +18,8 @@ The `IChainable` interface extends the `IStructuredType` interface from [Proposal - Vulkan Struct Chaining - #1 StructureType correction](Proposal%20-%20Vulkan%20Struct%20Chaining%20-%20%231%20StructureType%20correction.md) and so the explicit implementation of `IChainable.StructureType()` from [that proposal](Proposal%20-%20Vulkan%20Struct%20Chaining%20-%20%231%20StructureType%20correction.md#istructuretype-implementation) -is triggerred for the structure, providing a mechanism for ensuring the `SType` is correctly set. +is triggerred for the structure, providing a mechanism for ensuring the `SType` is correctly set. It then exposes +a `Chain* PNext { get; set; }` property for easy access to the next item in the chain. The presence of the `IChainable` interface, also acts as a **guarantee** that it is safe to cast any pointer of a struct implementing it to a pointer to a `Chain` struct, which is a struct which has just the `SType` and `PNext` fields @@ -31,16 +32,15 @@ run time. offset 0, i.e. in the first position. However, rather than extending `IChainable` directly, it will be more common to choose one of `IChainStart` -or `IExtendsChain` (both of which extend `IChainable`). It does this based on the `structextends` attribute -provided in +or `IExtendsChain` (both of which extend `IChainable`). `BuildTools` will do this based on the `structextends` +attribute provided in the [Vulkan Specification](https://raw.githubusercontent.com/KhronosGroup/Vulkan-Headers/master/registry/vk.xml)). -For example, if `struct B` extends `struct A` (as per -the [Vulkan Specification](https://raw.githubusercontent.com/KhronosGroup/Vulkan-Headers/master/registry/vk.xml)), then -`struct B` will be marked with `IExtendsChain` and `struct A` will be marked with `IChainStart`. A struct may only -extend `IChainStart` once (even though it may appear in the `structextends` attribute of many structs), but is may -implement multiple `IExtendsChain` interfaces. It is also feasible for a struct to implement both (i.e. be able -to extend other chains, as well as being a chain start), a real example of this can be seen +For example, if `struct B` extends `struct A`, then `struct B` will be marked with `IExtendsChain` and `struct A` +will be marked with `IChainStart`. A struct may only extend `IChainStart` once (even though it may appear in +the `structextends` attribute of many structs), but is may implement multiple `IExtendsChain` interfaces. It is +also feasible for a struct to implement both (i.e. be able to extend other chains, as well as being a chain start), a +real example of this can be seen [in the labs](../../src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceFeatures2.cs). As a result, `IChainable` will not usually be directly implemented (just as it is unlikely to see `IStructuredType` @@ -52,12 +52,12 @@ will be explicitly marked as `IChainable`. Whenever a struct is marked as `IChainStart` a static `ref [StructType] Chain(out [StructType]) capture);` method is also added, providing an easy form of starting a chain with default values. As `IChainStart` also -implements `IStructuredType` (via `IChainable`), then a chain start will have two additional methods generated (the -static -`Chain(out)` method and the explicit `IStructuredType.StructureType()` implementation); as compared to all other -`IChainable` structs, which will only have the explicit `IStructuredType.StructureType()` implementation from +implements `IChainable`, which implements `IStructuredType`, then a chain start will have three additional methods +generated (the static `Chain(out)` method and the explicit `IStructuredType.StructureType()` and `IChainable.PNext` +implementation); as compared to all other `IChainable` structs, which will only have the +explicit `IStructuredType.StructureType()` implementation from [Proposal - Vulkan Struct Chaining - #1 StructureType correction](Proposal%20-%20Vulkan%20Struct%20Chaining%20-%20%231%20StructureType%20correction.md) -. +and the explicit `Chain* IChainable.PNext { get; set;}` property from this proposal. The remaining functionality is provided entirely by the following new extension methods: @@ -115,13 +115,13 @@ What this proposal does not do (some of these _are_ addressed in [Proposal - Vulkan Struct Chaining - #3 Managed Chaining](Proposal%20-%20Vulkan%20Struct%20Chaining%20-%20%233%20Managed%20Chaining.md)) is manage pointers of structures that find themselves on the heap. Any supplied structures should be held on the stack, once moved to the heap their `PNext` values can no longer be trusted as the GC is free to move structures in heap -memory. The interface of this proposal makes it difficult to use with heap objects, but it is not impossible. The +memory. The proposed extension methods make it difficult to use with heap objects, but it is not impossible. The presence of the `ManagedChain` classes from [the proposal for managed chains](Proposal%20-%20Vulkan%20Struct%20Chaining%20-%20%233%20Managed%20Chaining.md), along with a well documented API should highlight the danger of such practices. -Indeed, it is important to remember that such dangers are already part of the existing implementation are a feature of -using unmanaged pointers in .NET rather than a 'limitation' of this proposal. +Indeed, it is important to remember that such dangers are already part of the existing implementation and are a feature of +using unmanaged pointers in .NET rather than a limitation of this proposal. # Usage diff --git a/documentation/proposals/Proposal - Vulkan Struct Chaining - #3 Managed Chaining.md b/documentation/proposals/Proposal - Vulkan Struct Chaining - #3 Managed Chaining.md index 8ffb1cb6e5..47c6bbfc89 100644 --- a/documentation/proposals/Proposal - Vulkan Struct Chaining - #3 Managed Chaining.md +++ b/documentation/proposals/Proposal - Vulkan Struct Chaining - #3 Managed Chaining.md @@ -17,7 +17,7 @@ performance. However, many consumers are uncomfortable with pointers, and are especially prone to introducing bugs when placing structs onto the heap. This proposal provides a convenient `ManagedChain` class, and multiple -descendent `ManagedChain` classes to safely fix the structures in memory and prevent pointer bugs. +descendent `ManagedChain` classes to safely fix the structures in memory and prevent pointer bugs. Whenever a structure is loaded into the `ManagedChain` its `SType` and `PNext` are forced to be correct, preventing errors. Structures can be replaced at any time, and will be inserted efficiently into the chain as an O(1) operation. @@ -36,34 +36,32 @@ errors. Structures can be replaced at any time, and will be inserted efficiently # Design Decisions - There are no requirements to extend `BuildTools`, or add any additional information to the `IChainable` structures. -- Although the `ManagedChain` generic classes are auto-generated (for convenience) this is done using T4 +- Although the `ManagedChain` generic classes are auto-generated (for convenience) this is done using T4 templating, an implementation of which is provided [in the labs](../../src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.tt). - For improved performance, the chain's structures are held in a single block of contiguous unmanaged memory, as the memory is unmanaged, the position of the structures remains fixed, even though the containing object can be safely - moved around by the GC in the heap. + moved around by the GC in the heap. Indeed a pointer to this block is the only data stored by an instance of any + `ManageChain` object, despite all the functionality provided! - The structure accessors return a copy of the structures, and always correct the `SType` and `PNext` on input. Even though the `PNext` values are exposed there is no way to modify them from outside the class, guaranteeing their safety. Open questions: -- Should we expose 8, 16 or 32 `ManagedChain` classes? +- Should we expose 8, 16 or 32 `ManagedChain` classes? - Do we want to stick with `TChain chain, T1 item1`, or use `T1 item1, T2 item2` ala `Tuple`? - Although the constructors used by `ManagedChain.Create` and `ManagedChain.Load` could be made `internal`, I don't propose we do so. Primarily, the main benefit of the static methods is type inference, but, as chain building is frequently done with defaults then direct constructor access does not have a disadvantage, and can take advantage of implicit typing when assigning to an already typed field/property. Having both forms available is therefore convenient. -- Currently `ManagedChain` is the smallest chain, there is a strong case to be made for - a `ManagedChain`. - The current `Load` methods expect an unmanaged chain that matches the supplied type constraints, and is of the same length. This is useful, as coders will normally expect a particular chain. We could additionally add more lax `Import` methods that will import an unmanaged chain into a managed chain by populating any positions with structure types found in the unmanaged chain, no matter at what position they are found. This is not entirely unreasonable as the order of chains (after the start) is not fixed in Vulkan, and it will allow importing existing chains where the order doesn't matter. -- Similar to `Append` do we want a `Truncate` method to trim the end of a chain? - Similar to `Append` and `Truncate` we could also add `Insert` and `Remove` methods, though slightly more complex, as we'd have to generate multiples of each, it is not difficult to do, for example: @@ -173,8 +171,8 @@ ensures the `PNext` value pointing to it is maintained. ### Appending to a chain -You can call `Append` on a `ManagedChain` to efficiently create a new, larger, `ManagedChain` with a new item appended -to the end, e.g: +You can call `Append` on a `ManagedChain` (of length < 16) to efficiently create a new, larger, `ManagedChain` with a +new item appended to the end, e.g: ```csharp using var chain = new ManagedChain( @@ -192,10 +190,33 @@ Assert.True(newChain.Item1.ShaderInputAttachmentArrayDynamicIndexing); finished with, when using the `Append` method you will produce a new `ManagedChain` and should not forget to dispose the original if it is no longer needed. +### Truncate + +Similarly, you can `Truncate` a chain (of length > 1) to get an instance of a smaller chain: +```csharp +using var chain = ManagedChain.Create(); +using var chain2 = chain.Append(); +// Remove the indexing features we just added (note the out parameter is optional) +using var chain3 = chain2.Truncate(out var indexingFeatures); + +Assert.Equal(1, chain.Count); +Assert.Equal(2, chain2.Count); +Assert.Equal(1, chain3.Count); +``` + +### Duplicate + +You can efficiently duplicate a managed chain by calling Duplicate on it: +```csharp +using var chain = new ManagedChain(); +using var copy = chain.Duplicate(); +``` + ### Loading from an unmanaged chain If you have created an unmanaged chain and would like to load that into a `ManagedChain` you can use one of the -`ManagedChain.Load` methods: +`ManagedChain.Load` methods: ```csharp // Load an unmanaged chain @@ -265,7 +286,7 @@ equivalent constructor to `Load(TChain)` as that would be ambiguous. ### IReadOnlyList -All the fully generic `ManageChain` types extend `ManagedChain` which implements `IDisposable` +All the fully generic `ManageChain` types extend `ManagedChain` which implements `IDisposable` and `IReadOnlyList`. The latter allowing for easy consumption of any `ManagedChain`, e.g.: ```csharp @@ -292,7 +313,7 @@ Assert.IsType(structures[2]); ### Deconstruction -Each `ManageChain` has a corresponding deconstructor for convenience, e.g.: +Each `ManageChain` has a corresponding deconstructor for convenience, e.g.: ```csharp using var chain = new ManagedChain, IDisposable A class is generated for each valid size of a chain, here is one example: ```csharp + /// /// A safely manages the pointers of a managed structure chain. /// @@ -385,7 +407,27 @@ public unsafe class ManagedChain : ManagedChain where TChain : struct, IChainStart where T1 : struct, IExtendsChain { - private IntPtr _headPtr; + /// + /// Gets the size (in bytes) of the head structure. + /// + public static readonly int HeadSize = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item1Offset = HeadSize; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item1Size = Marshal.SizeOf(); + + /// + /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. + /// + public static readonly int MemorySize = Item1Offset + Item1Size; + + private nint _headPtr; /// /// Gets a pointer to the current head. @@ -401,53 +443,61 @@ public unsafe class ManagedChain : ManagedChain set { value.StructureType(); - var nextPtr = ((Chain*) _headPtr)->PNext; + var ptr = (Chain*) _headPtr; + var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, _headPtr, true); - ((Chain*) _headPtr)->PNext = nextPtr; + ptr->PNext = nextPtr; } } - private IntPtr _item1Ptr; - /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item1Ptr => (Chain*) _item1Ptr; + public Chain* Item1Ptr => (Chain*) (_headPtr + Item1Offset); /// /// Gets or sets item #1 in the chain. /// public T1 Item1 { - get => Unsafe.AsRef((Chain*) _item1Ptr); + get => Unsafe.AsRef(Item1Ptr); set { value.StructureType(); - var nextPtr = ((Chain*) _item1Ptr)->PNext; - Marshal.StructureToPtr(value, _item1Ptr, true); - ((Chain*) _item1Ptr)->PNext = nextPtr; + var ptr = Item1Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } } + /// + /// Creates a new with 2 items from an existing memory block. + /// + /// The pointer to the head of the chain.. + /// + /// Callers are responsible for ensuring the size of the memory is correct. + /// + internal ManagedChain(nint headPtr) + { + _headPtr = headPtr; + } + /// /// Creates a new with 2 items. /// /// The head of the chain. /// Item 1. public ManagedChain(TChain head = default, T1 item1 = default) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Calculate memory requirements - var headSize = Marshal.SizeOf(); - var item1Size = Marshal.SizeOf(); - - _headPtr = Marshal.AllocHGlobal(headSize + item1Size); head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); - - _item1Ptr = _headPtr + headSize; + Chain* itemPtr = Item1Ptr; item1.StructureType(); - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + Marshal.StructureToPtr(item1, (nint)itemPtr, false); + HeadPtr->PNext = itemPtr; + Item1Ptr->PNext = null; } /// @@ -456,43 +506,114 @@ public unsafe class ManagedChain : ManagedChain /// Any errors loading the chain. /// The unmanaged chain to use as the basis of this chain. public ManagedChain(out string errors, TChain chain) + : this(Marshal.AllocHGlobal(MemorySize)) { - // Load existing chain first, so any errors occur before we allocate memory - var head = chain; - var headSize = Marshal.SizeOf(); - var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); - StructureType expectedStructureType; + chain.StructureType(); + Marshal.StructureToPtr(chain, _headPtr, false); StringBuilder errorBuilder = new StringBuilder(); + var existingPtr = (Chain*) Unsafe.AsPointer(ref chain); + var newPtr = (Chain*) _headPtr; + + existingPtr = existingPtr->PNext; + newPtr->PNext = (Chain*) (_headPtr + Item1Offset); + newPtr = newPtr->PNext; - currentPtr = currentPtr->PNext; T1 item1 = default; - if (currentPtr is null) + var expectedStructureType = item1.StructureType(); + if (existingPtr is null) { errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 2"); - else { - expectedStructureType = item1.StructureType(); - if (currentPtr->SType != expectedStructureType) { + } else { + if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(currentPtr->SType) + .Append(existingPtr->SType) .Append(" at position 2; expected ") .Append(expectedStructureType) .AppendLine(); - } else - item1 = Unsafe.AsRef(currentPtr); - if (currentPtr->PNext is not null) - errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 2"); + } else { + if (existingPtr->PNext is not null) { + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 2"); + existingPtr->PNext = null; + } + item1 = Unsafe.AsRef(existingPtr); + } } - var item1Size = Marshal.SizeOf(); - + Marshal.StructureToPtr(item1, (nint) newPtr, false); // Create string of errors errors = errorBuilder.ToString().Trim(); + } - _headPtr = Marshal.AllocHGlobal(headSize + item1Size); - Marshal.StructureToPtr(head, _headPtr, false); + /// + /// Creates a new with 2 by copying this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Duplicate() + { + var newHeadPtr = Marshal.AllocHGlobal(MemorySize); + // Block copy original struct data for speed + Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); + // Update all pointers + ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); + return new ManagedChain(newHeadPtr); + } - _item1Ptr = _headPtr + headSize; - Marshal.StructureToPtr(item1, _item1Ptr, false); - ((Chain*) _headPtr)->PNext = (Chain*) _item1Ptr; + /// + /// Creates a new with 2 items, by appending + /// to the end of this chain. + /// + /// The chain to append to. + /// Item 1. + /// + /// Do not forget to dispose the chain if you are no longer using it. + /// + public ManagedChain(ManagedChain previous, T1 item1 = default) + : this(Marshal.AllocHGlobal(MemorySize)) + { + var previousSize = MemorySize - Item1Size; + // Block copy original struct data for speed + Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); + + // Append item 1 + item1.StructureType(); + Marshal.StructureToPtr(item1, _headPtr + previousSize, false); + + // Update all pointers + ((Chain*)_headPtr)->PNext = (Chain*) (_headPtr + Item1Offset); + ((Chain*)(_headPtr + previousSize))->PNext = null; + } + + /// + /// Creates a new with 1 items, by removing the last item + /// from this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Truncate() + { + return Truncate(out var _); + } + + /// + /// Creates a new with 1 items, by removing + /// from the end of this chain. + /// + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + public ManagedChain Truncate(out T1 item1) + { + item1 = Item1; + + var newSize = MemorySize - Item1Size; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); + // Update all pointers + ((Chain*)newHeadPtr)->PNext = null; + return new ManagedChain(newHeadPtr); } /// @@ -502,7 +623,7 @@ public unsafe class ManagedChain : ManagedChain /// Item 2. /// Type of Item 2 /// - /// Do not forget to dispose this chain if you are no longer using it. + /// Do not forget to dispose this chain if you are no longer using it. /// public ManagedChain Append(T2 item2 = default) where T2: struct, IExtendsChain @@ -524,7 +645,8 @@ public unsafe class ManagedChain : ManagedChain public override IChainable this[int index] => index switch { - 0 => Head, 1 => Item1, + 0 => Head, + 1 => Item1, _ => throw new IndexOutOfRangeException() }; @@ -542,13 +664,14 @@ public unsafe class ManagedChain : ManagedChain /// public override void Dispose() { - var headPtr = Interlocked.Exchange(ref _headPtr, IntPtr.Zero); - if (headPtr == IntPtr.Zero) return; + var headPtr = Interlocked.Exchange(ref _headPtr, (nint)0); + if (headPtr == (nint)0) { + return; + } // Destroy all structures Marshal.DestroyStructure(headPtr); - var item1Ptr = Interlocked.Exchange(ref _item1Ptr, IntPtr.Zero); - Marshal.DestroyStructure(item1Ptr); + Marshal.DestroyStructure(headPtr + Item1Offset); // Free memory block Marshal.FreeHGlobal(headPtr); diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChains.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChains.cs index 0debaa5543..2ccadfa81b 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChains.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChains.cs @@ -19,7 +19,7 @@ public unsafe void TestAddNext() // Ensure all pointers set correctly Assert.Equal((nint) (&indexingFeatures), (nint) features2.PNext); Assert.Equal((nint) (&accelerationStructureFeaturesKhr), (nint) indexingFeatures.PNext); - Assert.Equal((nint) 0, (nint) accelerationStructureFeaturesKhr.PNext); + Assert.Equal(0, (nint) accelerationStructureFeaturesKhr.PNext); // Ensure all STypes set correctly Assert.Equal(StructureType.PhysicalDeviceFeatures2, features2.SType); @@ -76,7 +76,7 @@ public unsafe void TestSetNext() Assert.Equal((nint) (&indexingFeatures), (nint) features2.PNext); Assert.Equal((nint) (&accelerationStructureFeaturesKhr), (nint) indexingFeatures.PNext); - Assert.Equal((nint) 0, (nint) accelerationStructureFeaturesKhr.PNext); + Assert.Equal(0, (nint) accelerationStructureFeaturesKhr.PNext); Assert.Equal(StructureType.PhysicalDeviceFeatures2, features2.SType); Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, indexingFeatures.SType); @@ -104,7 +104,7 @@ public unsafe void TestSetNextUpdates() .SetNext(ref indexingFeatures); Assert.Equal((nint) (&indexingFeatures), (nint) features2.PNext); - Assert.Equal((nint) 0, (nint) indexingFeatures.PNext); + Assert.Equal(0, (nint) indexingFeatures.PNext); Assert.Equal(StructureType.PhysicalDeviceFeatures2, features2.SType); Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, indexingFeatures.SType); @@ -117,7 +117,7 @@ public unsafe void TestSetNextUpdates() features2.SetNext(ref indexingFeatures2); Assert.Equal((nint) (&indexingFeatures2), (nint) features2.PNext); - Assert.Equal((nint) 0, (nint) indexingFeatures2.PNext); + Assert.Equal(0, (nint) indexingFeatures2.PNext); Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, indexingFeatures2.SType); @@ -139,7 +139,7 @@ public unsafe void TestSetNextAlwaysAdd() .SetNext(ref indexingFeatures); Assert.Equal((nint) (&indexingFeatures), (nint) features2.PNext); - Assert.Equal((nint) 0, (nint) indexingFeatures.PNext); + Assert.Equal(0, (nint) indexingFeatures.PNext); Assert.Equal(StructureType.PhysicalDeviceFeatures2, features2.SType); Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, indexingFeatures.SType); @@ -153,7 +153,7 @@ public unsafe void TestSetNextAlwaysAdd() Assert.Equal((nint) (&indexingFeatures), (nint) features2.PNext); Assert.Equal((nint) (&indexingFeatures2), (nint) indexingFeatures.PNext); - Assert.Equal((nint) 0, (nint) indexingFeatures2.PNext); + Assert.Equal(0, (nint) indexingFeatures2.PNext); Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, indexingFeatures2.SType); @@ -172,7 +172,7 @@ public unsafe void TestWithoutChain() // However, note that AddNext will still coerce the SType of createInfo. createInfo.AddNext(out PhysicalDeviceFeatures2 features2); Assert.Equal((nint) (&features2), (nint) createInfo.PNext); - Assert.Equal((nint) 0, (nint) features2.PNext); + Assert.Equal(0, (nint) features2.PNext); // Note, even though we didn't use chain, we have still coerced the SType Assert.Equal(StructureType.DeviceCreateInfo, createInfo.SType); diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestCompilation.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestCompilation.cs index 0d4c192599..e8e9163d03 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestCompilation.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestCompilation.cs @@ -64,7 +64,7 @@ private IReadOnlyList CheckCompile(string code) } [Fact] - public unsafe void TestCantAddUnsupportedNext() + public void TestCantAddUnsupportedNext() { var diagnostics = CheckCompile ( @@ -80,7 +80,7 @@ public unsafe void TestCantAddUnsupportedNext() } [Fact] - public unsafe void TestCanAddSupportedNext() + public void TestCanAddSupportedNext() { var diagnostics = CheckCompile ( diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestManagedChains.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestManagedChains.cs index 6f212a3d1b..268447d33f 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestManagedChains.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestManagedChains.cs @@ -21,7 +21,7 @@ public unsafe void TestManagedChain() // Ensure pointers set correctly Assert.Equal((nint) chain.Item1Ptr, (nint) chain.Head.PNext); Assert.Equal((nint) chain.Item2Ptr, (nint) chain.Item1.PNext); - Assert.Equal((nint) 0, (nint) chain.Item2.PNext); + Assert.Equal(0, (nint) chain.Item2.PNext); } [Fact] @@ -38,7 +38,7 @@ public unsafe void TestManagedChainReplaceHead() // Ensure pointers set correctly Assert.Equal((nint) chain.Item1Ptr, (nint) chain.Head.PNext); Assert.Equal((nint) chain.Item2Ptr, (nint) chain.Item1.PNext); - Assert.Equal((nint) 0, (nint) chain.Item2.PNext); + Assert.Equal(0, (nint) chain.Item2.PNext); Assert.Equal(0U, chain.Head.Flags); @@ -81,7 +81,7 @@ public unsafe void TestManagedChainReplaceMiddle() // Ensure pointers set correctly Assert.Equal((nint) chain.Item1Ptr, (nint) chain.Head.PNext); Assert.Equal((nint) chain.Item2Ptr, (nint) chain.Item1.PNext); - Assert.Equal((nint) 0, (nint) chain.Item2.PNext); + Assert.Equal(0, (nint) chain.Item2.PNext); // Check our value was set Assert.True(chain.Item1.ShaderInputAttachmentArrayDynamicIndexing); @@ -101,7 +101,7 @@ public unsafe void TestManagedChainReplaceMiddle() // Note all the pointers are still correct (and have not changed) Assert.Equal((nint) chain.Item1Ptr, (nint) chain.Head.PNext); Assert.Equal((nint) chain.Item2Ptr, (nint) chain.Item1.PNext); - Assert.Equal((nint) 0, (nint) chain.Item2.PNext); + Assert.Equal(0, (nint) chain.Item2.PNext); // As is the SType Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, chain.Item1.SType); @@ -121,7 +121,7 @@ public unsafe void TestManagedChainDuplicate() // Ensure pointers set correctly Assert.Equal((nint) chain.Item1Ptr, (nint) chain.Head.PNext); - Assert.Equal((nint) 0, (nint) chain.Item1.PNext); + Assert.Equal(0, (nint) chain.Item1.PNext); // Check flag set Assert.True(chain.Item1.ShaderInputAttachmentArrayDynamicIndexing); @@ -134,7 +134,7 @@ public unsafe void TestManagedChainDuplicate() // Ensure pointers set correctly Assert.Equal((nint) chain.Item1Ptr, (nint) chain.Head.PNext); - Assert.Equal((nint) 0, (nint) chain.Item1.PNext); + Assert.Equal(0, (nint) chain.Item1.PNext); // Check flag set Assert.True(chain.Item1.ShaderInputAttachmentArrayDynamicIndexing); @@ -158,7 +158,7 @@ public unsafe void TestManagedChainAppend() // Ensure pointers set correctly Assert.Equal((nint) chain.Item1Ptr, (nint) chain.Head.PNext); - Assert.Equal((nint) 0, (nint) chain.Item1.PNext); + Assert.Equal(0, (nint) chain.Item1.PNext); // Check flag set Assert.True(chain.Item1.ShaderInputAttachmentArrayDynamicIndexing); @@ -173,7 +173,7 @@ public unsafe void TestManagedChainAppend() // Ensure pointers set correctly Assert.Equal((nint) newChain.Item1Ptr, (nint) newChain.Head.PNext); Assert.Equal((nint) newChain.Item2Ptr, (nint) newChain.Item1.PNext); - Assert.Equal((nint) 0, (nint) newChain.Item2.PNext); + Assert.Equal(0, (nint) newChain.Item2.PNext); // Check flag still set Assert.True(newChain.Item1.ShaderInputAttachmentArrayDynamicIndexing); @@ -204,7 +204,7 @@ public unsafe void TestManagedChainTruncate() // Ensure pointers set correctly Assert.Equal((nint) chain.Item1Ptr, (nint) chain.Head.PNext); Assert.Equal((nint) chain.Item2Ptr, (nint) chain.Item1.PNext); - Assert.Equal((nint) 0, (nint) chain.Item2.PNext); + Assert.Equal(0, (nint) chain.Item2.PNext); // Check flag set Assert.True(chain.Item2.AccelerationStructure); @@ -219,7 +219,7 @@ public unsafe void TestManagedChainTruncate() // Ensure pointers set correctly Assert.Equal((nint) newChain.Item1Ptr, (nint) newChain.Head.PNext); - Assert.Equal((nint) 0, (nint) newChain.Item1.PNext); + Assert.Equal(0, (nint) newChain.Item1.PNext); // Check removed type flag Assert.True(accelerationStructure.AccelerationStructure); @@ -261,11 +261,11 @@ public unsafe void TestManagedChainLoad() // Ensure pointers set correctly Assert.Equal((nint) managedChain.Item1Ptr, (nint) managedChain.Head.PNext); Assert.Equal((nint) managedChain.Item2Ptr, (nint) managedChain.Item1.PNext); - Assert.Equal((nint) 0, (nint) managedChain.Item2.PNext); + Assert.Equal(0, (nint) managedChain.Item2.PNext); } [Fact] - public unsafe void TestManagedChainLoadWithError() + public void TestManagedChainLoadWithError() { var indexingFeatures = new PhysicalDeviceDescriptorIndexingFeatures { @@ -301,7 +301,7 @@ public unsafe void TestManagedChainLoadWithError() } [Fact] - public unsafe void TestManagedChainLoadWithErrorTooLong() + public void TestManagedChainLoadWithErrorTooLong() { var indexingFeatures = new PhysicalDeviceDescriptorIndexingFeatures { @@ -329,7 +329,7 @@ public unsafe void TestManagedChainLoadWithErrorTooLong() } [Fact] - public unsafe void TestReadOnlyList() + public void TestReadOnlyList() { using var chain = new ManagedChain(); @@ -353,7 +353,7 @@ public unsafe void TestReadOnlyList() } [Fact] - public unsafe void TestDeconstructor() + public void TestDeconstructor() { using var chain = new ManagedChain(); diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PrototypeStructChaining.csproj b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PrototypeStructChaining.csproj index 643b5beaf5..79d8733662 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PrototypeStructChaining.csproj +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PrototypeStructChaining.csproj @@ -27,16 +27,11 @@ - - True - True - ManagedChain.gen.tt - - - True - True - ManagedChain.gen.tt - + + True + True + ManagedChain.gen.tt + From e07f72fa891333a8999b4d35583fd4b6df267428 Mon Sep 17 00:00:00 2001 From: Craig Dean Date: Sun, 7 Nov 2021 23:37:33 +0000 Subject: [PATCH 28/42] feat: Added chain metadata extensions. * Added the `Extensions`, `Extenders`, `ClrTypes` and `StructureTypes` dictionaries to `Chain`. * Added the `ClrType`, `StructureType`, `IsChainStart`, `IsChainable`, `CanExtend` and `CanBeExtendedBy` extension methods to `ChainExtensions`. * Finished Proposal #4 on Chaining Metadata extension. --- ...ining - #4 Chaining Metadata extensions.md | 382 +++++++++++++++++- .../PrototypeStructChaining.Test.csproj | 10 +- .../TestChainMetadata.cs | 58 +++ .../TestChains.cs | 4 +- .../TestManagedChains.cs | 28 +- .../PrototypeStructChaining/Chain.cs | 64 +++ .../ChainExtensions.cs | 129 +++++- ...DeviceAccelerationStructureFeaturesKhr.cs} | 4 +- 8 files changed, 651 insertions(+), 28 deletions(-) create mode 100644 src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChainMetadata.cs rename src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/{PhysicalDeviceAccelerationStructureFeaturesKHR.cs => PhysicalDeviceAccelerationStructureFeaturesKhr.cs} (90%) diff --git a/documentation/proposals/Proposal - Vulkan Struct Chaining - #4 Chaining Metadata extensions.md b/documentation/proposals/Proposal - Vulkan Struct Chaining - #4 Chaining Metadata extensions.md index 6039b01fcd..bd2ed5db6c 100644 --- a/documentation/proposals/Proposal - Vulkan Struct Chaining - #4 Chaining Metadata extensions.md +++ b/documentation/proposals/Proposal - Vulkan Struct Chaining - #4 Chaining Metadata extensions.md @@ -1,17 +1,393 @@ # Summary -TODO + +**_This proposal is dependent +on [Proposal - Vulkan Struct Chaining - #2 Unmanaged Chaining](Proposal%20-%20Vulkan%20Struct%20Chaining%20-%20%232%20Unmanaged%20Chaining.md) +._** + +Having extended `BuildTools` to make use of the `structextends` attribute, as part of +the [unmanaged chaining proposal](Proposal%20-%20Vulkan%20Struct%20Chaining%20-%20%232%20Unmanaged%20Chaining.md) +it is possible to supply that metadata in a ready form for use by consumers of the library, without them needing to +resort to reflection. + +There are a number of potential use cases, most specifically validating that a supply `IChainable` structure is valid +for a given chain, at runtime. To facilitate the most common scenario 4 extension methods are also added. # Contributors + - [Craig Dean, DevDecoder](https://github.com/thargy) # Current Status + - [x] Proposed - [ ] Discussed with API Review Board (ARB) - [ ] Approved - [ ] Implemented # Design Decisions -TODO + +- It is possible to get the same information presented statically by this proposal by creative use of reflection, + however, it is non-trivial and costly to do so. +- When combined with the + [Proposal - Vulkan Struct Chaining - #3 Managed Chaining](Proposal%20-%20Vulkan%20Struct%20Chaining%20-%20%233%20Managed%20Chaining.md) + the above functionality makes handling of non-generic chains at runtime significantly easier, which is great for + library writers. +- Though 4 collections are proposed, they are grouped in pairs, providing two-way mapping. It is possible to only + provide one of each pair, and leave the reversal to the consumer, though that would make the extension methods + impractical. +- As .Net Standard 2.0 does not support `IReadOnlySet` we make use of the `IReadOnlyCollection` interface. # Proposed API -TODO \ No newline at end of file + +## Auto-generated Metadata Structures + +The `Extensions` dictionary is added to the `Chain` structure from +the [unmanaged chaining proposal](Proposal%20-%20Vulkan%20Struct%20Chaining%20-%20%232%20Unmanaged%20Chaining.md) +for discoverability. It is a direct mapping of the `structextends` attribute, and is therefore trivial to generate. +Below is a cut down example to illustrate what will be generated: + +```csharp +public struct Chain : IChainable +{ + ... + /// + /// Provides a set of all the s that can be extended by a . + /// + public static readonly IReadOnlyDictionary> Extensions = + new Dictionary> + { + [StructureType.PhysicalDeviceFeatures2] = new HashSet + { + StructureType.DeviceCreateInfo + }, + [StructureType.PhysicalDeviceDescriptorIndexingFeatures] = new HashSet + { + StructureType.PhysicalDeviceFeatures2, + StructureType.DeviceCreateInfo + }, + [StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr] = new HashSet + { + StructureType.PhysicalDeviceFeatures2, + StructureType.DeviceCreateInfo + }, + ... + }; +} +``` + +## Extenders (Optional) + +By contrast the `Extenders` dictionary, it the reverse mapping of the `Extensions` dictionary, providing quick reverse +lookup. As this is slightly more complex to generate, it could be left to the consumer (who can generate it easily +from `Extensions` when needed). + +```csharp +public struct Chain : IChainable +{ + ... + /// + /// Provides a set of all the s that can extend a . + /// + public static readonly IReadOnlyDictionary> Extenders = + new Dictionary> + { + [StructureType.DeviceCreateInfo] = new HashSet + { + StructureType.PhysicalDeviceFeatures2, StructureType.PhysicalDeviceDescriptorIndexingFeatures, + StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr + }, + [StructureType.PhysicalDeviceFeatures2] = new HashSet + { + StructureType.PhysicalDeviceDescriptorIndexingFeatures, + StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr + }, + ... + }; +} +``` + +### ClrTypes + +The `ClrTypes` dictionary provides a `ClrType` for each `StructureType`, it is trivial to generate with existing +information: + +```csharp +public struct Chain : IChainable +{ + ... + /// + /// Provides a mapping from the to the corresponding . + /// + public static readonly IReadOnlyDictionary ClrTypes = + new Dictionary + { + [StructureType.DeviceCreateInfo] = typeof(DeviceCreateInfo), + [StructureType.PhysicalDeviceFeatures2] = typeof(PhysicalDeviceFeatures2), + [StructureType.PhysicalDeviceDescriptorIndexingFeatures]= typeof(PhysicalDeviceDescriptorIndexingFeatures), + [StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr] = typeof(PhysicalDeviceAccelerationStructureFeaturesKhr), + ... + }; +} +``` + +### StructureTypes (Optional) + +The `StructureTypes` is the reverse mapping of `ClrTypes` and is likewise trivial to generate. + +```csharp +public struct Chain : IChainable +{ + ... + /// + /// Provides a mapping from the to the corresponding . + /// + public static readonly IReadOnlyDictionary StructureTypes = + new Dictionary + { + [typeof(DeviceCreateInfo)] = StructureType.DeviceCreateInfo, + [typeof(PhysicalDeviceFeatures2)] = StructureType.PhysicalDeviceFeatures2, + [typeof(PhysicalDeviceDescriptorIndexingFeatures)]= StructureType.PhysicalDeviceDescriptorIndexingFeatures, + [typeof(PhysicalDeviceAccelerationStructureFeaturesKhr)] = StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr + ... + }; +} +``` + +## Extension Methods + +The following extension methods are not auto-generated and so can be added simply. + +### ClrType() + +Gets the corresponding `ClrType` for a `StructureTYpe`. + +```csharp +public static class ChainExtensions +{ + ... + /// + /// Gets the corresponding for a , if any. + /// + /// The structure type. + /// The corresponding for , if any; otherwise, + /// . + public static Type ClrType(this StructureType structureType) + { + return Chain.ClrTypes[structureType]; + } +} +``` + +Usage: + +```csharp +Assert.Equal(typeof(DeviceCreateInfo), StructureType.DeviceCreateInfo.ClrType()); +``` + +### StructureType() (Optional) + +Gets the corresponding `ClrType` for a `StructureTYpe`. + +```csharp +public static class ChainExtensions +{ + ... + /// + /// Gets the corresponding for a , if any. + /// + /// The CLR type. + /// The corresponding for , if any; otherwise, + /// . + public static StructureType? StructureType(this Type type) + { + return Chain.StructureTypes.TryGetValue(type, out var structureType) ? structureType : null; + } +} +``` + +Usage: + +```csharp +Assert.Equal(StructureType.DeviceCreateInfo, typeof(DeviceCreateInfo).StructureType()); +Assert.Null(typeof(PhysicalDeviceFeatures).StructureType()); +``` + +### IsChainStart() + +Tests whether the `StructureType` or `Type` can be used at the start of a chain: + +```csharp +public static class ChainExtensions +{ + ... + /// + /// Whether the can start a chain. + /// + /// The to test. + /// if the can start a chain; otherwise + /// . + public static bool IsChainStart(this StructureType type) + { + return Chain.Extenders.ContainsKey(type); + } + + /// + /// Whether the can start a chain. + /// + /// The to test. + /// if the can start a chain; otherwise + /// . + public static bool IsChainStart(this Type type) + { + return Chain.StructureTypes.TryGetValue(type, out var structureType) && + Chain.Extenders.ContainsKey(structureType); + } +} +``` + +Usage: + +```csharp +Assert.True(StructureType.DeviceCreateInfo.IsChainStart()); +Assert.True(typeof(DeviceCreateInfo).IsChainStart()); +Assert.False(StructureType.PhysicalDeviceDescriptorIndexingFeatures.IsChainStart()); +Assert.False(typeof(PhysicalDeviceDescriptorIndexingFeatures).IsChainStart()); +``` + +### IsChainable() + +Tests whether the `StructureType` or `Type` can be used in a chain: + +```csharp +public static class ChainExtensions +{ + ... + /// + /// Whether the is chainable. + /// + /// The to test. + /// if the can start a chain; otherwise + /// . + public static bool IsChainable(this StructureType type) + { + return Chain.Extenders.ContainsKey(type) || + Chain.Extensions.ContainsKey(type); + } + + /// + /// Whether the is chainable. + /// + /// The to test. + /// if the can start a chain; otherwise + /// . + public static bool IsChainable(this Type type) + { + return Chain.StructureTypes.TryGetValue(type, out var structureType) && + (Chain.Extenders.ContainsKey(structureType) || Chain.Extensions.ContainsKey(structureType)); + } +} +``` + +Usage: + +```csharp +Assert.True(StructureType.DeviceCreateInfo.IsChainable()); +Assert.True(typeof(DeviceCreateInfo).IsChainable()); +Assert.True(StructureType.PhysicalDeviceDescriptorIndexingFeatures.IsChainable()); +Assert.True(typeof(PhysicalDeviceDescriptorIndexingFeatures).IsChainable()); +``` + +### CanExtend() + +Tests whether the `StructureType` or `Type` can extend the corresponding type: + +```csharp +public static class ChainExtensions +{ + ... + + /// + /// Whether the current can extend the . + /// + /// The to test. + /// The of the chain. + /// if the can extend the ; otherwise, false. + /// + public static bool CanExtend(this StructureType next, StructureType chain) + { + return Chain.Extensions.TryGetValue(next, out var extensions) && extensions.Contains(chain); + } + + /// + /// Whether the current can extend the . + /// + /// The to test. + /// The of the chain. + /// if the can extend the ; otherwise, false. + /// + public static bool CanExtend(this Type next, Type chain) + { + return + Chain.StructureTypes.TryGetValue(next, out var nextType) && + Chain.StructureTypes.TryGetValue(chain, out var chainType) && + Chain.Extensions.TryGetValue(nextType, out var extensions) && + extensions.Contains(chainType); + } +} +``` + +Usage: + +```csharp +Assert.True(StructureType.PhysicalDeviceFeatures2.CanExtend(StructureType.DeviceCreateInfo)); +Assert.False(StructureType.DeviceCreateInfo.CanExtend(StructureType.PhysicalDeviceFeatures2)); +Assert.True(typeof(PhysicalDeviceFeatures2).CanExtend(typeof(DeviceCreateInfo))); +Assert.False(typeof(DeviceCreateInfo).CanExtend(typeof(PhysicalDeviceFeatures2))); +``` + +### CanBeExtendedBy() + +Tests whether the `StructureType` or `Type` can be extended by the corresponding type: + +```csharp +public static class ChainExtensions +{ + ... + + /// + /// Whether the current can be extended by the . + /// + /// The of the chain. + /// The to test. + /// if the can be extended the ; otherwise, false. + /// + public static bool CanBeExtendedBy(this StructureType chain, StructureType next) + { + return Chain.Extenders.TryGetValue(chain, out var extenders) && extenders.Contains(next); + } + + /// + /// Whether the current can be extended by the . + /// + /// The of the chain. + /// The to test. + /// if the can extend the ; otherwise, false. + /// + public static bool CanBeExtendedBy(this Type chain, Type next) + { + return + Chain.StructureTypes.TryGetValue(next, out var nextType) && + Chain.StructureTypes.TryGetValue(chain, out var chainType) && + Chain.Extenders.TryGetValue(chainType, out var extenders) && + extenders.Contains(nextType); + } +} +``` + +Usage: + +```csharp +Assert.False(StructureType.PhysicalDeviceFeatures2.CanBeExtendedBy(StructureType.DeviceCreateInfo)); +Assert.True(StructureType.DeviceCreateInfo.CanBeExtendedBy(StructureType.PhysicalDeviceFeatures2)); +Assert.False(typeof(PhysicalDeviceFeatures2).CanBeExtendedBy(typeof(DeviceCreateInfo))); +Assert.True(typeof(DeviceCreateInfo).CanBeExtendedBy(typeof(PhysicalDeviceFeatures2))); +``` \ No newline at end of file diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/PrototypeStructChaining.Test.csproj b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/PrototypeStructChaining.Test.csproj index 9353923378..c61c1205b8 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/PrototypeStructChaining.Test.csproj +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/PrototypeStructChaining.Test.csproj @@ -10,9 +10,9 @@ - - - + + + runtime; build; native; contentfiles; analyzers; buildtransitive all @@ -24,11 +24,11 @@ - + - + diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChainMetadata.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChainMetadata.cs new file mode 100644 index 0000000000..f823b0bdf5 --- /dev/null +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChainMetadata.cs @@ -0,0 +1,58 @@ +using System; +using System.Linq; +using Silk.Net.Vulkan; +using Xunit; + +namespace PrototypeStructChaining.Test; + +public class TestChainMetadata +{ + [Fact] + public void TestClrType() + { + Assert.Equal(typeof(DeviceCreateInfo), StructureType.DeviceCreateInfo.ClrType()); + } + + [Fact] + public void TestStructureType() + { + Assert.Equal(StructureType.DeviceCreateInfo, typeof(DeviceCreateInfo).StructureType()); + Assert.Null(typeof(PhysicalDeviceFeatures).StructureType()); + } + + [Fact] + public void TestIsChainStart() + { + Assert.True(StructureType.DeviceCreateInfo.IsChainStart()); + Assert.True(typeof(DeviceCreateInfo).IsChainStart()); + Assert.False(StructureType.PhysicalDeviceDescriptorIndexingFeatures.IsChainStart()); + Assert.False(typeof(PhysicalDeviceDescriptorIndexingFeatures).IsChainStart()); + } + + [Fact] + public void TestIsChainable() + { + Assert.True(StructureType.DeviceCreateInfo.IsChainable()); + Assert.True(typeof(DeviceCreateInfo).IsChainable()); + Assert.True(StructureType.PhysicalDeviceDescriptorIndexingFeatures.IsChainable()); + Assert.True(typeof(PhysicalDeviceDescriptorIndexingFeatures).IsChainable()); + } + + [Fact] + public void TestCanExtend() + { + Assert.True(StructureType.PhysicalDeviceFeatures2.CanExtend(StructureType.DeviceCreateInfo)); + Assert.False(StructureType.DeviceCreateInfo.CanExtend(StructureType.PhysicalDeviceFeatures2)); + Assert.True(typeof(PhysicalDeviceFeatures2).CanExtend(typeof(DeviceCreateInfo))); + Assert.False(typeof(DeviceCreateInfo).CanExtend(typeof(PhysicalDeviceFeatures2))); + } + + [Fact] + public void TestCanBeExtendedBy() + { + Assert.False(StructureType.PhysicalDeviceFeatures2.CanBeExtendedBy(StructureType.DeviceCreateInfo)); + Assert.True(StructureType.DeviceCreateInfo.CanBeExtendedBy(StructureType.PhysicalDeviceFeatures2)); + Assert.False(typeof(PhysicalDeviceFeatures2).CanBeExtendedBy(typeof(DeviceCreateInfo))); + Assert.True(typeof(DeviceCreateInfo).CanBeExtendedBy(typeof(PhysicalDeviceFeatures2))); + } +} diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChains.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChains.cs index 2ccadfa81b..d8eab9cffe 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChains.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChains.cs @@ -14,7 +14,7 @@ public unsafe void TestAddNext() // AddNext will create an empty struct, with the correct SType (as well as ensuring the // chain's SType is coerced correctly. .AddNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures) - .AddNext(out PhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeaturesKhr); + .AddNext(out PhysicalDeviceAccelerationStructureFeaturesKhr accelerationStructureFeaturesKhr); // Ensure all pointers set correctly Assert.Equal((nint) (&indexingFeatures), (nint) features2.PNext); @@ -63,7 +63,7 @@ public unsafe void TestSetNext() { ShaderInputAttachmentArrayDynamicIndexing = true }; - var accelerationStructureFeaturesKhr = new PhysicalDeviceAccelerationStructureFeaturesKHR + var accelerationStructureFeaturesKhr = new PhysicalDeviceAccelerationStructureFeaturesKhr { AccelerationStructure = true }; diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestManagedChains.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestManagedChains.cs index 268447d33f..e1504b67d3 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestManagedChains.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestManagedChains.cs @@ -11,7 +11,7 @@ public class TestManagedChains public unsafe void TestManagedChain() { using var chain = new ManagedChain(); + PhysicalDeviceAccelerationStructureFeaturesKhr>(); // Ensure all STypes set correctly Assert.Equal(StructureType.PhysicalDeviceFeatures2, chain.Head.SType); @@ -63,7 +63,7 @@ public unsafe void TestManagedChainReplaceHead() public unsafe void TestManagedChainReplaceMiddle() { using var chain = new ManagedChain + PhysicalDeviceAccelerationStructureFeaturesKhr> ( item1: new PhysicalDeviceDescriptorIndexingFeatures { @@ -163,7 +163,7 @@ public unsafe void TestManagedChainAppend() // Check flag set Assert.True(chain.Item1.ShaderInputAttachmentArrayDynamicIndexing); - using var newChain = chain.Append(); + using var newChain = chain.Append(); // Ensure all STypes set correctly Assert.Equal(StructureType.PhysicalDeviceFeatures2, newChain.Head.SType); @@ -190,9 +190,9 @@ public unsafe void TestManagedChainTruncate() ManagedChain.Create< PhysicalDeviceFeatures2, PhysicalDeviceDescriptorIndexingFeatures, - PhysicalDeviceAccelerationStructureFeaturesKHR> + PhysicalDeviceAccelerationStructureFeaturesKhr> ( - item2: new PhysicalDeviceAccelerationStructureFeaturesKHR + item2: new PhysicalDeviceAccelerationStructureFeaturesKhr {AccelerationStructure = true} ); @@ -240,12 +240,12 @@ public unsafe void TestManagedChainLoad() PhysicalDeviceFeatures2 .Chain(out var unmanagedChain) .SetNext(ref indexingFeatures) - .AddNext(out PhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeaturesKhr); + .AddNext(out PhysicalDeviceAccelerationStructureFeaturesKhr accelerationStructureFeaturesKhr); // Loads a new managed chain from an unmanaged chain using var managedChain = new ManagedChain(out var errors, unmanagedChain); + PhysicalDeviceAccelerationStructureFeaturesKhr>(out var errors, unmanagedChain); // Check we had no loading errors Assert.Equal("", errors); @@ -276,16 +276,16 @@ public void TestManagedChainLoadWithError() .Chain(out var unmanagedChain) .AddNext(out PhysicalDeviceFeatures2 features2) .SetNext(ref indexingFeatures) - .AddNext(out PhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeaturesKhr); + .AddNext(out PhysicalDeviceAccelerationStructureFeaturesKhr accelerationStructureFeaturesKhr); // Loads a new managed chain from an unmanaged chain using var managedChain = ManagedChain.Load< DeviceCreateInfo, // Note we are supplied a PhysicalDeviceFeatures2 here from the unmanaged chain - PhysicalDeviceAccelerationStructureFeaturesKHR, + PhysicalDeviceAccelerationStructureFeaturesKhr, PhysicalDeviceDescriptorIndexingFeatures, - PhysicalDeviceAccelerationStructureFeaturesKHR, + PhysicalDeviceAccelerationStructureFeaturesKhr, // Note that the unmanaged chain did not supply a 5th entry PhysicalDeviceFeatures2>(out var errors, unmanagedChain); @@ -312,7 +312,7 @@ public void TestManagedChainLoadWithErrorTooLong() .Chain(out var unmanagedChain) .AddNext(out PhysicalDeviceFeatures2 features2) .SetNext(ref indexingFeatures) - .AddNext(out PhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeaturesKhr); + .AddNext(out PhysicalDeviceAccelerationStructureFeaturesKhr accelerationStructureFeaturesKhr); // Try loading a shorter managed chain using var managedChain = @@ -332,7 +332,7 @@ public void TestManagedChainLoadWithErrorTooLong() public void TestReadOnlyList() { using var chain = new ManagedChain(); + PhysicalDeviceAccelerationStructureFeaturesKhr>(); Assert.Equal(3, chain.Count); @@ -349,14 +349,14 @@ public void TestReadOnlyList() // Check concrete types Assert.IsType(structures[0]); Assert.IsType(structures[1]); - Assert.IsType(structures[2]); + Assert.IsType(structures[2]); } [Fact] public void TestDeconstructor() { using var chain = new ManagedChain(); + PhysicalDeviceAccelerationStructureFeaturesKhr>(); var (physicalDeviceFeatures2, indexingFeatures, accelerationStructureFeaturesKhr) = chain; diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/Chain.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/Chain.cs index 4764a845bb..b4a101b44b 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/Chain.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/Chain.cs @@ -11,6 +11,70 @@ namespace Silk.Net.Vulkan; /// public struct Chain : IChainable { + /// + /// Provides a set of all the s that can be extended by a . + /// + public static readonly IReadOnlyDictionary> Extensions = + new Dictionary> + { + [StructureType.PhysicalDeviceFeatures2] = new HashSet + { + StructureType.DeviceCreateInfo + }, + [StructureType.PhysicalDeviceDescriptorIndexingFeatures] = new HashSet + { + StructureType.PhysicalDeviceFeatures2, + StructureType.DeviceCreateInfo + }, + [StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr] = new HashSet + { + StructureType.PhysicalDeviceFeatures2, + StructureType.DeviceCreateInfo + } + }; + + /// + /// Provides a set of all the s that can extend a . + /// + public static readonly IReadOnlyDictionary> Extenders = + new Dictionary> + { + [StructureType.DeviceCreateInfo] = new HashSet + { + StructureType.PhysicalDeviceFeatures2, StructureType.PhysicalDeviceDescriptorIndexingFeatures, + StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr + }, + [StructureType.PhysicalDeviceFeatures2] = new HashSet + { + StructureType.PhysicalDeviceDescriptorIndexingFeatures, + StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr + } + }; + + /// + /// Provides a mapping from the to the corresponding . + /// + public static readonly IReadOnlyDictionary ClrTypes = + new Dictionary + { + [StructureType.DeviceCreateInfo] = typeof(DeviceCreateInfo), + [StructureType.PhysicalDeviceFeatures2] = typeof(PhysicalDeviceFeatures2), + [StructureType.PhysicalDeviceDescriptorIndexingFeatures]= typeof(PhysicalDeviceDescriptorIndexingFeatures), + [StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr] = typeof(PhysicalDeviceAccelerationStructureFeaturesKhr) + }; + + /// + /// Provides a mapping from the to the corresponding . + /// + public static readonly IReadOnlyDictionary StructureTypes = + new Dictionary + { + [typeof(DeviceCreateInfo)] = StructureType.DeviceCreateInfo, + [typeof(PhysicalDeviceFeatures2)] = StructureType.PhysicalDeviceFeatures2, + [typeof(PhysicalDeviceDescriptorIndexingFeatures)]= StructureType.PhysicalDeviceDescriptorIndexingFeatures, + [typeof(PhysicalDeviceAccelerationStructureFeaturesKhr)] = StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr + }; + /// /// The structure type. /// diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ChainExtensions.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ChainExtensions.cs index 51c36f6393..e4553fa546 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ChainExtensions.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ChainExtensions.cs @@ -22,7 +22,7 @@ public static class ChainExtensions /// { /// ShaderInputAttachmentArrayDynamicIndexing = true /// }; - /// var accelerationStructureFeaturesKhr = new PhysicalDeviceAccelerationStructureFeaturesKHR + /// var accelerationStructureFeaturesKhr = new PhysicalDeviceAccelerationStructureFeaturesKhr /// { /// AccelerationStructure = true /// }; @@ -92,7 +92,7 @@ public static unsafe ref TChain SetNext /// PhysicalDeviceFeatures2 /// .Chain(out var features2) /// .AddNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures) - /// .AddNext(out PhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeaturesKhr); + /// .AddNext(out PhysicalDeviceAccelerationStructureFeaturesKhr accelerationStructureFeaturesKhr); /// /// Note, the value is always added, even if an equivalent value is added in the chain already. Use /// to only add if not already present. @@ -203,4 +203,129 @@ public static unsafe int IndexOf(this ref TChain chain, ref TNext return -1; } + + /// + /// Gets the corresponding for a , if any. + /// + /// The structure type. + /// The corresponding for , if any; otherwise, + /// . + public static Type ClrType(this StructureType structureType) + { + return Chain.ClrTypes[structureType]; + } + + /// + /// Gets the corresponding for a , if any. + /// + /// The CLR type. + /// The corresponding for , if any; otherwise, + /// . + public static StructureType? StructureType(this Type type) + { + return Chain.StructureTypes.TryGetValue(type, out var structureType) ? structureType : null; + } + + /// + /// Whether the can start a chain. + /// + /// The to test. + /// if the can start a chain; otherwise + /// . + public static bool IsChainStart(this StructureType type) + { + return Chain.Extenders.ContainsKey(type); + } + + /// + /// Whether the can start a chain. + /// + /// The to test. + /// if the can start a chain; otherwise + /// . + public static bool IsChainStart(this Type type) + { + return Chain.StructureTypes.TryGetValue(type, out var structureType) && + Chain.Extenders.ContainsKey(structureType); + } + + /// + /// Whether the is chainable. + /// + /// The to test. + /// if the can start a chain; otherwise + /// . + public static bool IsChainable(this StructureType type) + { + return Chain.Extenders.ContainsKey(type) || + Chain.Extensions.ContainsKey(type); + } + + /// + /// Whether the is chainable. + /// + /// The to test. + /// if the can start a chain; otherwise + /// . + public static bool IsChainable(this Type type) + { + return Chain.StructureTypes.TryGetValue(type, out var structureType) && + (Chain.Extenders.ContainsKey(structureType) || Chain.Extensions.ContainsKey(structureType)); + } + + /// + /// Whether the current can extend the . + /// + /// The to test. + /// The of the chain. + /// if the can extend the ; otherwise, false. + /// + public static bool CanExtend(this StructureType next, StructureType chain) + { + return Chain.Extensions.TryGetValue(next, out var extensions) && extensions.Contains(chain); + } + + /// + /// Whether the current can extend the . + /// + /// The to test. + /// The of the chain. + /// if the can extend the ; otherwise, false. + /// + public static bool CanExtend(this Type next, Type chain) + { + return + Chain.StructureTypes.TryGetValue(next, out var nextType) && + Chain.StructureTypes.TryGetValue(chain, out var chainType) && + Chain.Extensions.TryGetValue(nextType, out var extensions) && + extensions.Contains(chainType); + } + + /// + /// Whether the current can be extended by the . + /// + /// The of the chain. + /// The to test. + /// if the can be extended the ; otherwise, false. + /// + public static bool CanBeExtendedBy(this StructureType chain, StructureType next) + { + return Chain.Extenders.TryGetValue(chain, out var extenders) && extenders.Contains(next); + } + + /// + /// Whether the current can be extended by the . + /// + /// The of the chain. + /// The to test. + /// if the can extend the ; otherwise, false. + /// + public static bool CanBeExtendedBy(this Type chain, Type next) + { + return + Chain.StructureTypes.TryGetValue(next, out var nextType) && + Chain.StructureTypes.TryGetValue(chain, out var chainType) && + Chain.Extenders.TryGetValue(chainType, out var extenders) && + extenders.Contains(nextType); + } } diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceAccelerationStructureFeaturesKHR.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceAccelerationStructureFeaturesKhr.cs similarity index 90% rename from src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceAccelerationStructureFeaturesKHR.cs rename to src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceAccelerationStructureFeaturesKhr.cs index bd7fdeb97e..30cec6947a 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceAccelerationStructureFeaturesKHR.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceAccelerationStructureFeaturesKhr.cs @@ -1,6 +1,6 @@ namespace Silk.Net.Vulkan; -public struct PhysicalDeviceAccelerationStructureFeaturesKHR : +public struct PhysicalDeviceAccelerationStructureFeaturesKhr : IExtendsChain, IExtendsChain { @@ -15,7 +15,7 @@ public struct PhysicalDeviceAccelerationStructureFeaturesKHR : // NOTE Truncated for example - public unsafe PhysicalDeviceAccelerationStructureFeaturesKHR( + public unsafe PhysicalDeviceAccelerationStructureFeaturesKhr( StructureType? sType = StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr, void* pNext = null, bool? accelerationStructure = null) From 374d85eee8bb198e9f6065e92d838f6116f6e794 Mon Sep 17 00:00:00 2001 From: Craig Dean Date: Tue, 9 Nov 2021 09:49:05 +0000 Subject: [PATCH 29/42] docs: Added suggestion for specific chain interfaces --- ...Struct Chaining - #2 Unmanaged Chaining.md | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/documentation/proposals/Proposal - Vulkan Struct Chaining - #2 Unmanaged Chaining.md b/documentation/proposals/Proposal - Vulkan Struct Chaining - #2 Unmanaged Chaining.md index 513cd4487d..d00ec4764a 100644 --- a/documentation/proposals/Proposal - Vulkan Struct Chaining - #2 Unmanaged Chaining.md +++ b/documentation/proposals/Proposal - Vulkan Struct Chaining - #2 Unmanaged Chaining.md @@ -120,8 +120,12 @@ presence of the `ManagedChain` classes from [the proposal for managed chains](Proposal%20-%20Vulkan%20Struct%20Chaining%20-%20%233%20Managed%20Chaining.md), along with a well documented API should highlight the danger of such practices. -Indeed, it is important to remember that such dangers are already part of the existing implementation and are a feature of -using unmanaged pointers in .NET rather than a limitation of this proposal. +Indeed, it is important to remember that such dangers are already part of the existing implementation and are a feature +of using unmanaged pointers in .NET rather than a limitation of this proposal. + +To be discussed: + +- Whether to include [specific chain interfaces](#chain-interfaces-optional). # Usage @@ -494,3 +498,23 @@ public static unsafe ref [StrucType] Chain( return ref capture; } ``` + +### Chain interfaces (Optional) + +As a useful optional extra, whenever an `IChainStart` struct is found, a corresponding `I[StructName]Chain` is created, +that extends from `IChainable`, e.g.: + +```csharp +namespace Silk.Net.Vulkan; + +/// +/// Marks a chainable struct as being part of the `DeviceCreateInfo` chain. +/// +public interface IDeviceCreateInfoChain : IChainable +{ +} +``` + +This interface is then added to the corresponding `IChainStart` _and_ any struct that implements the +corresponding `IExtendsChain`. The primary benefit of this approach is to make it significantly easier to write +code that accepts any part of a specific chain (including the head). \ No newline at end of file From 866f2dcdcc7817995e9fb633213e7630d510ee35 Mon Sep 17 00:00:00 2001 From: Craig Dean Date: Tue, 9 Nov 2021 11:54:16 +0000 Subject: [PATCH 30/42] docs: Updated to use `BaseInStructure` * `Chain` was replaced by `BaseInStructure`, which is supplied by the Vulkan Specification already. * `ChainExtensions` was renamed to `Chain`. --- ... Chaining - #1 StructureType correction.md | 10 +- ...Struct Chaining - #2 Unmanaged Chaining.md | 20 +- ...ining - #4 Chaining Metadata extensions.md | 16 +- .../TestChains.cs | 6 +- .../TestCompilation.cs | 2 +- .../BaseInStructure.cs | 37 + .../PrototypeStructChaining/Chain.cs | 389 +++- .../ChainExtensions.cs | 331 --- .../DeviceCreateInfo.cs | 4 +- .../PrototypeStructChaining/IChainStart.cs | 2 +- .../PrototypeStructChaining/IChainable.cs | 4 +- .../ManagedChain.gen.cs | 1896 ++++++++--------- .../ManagedChain.gen.tt | 36 +- ...lDeviceAccelerationStructureFeaturesKhr.cs | 4 +- ...hysicalDeviceDescriptorIndexingFeatures.cs | 4 +- .../PhysicalDeviceFeatures2.cs | 4 +- 16 files changed, 1384 insertions(+), 1381 deletions(-) create mode 100644 src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/BaseInStructure.cs delete mode 100644 src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ChainExtensions.cs diff --git a/documentation/proposals/Proposal - Vulkan Struct Chaining - #1 StructureType correction.md b/documentation/proposals/Proposal - Vulkan Struct Chaining - #1 StructureType correction.md index a1532210f5..0af0ccad20 100644 --- a/documentation/proposals/Proposal - Vulkan Struct Chaining - #1 StructureType correction.md +++ b/documentation/proposals/Proposal - Vulkan Struct Chaining - #1 StructureType correction.md @@ -24,10 +24,6 @@ correctly set when passing to Vulkan, and to provide a mechanism for doing so. - The `IStructuredType` interface will usually not be implemented directly, instead `IChainable` (from the [unmanaged chaining proposal](Proposal%20-%20Vulkan%20Struct%20Chaining%20-%20%232%20Unmanaged%20Chaining.md)) will extend this interface. -- The BuildTools should instead only add this interface to any structure that meets the above constraint (the structure - has a `StructureType SType` field) that _doesn't_ already add the `IChainable` interface. Though I believe this - scenario won't occur in the current Vulkan specification, we'd need to check all valid StructureType structures to - confirm, and regardless, writing the code to add the interface in such scenarios will future proof it. - Whenever the `IStructuredType` is added to an interface (either directly or indirectly) the corresponding `StructureType()` method should also be explicitly implemented ([see below](#istructuretype-implementation)). @@ -40,6 +36,8 @@ correctly set when passing to Vulkan, and to provide a mechanism for doing so. - To be clear, this proposal does not need to guarantee that the `SType` field is in position 0 (i.e. first), that requirement is only necessary to implement the functionality [proposed by the unmanaged chaining system](Proposal%20-%20Vulkan%20Struct%20Chaining%20-%20%232%20Unmanaged%20Chaining.md) +- Not all structures exposed by Vulkan have a default value for the `SType`, (e.g. `BaseOutStructure` and `BaseInStructure`), + where no default is available, the `StructureType()` method only returns the current value, rather than setting it. # Implementation Notes @@ -72,7 +70,7 @@ public interface IStructuredType /// Gets the structured type's enum value. /// /// - /// Retrieving the also ensures it is set to the correct value. + /// Retrieving the also ensures it is set to the correct value (if any). /// StructureType StructureType(); } @@ -81,7 +79,7 @@ public interface IStructuredType ### IStructureType implementation Each struct generated that implements `IStructuredType` should also have the following code auto-generated, to -explicitly implement the interface. The method sets and returns the `SType` correctly for the current structure. +explicitly implement the interface. The method sets and returns the `SType` correctly (if any) for the current structure. ```csharp /// diff --git a/documentation/proposals/Proposal - Vulkan Struct Chaining - #2 Unmanaged Chaining.md b/documentation/proposals/Proposal - Vulkan Struct Chaining - #2 Unmanaged Chaining.md index d00ec4764a..8b179e185c 100644 --- a/documentation/proposals/Proposal - Vulkan Struct Chaining - #2 Unmanaged Chaining.md +++ b/documentation/proposals/Proposal - Vulkan Struct Chaining - #2 Unmanaged Chaining.md @@ -19,11 +19,11 @@ from [Proposal - Vulkan Struct Chaining - #1 StructureType correction](Proposal% and so the explicit implementation of `IChainable.StructureType()` from [that proposal](Proposal%20-%20Vulkan%20Struct%20Chaining%20-%20%231%20StructureType%20correction.md#istructuretype-implementation) is triggerred for the structure, providing a mechanism for ensuring the `SType` is correctly set. It then exposes -a `Chain* PNext { get; set; }` property for easy access to the next item in the chain. +a `BaseInStructure* PNext { get; set; }` property for easy access to the next item in the chain. The presence of the `IChainable` interface, also acts as a **guarantee** that it is safe to cast any pointer of a struct -implementing it to a pointer to a `Chain` struct, which is a struct which has just the `SType` and `PNext` fields -present. Therefore it is always possible to cast `void* PNext` of an `IChainable` struct to `Chain*`. It is this +implementing it to a pointer to a `BaseInStructure` struct, which is a struct which has just the `SType` and `PNext` fields +present. Therefore it is always possible to cast `void* PNext` of an `IChainable` struct to `BaseInStructure*`. It is this guarantee that requires the position of the fields to be fixed (which they are in practice). However, by ensuring we validate the constraints at build time (when choosing to add the interface), we can prevent downstream bugs occurring at run time. @@ -57,7 +57,7 @@ generated (the static `Chain(out)` method and the explicit `IStructuredType.Stru implementation); as compared to all other `IChainable` structs, which will only have the explicit `IStructuredType.StructureType()` implementation from [Proposal - Vulkan Struct Chaining - #1 StructureType correction](Proposal%20-%20Vulkan%20Struct%20Chaining%20-%20%231%20StructureType%20correction.md) -and the explicit `Chain* IChainable.PNext { get; set;}` property from this proposal. +and the explicit `BaseInStructure* IChainable.PNext { get; set;}` property from this proposal. The remaining functionality is provided entirely by the following new extension methods: @@ -146,7 +146,7 @@ createinfo.AddNext... ``` -in many cases, we only want to create a default structure for population by the API. To do so, we use the -static `Chain` method like so: +static `BaseInStructure` method like so: ```csharp PhysicalDeviceFeatures2.Chain(out var features2) @@ -158,7 +158,7 @@ This has several advantages: - The structure's `SType` will be correctly set immediately. - The syntax is fluent, and creates more readable code when used with the other chaining methods (see below). -**Note** All the chaining methods return the current start of the chain by reference (including `Chain`). This allows +**Note** All the chaining methods return the current start of the chain by reference (including `BaseInStructure`). This allows each method to scan the entire chain. More importantly, it allows the Type constraints to be checked during compile time to ensure that a type actually extends the chain. One side effect is that `ref Chain(out)` outputs the newly created chain _and_ returns a reference to it. This can cause confusion to less experienced C# devs, for example: @@ -344,7 +344,7 @@ found [in the labs](../../src/Lab/Experiments/PrototypeStructChaining/PrototypeS ```csharp namespace Silk.Net.Vulkan; -public static class ChainExtensions +public static class Chain { /// /// Replaces a structure in the chain (if present, and is false), or adds it to the end. @@ -442,7 +442,7 @@ public static class ChainExtensions ### Chain Structure -The `Chain` struct makes it easy to access the `SType` and `PNext` of a structure pointed to by `void* PNext`, although +The `BaseInStructure` struct makes it easy to access the `SType` and `PNext` of a structure pointed to by `void* PNext`, although it is used internally, it is useful for consumers of Silk.Net to have access to use in their own scenarios, that is because the `IChainable` interface does not directly expose the underlying `SType` and `PNext` fields; as they are fields (not properties), and this proposal aims to avoid boxing (so we try not to use the interface directly @@ -456,7 +456,7 @@ namespace Silk.Net.Vulkan; /// /// /// Any pointer to a structure marked as can safely be cast to a pointer to this type. -/// In particular, this means that the void* PNext field can always be safely cast to Chain*, providing +/// In particular, this means that the void* PNext field can always be safely cast to BaseInStructure*, providing /// access to the `SType` and `PNext` fields. /// /// @@ -469,7 +469,7 @@ public struct Chain : IChainable /// /// The next struct in the chain, if any; otherwise . /// - public unsafe Chain* PNext; + public unsafe BaseInStructure* PNext; /// /// Note, this cannot coerce the type as 'guaranteed by the `IStructuredType` interface. diff --git a/documentation/proposals/Proposal - Vulkan Struct Chaining - #4 Chaining Metadata extensions.md b/documentation/proposals/Proposal - Vulkan Struct Chaining - #4 Chaining Metadata extensions.md index bd2ed5db6c..5a1153fcfb 100644 --- a/documentation/proposals/Proposal - Vulkan Struct Chaining - #4 Chaining Metadata extensions.md +++ b/documentation/proposals/Proposal - Vulkan Struct Chaining - #4 Chaining Metadata extensions.md @@ -40,13 +40,13 @@ for a given chain, at runtime. To facilitate the most common scenario 4 extensio ## Auto-generated Metadata Structures -The `Extensions` dictionary is added to the `Chain` structure from +The `Extensions` dictionary is added to the `Chain` extensions class from the [unmanaged chaining proposal](Proposal%20-%20Vulkan%20Struct%20Chaining%20-%20%232%20Unmanaged%20Chaining.md) for discoverability. It is a direct mapping of the `structextends` attribute, and is therefore trivial to generate. Below is a cut down example to illustrate what will be generated: ```csharp -public struct Chain : IChainable +public static class Chain : IChainable { ... /// @@ -161,7 +161,7 @@ The following extension methods are not auto-generated and so can be added simpl Gets the corresponding `ClrType` for a `StructureTYpe`. ```csharp -public static class ChainExtensions +public static class Chain { ... /// @@ -188,7 +188,7 @@ Assert.Equal(typeof(DeviceCreateInfo), StructureType.DeviceCreateInfo.ClrType()) Gets the corresponding `ClrType` for a `StructureTYpe`. ```csharp -public static class ChainExtensions +public static class Chain { ... /// @@ -216,7 +216,7 @@ Assert.Null(typeof(PhysicalDeviceFeatures).StructureType()); Tests whether the `StructureType` or `Type` can be used at the start of a chain: ```csharp -public static class ChainExtensions +public static class Chain { ... /// @@ -258,7 +258,7 @@ Assert.False(typeof(PhysicalDeviceDescriptorIndexingFeatures).IsChainStart()); Tests whether the `StructureType` or `Type` can be used in a chain: ```csharp -public static class ChainExtensions +public static class Chain { ... /// @@ -301,7 +301,7 @@ Assert.True(typeof(PhysicalDeviceDescriptorIndexingFeatures).IsChainable()); Tests whether the `StructureType` or `Type` can extend the corresponding type: ```csharp -public static class ChainExtensions +public static class Chain { ... @@ -349,7 +349,7 @@ Assert.False(typeof(DeviceCreateInfo).CanExtend(typeof(PhysicalDeviceFeatures2)) Tests whether the `StructureType` or `Type` can be extended by the corresponding type: ```csharp -public static class ChainExtensions +public static class Chain { ... diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChains.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChains.cs index d8eab9cffe..45c1e5b66d 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChains.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChains.cs @@ -9,7 +9,7 @@ public class TestChains public unsafe void TestAddNext() { PhysicalDeviceFeatures2 - // The Chain method, is a convenient static, to provide a consistent syntax. + // The BaseInStructure method, is a convenient static, to provide a consistent syntax. .Chain(out var features2) // AddNext will create an empty struct, with the correct SType (as well as ensuring the // chain's SType is coerced correctly. @@ -39,7 +39,7 @@ public unsafe void TestAddNext() public unsafe void TestTryAddNext() { PhysicalDeviceFeatures2 - // The Chain method, is a convenient static, to provide a consistent syntax. + // The BaseInStructure method, is a convenient static, to provide a consistent syntax. .Chain(out var features2) // AddNext will create an empty struct, with the correct SType (as well as ensuring the // chain's SType is coerced correctly. @@ -164,7 +164,7 @@ public unsafe void TestSetNextAlwaysAdd() [Fact] public unsafe void TestWithoutChain() { - // We don't have to use the Chain() pattern, as we can start with an existing struct + // We don't have to use the BaseInStructure() pattern, as we can start with an existing struct var createInfo = new DeviceCreateInfo { Flags = 1U diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestCompilation.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestCompilation.cs index e8e9163d03..abf2e22595 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestCompilation.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestCompilation.cs @@ -75,7 +75,7 @@ public void TestCantAddUnsupportedNext() Assert.Single(diagnostics); var error = diagnostics.First(); - // error CS0315: The type 'Silk.Net.Vulkan.PhysicalDeviceFeatures2' cannot be used as type parameter 'TChain' in the generic type or method 'ChainExtensions.AddNext(ref TChain, out TNext)'. There is no boxing conversion from 'Silk.Net.Vulkan.PhysicalDeviceFeatures2' to 'Silk.Net.Vulkan.IChainable'. + // error CS0315: The type 'Silk.Net.Vulkan.PhysicalDeviceFeatures2' cannot be used as type parameter 'TChain' in the generic type or method 'Chain.AddNext(ref TChain, out TNext)'. There is no boxing conversion from 'Silk.Net.Vulkan.PhysicalDeviceFeatures2' to 'Silk.Net.Vulkan.IChainable'. Assert.Equal("CS0315", error.Id); } diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/BaseInStructure.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/BaseInStructure.cs new file mode 100644 index 0000000000..dee01f2685 --- /dev/null +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/BaseInStructure.cs @@ -0,0 +1,37 @@ +namespace Silk.Net.Vulkan; + +/// +/// Header struct of all structs. +/// +/// +/// Any pointer to a structure marked as can safely be cast to a pointer to this type. +/// In particular, this means that the void* PNext field can always be safely cast to BaseInStructure*, providing +/// access to the `SType` and `PNext` fields. +/// +/// +public struct BaseInStructure : IChainable +{ + /// + /// The structure type. + /// + public StructureType SType; + + /// + /// The next struct in the chain, if any; otherwise . + /// + public unsafe void* PNext; + + /// + /// Note, this cannot coerce the type as 'guaranteed by the `IStructuredType` interface. + StructureType IStructuredType.StructureType() + { + return SType; + } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } +} diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/Chain.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/Chain.cs index b4a101b44b..75106005dc 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/Chain.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/Chain.cs @@ -1,53 +1,214 @@ +using System.Runtime.CompilerServices; + namespace Silk.Net.Vulkan; -/// -/// Header struct of all structs. -/// -/// -/// Any pointer to a structure marked as can safely be cast to a pointer to this type. -/// In particular, this means that the void* PNext field can always be safely cast to Chain*, providing -/// access to the `SType` and `PNext` fields. -/// -/// -public struct Chain : IChainable +public static class Chain { + /// + /// Replaces a structure in the chain (if present, and is false), or adds it to the end. + /// + /// The current chain + /// A reference to the structure to update + /// Always adds to the end of the chain, even if an equivalent structure is present. + /// The type of the current chain + /// The type of the value + /// A reference to the value value in the chain + /// + /// Note that both the supplied chain, and the supplied value will have their `SType` correctly set. Further, + /// the supplied structure's will be overwritten. + /// To use + /// + /// var indexingFeatures = new PhysicalDeviceDescriptorIndexingFeatures + /// { + /// ShaderInputAttachmentArrayDynamicIndexing = true + /// }; + /// var accelerationStructureFeaturesKhr = new PhysicalDeviceAccelerationStructureFeaturesKhr + /// { + /// AccelerationStructure = true + /// }; + /// + /// PhysicalDeviceFeatures2 + /// .BaseInStructure(out var features2) + /// .SetNext(ref indexingFeatures) + /// .SetNext(ref accelerationStructureFeaturesKhr); + /// + /// + public static unsafe ref TChain SetNext + ( + this ref TChain chain, + ref TNext value, + bool alwaysAdd = false + ) + where TChain : struct, IChainStart + where TNext : struct, IExtendsChain + { + // Ensure structure type of chain and value are set. + chain.StructureType(); + var structureType = value.StructureType(); + + // Find end of chain + var previousPtr = (BaseInStructure*) null; + var currentPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); + var valuePtr = (BaseInStructure*) Unsafe.AsPointer(ref value); + do + { + var nextPtr = currentPtr->PNext; + if (!alwaysAdd && currentPtr->SType == structureType) + { + // We have an existing structure, replace it. + if (previousPtr is not null) + { + previousPtr->PNext = valuePtr; + } + + valuePtr->PNext = nextPtr; + + return ref chain; + } + + previousPtr = currentPtr; + currentPtr = (BaseInStructure*) nextPtr; + } while (currentPtr is not null); + + // Add value to end of chain + previousPtr->PNext = valuePtr; + valuePtr->PNext = null; + + return ref chain; + } + + /// + /// Adds a structure to the end of the chain. + /// + /// The current chain + /// The structure added to the end of the chain + /// The type of the current chain + /// The type of the structure to add + /// The reference to the chain. + /// + /// Note that both the supplied chain, and the added structure will have their `SType` correctly set + /// To use specify the output type required, e.g.: + /// + /// PhysicalDeviceFeatures2 + /// .BaseInStructure(out var features2) + /// .AddNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures) + /// .AddNext(out PhysicalDeviceAccelerationStructureFeaturesKhr accelerationStructureFeaturesKhr); + /// + /// Note, the value is always added, even if an equivalent value is added in the chain already. Use + /// to only add if not already present. + /// + public static unsafe ref TChain AddNext(this ref TChain chain, out TNext next) + where TChain : struct, IChainStart + where TNext : struct, IExtendsChain + { + // Ensure structure type of chain is set. + chain.StructureType(); + + // Find end of chain + var currentPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); + while (currentPtr->PNext is not null) + { + currentPtr = (BaseInStructure*) currentPtr->PNext; + } + + // Create new entry and set it's structure type + next = default; + next.StructureType(); + currentPtr->PNext = (BaseInStructure*) Unsafe.AsPointer(ref next); + return ref chain; + } + + /// + /// Tries to add a structure to the end of the chain. + /// + /// The current chain + /// The structure added to the end of the chain + /// Whether the structure was actually added + /// The type of the current chain + /// The type of the structure to add + /// The reference to the chain. + /// + /// Note that both the supplied chain, and the added structure will have their `SType` correctly set + /// To use specify the output type required, e.g.: + /// + /// PhysicalDeviceFeatures2 + /// .BaseInStructure(out var features2) + /// .TryAddNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures, out var added); + /// + /// + public static unsafe ref TChain TryAddNext(this ref TChain chain, out TNext next, out bool added) + where TChain : struct, IChainStart + where TNext : struct, IExtendsChain + { + // Ensure structure type of chain is set. + chain.StructureType(); + + // Create new entry and get it's structure type + next = default; + var structureType = next.StructureType(); + + // Follow chain + var currentPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); + do + { + if (currentPtr->SType == structureType) + { + added = false; + return ref chain; + } + + var nextPtr = currentPtr->PNext; + if (nextPtr is null) + { + break; + } + + currentPtr = (BaseInStructure*) nextPtr; + } while (true); + + currentPtr->PNext = (BaseInStructure*) Unsafe.AsPointer(ref next); + added = true; + return ref chain; + } + /// /// Provides a set of all the s that can be extended by a . /// public static readonly IReadOnlyDictionary> Extensions = new Dictionary> { - [StructureType.PhysicalDeviceFeatures2] = new HashSet + [Vulkan.StructureType.PhysicalDeviceFeatures2] = new HashSet { - StructureType.DeviceCreateInfo + Vulkan.StructureType.DeviceCreateInfo }, - [StructureType.PhysicalDeviceDescriptorIndexingFeatures] = new HashSet + [Vulkan.StructureType.PhysicalDeviceDescriptorIndexingFeatures] = new HashSet { - StructureType.PhysicalDeviceFeatures2, - StructureType.DeviceCreateInfo + Vulkan.StructureType.PhysicalDeviceFeatures2, + Vulkan.StructureType.DeviceCreateInfo }, - [StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr] = new HashSet + [Vulkan.StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr] = new HashSet { - StructureType.PhysicalDeviceFeatures2, - StructureType.DeviceCreateInfo + Vulkan.StructureType.PhysicalDeviceFeatures2, + Vulkan.StructureType.DeviceCreateInfo } }; - + /// /// Provides a set of all the s that can extend a . /// public static readonly IReadOnlyDictionary> Extenders = new Dictionary> { - [StructureType.DeviceCreateInfo] = new HashSet + [Vulkan.StructureType.DeviceCreateInfo] = new HashSet { - StructureType.PhysicalDeviceFeatures2, StructureType.PhysicalDeviceDescriptorIndexingFeatures, - StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr + Vulkan.StructureType.PhysicalDeviceFeatures2, + Vulkan.StructureType.PhysicalDeviceDescriptorIndexingFeatures, + Vulkan.StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr }, - [StructureType.PhysicalDeviceFeatures2] = new HashSet + [Vulkan.StructureType.PhysicalDeviceFeatures2] = new HashSet { - StructureType.PhysicalDeviceDescriptorIndexingFeatures, - StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr + Vulkan.StructureType.PhysicalDeviceDescriptorIndexingFeatures, + Vulkan.StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr } }; @@ -57,10 +218,12 @@ public struct Chain : IChainable public static readonly IReadOnlyDictionary ClrTypes = new Dictionary { - [StructureType.DeviceCreateInfo] = typeof(DeviceCreateInfo), - [StructureType.PhysicalDeviceFeatures2] = typeof(PhysicalDeviceFeatures2), - [StructureType.PhysicalDeviceDescriptorIndexingFeatures]= typeof(PhysicalDeviceDescriptorIndexingFeatures), - [StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr] = typeof(PhysicalDeviceAccelerationStructureFeaturesKhr) + [Vulkan.StructureType.DeviceCreateInfo] = typeof(DeviceCreateInfo), + [Vulkan.StructureType.PhysicalDeviceFeatures2] = typeof(PhysicalDeviceFeatures2), + [Vulkan.StructureType.PhysicalDeviceDescriptorIndexingFeatures] = + typeof(PhysicalDeviceDescriptorIndexingFeatures), + [Vulkan.StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr] = + typeof(PhysicalDeviceAccelerationStructureFeaturesKhr) }; /// @@ -69,33 +232,169 @@ public struct Chain : IChainable public static readonly IReadOnlyDictionary StructureTypes = new Dictionary { - [typeof(DeviceCreateInfo)] = StructureType.DeviceCreateInfo, - [typeof(PhysicalDeviceFeatures2)] = StructureType.PhysicalDeviceFeatures2, - [typeof(PhysicalDeviceDescriptorIndexingFeatures)]= StructureType.PhysicalDeviceDescriptorIndexingFeatures, - [typeof(PhysicalDeviceAccelerationStructureFeaturesKhr)] = StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr + [typeof(DeviceCreateInfo)] = Vulkan.StructureType.DeviceCreateInfo, + [typeof(PhysicalDeviceFeatures2)] = Vulkan.StructureType.PhysicalDeviceFeatures2, + [typeof(PhysicalDeviceDescriptorIndexingFeatures)] = + Vulkan.StructureType.PhysicalDeviceDescriptorIndexingFeatures, + [typeof(PhysicalDeviceAccelerationStructureFeaturesKhr)] = + Vulkan.StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr }; /// - /// The structure type. + /// Returns the index of the in the , if present. + /// + /// The chain + /// The structure value + /// The type of the current chain + /// The type of the value + /// The zero-indexed index if found; otherwise -1. + public static unsafe int IndexOf(this ref TChain chain, ref TNext value) + where TChain : struct, IChainStart + where TNext : struct, IExtendsChain + { + // Ensure structure type of chain is set. + chain.StructureType(); + + var index = 0; + var currentPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); + var valuePtr = (BaseInStructure*) Unsafe.AsPointer(ref value); + // Follow chain + do + { + if (currentPtr == valuePtr) + { + return index; + } + + currentPtr = (BaseInStructure*) currentPtr->PNext; + index++; + } while (currentPtr is not null); + + return -1; + } + + /// + /// Gets the corresponding for a , if any. + /// + /// The structure type. + /// The corresponding for , if any; otherwise, + /// . + public static Type ClrType(this StructureType structureType) + { + return ClrTypes[structureType]; + } + + /// + /// Gets the corresponding for a , if any. + /// + /// The CLR type. + /// The corresponding for , if any; otherwise, + /// . + public static StructureType? StructureType(this Type type) + { + return StructureTypes.TryGetValue(type, out var structureType) ? structureType : null; + } + + /// + /// Whether the can start a chain. + /// + /// The to test. + /// if the can start a chain; otherwise + /// . + public static bool IsChainStart(this StructureType type) + { + return Extenders.ContainsKey(type); + } + + /// + /// Whether the can start a chain. + /// + /// The to test. + /// if the can start a chain; otherwise + /// . + public static bool IsChainStart(this Type type) + { + return StructureTypes.TryGetValue(type, out var structureType) && + Extenders.ContainsKey(structureType); + } + + /// + /// Whether the is chainable. + /// + /// The to test. + /// if the can start a chain; otherwise + /// . + public static bool IsChainable(this StructureType type) + { + return Extenders.ContainsKey(type) || + Extensions.ContainsKey(type); + } + + /// + /// Whether the is chainable. + /// + /// The to test. + /// if the can start a chain; otherwise + /// . + public static bool IsChainable(this Type type) + { + return StructureTypes.TryGetValue(type, out var structureType) && + (Extenders.ContainsKey(structureType) || Extensions.ContainsKey(structureType)); + } + + /// + /// Whether the current can extend the . /// - public StructureType SType; + /// The to test. + /// The of the chain. + /// if the can extend the ; otherwise, false. + /// + public static bool CanExtend(this StructureType next, StructureType chain) + { + return Extensions.TryGetValue(next, out var extensions) && extensions.Contains(chain); + } /// - /// The next struct in the chain, if any; otherwise . + /// Whether the current can extend the . /// - public unsafe Chain* PNext; + /// The to test. + /// The of the chain. + /// if the can extend the ; otherwise, false. + /// + public static bool CanExtend(this Type next, Type chain) + { + return + StructureTypes.TryGetValue(next, out var nextType) && + StructureTypes.TryGetValue(chain, out var chainType) && + Extensions.TryGetValue(nextType, out var extensions) && + extensions.Contains(chainType); + } - /// - /// Note, this cannot coerce the type as 'guaranteed by the `IStructuredType` interface. - StructureType IStructuredType.StructureType() + /// + /// Whether the current can be extended by the . + /// + /// The of the chain. + /// The to test. + /// if the can be extended the ; otherwise, false. + /// + public static bool CanBeExtendedBy(this StructureType chain, StructureType next) { - return SType; + return Extenders.TryGetValue(chain, out var extenders) && extenders.Contains(next); } - /// - unsafe Chain* IChainable.PNext + /// + /// Whether the current can be extended by the . + /// + /// The of the chain. + /// The to test. + /// if the can extend the ; otherwise, false. + /// + public static bool CanBeExtendedBy(this Type chain, Type next) { - get => (Chain*) PNext; - set => PNext = value; + return + StructureTypes.TryGetValue(next, out var nextType) && + StructureTypes.TryGetValue(chain, out var chainType) && + Extenders.TryGetValue(chainType, out var extenders) && + extenders.Contains(nextType); } } diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ChainExtensions.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ChainExtensions.cs deleted file mode 100644 index e4553fa546..0000000000 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ChainExtensions.cs +++ /dev/null @@ -1,331 +0,0 @@ -using System.Runtime.CompilerServices; - -namespace Silk.Net.Vulkan; - -public static class ChainExtensions -{ - /// - /// Replaces a structure in the chain (if present, and is false), or adds it to the end. - /// - /// The current chain - /// A reference to the structure to update - /// Always adds to the end of the chain, even if an equivalent structure is present. - /// The type of the current chain - /// The type of the value - /// A reference to the value value in the chain - /// - /// Note that both the supplied chain, and the supplied value will have their `SType` correctly set. Further, - /// the supplied structure's will be overwritten. - /// To use - /// - /// var indexingFeatures = new PhysicalDeviceDescriptorIndexingFeatures - /// { - /// ShaderInputAttachmentArrayDynamicIndexing = true - /// }; - /// var accelerationStructureFeaturesKhr = new PhysicalDeviceAccelerationStructureFeaturesKhr - /// { - /// AccelerationStructure = true - /// }; - /// - /// PhysicalDeviceFeatures2 - /// .Chain(out var features2) - /// .SetNext(ref indexingFeatures) - /// .SetNext(ref accelerationStructureFeaturesKhr); - /// - /// - public static unsafe ref TChain SetNext - ( - this ref TChain chain, - ref TNext value, - bool alwaysAdd = false - ) - where TChain : struct, IChainStart - where TNext : struct, IExtendsChain - { - // Ensure structure type of chain and value are set. - chain.StructureType(); - var structureType = value.StructureType(); - - // Find end of chain - var previousPtr = (Chain*) null; - var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); - var valuePtr = (Chain*) Unsafe.AsPointer(ref value); - do - { - var nextPtr = currentPtr->PNext; - if (!alwaysAdd && currentPtr->SType == structureType) - { - // We have an existing structure, replace it. - if (previousPtr is not null) - { - previousPtr->PNext = valuePtr; - } - - valuePtr->PNext = nextPtr; - - return ref chain; - } - - previousPtr = currentPtr; - currentPtr = nextPtr; - } while (currentPtr is not null); - - // Add value to end of chain - previousPtr->PNext = valuePtr; - valuePtr->PNext = null; - - return ref chain; - } - - /// - /// Adds a structure to the end of the chain. - /// - /// The current chain - /// The structure added to the end of the chain - /// The type of the current chain - /// The type of the structure to add - /// The reference to the chain. - /// - /// Note that both the supplied chain, and the added structure will have their `SType` correctly set - /// To use specify the output type required, e.g.: - /// - /// PhysicalDeviceFeatures2 - /// .Chain(out var features2) - /// .AddNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures) - /// .AddNext(out PhysicalDeviceAccelerationStructureFeaturesKhr accelerationStructureFeaturesKhr); - /// - /// Note, the value is always added, even if an equivalent value is added in the chain already. Use - /// to only add if not already present. - /// - public static unsafe ref TChain AddNext(this ref TChain chain, out TNext next) - where TChain : struct, IChainStart - where TNext : struct, IExtendsChain - { - // Ensure structure type of chain is set. - chain.StructureType(); - - // Find end of chain - var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); - while (currentPtr->PNext is not null) - { - currentPtr = currentPtr->PNext; - } - - // Create new entry and set it's structure type - next = default; - next.StructureType(); - currentPtr->PNext = (Chain*) Unsafe.AsPointer(ref next); - return ref chain; - } - - /// - /// Tries to add a structure to the end of the chain. - /// - /// The current chain - /// The structure added to the end of the chain - /// Whether the structure was actually added - /// The type of the current chain - /// The type of the structure to add - /// The reference to the chain. - /// - /// Note that both the supplied chain, and the added structure will have their `SType` correctly set - /// To use specify the output type required, e.g.: - /// - /// PhysicalDeviceFeatures2 - /// .Chain(out var features2) - /// .TryAddNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures, out var added); - /// - /// - public static unsafe ref TChain TryAddNext(this ref TChain chain, out TNext next, out bool added) - where TChain : struct, IChainStart - where TNext : struct, IExtendsChain - { - // Ensure structure type of chain is set. - chain.StructureType(); - - // Create new entry and get it's structure type - next = default; - var structureType = next.StructureType(); - - // Follow chain - var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); - do - { - if (currentPtr->SType == structureType) - { - added = false; - return ref chain; - } - - var nextPtr = currentPtr->PNext; - if (nextPtr is null) - { - break; - } - - currentPtr = nextPtr; - } while (true); - - currentPtr->PNext = (Chain*) Unsafe.AsPointer(ref next); - added = true; - return ref chain; - } - - /// - /// Returns the index of the in the , if present. - /// - /// The chain - /// The structure value - /// The type of the current chain - /// The type of the value - /// The zero-indexed index if found; otherwise -1. - public static unsafe int IndexOf(this ref TChain chain, ref TNext value) - where TChain : struct, IChainStart - where TNext : struct, IExtendsChain - { - // Ensure structure type of chain is set. - chain.StructureType(); - - var index = 0; - var currentPtr = (Chain*) Unsafe.AsPointer(ref chain); - var valuePtr = (Chain*) Unsafe.AsPointer(ref value); - // Follow chain - do - { - if (currentPtr == valuePtr) - { - return index; - } - - currentPtr = currentPtr->PNext; - index++; - } while (currentPtr is not null); - - return -1; - } - - /// - /// Gets the corresponding for a , if any. - /// - /// The structure type. - /// The corresponding for , if any; otherwise, - /// . - public static Type ClrType(this StructureType structureType) - { - return Chain.ClrTypes[structureType]; - } - - /// - /// Gets the corresponding for a , if any. - /// - /// The CLR type. - /// The corresponding for , if any; otherwise, - /// . - public static StructureType? StructureType(this Type type) - { - return Chain.StructureTypes.TryGetValue(type, out var structureType) ? structureType : null; - } - - /// - /// Whether the can start a chain. - /// - /// The to test. - /// if the can start a chain; otherwise - /// . - public static bool IsChainStart(this StructureType type) - { - return Chain.Extenders.ContainsKey(type); - } - - /// - /// Whether the can start a chain. - /// - /// The to test. - /// if the can start a chain; otherwise - /// . - public static bool IsChainStart(this Type type) - { - return Chain.StructureTypes.TryGetValue(type, out var structureType) && - Chain.Extenders.ContainsKey(structureType); - } - - /// - /// Whether the is chainable. - /// - /// The to test. - /// if the can start a chain; otherwise - /// . - public static bool IsChainable(this StructureType type) - { - return Chain.Extenders.ContainsKey(type) || - Chain.Extensions.ContainsKey(type); - } - - /// - /// Whether the is chainable. - /// - /// The to test. - /// if the can start a chain; otherwise - /// . - public static bool IsChainable(this Type type) - { - return Chain.StructureTypes.TryGetValue(type, out var structureType) && - (Chain.Extenders.ContainsKey(structureType) || Chain.Extensions.ContainsKey(structureType)); - } - - /// - /// Whether the current can extend the . - /// - /// The to test. - /// The of the chain. - /// if the can extend the ; otherwise, false. - /// - public static bool CanExtend(this StructureType next, StructureType chain) - { - return Chain.Extensions.TryGetValue(next, out var extensions) && extensions.Contains(chain); - } - - /// - /// Whether the current can extend the . - /// - /// The to test. - /// The of the chain. - /// if the can extend the ; otherwise, false. - /// - public static bool CanExtend(this Type next, Type chain) - { - return - Chain.StructureTypes.TryGetValue(next, out var nextType) && - Chain.StructureTypes.TryGetValue(chain, out var chainType) && - Chain.Extensions.TryGetValue(nextType, out var extensions) && - extensions.Contains(chainType); - } - - /// - /// Whether the current can be extended by the . - /// - /// The of the chain. - /// The to test. - /// if the can be extended the ; otherwise, false. - /// - public static bool CanBeExtendedBy(this StructureType chain, StructureType next) - { - return Chain.Extenders.TryGetValue(chain, out var extenders) && extenders.Contains(next); - } - - /// - /// Whether the current can be extended by the . - /// - /// The of the chain. - /// The to test. - /// if the can extend the ; otherwise, false. - /// - public static bool CanBeExtendedBy(this Type chain, Type next) - { - return - Chain.StructureTypes.TryGetValue(next, out var nextType) && - Chain.StructureTypes.TryGetValue(chain, out var chainType) && - Chain.Extenders.TryGetValue(chainType, out var extenders) && - extenders.Contains(nextType); - } -} diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/DeviceCreateInfo.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/DeviceCreateInfo.cs index 292c2bb96f..3f6a136559 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/DeviceCreateInfo.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/DeviceCreateInfo.cs @@ -62,9 +62,9 @@ StructureType IStructuredType.StructureType() } /// - unsafe Chain* IChainable.PNext + unsafe BaseInStructure* IChainable.PNext { - get => (Chain*) PNext; + get => (BaseInStructure*) PNext; set => PNext = value; } diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IChainStart.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IChainStart.cs index 4da9542556..867d9d658a 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IChainStart.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IChainStart.cs @@ -3,7 +3,7 @@ namespace Silk.Net.Vulkan; /// /// Marks a chainable struct as being allowed at the start of a chain. /// -/// Any will have a corresponding static `Chain(out var chain)` +/// Any will have a corresponding static `BaseInStructure(out var chain)` /// convenience method. public interface IChainStart : IChainable { diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IChainable.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IChainable.cs index 098fd169bc..9b47ca507c 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IChainable.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IChainable.cs @@ -5,8 +5,8 @@ namespace Silk.Net.Vulkan; /// /// Note that any structure marked must start with a /// and a void* field, in that order. This is so that a pointer to it can be coerced -/// to a pointer to a . +/// to a pointer to a . public interface IChainable : IStructuredType { - unsafe Chain* PNext { get; set; } + unsafe BaseInStructure* PNext { get; set; } } diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.cs index def61ff87a..ae81ec1995 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.cs @@ -1227,18 +1227,18 @@ public unsafe class ManagedChain : ManagedChain /// /// Gets a pointer to the current head. /// - public Chain* HeadPtr => (Chain*) _headPtr; + public BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; /// /// Gets or sets the head of the chain. /// public TChain Head { - get => Unsafe.AsRef((Chain*) _headPtr); + get => Unsafe.AsRef((BaseInStructure*) _headPtr); set { value.StructureType(); - var ptr = (Chain*) _headPtr; + var ptr = (BaseInStructure*) _headPtr; var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, _headPtr, true); ptr->PNext = nextPtr; @@ -1387,18 +1387,18 @@ public unsafe class ManagedChain : ManagedChain /// /// Gets a pointer to the current head. /// - public Chain* HeadPtr => (Chain*) _headPtr; + public BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; /// /// Gets or sets the head of the chain. /// public TChain Head { - get => Unsafe.AsRef((Chain*) _headPtr); + get => Unsafe.AsRef((BaseInStructure*) _headPtr); set { value.StructureType(); - var ptr = (Chain*) _headPtr; + var ptr = (BaseInStructure*) _headPtr; var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, _headPtr, true); ptr->PNext = nextPtr; @@ -1408,7 +1408,7 @@ public TChain Head /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item1Ptr => (Chain*) (_headPtr + Item1Offset); + public BaseInStructure* Item1Ptr => (BaseInStructure*) (_headPtr + Item1Offset); /// /// Gets or sets item #1 in the chain. @@ -1448,7 +1448,7 @@ public ManagedChain(TChain head = default, T1 item1 = default) { head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); - Chain* itemPtr = Item1Ptr; + BaseInStructure* itemPtr = Item1Ptr; item1.StructureType(); Marshal.StructureToPtr(item1, (nint)itemPtr, false); HeadPtr->PNext = itemPtr; @@ -1466,12 +1466,12 @@ public ManagedChain(out string errors, TChain chain) chain.StructureType(); Marshal.StructureToPtr(chain, _headPtr, false); StringBuilder errorBuilder = new StringBuilder(); - var existingPtr = (Chain*) Unsafe.AsPointer(ref chain); - var newPtr = (Chain*) _headPtr; + var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); + var newPtr = (BaseInStructure*) _headPtr; - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item1Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item1Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T1 item1 = default; var expectedStructureType = item1.StructureType(); @@ -1510,7 +1510,7 @@ public ManagedChain Duplicate() // Block copy original struct data for speed Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); // Update all pointers - ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); return new ManagedChain(newHeadPtr); } @@ -1535,8 +1535,8 @@ public ManagedChain(ManagedChain previous, T1 item1 = default) Marshal.StructureToPtr(item1, _headPtr + previousSize, false); // Update all pointers - ((Chain*)_headPtr)->PNext = (Chain*) (_headPtr + Item1Offset); - ((Chain*)(_headPtr + previousSize))->PNext = null; + ((BaseInStructure*)_headPtr)->PNext = (BaseInStructure*) (_headPtr + Item1Offset); + ((BaseInStructure*)(_headPtr + previousSize))->PNext = null; } /// @@ -1567,7 +1567,7 @@ public ManagedChain Truncate(out T1 item1) // Block copy original struct data for speed Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); // Update all pointers - ((Chain*)newHeadPtr)->PNext = null; + ((BaseInStructure*)newHeadPtr)->PNext = null; return new ManagedChain(newHeadPtr); } @@ -1679,18 +1679,18 @@ public unsafe class ManagedChain : ManagedChain /// /// Gets a pointer to the current head. /// - public Chain* HeadPtr => (Chain*) _headPtr; + public BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; /// /// Gets or sets the head of the chain. /// public TChain Head { - get => Unsafe.AsRef((Chain*) _headPtr); + get => Unsafe.AsRef((BaseInStructure*) _headPtr); set { value.StructureType(); - var ptr = (Chain*) _headPtr; + var ptr = (BaseInStructure*) _headPtr; var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, _headPtr, true); ptr->PNext = nextPtr; @@ -1700,7 +1700,7 @@ public TChain Head /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item1Ptr => (Chain*) (_headPtr + Item1Offset); + public BaseInStructure* Item1Ptr => (BaseInStructure*) (_headPtr + Item1Offset); /// /// Gets or sets item #1 in the chain. @@ -1721,7 +1721,7 @@ public T1 Item1 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item2Ptr => (Chain*) (_headPtr + Item2Offset); + public BaseInStructure* Item2Ptr => (BaseInStructure*) (_headPtr + Item2Offset); /// /// Gets or sets item #2 in the chain. @@ -1762,7 +1762,7 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul { head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); - Chain* itemPtr = Item1Ptr; + BaseInStructure* itemPtr = Item1Ptr; item1.StructureType(); Marshal.StructureToPtr(item1, (nint)itemPtr, false); HeadPtr->PNext = itemPtr; @@ -1784,12 +1784,12 @@ public ManagedChain(out string errors, TChain chain) chain.StructureType(); Marshal.StructureToPtr(chain, _headPtr, false); StringBuilder errorBuilder = new StringBuilder(); - var existingPtr = (Chain*) Unsafe.AsPointer(ref chain); - var newPtr = (Chain*) _headPtr; + var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); + var newPtr = (BaseInStructure*) _headPtr; - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item1Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item1Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T1 item1 = default; var expectedStructureType = item1.StructureType(); @@ -1808,9 +1808,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item1, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item2Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item2Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T2 item2 = default; expectedStructureType = item2.StructureType(); @@ -1849,8 +1849,8 @@ public ManagedChain Duplicate() // Block copy original struct data for speed Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); // Update all pointers - ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); - ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); + ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); return new ManagedChain(newHeadPtr); } @@ -1875,9 +1875,9 @@ public ManagedChain(ManagedChain previous, T2 item2 = default) Marshal.StructureToPtr(item2, _headPtr + previousSize, false); // Update all pointers - ((Chain*)_headPtr)->PNext = (Chain*) (_headPtr + Item1Offset); - ((Chain*)(_headPtr + Item1Offset))->PNext = (Chain*) (_headPtr + Item2Offset); - ((Chain*)(_headPtr + previousSize))->PNext = null; + ((BaseInStructure*)_headPtr)->PNext = (BaseInStructure*) (_headPtr + Item1Offset); + ((BaseInStructure*)(_headPtr + Item1Offset))->PNext = (BaseInStructure*) (_headPtr + Item2Offset); + ((BaseInStructure*)(_headPtr + previousSize))->PNext = null; } /// @@ -1908,8 +1908,8 @@ public ManagedChain Truncate(out T2 item2) // Block copy original struct data for speed Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); // Update all pointers - ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); - ((Chain*)(newHeadPtr + Item1Offset))->PNext = null; + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); + ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = null; return new ManagedChain(newHeadPtr); } @@ -2038,18 +2038,18 @@ public unsafe class ManagedChain : ManagedChain /// /// Gets a pointer to the current head. /// - public Chain* HeadPtr => (Chain*) _headPtr; + public BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; /// /// Gets or sets the head of the chain. /// public TChain Head { - get => Unsafe.AsRef((Chain*) _headPtr); + get => Unsafe.AsRef((BaseInStructure*) _headPtr); set { value.StructureType(); - var ptr = (Chain*) _headPtr; + var ptr = (BaseInStructure*) _headPtr; var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, _headPtr, true); ptr->PNext = nextPtr; @@ -2059,7 +2059,7 @@ public TChain Head /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item1Ptr => (Chain*) (_headPtr + Item1Offset); + public BaseInStructure* Item1Ptr => (BaseInStructure*) (_headPtr + Item1Offset); /// /// Gets or sets item #1 in the chain. @@ -2080,7 +2080,7 @@ public T1 Item1 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item2Ptr => (Chain*) (_headPtr + Item2Offset); + public BaseInStructure* Item2Ptr => (BaseInStructure*) (_headPtr + Item2Offset); /// /// Gets or sets item #2 in the chain. @@ -2101,7 +2101,7 @@ public T2 Item2 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item3Ptr => (Chain*) (_headPtr + Item3Offset); + public BaseInStructure* Item3Ptr => (BaseInStructure*) (_headPtr + Item3Offset); /// /// Gets or sets item #3 in the chain. @@ -2143,7 +2143,7 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul { head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); - Chain* itemPtr = Item1Ptr; + BaseInStructure* itemPtr = Item1Ptr; item1.StructureType(); Marshal.StructureToPtr(item1, (nint)itemPtr, false); HeadPtr->PNext = itemPtr; @@ -2169,12 +2169,12 @@ public ManagedChain(out string errors, TChain chain) chain.StructureType(); Marshal.StructureToPtr(chain, _headPtr, false); StringBuilder errorBuilder = new StringBuilder(); - var existingPtr = (Chain*) Unsafe.AsPointer(ref chain); - var newPtr = (Chain*) _headPtr; + var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); + var newPtr = (BaseInStructure*) _headPtr; - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item1Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item1Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T1 item1 = default; var expectedStructureType = item1.StructureType(); @@ -2193,9 +2193,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item1, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item2Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item2Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T2 item2 = default; expectedStructureType = item2.StructureType(); @@ -2214,9 +2214,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item2, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item3Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item3Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T3 item3 = default; expectedStructureType = item3.StructureType(); @@ -2255,9 +2255,9 @@ public ManagedChain Duplicate() // Block copy original struct data for speed Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); // Update all pointers - ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); - ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); - ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); + ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); + ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); return new ManagedChain(newHeadPtr); } @@ -2282,10 +2282,10 @@ public ManagedChain(ManagedChain previous, T3 item3 = default) Marshal.StructureToPtr(item3, _headPtr + previousSize, false); // Update all pointers - ((Chain*)_headPtr)->PNext = (Chain*) (_headPtr + Item1Offset); - ((Chain*)(_headPtr + Item1Offset))->PNext = (Chain*) (_headPtr + Item2Offset); - ((Chain*)(_headPtr + Item2Offset))->PNext = (Chain*) (_headPtr + Item3Offset); - ((Chain*)(_headPtr + previousSize))->PNext = null; + ((BaseInStructure*)_headPtr)->PNext = (BaseInStructure*) (_headPtr + Item1Offset); + ((BaseInStructure*)(_headPtr + Item1Offset))->PNext = (BaseInStructure*) (_headPtr + Item2Offset); + ((BaseInStructure*)(_headPtr + Item2Offset))->PNext = (BaseInStructure*) (_headPtr + Item3Offset); + ((BaseInStructure*)(_headPtr + previousSize))->PNext = null; } /// @@ -2316,9 +2316,9 @@ public ManagedChain Truncate(out T3 item3) // Block copy original struct data for speed Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); // Update all pointers - ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); - ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); - ((Chain*)(newHeadPtr + Item2Offset))->PNext = null; + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); + ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); + ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = null; return new ManagedChain(newHeadPtr); } @@ -2464,18 +2464,18 @@ public unsafe class ManagedChain : ManagedChain /// /// Gets a pointer to the current head. /// - public Chain* HeadPtr => (Chain*) _headPtr; + public BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; /// /// Gets or sets the head of the chain. /// public TChain Head { - get => Unsafe.AsRef((Chain*) _headPtr); + get => Unsafe.AsRef((BaseInStructure*) _headPtr); set { value.StructureType(); - var ptr = (Chain*) _headPtr; + var ptr = (BaseInStructure*) _headPtr; var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, _headPtr, true); ptr->PNext = nextPtr; @@ -2485,7 +2485,7 @@ public TChain Head /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item1Ptr => (Chain*) (_headPtr + Item1Offset); + public BaseInStructure* Item1Ptr => (BaseInStructure*) (_headPtr + Item1Offset); /// /// Gets or sets item #1 in the chain. @@ -2506,7 +2506,7 @@ public T1 Item1 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item2Ptr => (Chain*) (_headPtr + Item2Offset); + public BaseInStructure* Item2Ptr => (BaseInStructure*) (_headPtr + Item2Offset); /// /// Gets or sets item #2 in the chain. @@ -2527,7 +2527,7 @@ public T2 Item2 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item3Ptr => (Chain*) (_headPtr + Item3Offset); + public BaseInStructure* Item3Ptr => (BaseInStructure*) (_headPtr + Item3Offset); /// /// Gets or sets item #3 in the chain. @@ -2548,7 +2548,7 @@ public T3 Item3 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item4Ptr => (Chain*) (_headPtr + Item4Offset); + public BaseInStructure* Item4Ptr => (BaseInStructure*) (_headPtr + Item4Offset); /// /// Gets or sets item #4 in the chain. @@ -2591,7 +2591,7 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul { head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); - Chain* itemPtr = Item1Ptr; + BaseInStructure* itemPtr = Item1Ptr; item1.StructureType(); Marshal.StructureToPtr(item1, (nint)itemPtr, false); HeadPtr->PNext = itemPtr; @@ -2621,12 +2621,12 @@ public ManagedChain(out string errors, TChain chain) chain.StructureType(); Marshal.StructureToPtr(chain, _headPtr, false); StringBuilder errorBuilder = new StringBuilder(); - var existingPtr = (Chain*) Unsafe.AsPointer(ref chain); - var newPtr = (Chain*) _headPtr; + var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); + var newPtr = (BaseInStructure*) _headPtr; - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item1Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item1Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T1 item1 = default; var expectedStructureType = item1.StructureType(); @@ -2645,9 +2645,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item1, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item2Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item2Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T2 item2 = default; expectedStructureType = item2.StructureType(); @@ -2666,9 +2666,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item2, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item3Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item3Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T3 item3 = default; expectedStructureType = item3.StructureType(); @@ -2687,9 +2687,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item3, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item4Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item4Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T4 item4 = default; expectedStructureType = item4.StructureType(); @@ -2728,10 +2728,10 @@ public ManagedChain Duplicate() // Block copy original struct data for speed Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); // Update all pointers - ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); - ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); - ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); - ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); + ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); + ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); + ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); return new ManagedChain(newHeadPtr); } @@ -2756,11 +2756,11 @@ public ManagedChain(ManagedChain previous, T4 item4 = defaul Marshal.StructureToPtr(item4, _headPtr + previousSize, false); // Update all pointers - ((Chain*)_headPtr)->PNext = (Chain*) (_headPtr + Item1Offset); - ((Chain*)(_headPtr + Item1Offset))->PNext = (Chain*) (_headPtr + Item2Offset); - ((Chain*)(_headPtr + Item2Offset))->PNext = (Chain*) (_headPtr + Item3Offset); - ((Chain*)(_headPtr + Item3Offset))->PNext = (Chain*) (_headPtr + Item4Offset); - ((Chain*)(_headPtr + previousSize))->PNext = null; + ((BaseInStructure*)_headPtr)->PNext = (BaseInStructure*) (_headPtr + Item1Offset); + ((BaseInStructure*)(_headPtr + Item1Offset))->PNext = (BaseInStructure*) (_headPtr + Item2Offset); + ((BaseInStructure*)(_headPtr + Item2Offset))->PNext = (BaseInStructure*) (_headPtr + Item3Offset); + ((BaseInStructure*)(_headPtr + Item3Offset))->PNext = (BaseInStructure*) (_headPtr + Item4Offset); + ((BaseInStructure*)(_headPtr + previousSize))->PNext = null; } /// @@ -2791,10 +2791,10 @@ public ManagedChain Truncate(out T4 item4) // Block copy original struct data for speed Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); // Update all pointers - ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); - ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); - ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); - ((Chain*)(newHeadPtr + Item3Offset))->PNext = null; + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); + ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); + ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); + ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = null; return new ManagedChain(newHeadPtr); } @@ -2957,18 +2957,18 @@ public unsafe class ManagedChain : ManagedChain /// /// Gets a pointer to the current head. /// - public Chain* HeadPtr => (Chain*) _headPtr; + public BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; /// /// Gets or sets the head of the chain. /// public TChain Head { - get => Unsafe.AsRef((Chain*) _headPtr); + get => Unsafe.AsRef((BaseInStructure*) _headPtr); set { value.StructureType(); - var ptr = (Chain*) _headPtr; + var ptr = (BaseInStructure*) _headPtr; var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, _headPtr, true); ptr->PNext = nextPtr; @@ -2978,7 +2978,7 @@ public TChain Head /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item1Ptr => (Chain*) (_headPtr + Item1Offset); + public BaseInStructure* Item1Ptr => (BaseInStructure*) (_headPtr + Item1Offset); /// /// Gets or sets item #1 in the chain. @@ -2999,7 +2999,7 @@ public T1 Item1 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item2Ptr => (Chain*) (_headPtr + Item2Offset); + public BaseInStructure* Item2Ptr => (BaseInStructure*) (_headPtr + Item2Offset); /// /// Gets or sets item #2 in the chain. @@ -3020,7 +3020,7 @@ public T2 Item2 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item3Ptr => (Chain*) (_headPtr + Item3Offset); + public BaseInStructure* Item3Ptr => (BaseInStructure*) (_headPtr + Item3Offset); /// /// Gets or sets item #3 in the chain. @@ -3041,7 +3041,7 @@ public T3 Item3 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item4Ptr => (Chain*) (_headPtr + Item4Offset); + public BaseInStructure* Item4Ptr => (BaseInStructure*) (_headPtr + Item4Offset); /// /// Gets or sets item #4 in the chain. @@ -3062,7 +3062,7 @@ public T4 Item4 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item5Ptr => (Chain*) (_headPtr + Item5Offset); + public BaseInStructure* Item5Ptr => (BaseInStructure*) (_headPtr + Item5Offset); /// /// Gets or sets item #5 in the chain. @@ -3106,7 +3106,7 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul { head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); - Chain* itemPtr = Item1Ptr; + BaseInStructure* itemPtr = Item1Ptr; item1.StructureType(); Marshal.StructureToPtr(item1, (nint)itemPtr, false); HeadPtr->PNext = itemPtr; @@ -3140,12 +3140,12 @@ public ManagedChain(out string errors, TChain chain) chain.StructureType(); Marshal.StructureToPtr(chain, _headPtr, false); StringBuilder errorBuilder = new StringBuilder(); - var existingPtr = (Chain*) Unsafe.AsPointer(ref chain); - var newPtr = (Chain*) _headPtr; + var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); + var newPtr = (BaseInStructure*) _headPtr; - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item1Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item1Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T1 item1 = default; var expectedStructureType = item1.StructureType(); @@ -3164,9 +3164,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item1, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item2Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item2Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T2 item2 = default; expectedStructureType = item2.StructureType(); @@ -3185,9 +3185,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item2, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item3Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item3Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T3 item3 = default; expectedStructureType = item3.StructureType(); @@ -3206,9 +3206,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item3, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item4Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item4Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T4 item4 = default; expectedStructureType = item4.StructureType(); @@ -3227,9 +3227,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item4, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item5Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item5Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T5 item5 = default; expectedStructureType = item5.StructureType(); @@ -3268,11 +3268,11 @@ public ManagedChain Duplicate() // Block copy original struct data for speed Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); // Update all pointers - ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); - ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); - ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); - ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); - ((Chain*)(newHeadPtr + Item4Offset))->PNext = (Chain*) (newHeadPtr + Item5Offset); + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); + ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); + ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); + ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); + ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item5Offset); return new ManagedChain(newHeadPtr); } @@ -3297,12 +3297,12 @@ public ManagedChain(ManagedChain previous, T5 item5 = de Marshal.StructureToPtr(item5, _headPtr + previousSize, false); // Update all pointers - ((Chain*)_headPtr)->PNext = (Chain*) (_headPtr + Item1Offset); - ((Chain*)(_headPtr + Item1Offset))->PNext = (Chain*) (_headPtr + Item2Offset); - ((Chain*)(_headPtr + Item2Offset))->PNext = (Chain*) (_headPtr + Item3Offset); - ((Chain*)(_headPtr + Item3Offset))->PNext = (Chain*) (_headPtr + Item4Offset); - ((Chain*)(_headPtr + Item4Offset))->PNext = (Chain*) (_headPtr + Item5Offset); - ((Chain*)(_headPtr + previousSize))->PNext = null; + ((BaseInStructure*)_headPtr)->PNext = (BaseInStructure*) (_headPtr + Item1Offset); + ((BaseInStructure*)(_headPtr + Item1Offset))->PNext = (BaseInStructure*) (_headPtr + Item2Offset); + ((BaseInStructure*)(_headPtr + Item2Offset))->PNext = (BaseInStructure*) (_headPtr + Item3Offset); + ((BaseInStructure*)(_headPtr + Item3Offset))->PNext = (BaseInStructure*) (_headPtr + Item4Offset); + ((BaseInStructure*)(_headPtr + Item4Offset))->PNext = (BaseInStructure*) (_headPtr + Item5Offset); + ((BaseInStructure*)(_headPtr + previousSize))->PNext = null; } /// @@ -3333,11 +3333,11 @@ public ManagedChain Truncate(out T5 item5) // Block copy original struct data for speed Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); // Update all pointers - ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); - ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); - ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); - ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); - ((Chain*)(newHeadPtr + Item4Offset))->PNext = null; + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); + ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); + ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); + ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); + ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = null; return new ManagedChain(newHeadPtr); } @@ -3517,18 +3517,18 @@ public unsafe class ManagedChain : ManagedChain /// /// Gets a pointer to the current head. /// - public Chain* HeadPtr => (Chain*) _headPtr; + public BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; /// /// Gets or sets the head of the chain. /// public TChain Head { - get => Unsafe.AsRef((Chain*) _headPtr); + get => Unsafe.AsRef((BaseInStructure*) _headPtr); set { value.StructureType(); - var ptr = (Chain*) _headPtr; + var ptr = (BaseInStructure*) _headPtr; var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, _headPtr, true); ptr->PNext = nextPtr; @@ -3538,7 +3538,7 @@ public TChain Head /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item1Ptr => (Chain*) (_headPtr + Item1Offset); + public BaseInStructure* Item1Ptr => (BaseInStructure*) (_headPtr + Item1Offset); /// /// Gets or sets item #1 in the chain. @@ -3559,7 +3559,7 @@ public T1 Item1 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item2Ptr => (Chain*) (_headPtr + Item2Offset); + public BaseInStructure* Item2Ptr => (BaseInStructure*) (_headPtr + Item2Offset); /// /// Gets or sets item #2 in the chain. @@ -3580,7 +3580,7 @@ public T2 Item2 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item3Ptr => (Chain*) (_headPtr + Item3Offset); + public BaseInStructure* Item3Ptr => (BaseInStructure*) (_headPtr + Item3Offset); /// /// Gets or sets item #3 in the chain. @@ -3601,7 +3601,7 @@ public T3 Item3 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item4Ptr => (Chain*) (_headPtr + Item4Offset); + public BaseInStructure* Item4Ptr => (BaseInStructure*) (_headPtr + Item4Offset); /// /// Gets or sets item #4 in the chain. @@ -3622,7 +3622,7 @@ public T4 Item4 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item5Ptr => (Chain*) (_headPtr + Item5Offset); + public BaseInStructure* Item5Ptr => (BaseInStructure*) (_headPtr + Item5Offset); /// /// Gets or sets item #5 in the chain. @@ -3643,7 +3643,7 @@ public T5 Item5 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item6Ptr => (Chain*) (_headPtr + Item6Offset); + public BaseInStructure* Item6Ptr => (BaseInStructure*) (_headPtr + Item6Offset); /// /// Gets or sets item #6 in the chain. @@ -3688,7 +3688,7 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul { head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); - Chain* itemPtr = Item1Ptr; + BaseInStructure* itemPtr = Item1Ptr; item1.StructureType(); Marshal.StructureToPtr(item1, (nint)itemPtr, false); HeadPtr->PNext = itemPtr; @@ -3726,12 +3726,12 @@ public ManagedChain(out string errors, TChain chain) chain.StructureType(); Marshal.StructureToPtr(chain, _headPtr, false); StringBuilder errorBuilder = new StringBuilder(); - var existingPtr = (Chain*) Unsafe.AsPointer(ref chain); - var newPtr = (Chain*) _headPtr; + var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); + var newPtr = (BaseInStructure*) _headPtr; - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item1Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item1Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T1 item1 = default; var expectedStructureType = item1.StructureType(); @@ -3750,9 +3750,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item1, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item2Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item2Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T2 item2 = default; expectedStructureType = item2.StructureType(); @@ -3771,9 +3771,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item2, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item3Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item3Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T3 item3 = default; expectedStructureType = item3.StructureType(); @@ -3792,9 +3792,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item3, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item4Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item4Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T4 item4 = default; expectedStructureType = item4.StructureType(); @@ -3813,9 +3813,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item4, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item5Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item5Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T5 item5 = default; expectedStructureType = item5.StructureType(); @@ -3834,9 +3834,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item5, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item6Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item6Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T6 item6 = default; expectedStructureType = item6.StructureType(); @@ -3875,12 +3875,12 @@ public ManagedChain Duplicate() // Block copy original struct data for speed Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); // Update all pointers - ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); - ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); - ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); - ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); - ((Chain*)(newHeadPtr + Item4Offset))->PNext = (Chain*) (newHeadPtr + Item5Offset); - ((Chain*)(newHeadPtr + Item5Offset))->PNext = (Chain*) (newHeadPtr + Item6Offset); + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); + ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); + ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); + ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); + ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item5Offset); + ((BaseInStructure*)(newHeadPtr + Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item6Offset); return new ManagedChain(newHeadPtr); } @@ -3905,13 +3905,13 @@ public ManagedChain(ManagedChain previous, T6 item6 Marshal.StructureToPtr(item6, _headPtr + previousSize, false); // Update all pointers - ((Chain*)_headPtr)->PNext = (Chain*) (_headPtr + Item1Offset); - ((Chain*)(_headPtr + Item1Offset))->PNext = (Chain*) (_headPtr + Item2Offset); - ((Chain*)(_headPtr + Item2Offset))->PNext = (Chain*) (_headPtr + Item3Offset); - ((Chain*)(_headPtr + Item3Offset))->PNext = (Chain*) (_headPtr + Item4Offset); - ((Chain*)(_headPtr + Item4Offset))->PNext = (Chain*) (_headPtr + Item5Offset); - ((Chain*)(_headPtr + Item5Offset))->PNext = (Chain*) (_headPtr + Item6Offset); - ((Chain*)(_headPtr + previousSize))->PNext = null; + ((BaseInStructure*)_headPtr)->PNext = (BaseInStructure*) (_headPtr + Item1Offset); + ((BaseInStructure*)(_headPtr + Item1Offset))->PNext = (BaseInStructure*) (_headPtr + Item2Offset); + ((BaseInStructure*)(_headPtr + Item2Offset))->PNext = (BaseInStructure*) (_headPtr + Item3Offset); + ((BaseInStructure*)(_headPtr + Item3Offset))->PNext = (BaseInStructure*) (_headPtr + Item4Offset); + ((BaseInStructure*)(_headPtr + Item4Offset))->PNext = (BaseInStructure*) (_headPtr + Item5Offset); + ((BaseInStructure*)(_headPtr + Item5Offset))->PNext = (BaseInStructure*) (_headPtr + Item6Offset); + ((BaseInStructure*)(_headPtr + previousSize))->PNext = null; } /// @@ -3942,12 +3942,12 @@ public ManagedChain Truncate(out T6 item6) // Block copy original struct data for speed Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); // Update all pointers - ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); - ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); - ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); - ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); - ((Chain*)(newHeadPtr + Item4Offset))->PNext = (Chain*) (newHeadPtr + Item5Offset); - ((Chain*)(newHeadPtr + Item5Offset))->PNext = null; + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); + ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); + ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); + ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); + ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item5Offset); + ((BaseInStructure*)(newHeadPtr + Item5Offset))->PNext = null; return new ManagedChain(newHeadPtr); } @@ -4144,18 +4144,18 @@ public unsafe class ManagedChain : ManagedCh /// /// Gets a pointer to the current head. /// - public Chain* HeadPtr => (Chain*) _headPtr; + public BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; /// /// Gets or sets the head of the chain. /// public TChain Head { - get => Unsafe.AsRef((Chain*) _headPtr); + get => Unsafe.AsRef((BaseInStructure*) _headPtr); set { value.StructureType(); - var ptr = (Chain*) _headPtr; + var ptr = (BaseInStructure*) _headPtr; var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, _headPtr, true); ptr->PNext = nextPtr; @@ -4165,7 +4165,7 @@ public TChain Head /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item1Ptr => (Chain*) (_headPtr + Item1Offset); + public BaseInStructure* Item1Ptr => (BaseInStructure*) (_headPtr + Item1Offset); /// /// Gets or sets item #1 in the chain. @@ -4186,7 +4186,7 @@ public T1 Item1 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item2Ptr => (Chain*) (_headPtr + Item2Offset); + public BaseInStructure* Item2Ptr => (BaseInStructure*) (_headPtr + Item2Offset); /// /// Gets or sets item #2 in the chain. @@ -4207,7 +4207,7 @@ public T2 Item2 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item3Ptr => (Chain*) (_headPtr + Item3Offset); + public BaseInStructure* Item3Ptr => (BaseInStructure*) (_headPtr + Item3Offset); /// /// Gets or sets item #3 in the chain. @@ -4228,7 +4228,7 @@ public T3 Item3 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item4Ptr => (Chain*) (_headPtr + Item4Offset); + public BaseInStructure* Item4Ptr => (BaseInStructure*) (_headPtr + Item4Offset); /// /// Gets or sets item #4 in the chain. @@ -4249,7 +4249,7 @@ public T4 Item4 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item5Ptr => (Chain*) (_headPtr + Item5Offset); + public BaseInStructure* Item5Ptr => (BaseInStructure*) (_headPtr + Item5Offset); /// /// Gets or sets item #5 in the chain. @@ -4270,7 +4270,7 @@ public T5 Item5 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item6Ptr => (Chain*) (_headPtr + Item6Offset); + public BaseInStructure* Item6Ptr => (BaseInStructure*) (_headPtr + Item6Offset); /// /// Gets or sets item #6 in the chain. @@ -4291,7 +4291,7 @@ public T6 Item6 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item7Ptr => (Chain*) (_headPtr + Item7Offset); + public BaseInStructure* Item7Ptr => (BaseInStructure*) (_headPtr + Item7Offset); /// /// Gets or sets item #7 in the chain. @@ -4337,7 +4337,7 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul { head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); - Chain* itemPtr = Item1Ptr; + BaseInStructure* itemPtr = Item1Ptr; item1.StructureType(); Marshal.StructureToPtr(item1, (nint)itemPtr, false); HeadPtr->PNext = itemPtr; @@ -4379,12 +4379,12 @@ public ManagedChain(out string errors, TChain chain) chain.StructureType(); Marshal.StructureToPtr(chain, _headPtr, false); StringBuilder errorBuilder = new StringBuilder(); - var existingPtr = (Chain*) Unsafe.AsPointer(ref chain); - var newPtr = (Chain*) _headPtr; + var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); + var newPtr = (BaseInStructure*) _headPtr; - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item1Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item1Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T1 item1 = default; var expectedStructureType = item1.StructureType(); @@ -4403,9 +4403,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item1, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item2Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item2Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T2 item2 = default; expectedStructureType = item2.StructureType(); @@ -4424,9 +4424,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item2, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item3Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item3Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T3 item3 = default; expectedStructureType = item3.StructureType(); @@ -4445,9 +4445,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item3, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item4Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item4Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T4 item4 = default; expectedStructureType = item4.StructureType(); @@ -4466,9 +4466,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item4, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item5Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item5Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T5 item5 = default; expectedStructureType = item5.StructureType(); @@ -4487,9 +4487,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item5, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item6Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item6Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T6 item6 = default; expectedStructureType = item6.StructureType(); @@ -4508,9 +4508,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item6, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item7Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item7Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T7 item7 = default; expectedStructureType = item7.StructureType(); @@ -4549,13 +4549,13 @@ public ManagedChain Duplicate() // Block copy original struct data for speed Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); // Update all pointers - ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); - ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); - ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); - ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); - ((Chain*)(newHeadPtr + Item4Offset))->PNext = (Chain*) (newHeadPtr + Item5Offset); - ((Chain*)(newHeadPtr + Item5Offset))->PNext = (Chain*) (newHeadPtr + Item6Offset); - ((Chain*)(newHeadPtr + Item6Offset))->PNext = (Chain*) (newHeadPtr + Item7Offset); + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); + ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); + ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); + ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); + ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item5Offset); + ((BaseInStructure*)(newHeadPtr + Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item6Offset); + ((BaseInStructure*)(newHeadPtr + Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item7Offset); return new ManagedChain(newHeadPtr); } @@ -4580,14 +4580,14 @@ public ManagedChain(ManagedChain previous, T7 it Marshal.StructureToPtr(item7, _headPtr + previousSize, false); // Update all pointers - ((Chain*)_headPtr)->PNext = (Chain*) (_headPtr + Item1Offset); - ((Chain*)(_headPtr + Item1Offset))->PNext = (Chain*) (_headPtr + Item2Offset); - ((Chain*)(_headPtr + Item2Offset))->PNext = (Chain*) (_headPtr + Item3Offset); - ((Chain*)(_headPtr + Item3Offset))->PNext = (Chain*) (_headPtr + Item4Offset); - ((Chain*)(_headPtr + Item4Offset))->PNext = (Chain*) (_headPtr + Item5Offset); - ((Chain*)(_headPtr + Item5Offset))->PNext = (Chain*) (_headPtr + Item6Offset); - ((Chain*)(_headPtr + Item6Offset))->PNext = (Chain*) (_headPtr + Item7Offset); - ((Chain*)(_headPtr + previousSize))->PNext = null; + ((BaseInStructure*)_headPtr)->PNext = (BaseInStructure*) (_headPtr + Item1Offset); + ((BaseInStructure*)(_headPtr + Item1Offset))->PNext = (BaseInStructure*) (_headPtr + Item2Offset); + ((BaseInStructure*)(_headPtr + Item2Offset))->PNext = (BaseInStructure*) (_headPtr + Item3Offset); + ((BaseInStructure*)(_headPtr + Item3Offset))->PNext = (BaseInStructure*) (_headPtr + Item4Offset); + ((BaseInStructure*)(_headPtr + Item4Offset))->PNext = (BaseInStructure*) (_headPtr + Item5Offset); + ((BaseInStructure*)(_headPtr + Item5Offset))->PNext = (BaseInStructure*) (_headPtr + Item6Offset); + ((BaseInStructure*)(_headPtr + Item6Offset))->PNext = (BaseInStructure*) (_headPtr + Item7Offset); + ((BaseInStructure*)(_headPtr + previousSize))->PNext = null; } /// @@ -4618,13 +4618,13 @@ public ManagedChain Truncate(out T7 item7) // Block copy original struct data for speed Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); // Update all pointers - ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); - ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); - ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); - ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); - ((Chain*)(newHeadPtr + Item4Offset))->PNext = (Chain*) (newHeadPtr + Item5Offset); - ((Chain*)(newHeadPtr + Item5Offset))->PNext = (Chain*) (newHeadPtr + Item6Offset); - ((Chain*)(newHeadPtr + Item6Offset))->PNext = null; + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); + ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); + ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); + ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); + ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item5Offset); + ((BaseInStructure*)(newHeadPtr + Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item6Offset); + ((BaseInStructure*)(newHeadPtr + Item6Offset))->PNext = null; return new ManagedChain(newHeadPtr); } @@ -4838,18 +4838,18 @@ public unsafe class ManagedChain : Manag /// /// Gets a pointer to the current head. /// - public Chain* HeadPtr => (Chain*) _headPtr; + public BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; /// /// Gets or sets the head of the chain. /// public TChain Head { - get => Unsafe.AsRef((Chain*) _headPtr); + get => Unsafe.AsRef((BaseInStructure*) _headPtr); set { value.StructureType(); - var ptr = (Chain*) _headPtr; + var ptr = (BaseInStructure*) _headPtr; var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, _headPtr, true); ptr->PNext = nextPtr; @@ -4859,7 +4859,7 @@ public TChain Head /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item1Ptr => (Chain*) (_headPtr + Item1Offset); + public BaseInStructure* Item1Ptr => (BaseInStructure*) (_headPtr + Item1Offset); /// /// Gets or sets item #1 in the chain. @@ -4880,7 +4880,7 @@ public T1 Item1 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item2Ptr => (Chain*) (_headPtr + Item2Offset); + public BaseInStructure* Item2Ptr => (BaseInStructure*) (_headPtr + Item2Offset); /// /// Gets or sets item #2 in the chain. @@ -4901,7 +4901,7 @@ public T2 Item2 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item3Ptr => (Chain*) (_headPtr + Item3Offset); + public BaseInStructure* Item3Ptr => (BaseInStructure*) (_headPtr + Item3Offset); /// /// Gets or sets item #3 in the chain. @@ -4922,7 +4922,7 @@ public T3 Item3 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item4Ptr => (Chain*) (_headPtr + Item4Offset); + public BaseInStructure* Item4Ptr => (BaseInStructure*) (_headPtr + Item4Offset); /// /// Gets or sets item #4 in the chain. @@ -4943,7 +4943,7 @@ public T4 Item4 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item5Ptr => (Chain*) (_headPtr + Item5Offset); + public BaseInStructure* Item5Ptr => (BaseInStructure*) (_headPtr + Item5Offset); /// /// Gets or sets item #5 in the chain. @@ -4964,7 +4964,7 @@ public T5 Item5 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item6Ptr => (Chain*) (_headPtr + Item6Offset); + public BaseInStructure* Item6Ptr => (BaseInStructure*) (_headPtr + Item6Offset); /// /// Gets or sets item #6 in the chain. @@ -4985,7 +4985,7 @@ public T6 Item6 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item7Ptr => (Chain*) (_headPtr + Item7Offset); + public BaseInStructure* Item7Ptr => (BaseInStructure*) (_headPtr + Item7Offset); /// /// Gets or sets item #7 in the chain. @@ -5006,7 +5006,7 @@ public T7 Item7 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item8Ptr => (Chain*) (_headPtr + Item8Offset); + public BaseInStructure* Item8Ptr => (BaseInStructure*) (_headPtr + Item8Offset); /// /// Gets or sets item #8 in the chain. @@ -5053,7 +5053,7 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul { head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); - Chain* itemPtr = Item1Ptr; + BaseInStructure* itemPtr = Item1Ptr; item1.StructureType(); Marshal.StructureToPtr(item1, (nint)itemPtr, false); HeadPtr->PNext = itemPtr; @@ -5099,12 +5099,12 @@ public ManagedChain(out string errors, TChain chain) chain.StructureType(); Marshal.StructureToPtr(chain, _headPtr, false); StringBuilder errorBuilder = new StringBuilder(); - var existingPtr = (Chain*) Unsafe.AsPointer(ref chain); - var newPtr = (Chain*) _headPtr; + var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); + var newPtr = (BaseInStructure*) _headPtr; - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item1Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item1Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T1 item1 = default; var expectedStructureType = item1.StructureType(); @@ -5123,9 +5123,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item1, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item2Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item2Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T2 item2 = default; expectedStructureType = item2.StructureType(); @@ -5144,9 +5144,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item2, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item3Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item3Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T3 item3 = default; expectedStructureType = item3.StructureType(); @@ -5165,9 +5165,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item3, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item4Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item4Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T4 item4 = default; expectedStructureType = item4.StructureType(); @@ -5186,9 +5186,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item4, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item5Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item5Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T5 item5 = default; expectedStructureType = item5.StructureType(); @@ -5207,9 +5207,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item5, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item6Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item6Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T6 item6 = default; expectedStructureType = item6.StructureType(); @@ -5228,9 +5228,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item6, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item7Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item7Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T7 item7 = default; expectedStructureType = item7.StructureType(); @@ -5249,9 +5249,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item7, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item8Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item8Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T8 item8 = default; expectedStructureType = item8.StructureType(); @@ -5290,14 +5290,14 @@ public ManagedChain Duplicate() // Block copy original struct data for speed Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); // Update all pointers - ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); - ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); - ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); - ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); - ((Chain*)(newHeadPtr + Item4Offset))->PNext = (Chain*) (newHeadPtr + Item5Offset); - ((Chain*)(newHeadPtr + Item5Offset))->PNext = (Chain*) (newHeadPtr + Item6Offset); - ((Chain*)(newHeadPtr + Item6Offset))->PNext = (Chain*) (newHeadPtr + Item7Offset); - ((Chain*)(newHeadPtr + Item7Offset))->PNext = (Chain*) (newHeadPtr + Item8Offset); + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); + ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); + ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); + ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); + ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item5Offset); + ((BaseInStructure*)(newHeadPtr + Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item6Offset); + ((BaseInStructure*)(newHeadPtr + Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item7Offset); + ((BaseInStructure*)(newHeadPtr + Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item8Offset); return new ManagedChain(newHeadPtr); } @@ -5322,15 +5322,15 @@ public ManagedChain(ManagedChain previous, T Marshal.StructureToPtr(item8, _headPtr + previousSize, false); // Update all pointers - ((Chain*)_headPtr)->PNext = (Chain*) (_headPtr + Item1Offset); - ((Chain*)(_headPtr + Item1Offset))->PNext = (Chain*) (_headPtr + Item2Offset); - ((Chain*)(_headPtr + Item2Offset))->PNext = (Chain*) (_headPtr + Item3Offset); - ((Chain*)(_headPtr + Item3Offset))->PNext = (Chain*) (_headPtr + Item4Offset); - ((Chain*)(_headPtr + Item4Offset))->PNext = (Chain*) (_headPtr + Item5Offset); - ((Chain*)(_headPtr + Item5Offset))->PNext = (Chain*) (_headPtr + Item6Offset); - ((Chain*)(_headPtr + Item6Offset))->PNext = (Chain*) (_headPtr + Item7Offset); - ((Chain*)(_headPtr + Item7Offset))->PNext = (Chain*) (_headPtr + Item8Offset); - ((Chain*)(_headPtr + previousSize))->PNext = null; + ((BaseInStructure*)_headPtr)->PNext = (BaseInStructure*) (_headPtr + Item1Offset); + ((BaseInStructure*)(_headPtr + Item1Offset))->PNext = (BaseInStructure*) (_headPtr + Item2Offset); + ((BaseInStructure*)(_headPtr + Item2Offset))->PNext = (BaseInStructure*) (_headPtr + Item3Offset); + ((BaseInStructure*)(_headPtr + Item3Offset))->PNext = (BaseInStructure*) (_headPtr + Item4Offset); + ((BaseInStructure*)(_headPtr + Item4Offset))->PNext = (BaseInStructure*) (_headPtr + Item5Offset); + ((BaseInStructure*)(_headPtr + Item5Offset))->PNext = (BaseInStructure*) (_headPtr + Item6Offset); + ((BaseInStructure*)(_headPtr + Item6Offset))->PNext = (BaseInStructure*) (_headPtr + Item7Offset); + ((BaseInStructure*)(_headPtr + Item7Offset))->PNext = (BaseInStructure*) (_headPtr + Item8Offset); + ((BaseInStructure*)(_headPtr + previousSize))->PNext = null; } /// @@ -5361,14 +5361,14 @@ public ManagedChain Truncate(out T8 item8) // Block copy original struct data for speed Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); // Update all pointers - ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); - ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); - ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); - ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); - ((Chain*)(newHeadPtr + Item4Offset))->PNext = (Chain*) (newHeadPtr + Item5Offset); - ((Chain*)(newHeadPtr + Item5Offset))->PNext = (Chain*) (newHeadPtr + Item6Offset); - ((Chain*)(newHeadPtr + Item6Offset))->PNext = (Chain*) (newHeadPtr + Item7Offset); - ((Chain*)(newHeadPtr + Item7Offset))->PNext = null; + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); + ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); + ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); + ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); + ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item5Offset); + ((BaseInStructure*)(newHeadPtr + Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item6Offset); + ((BaseInStructure*)(newHeadPtr + Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item7Offset); + ((BaseInStructure*)(newHeadPtr + Item7Offset))->PNext = null; return new ManagedChain(newHeadPtr); } @@ -5599,18 +5599,18 @@ public unsafe class ManagedChain : M /// /// Gets a pointer to the current head. /// - public Chain* HeadPtr => (Chain*) _headPtr; + public BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; /// /// Gets or sets the head of the chain. /// public TChain Head { - get => Unsafe.AsRef((Chain*) _headPtr); + get => Unsafe.AsRef((BaseInStructure*) _headPtr); set { value.StructureType(); - var ptr = (Chain*) _headPtr; + var ptr = (BaseInStructure*) _headPtr; var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, _headPtr, true); ptr->PNext = nextPtr; @@ -5620,7 +5620,7 @@ public TChain Head /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item1Ptr => (Chain*) (_headPtr + Item1Offset); + public BaseInStructure* Item1Ptr => (BaseInStructure*) (_headPtr + Item1Offset); /// /// Gets or sets item #1 in the chain. @@ -5641,7 +5641,7 @@ public T1 Item1 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item2Ptr => (Chain*) (_headPtr + Item2Offset); + public BaseInStructure* Item2Ptr => (BaseInStructure*) (_headPtr + Item2Offset); /// /// Gets or sets item #2 in the chain. @@ -5662,7 +5662,7 @@ public T2 Item2 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item3Ptr => (Chain*) (_headPtr + Item3Offset); + public BaseInStructure* Item3Ptr => (BaseInStructure*) (_headPtr + Item3Offset); /// /// Gets or sets item #3 in the chain. @@ -5683,7 +5683,7 @@ public T3 Item3 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item4Ptr => (Chain*) (_headPtr + Item4Offset); + public BaseInStructure* Item4Ptr => (BaseInStructure*) (_headPtr + Item4Offset); /// /// Gets or sets item #4 in the chain. @@ -5704,7 +5704,7 @@ public T4 Item4 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item5Ptr => (Chain*) (_headPtr + Item5Offset); + public BaseInStructure* Item5Ptr => (BaseInStructure*) (_headPtr + Item5Offset); /// /// Gets or sets item #5 in the chain. @@ -5725,7 +5725,7 @@ public T5 Item5 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item6Ptr => (Chain*) (_headPtr + Item6Offset); + public BaseInStructure* Item6Ptr => (BaseInStructure*) (_headPtr + Item6Offset); /// /// Gets or sets item #6 in the chain. @@ -5746,7 +5746,7 @@ public T6 Item6 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item7Ptr => (Chain*) (_headPtr + Item7Offset); + public BaseInStructure* Item7Ptr => (BaseInStructure*) (_headPtr + Item7Offset); /// /// Gets or sets item #7 in the chain. @@ -5767,7 +5767,7 @@ public T7 Item7 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item8Ptr => (Chain*) (_headPtr + Item8Offset); + public BaseInStructure* Item8Ptr => (BaseInStructure*) (_headPtr + Item8Offset); /// /// Gets or sets item #8 in the chain. @@ -5788,7 +5788,7 @@ public T8 Item8 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item9Ptr => (Chain*) (_headPtr + Item9Offset); + public BaseInStructure* Item9Ptr => (BaseInStructure*) (_headPtr + Item9Offset); /// /// Gets or sets item #9 in the chain. @@ -5836,7 +5836,7 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul { head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); - Chain* itemPtr = Item1Ptr; + BaseInStructure* itemPtr = Item1Ptr; item1.StructureType(); Marshal.StructureToPtr(item1, (nint)itemPtr, false); HeadPtr->PNext = itemPtr; @@ -5886,12 +5886,12 @@ public ManagedChain(out string errors, TChain chain) chain.StructureType(); Marshal.StructureToPtr(chain, _headPtr, false); StringBuilder errorBuilder = new StringBuilder(); - var existingPtr = (Chain*) Unsafe.AsPointer(ref chain); - var newPtr = (Chain*) _headPtr; + var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); + var newPtr = (BaseInStructure*) _headPtr; - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item1Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item1Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T1 item1 = default; var expectedStructureType = item1.StructureType(); @@ -5910,9 +5910,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item1, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item2Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item2Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T2 item2 = default; expectedStructureType = item2.StructureType(); @@ -5931,9 +5931,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item2, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item3Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item3Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T3 item3 = default; expectedStructureType = item3.StructureType(); @@ -5952,9 +5952,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item3, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item4Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item4Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T4 item4 = default; expectedStructureType = item4.StructureType(); @@ -5973,9 +5973,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item4, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item5Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item5Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T5 item5 = default; expectedStructureType = item5.StructureType(); @@ -5994,9 +5994,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item5, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item6Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item6Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T6 item6 = default; expectedStructureType = item6.StructureType(); @@ -6015,9 +6015,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item6, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item7Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item7Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T7 item7 = default; expectedStructureType = item7.StructureType(); @@ -6036,9 +6036,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item7, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item8Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item8Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T8 item8 = default; expectedStructureType = item8.StructureType(); @@ -6057,9 +6057,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item8, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item9Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item9Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T9 item9 = default; expectedStructureType = item9.StructureType(); @@ -6098,15 +6098,15 @@ public ManagedChain Duplicate() // Block copy original struct data for speed Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); // Update all pointers - ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); - ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); - ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); - ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); - ((Chain*)(newHeadPtr + Item4Offset))->PNext = (Chain*) (newHeadPtr + Item5Offset); - ((Chain*)(newHeadPtr + Item5Offset))->PNext = (Chain*) (newHeadPtr + Item6Offset); - ((Chain*)(newHeadPtr + Item6Offset))->PNext = (Chain*) (newHeadPtr + Item7Offset); - ((Chain*)(newHeadPtr + Item7Offset))->PNext = (Chain*) (newHeadPtr + Item8Offset); - ((Chain*)(newHeadPtr + Item8Offset))->PNext = (Chain*) (newHeadPtr + Item9Offset); + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); + ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); + ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); + ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); + ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item5Offset); + ((BaseInStructure*)(newHeadPtr + Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item6Offset); + ((BaseInStructure*)(newHeadPtr + Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item7Offset); + ((BaseInStructure*)(newHeadPtr + Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item8Offset); + ((BaseInStructure*)(newHeadPtr + Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item9Offset); return new ManagedChain(newHeadPtr); } @@ -6131,16 +6131,16 @@ public ManagedChain(ManagedChain previou Marshal.StructureToPtr(item9, _headPtr + previousSize, false); // Update all pointers - ((Chain*)_headPtr)->PNext = (Chain*) (_headPtr + Item1Offset); - ((Chain*)(_headPtr + Item1Offset))->PNext = (Chain*) (_headPtr + Item2Offset); - ((Chain*)(_headPtr + Item2Offset))->PNext = (Chain*) (_headPtr + Item3Offset); - ((Chain*)(_headPtr + Item3Offset))->PNext = (Chain*) (_headPtr + Item4Offset); - ((Chain*)(_headPtr + Item4Offset))->PNext = (Chain*) (_headPtr + Item5Offset); - ((Chain*)(_headPtr + Item5Offset))->PNext = (Chain*) (_headPtr + Item6Offset); - ((Chain*)(_headPtr + Item6Offset))->PNext = (Chain*) (_headPtr + Item7Offset); - ((Chain*)(_headPtr + Item7Offset))->PNext = (Chain*) (_headPtr + Item8Offset); - ((Chain*)(_headPtr + Item8Offset))->PNext = (Chain*) (_headPtr + Item9Offset); - ((Chain*)(_headPtr + previousSize))->PNext = null; + ((BaseInStructure*)_headPtr)->PNext = (BaseInStructure*) (_headPtr + Item1Offset); + ((BaseInStructure*)(_headPtr + Item1Offset))->PNext = (BaseInStructure*) (_headPtr + Item2Offset); + ((BaseInStructure*)(_headPtr + Item2Offset))->PNext = (BaseInStructure*) (_headPtr + Item3Offset); + ((BaseInStructure*)(_headPtr + Item3Offset))->PNext = (BaseInStructure*) (_headPtr + Item4Offset); + ((BaseInStructure*)(_headPtr + Item4Offset))->PNext = (BaseInStructure*) (_headPtr + Item5Offset); + ((BaseInStructure*)(_headPtr + Item5Offset))->PNext = (BaseInStructure*) (_headPtr + Item6Offset); + ((BaseInStructure*)(_headPtr + Item6Offset))->PNext = (BaseInStructure*) (_headPtr + Item7Offset); + ((BaseInStructure*)(_headPtr + Item7Offset))->PNext = (BaseInStructure*) (_headPtr + Item8Offset); + ((BaseInStructure*)(_headPtr + Item8Offset))->PNext = (BaseInStructure*) (_headPtr + Item9Offset); + ((BaseInStructure*)(_headPtr + previousSize))->PNext = null; } /// @@ -6171,15 +6171,15 @@ public ManagedChain Truncate(out T9 item // Block copy original struct data for speed Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); // Update all pointers - ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); - ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); - ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); - ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); - ((Chain*)(newHeadPtr + Item4Offset))->PNext = (Chain*) (newHeadPtr + Item5Offset); - ((Chain*)(newHeadPtr + Item5Offset))->PNext = (Chain*) (newHeadPtr + Item6Offset); - ((Chain*)(newHeadPtr + Item6Offset))->PNext = (Chain*) (newHeadPtr + Item7Offset); - ((Chain*)(newHeadPtr + Item7Offset))->PNext = (Chain*) (newHeadPtr + Item8Offset); - ((Chain*)(newHeadPtr + Item8Offset))->PNext = null; + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); + ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); + ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); + ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); + ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item5Offset); + ((BaseInStructure*)(newHeadPtr + Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item6Offset); + ((BaseInStructure*)(newHeadPtr + Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item7Offset); + ((BaseInStructure*)(newHeadPtr + Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item8Offset); + ((BaseInStructure*)(newHeadPtr + Item8Offset))->PNext = null; return new ManagedChain(newHeadPtr); } @@ -6427,18 +6427,18 @@ public unsafe class ManagedChain /// Gets a pointer to the current head. /// - public Chain* HeadPtr => (Chain*) _headPtr; + public BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; /// /// Gets or sets the head of the chain. /// public TChain Head { - get => Unsafe.AsRef((Chain*) _headPtr); + get => Unsafe.AsRef((BaseInStructure*) _headPtr); set { value.StructureType(); - var ptr = (Chain*) _headPtr; + var ptr = (BaseInStructure*) _headPtr; var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, _headPtr, true); ptr->PNext = nextPtr; @@ -6448,7 +6448,7 @@ public TChain Head /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item1Ptr => (Chain*) (_headPtr + Item1Offset); + public BaseInStructure* Item1Ptr => (BaseInStructure*) (_headPtr + Item1Offset); /// /// Gets or sets item #1 in the chain. @@ -6469,7 +6469,7 @@ public T1 Item1 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item2Ptr => (Chain*) (_headPtr + Item2Offset); + public BaseInStructure* Item2Ptr => (BaseInStructure*) (_headPtr + Item2Offset); /// /// Gets or sets item #2 in the chain. @@ -6490,7 +6490,7 @@ public T2 Item2 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item3Ptr => (Chain*) (_headPtr + Item3Offset); + public BaseInStructure* Item3Ptr => (BaseInStructure*) (_headPtr + Item3Offset); /// /// Gets or sets item #3 in the chain. @@ -6511,7 +6511,7 @@ public T3 Item3 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item4Ptr => (Chain*) (_headPtr + Item4Offset); + public BaseInStructure* Item4Ptr => (BaseInStructure*) (_headPtr + Item4Offset); /// /// Gets or sets item #4 in the chain. @@ -6532,7 +6532,7 @@ public T4 Item4 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item5Ptr => (Chain*) (_headPtr + Item5Offset); + public BaseInStructure* Item5Ptr => (BaseInStructure*) (_headPtr + Item5Offset); /// /// Gets or sets item #5 in the chain. @@ -6553,7 +6553,7 @@ public T5 Item5 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item6Ptr => (Chain*) (_headPtr + Item6Offset); + public BaseInStructure* Item6Ptr => (BaseInStructure*) (_headPtr + Item6Offset); /// /// Gets or sets item #6 in the chain. @@ -6574,7 +6574,7 @@ public T6 Item6 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item7Ptr => (Chain*) (_headPtr + Item7Offset); + public BaseInStructure* Item7Ptr => (BaseInStructure*) (_headPtr + Item7Offset); /// /// Gets or sets item #7 in the chain. @@ -6595,7 +6595,7 @@ public T7 Item7 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item8Ptr => (Chain*) (_headPtr + Item8Offset); + public BaseInStructure* Item8Ptr => (BaseInStructure*) (_headPtr + Item8Offset); /// /// Gets or sets item #8 in the chain. @@ -6616,7 +6616,7 @@ public T8 Item8 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item9Ptr => (Chain*) (_headPtr + Item9Offset); + public BaseInStructure* Item9Ptr => (BaseInStructure*) (_headPtr + Item9Offset); /// /// Gets or sets item #9 in the chain. @@ -6637,7 +6637,7 @@ public T9 Item9 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item10Ptr => (Chain*) (_headPtr + Item10Offset); + public BaseInStructure* Item10Ptr => (BaseInStructure*) (_headPtr + Item10Offset); /// /// Gets or sets item #10 in the chain. @@ -6686,7 +6686,7 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul { head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); - Chain* itemPtr = Item1Ptr; + BaseInStructure* itemPtr = Item1Ptr; item1.StructureType(); Marshal.StructureToPtr(item1, (nint)itemPtr, false); HeadPtr->PNext = itemPtr; @@ -6740,12 +6740,12 @@ public ManagedChain(out string errors, TChain chain) chain.StructureType(); Marshal.StructureToPtr(chain, _headPtr, false); StringBuilder errorBuilder = new StringBuilder(); - var existingPtr = (Chain*) Unsafe.AsPointer(ref chain); - var newPtr = (Chain*) _headPtr; + var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); + var newPtr = (BaseInStructure*) _headPtr; - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item1Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item1Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T1 item1 = default; var expectedStructureType = item1.StructureType(); @@ -6764,9 +6764,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item1, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item2Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item2Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T2 item2 = default; expectedStructureType = item2.StructureType(); @@ -6785,9 +6785,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item2, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item3Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item3Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T3 item3 = default; expectedStructureType = item3.StructureType(); @@ -6806,9 +6806,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item3, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item4Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item4Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T4 item4 = default; expectedStructureType = item4.StructureType(); @@ -6827,9 +6827,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item4, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item5Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item5Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T5 item5 = default; expectedStructureType = item5.StructureType(); @@ -6848,9 +6848,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item5, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item6Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item6Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T6 item6 = default; expectedStructureType = item6.StructureType(); @@ -6869,9 +6869,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item6, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item7Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item7Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T7 item7 = default; expectedStructureType = item7.StructureType(); @@ -6890,9 +6890,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item7, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item8Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item8Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T8 item8 = default; expectedStructureType = item8.StructureType(); @@ -6911,9 +6911,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item8, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item9Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item9Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T9 item9 = default; expectedStructureType = item9.StructureType(); @@ -6932,9 +6932,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item9, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item10Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item10Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T10 item10 = default; expectedStructureType = item10.StructureType(); @@ -6973,16 +6973,16 @@ public ManagedChain Duplicate() // Block copy original struct data for speed Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); // Update all pointers - ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); - ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); - ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); - ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); - ((Chain*)(newHeadPtr + Item4Offset))->PNext = (Chain*) (newHeadPtr + Item5Offset); - ((Chain*)(newHeadPtr + Item5Offset))->PNext = (Chain*) (newHeadPtr + Item6Offset); - ((Chain*)(newHeadPtr + Item6Offset))->PNext = (Chain*) (newHeadPtr + Item7Offset); - ((Chain*)(newHeadPtr + Item7Offset))->PNext = (Chain*) (newHeadPtr + Item8Offset); - ((Chain*)(newHeadPtr + Item8Offset))->PNext = (Chain*) (newHeadPtr + Item9Offset); - ((Chain*)(newHeadPtr + Item9Offset))->PNext = (Chain*) (newHeadPtr + Item10Offset); + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); + ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); + ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); + ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); + ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item5Offset); + ((BaseInStructure*)(newHeadPtr + Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item6Offset); + ((BaseInStructure*)(newHeadPtr + Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item7Offset); + ((BaseInStructure*)(newHeadPtr + Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item8Offset); + ((BaseInStructure*)(newHeadPtr + Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item9Offset); + ((BaseInStructure*)(newHeadPtr + Item9Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item10Offset); return new ManagedChain(newHeadPtr); } @@ -7007,17 +7007,17 @@ public ManagedChain(ManagedChain pre Marshal.StructureToPtr(item10, _headPtr + previousSize, false); // Update all pointers - ((Chain*)_headPtr)->PNext = (Chain*) (_headPtr + Item1Offset); - ((Chain*)(_headPtr + Item1Offset))->PNext = (Chain*) (_headPtr + Item2Offset); - ((Chain*)(_headPtr + Item2Offset))->PNext = (Chain*) (_headPtr + Item3Offset); - ((Chain*)(_headPtr + Item3Offset))->PNext = (Chain*) (_headPtr + Item4Offset); - ((Chain*)(_headPtr + Item4Offset))->PNext = (Chain*) (_headPtr + Item5Offset); - ((Chain*)(_headPtr + Item5Offset))->PNext = (Chain*) (_headPtr + Item6Offset); - ((Chain*)(_headPtr + Item6Offset))->PNext = (Chain*) (_headPtr + Item7Offset); - ((Chain*)(_headPtr + Item7Offset))->PNext = (Chain*) (_headPtr + Item8Offset); - ((Chain*)(_headPtr + Item8Offset))->PNext = (Chain*) (_headPtr + Item9Offset); - ((Chain*)(_headPtr + Item9Offset))->PNext = (Chain*) (_headPtr + Item10Offset); - ((Chain*)(_headPtr + previousSize))->PNext = null; + ((BaseInStructure*)_headPtr)->PNext = (BaseInStructure*) (_headPtr + Item1Offset); + ((BaseInStructure*)(_headPtr + Item1Offset))->PNext = (BaseInStructure*) (_headPtr + Item2Offset); + ((BaseInStructure*)(_headPtr + Item2Offset))->PNext = (BaseInStructure*) (_headPtr + Item3Offset); + ((BaseInStructure*)(_headPtr + Item3Offset))->PNext = (BaseInStructure*) (_headPtr + Item4Offset); + ((BaseInStructure*)(_headPtr + Item4Offset))->PNext = (BaseInStructure*) (_headPtr + Item5Offset); + ((BaseInStructure*)(_headPtr + Item5Offset))->PNext = (BaseInStructure*) (_headPtr + Item6Offset); + ((BaseInStructure*)(_headPtr + Item6Offset))->PNext = (BaseInStructure*) (_headPtr + Item7Offset); + ((BaseInStructure*)(_headPtr + Item7Offset))->PNext = (BaseInStructure*) (_headPtr + Item8Offset); + ((BaseInStructure*)(_headPtr + Item8Offset))->PNext = (BaseInStructure*) (_headPtr + Item9Offset); + ((BaseInStructure*)(_headPtr + Item9Offset))->PNext = (BaseInStructure*) (_headPtr + Item10Offset); + ((BaseInStructure*)(_headPtr + previousSize))->PNext = null; } /// @@ -7048,16 +7048,16 @@ public ManagedChain Truncate(out T10 // Block copy original struct data for speed Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); // Update all pointers - ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); - ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); - ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); - ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); - ((Chain*)(newHeadPtr + Item4Offset))->PNext = (Chain*) (newHeadPtr + Item5Offset); - ((Chain*)(newHeadPtr + Item5Offset))->PNext = (Chain*) (newHeadPtr + Item6Offset); - ((Chain*)(newHeadPtr + Item6Offset))->PNext = (Chain*) (newHeadPtr + Item7Offset); - ((Chain*)(newHeadPtr + Item7Offset))->PNext = (Chain*) (newHeadPtr + Item8Offset); - ((Chain*)(newHeadPtr + Item8Offset))->PNext = (Chain*) (newHeadPtr + Item9Offset); - ((Chain*)(newHeadPtr + Item9Offset))->PNext = null; + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); + ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); + ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); + ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); + ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item5Offset); + ((BaseInStructure*)(newHeadPtr + Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item6Offset); + ((BaseInStructure*)(newHeadPtr + Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item7Offset); + ((BaseInStructure*)(newHeadPtr + Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item8Offset); + ((BaseInStructure*)(newHeadPtr + Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item9Offset); + ((BaseInStructure*)(newHeadPtr + Item9Offset))->PNext = null; return new ManagedChain(newHeadPtr); } @@ -7322,18 +7322,18 @@ public unsafe class ManagedChain /// Gets a pointer to the current head. /// - public Chain* HeadPtr => (Chain*) _headPtr; + public BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; /// /// Gets or sets the head of the chain. /// public TChain Head { - get => Unsafe.AsRef((Chain*) _headPtr); + get => Unsafe.AsRef((BaseInStructure*) _headPtr); set { value.StructureType(); - var ptr = (Chain*) _headPtr; + var ptr = (BaseInStructure*) _headPtr; var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, _headPtr, true); ptr->PNext = nextPtr; @@ -7343,7 +7343,7 @@ public TChain Head /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item1Ptr => (Chain*) (_headPtr + Item1Offset); + public BaseInStructure* Item1Ptr => (BaseInStructure*) (_headPtr + Item1Offset); /// /// Gets or sets item #1 in the chain. @@ -7364,7 +7364,7 @@ public T1 Item1 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item2Ptr => (Chain*) (_headPtr + Item2Offset); + public BaseInStructure* Item2Ptr => (BaseInStructure*) (_headPtr + Item2Offset); /// /// Gets or sets item #2 in the chain. @@ -7385,7 +7385,7 @@ public T2 Item2 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item3Ptr => (Chain*) (_headPtr + Item3Offset); + public BaseInStructure* Item3Ptr => (BaseInStructure*) (_headPtr + Item3Offset); /// /// Gets or sets item #3 in the chain. @@ -7406,7 +7406,7 @@ public T3 Item3 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item4Ptr => (Chain*) (_headPtr + Item4Offset); + public BaseInStructure* Item4Ptr => (BaseInStructure*) (_headPtr + Item4Offset); /// /// Gets or sets item #4 in the chain. @@ -7427,7 +7427,7 @@ public T4 Item4 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item5Ptr => (Chain*) (_headPtr + Item5Offset); + public BaseInStructure* Item5Ptr => (BaseInStructure*) (_headPtr + Item5Offset); /// /// Gets or sets item #5 in the chain. @@ -7448,7 +7448,7 @@ public T5 Item5 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item6Ptr => (Chain*) (_headPtr + Item6Offset); + public BaseInStructure* Item6Ptr => (BaseInStructure*) (_headPtr + Item6Offset); /// /// Gets or sets item #6 in the chain. @@ -7469,7 +7469,7 @@ public T6 Item6 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item7Ptr => (Chain*) (_headPtr + Item7Offset); + public BaseInStructure* Item7Ptr => (BaseInStructure*) (_headPtr + Item7Offset); /// /// Gets or sets item #7 in the chain. @@ -7490,7 +7490,7 @@ public T7 Item7 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item8Ptr => (Chain*) (_headPtr + Item8Offset); + public BaseInStructure* Item8Ptr => (BaseInStructure*) (_headPtr + Item8Offset); /// /// Gets or sets item #8 in the chain. @@ -7511,7 +7511,7 @@ public T8 Item8 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item9Ptr => (Chain*) (_headPtr + Item9Offset); + public BaseInStructure* Item9Ptr => (BaseInStructure*) (_headPtr + Item9Offset); /// /// Gets or sets item #9 in the chain. @@ -7532,7 +7532,7 @@ public T9 Item9 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item10Ptr => (Chain*) (_headPtr + Item10Offset); + public BaseInStructure* Item10Ptr => (BaseInStructure*) (_headPtr + Item10Offset); /// /// Gets or sets item #10 in the chain. @@ -7553,7 +7553,7 @@ public T10 Item10 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item11Ptr => (Chain*) (_headPtr + Item11Offset); + public BaseInStructure* Item11Ptr => (BaseInStructure*) (_headPtr + Item11Offset); /// /// Gets or sets item #11 in the chain. @@ -7603,7 +7603,7 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul { head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); - Chain* itemPtr = Item1Ptr; + BaseInStructure* itemPtr = Item1Ptr; item1.StructureType(); Marshal.StructureToPtr(item1, (nint)itemPtr, false); HeadPtr->PNext = itemPtr; @@ -7661,12 +7661,12 @@ public ManagedChain(out string errors, TChain chain) chain.StructureType(); Marshal.StructureToPtr(chain, _headPtr, false); StringBuilder errorBuilder = new StringBuilder(); - var existingPtr = (Chain*) Unsafe.AsPointer(ref chain); - var newPtr = (Chain*) _headPtr; + var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); + var newPtr = (BaseInStructure*) _headPtr; - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item1Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item1Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T1 item1 = default; var expectedStructureType = item1.StructureType(); @@ -7685,9 +7685,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item1, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item2Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item2Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T2 item2 = default; expectedStructureType = item2.StructureType(); @@ -7706,9 +7706,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item2, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item3Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item3Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T3 item3 = default; expectedStructureType = item3.StructureType(); @@ -7727,9 +7727,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item3, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item4Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item4Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T4 item4 = default; expectedStructureType = item4.StructureType(); @@ -7748,9 +7748,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item4, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item5Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item5Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T5 item5 = default; expectedStructureType = item5.StructureType(); @@ -7769,9 +7769,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item5, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item6Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item6Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T6 item6 = default; expectedStructureType = item6.StructureType(); @@ -7790,9 +7790,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item6, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item7Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item7Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T7 item7 = default; expectedStructureType = item7.StructureType(); @@ -7811,9 +7811,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item7, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item8Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item8Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T8 item8 = default; expectedStructureType = item8.StructureType(); @@ -7832,9 +7832,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item8, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item9Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item9Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T9 item9 = default; expectedStructureType = item9.StructureType(); @@ -7853,9 +7853,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item9, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item10Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item10Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T10 item10 = default; expectedStructureType = item10.StructureType(); @@ -7874,9 +7874,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item10, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item11Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item11Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T11 item11 = default; expectedStructureType = item11.StructureType(); @@ -7915,17 +7915,17 @@ public ManagedChain Duplic // Block copy original struct data for speed Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); // Update all pointers - ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); - ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); - ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); - ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); - ((Chain*)(newHeadPtr + Item4Offset))->PNext = (Chain*) (newHeadPtr + Item5Offset); - ((Chain*)(newHeadPtr + Item5Offset))->PNext = (Chain*) (newHeadPtr + Item6Offset); - ((Chain*)(newHeadPtr + Item6Offset))->PNext = (Chain*) (newHeadPtr + Item7Offset); - ((Chain*)(newHeadPtr + Item7Offset))->PNext = (Chain*) (newHeadPtr + Item8Offset); - ((Chain*)(newHeadPtr + Item8Offset))->PNext = (Chain*) (newHeadPtr + Item9Offset); - ((Chain*)(newHeadPtr + Item9Offset))->PNext = (Chain*) (newHeadPtr + Item10Offset); - ((Chain*)(newHeadPtr + Item10Offset))->PNext = (Chain*) (newHeadPtr + Item11Offset); + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); + ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); + ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); + ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); + ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item5Offset); + ((BaseInStructure*)(newHeadPtr + Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item6Offset); + ((BaseInStructure*)(newHeadPtr + Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item7Offset); + ((BaseInStructure*)(newHeadPtr + Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item8Offset); + ((BaseInStructure*)(newHeadPtr + Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item9Offset); + ((BaseInStructure*)(newHeadPtr + Item9Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item10Offset); + ((BaseInStructure*)(newHeadPtr + Item10Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item11Offset); return new ManagedChain(newHeadPtr); } @@ -7950,18 +7950,18 @@ public ManagedChain(ManagedChainPNext = (Chain*) (_headPtr + Item1Offset); - ((Chain*)(_headPtr + Item1Offset))->PNext = (Chain*) (_headPtr + Item2Offset); - ((Chain*)(_headPtr + Item2Offset))->PNext = (Chain*) (_headPtr + Item3Offset); - ((Chain*)(_headPtr + Item3Offset))->PNext = (Chain*) (_headPtr + Item4Offset); - ((Chain*)(_headPtr + Item4Offset))->PNext = (Chain*) (_headPtr + Item5Offset); - ((Chain*)(_headPtr + Item5Offset))->PNext = (Chain*) (_headPtr + Item6Offset); - ((Chain*)(_headPtr + Item6Offset))->PNext = (Chain*) (_headPtr + Item7Offset); - ((Chain*)(_headPtr + Item7Offset))->PNext = (Chain*) (_headPtr + Item8Offset); - ((Chain*)(_headPtr + Item8Offset))->PNext = (Chain*) (_headPtr + Item9Offset); - ((Chain*)(_headPtr + Item9Offset))->PNext = (Chain*) (_headPtr + Item10Offset); - ((Chain*)(_headPtr + Item10Offset))->PNext = (Chain*) (_headPtr + Item11Offset); - ((Chain*)(_headPtr + previousSize))->PNext = null; + ((BaseInStructure*)_headPtr)->PNext = (BaseInStructure*) (_headPtr + Item1Offset); + ((BaseInStructure*)(_headPtr + Item1Offset))->PNext = (BaseInStructure*) (_headPtr + Item2Offset); + ((BaseInStructure*)(_headPtr + Item2Offset))->PNext = (BaseInStructure*) (_headPtr + Item3Offset); + ((BaseInStructure*)(_headPtr + Item3Offset))->PNext = (BaseInStructure*) (_headPtr + Item4Offset); + ((BaseInStructure*)(_headPtr + Item4Offset))->PNext = (BaseInStructure*) (_headPtr + Item5Offset); + ((BaseInStructure*)(_headPtr + Item5Offset))->PNext = (BaseInStructure*) (_headPtr + Item6Offset); + ((BaseInStructure*)(_headPtr + Item6Offset))->PNext = (BaseInStructure*) (_headPtr + Item7Offset); + ((BaseInStructure*)(_headPtr + Item7Offset))->PNext = (BaseInStructure*) (_headPtr + Item8Offset); + ((BaseInStructure*)(_headPtr + Item8Offset))->PNext = (BaseInStructure*) (_headPtr + Item9Offset); + ((BaseInStructure*)(_headPtr + Item9Offset))->PNext = (BaseInStructure*) (_headPtr + Item10Offset); + ((BaseInStructure*)(_headPtr + Item10Offset))->PNext = (BaseInStructure*) (_headPtr + Item11Offset); + ((BaseInStructure*)(_headPtr + previousSize))->PNext = null; } /// @@ -7992,17 +7992,17 @@ public ManagedChain Truncate(ou // Block copy original struct data for speed Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); // Update all pointers - ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); - ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); - ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); - ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); - ((Chain*)(newHeadPtr + Item4Offset))->PNext = (Chain*) (newHeadPtr + Item5Offset); - ((Chain*)(newHeadPtr + Item5Offset))->PNext = (Chain*) (newHeadPtr + Item6Offset); - ((Chain*)(newHeadPtr + Item6Offset))->PNext = (Chain*) (newHeadPtr + Item7Offset); - ((Chain*)(newHeadPtr + Item7Offset))->PNext = (Chain*) (newHeadPtr + Item8Offset); - ((Chain*)(newHeadPtr + Item8Offset))->PNext = (Chain*) (newHeadPtr + Item9Offset); - ((Chain*)(newHeadPtr + Item9Offset))->PNext = (Chain*) (newHeadPtr + Item10Offset); - ((Chain*)(newHeadPtr + Item10Offset))->PNext = null; + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); + ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); + ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); + ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); + ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item5Offset); + ((BaseInStructure*)(newHeadPtr + Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item6Offset); + ((BaseInStructure*)(newHeadPtr + Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item7Offset); + ((BaseInStructure*)(newHeadPtr + Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item8Offset); + ((BaseInStructure*)(newHeadPtr + Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item9Offset); + ((BaseInStructure*)(newHeadPtr + Item9Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item10Offset); + ((BaseInStructure*)(newHeadPtr + Item10Offset))->PNext = null; return new ManagedChain(newHeadPtr); } @@ -8284,18 +8284,18 @@ public unsafe class ManagedChain /// Gets a pointer to the current head. /// - public Chain* HeadPtr => (Chain*) _headPtr; + public BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; /// /// Gets or sets the head of the chain. /// public TChain Head { - get => Unsafe.AsRef((Chain*) _headPtr); + get => Unsafe.AsRef((BaseInStructure*) _headPtr); set { value.StructureType(); - var ptr = (Chain*) _headPtr; + var ptr = (BaseInStructure*) _headPtr; var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, _headPtr, true); ptr->PNext = nextPtr; @@ -8305,7 +8305,7 @@ public TChain Head /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item1Ptr => (Chain*) (_headPtr + Item1Offset); + public BaseInStructure* Item1Ptr => (BaseInStructure*) (_headPtr + Item1Offset); /// /// Gets or sets item #1 in the chain. @@ -8326,7 +8326,7 @@ public T1 Item1 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item2Ptr => (Chain*) (_headPtr + Item2Offset); + public BaseInStructure* Item2Ptr => (BaseInStructure*) (_headPtr + Item2Offset); /// /// Gets or sets item #2 in the chain. @@ -8347,7 +8347,7 @@ public T2 Item2 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item3Ptr => (Chain*) (_headPtr + Item3Offset); + public BaseInStructure* Item3Ptr => (BaseInStructure*) (_headPtr + Item3Offset); /// /// Gets or sets item #3 in the chain. @@ -8368,7 +8368,7 @@ public T3 Item3 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item4Ptr => (Chain*) (_headPtr + Item4Offset); + public BaseInStructure* Item4Ptr => (BaseInStructure*) (_headPtr + Item4Offset); /// /// Gets or sets item #4 in the chain. @@ -8389,7 +8389,7 @@ public T4 Item4 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item5Ptr => (Chain*) (_headPtr + Item5Offset); + public BaseInStructure* Item5Ptr => (BaseInStructure*) (_headPtr + Item5Offset); /// /// Gets or sets item #5 in the chain. @@ -8410,7 +8410,7 @@ public T5 Item5 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item6Ptr => (Chain*) (_headPtr + Item6Offset); + public BaseInStructure* Item6Ptr => (BaseInStructure*) (_headPtr + Item6Offset); /// /// Gets or sets item #6 in the chain. @@ -8431,7 +8431,7 @@ public T6 Item6 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item7Ptr => (Chain*) (_headPtr + Item7Offset); + public BaseInStructure* Item7Ptr => (BaseInStructure*) (_headPtr + Item7Offset); /// /// Gets or sets item #7 in the chain. @@ -8452,7 +8452,7 @@ public T7 Item7 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item8Ptr => (Chain*) (_headPtr + Item8Offset); + public BaseInStructure* Item8Ptr => (BaseInStructure*) (_headPtr + Item8Offset); /// /// Gets or sets item #8 in the chain. @@ -8473,7 +8473,7 @@ public T8 Item8 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item9Ptr => (Chain*) (_headPtr + Item9Offset); + public BaseInStructure* Item9Ptr => (BaseInStructure*) (_headPtr + Item9Offset); /// /// Gets or sets item #9 in the chain. @@ -8494,7 +8494,7 @@ public T9 Item9 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item10Ptr => (Chain*) (_headPtr + Item10Offset); + public BaseInStructure* Item10Ptr => (BaseInStructure*) (_headPtr + Item10Offset); /// /// Gets or sets item #10 in the chain. @@ -8515,7 +8515,7 @@ public T10 Item10 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item11Ptr => (Chain*) (_headPtr + Item11Offset); + public BaseInStructure* Item11Ptr => (BaseInStructure*) (_headPtr + Item11Offset); /// /// Gets or sets item #11 in the chain. @@ -8536,7 +8536,7 @@ public T11 Item11 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item12Ptr => (Chain*) (_headPtr + Item12Offset); + public BaseInStructure* Item12Ptr => (BaseInStructure*) (_headPtr + Item12Offset); /// /// Gets or sets item #12 in the chain. @@ -8587,7 +8587,7 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul { head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); - Chain* itemPtr = Item1Ptr; + BaseInStructure* itemPtr = Item1Ptr; item1.StructureType(); Marshal.StructureToPtr(item1, (nint)itemPtr, false); HeadPtr->PNext = itemPtr; @@ -8649,12 +8649,12 @@ public ManagedChain(out string errors, TChain chain) chain.StructureType(); Marshal.StructureToPtr(chain, _headPtr, false); StringBuilder errorBuilder = new StringBuilder(); - var existingPtr = (Chain*) Unsafe.AsPointer(ref chain); - var newPtr = (Chain*) _headPtr; + var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); + var newPtr = (BaseInStructure*) _headPtr; - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item1Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item1Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T1 item1 = default; var expectedStructureType = item1.StructureType(); @@ -8673,9 +8673,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item1, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item2Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item2Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T2 item2 = default; expectedStructureType = item2.StructureType(); @@ -8694,9 +8694,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item2, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item3Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item3Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T3 item3 = default; expectedStructureType = item3.StructureType(); @@ -8715,9 +8715,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item3, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item4Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item4Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T4 item4 = default; expectedStructureType = item4.StructureType(); @@ -8736,9 +8736,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item4, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item5Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item5Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T5 item5 = default; expectedStructureType = item5.StructureType(); @@ -8757,9 +8757,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item5, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item6Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item6Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T6 item6 = default; expectedStructureType = item6.StructureType(); @@ -8778,9 +8778,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item6, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item7Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item7Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T7 item7 = default; expectedStructureType = item7.StructureType(); @@ -8799,9 +8799,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item7, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item8Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item8Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T8 item8 = default; expectedStructureType = item8.StructureType(); @@ -8820,9 +8820,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item8, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item9Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item9Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T9 item9 = default; expectedStructureType = item9.StructureType(); @@ -8841,9 +8841,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item9, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item10Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item10Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T10 item10 = default; expectedStructureType = item10.StructureType(); @@ -8862,9 +8862,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item10, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item11Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item11Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T11 item11 = default; expectedStructureType = item11.StructureType(); @@ -8883,9 +8883,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item11, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item12Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item12Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T12 item12 = default; expectedStructureType = item12.StructureType(); @@ -8924,18 +8924,18 @@ public ManagedChain D // Block copy original struct data for speed Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); // Update all pointers - ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); - ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); - ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); - ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); - ((Chain*)(newHeadPtr + Item4Offset))->PNext = (Chain*) (newHeadPtr + Item5Offset); - ((Chain*)(newHeadPtr + Item5Offset))->PNext = (Chain*) (newHeadPtr + Item6Offset); - ((Chain*)(newHeadPtr + Item6Offset))->PNext = (Chain*) (newHeadPtr + Item7Offset); - ((Chain*)(newHeadPtr + Item7Offset))->PNext = (Chain*) (newHeadPtr + Item8Offset); - ((Chain*)(newHeadPtr + Item8Offset))->PNext = (Chain*) (newHeadPtr + Item9Offset); - ((Chain*)(newHeadPtr + Item9Offset))->PNext = (Chain*) (newHeadPtr + Item10Offset); - ((Chain*)(newHeadPtr + Item10Offset))->PNext = (Chain*) (newHeadPtr + Item11Offset); - ((Chain*)(newHeadPtr + Item11Offset))->PNext = (Chain*) (newHeadPtr + Item12Offset); + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); + ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); + ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); + ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); + ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item5Offset); + ((BaseInStructure*)(newHeadPtr + Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item6Offset); + ((BaseInStructure*)(newHeadPtr + Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item7Offset); + ((BaseInStructure*)(newHeadPtr + Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item8Offset); + ((BaseInStructure*)(newHeadPtr + Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item9Offset); + ((BaseInStructure*)(newHeadPtr + Item9Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item10Offset); + ((BaseInStructure*)(newHeadPtr + Item10Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item11Offset); + ((BaseInStructure*)(newHeadPtr + Item11Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item12Offset); return new ManagedChain(newHeadPtr); } @@ -8960,19 +8960,19 @@ public ManagedChain(ManagedChainPNext = (Chain*) (_headPtr + Item1Offset); - ((Chain*)(_headPtr + Item1Offset))->PNext = (Chain*) (_headPtr + Item2Offset); - ((Chain*)(_headPtr + Item2Offset))->PNext = (Chain*) (_headPtr + Item3Offset); - ((Chain*)(_headPtr + Item3Offset))->PNext = (Chain*) (_headPtr + Item4Offset); - ((Chain*)(_headPtr + Item4Offset))->PNext = (Chain*) (_headPtr + Item5Offset); - ((Chain*)(_headPtr + Item5Offset))->PNext = (Chain*) (_headPtr + Item6Offset); - ((Chain*)(_headPtr + Item6Offset))->PNext = (Chain*) (_headPtr + Item7Offset); - ((Chain*)(_headPtr + Item7Offset))->PNext = (Chain*) (_headPtr + Item8Offset); - ((Chain*)(_headPtr + Item8Offset))->PNext = (Chain*) (_headPtr + Item9Offset); - ((Chain*)(_headPtr + Item9Offset))->PNext = (Chain*) (_headPtr + Item10Offset); - ((Chain*)(_headPtr + Item10Offset))->PNext = (Chain*) (_headPtr + Item11Offset); - ((Chain*)(_headPtr + Item11Offset))->PNext = (Chain*) (_headPtr + Item12Offset); - ((Chain*)(_headPtr + previousSize))->PNext = null; + ((BaseInStructure*)_headPtr)->PNext = (BaseInStructure*) (_headPtr + Item1Offset); + ((BaseInStructure*)(_headPtr + Item1Offset))->PNext = (BaseInStructure*) (_headPtr + Item2Offset); + ((BaseInStructure*)(_headPtr + Item2Offset))->PNext = (BaseInStructure*) (_headPtr + Item3Offset); + ((BaseInStructure*)(_headPtr + Item3Offset))->PNext = (BaseInStructure*) (_headPtr + Item4Offset); + ((BaseInStructure*)(_headPtr + Item4Offset))->PNext = (BaseInStructure*) (_headPtr + Item5Offset); + ((BaseInStructure*)(_headPtr + Item5Offset))->PNext = (BaseInStructure*) (_headPtr + Item6Offset); + ((BaseInStructure*)(_headPtr + Item6Offset))->PNext = (BaseInStructure*) (_headPtr + Item7Offset); + ((BaseInStructure*)(_headPtr + Item7Offset))->PNext = (BaseInStructure*) (_headPtr + Item8Offset); + ((BaseInStructure*)(_headPtr + Item8Offset))->PNext = (BaseInStructure*) (_headPtr + Item9Offset); + ((BaseInStructure*)(_headPtr + Item9Offset))->PNext = (BaseInStructure*) (_headPtr + Item10Offset); + ((BaseInStructure*)(_headPtr + Item10Offset))->PNext = (BaseInStructure*) (_headPtr + Item11Offset); + ((BaseInStructure*)(_headPtr + Item11Offset))->PNext = (BaseInStructure*) (_headPtr + Item12Offset); + ((BaseInStructure*)(_headPtr + previousSize))->PNext = null; } /// @@ -9003,18 +9003,18 @@ public ManagedChain Trunca // Block copy original struct data for speed Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); // Update all pointers - ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); - ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); - ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); - ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); - ((Chain*)(newHeadPtr + Item4Offset))->PNext = (Chain*) (newHeadPtr + Item5Offset); - ((Chain*)(newHeadPtr + Item5Offset))->PNext = (Chain*) (newHeadPtr + Item6Offset); - ((Chain*)(newHeadPtr + Item6Offset))->PNext = (Chain*) (newHeadPtr + Item7Offset); - ((Chain*)(newHeadPtr + Item7Offset))->PNext = (Chain*) (newHeadPtr + Item8Offset); - ((Chain*)(newHeadPtr + Item8Offset))->PNext = (Chain*) (newHeadPtr + Item9Offset); - ((Chain*)(newHeadPtr + Item9Offset))->PNext = (Chain*) (newHeadPtr + Item10Offset); - ((Chain*)(newHeadPtr + Item10Offset))->PNext = (Chain*) (newHeadPtr + Item11Offset); - ((Chain*)(newHeadPtr + Item11Offset))->PNext = null; + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); + ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); + ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); + ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); + ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item5Offset); + ((BaseInStructure*)(newHeadPtr + Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item6Offset); + ((BaseInStructure*)(newHeadPtr + Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item7Offset); + ((BaseInStructure*)(newHeadPtr + Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item8Offset); + ((BaseInStructure*)(newHeadPtr + Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item9Offset); + ((BaseInStructure*)(newHeadPtr + Item9Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item10Offset); + ((BaseInStructure*)(newHeadPtr + Item10Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item11Offset); + ((BaseInStructure*)(newHeadPtr + Item11Offset))->PNext = null; return new ManagedChain(newHeadPtr); } @@ -9313,18 +9313,18 @@ public unsafe class ManagedChain /// Gets a pointer to the current head. /// - public Chain* HeadPtr => (Chain*) _headPtr; + public BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; /// /// Gets or sets the head of the chain. /// public TChain Head { - get => Unsafe.AsRef((Chain*) _headPtr); + get => Unsafe.AsRef((BaseInStructure*) _headPtr); set { value.StructureType(); - var ptr = (Chain*) _headPtr; + var ptr = (BaseInStructure*) _headPtr; var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, _headPtr, true); ptr->PNext = nextPtr; @@ -9334,7 +9334,7 @@ public TChain Head /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item1Ptr => (Chain*) (_headPtr + Item1Offset); + public BaseInStructure* Item1Ptr => (BaseInStructure*) (_headPtr + Item1Offset); /// /// Gets or sets item #1 in the chain. @@ -9355,7 +9355,7 @@ public T1 Item1 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item2Ptr => (Chain*) (_headPtr + Item2Offset); + public BaseInStructure* Item2Ptr => (BaseInStructure*) (_headPtr + Item2Offset); /// /// Gets or sets item #2 in the chain. @@ -9376,7 +9376,7 @@ public T2 Item2 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item3Ptr => (Chain*) (_headPtr + Item3Offset); + public BaseInStructure* Item3Ptr => (BaseInStructure*) (_headPtr + Item3Offset); /// /// Gets or sets item #3 in the chain. @@ -9397,7 +9397,7 @@ public T3 Item3 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item4Ptr => (Chain*) (_headPtr + Item4Offset); + public BaseInStructure* Item4Ptr => (BaseInStructure*) (_headPtr + Item4Offset); /// /// Gets or sets item #4 in the chain. @@ -9418,7 +9418,7 @@ public T4 Item4 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item5Ptr => (Chain*) (_headPtr + Item5Offset); + public BaseInStructure* Item5Ptr => (BaseInStructure*) (_headPtr + Item5Offset); /// /// Gets or sets item #5 in the chain. @@ -9439,7 +9439,7 @@ public T5 Item5 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item6Ptr => (Chain*) (_headPtr + Item6Offset); + public BaseInStructure* Item6Ptr => (BaseInStructure*) (_headPtr + Item6Offset); /// /// Gets or sets item #6 in the chain. @@ -9460,7 +9460,7 @@ public T6 Item6 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item7Ptr => (Chain*) (_headPtr + Item7Offset); + public BaseInStructure* Item7Ptr => (BaseInStructure*) (_headPtr + Item7Offset); /// /// Gets or sets item #7 in the chain. @@ -9481,7 +9481,7 @@ public T7 Item7 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item8Ptr => (Chain*) (_headPtr + Item8Offset); + public BaseInStructure* Item8Ptr => (BaseInStructure*) (_headPtr + Item8Offset); /// /// Gets or sets item #8 in the chain. @@ -9502,7 +9502,7 @@ public T8 Item8 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item9Ptr => (Chain*) (_headPtr + Item9Offset); + public BaseInStructure* Item9Ptr => (BaseInStructure*) (_headPtr + Item9Offset); /// /// Gets or sets item #9 in the chain. @@ -9523,7 +9523,7 @@ public T9 Item9 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item10Ptr => (Chain*) (_headPtr + Item10Offset); + public BaseInStructure* Item10Ptr => (BaseInStructure*) (_headPtr + Item10Offset); /// /// Gets or sets item #10 in the chain. @@ -9544,7 +9544,7 @@ public T10 Item10 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item11Ptr => (Chain*) (_headPtr + Item11Offset); + public BaseInStructure* Item11Ptr => (BaseInStructure*) (_headPtr + Item11Offset); /// /// Gets or sets item #11 in the chain. @@ -9565,7 +9565,7 @@ public T11 Item11 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item12Ptr => (Chain*) (_headPtr + Item12Offset); + public BaseInStructure* Item12Ptr => (BaseInStructure*) (_headPtr + Item12Offset); /// /// Gets or sets item #12 in the chain. @@ -9586,7 +9586,7 @@ public T12 Item12 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item13Ptr => (Chain*) (_headPtr + Item13Offset); + public BaseInStructure* Item13Ptr => (BaseInStructure*) (_headPtr + Item13Offset); /// /// Gets or sets item #13 in the chain. @@ -9638,7 +9638,7 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul { head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); - Chain* itemPtr = Item1Ptr; + BaseInStructure* itemPtr = Item1Ptr; item1.StructureType(); Marshal.StructureToPtr(item1, (nint)itemPtr, false); HeadPtr->PNext = itemPtr; @@ -9704,12 +9704,12 @@ public ManagedChain(out string errors, TChain chain) chain.StructureType(); Marshal.StructureToPtr(chain, _headPtr, false); StringBuilder errorBuilder = new StringBuilder(); - var existingPtr = (Chain*) Unsafe.AsPointer(ref chain); - var newPtr = (Chain*) _headPtr; + var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); + var newPtr = (BaseInStructure*) _headPtr; - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item1Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item1Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T1 item1 = default; var expectedStructureType = item1.StructureType(); @@ -9728,9 +9728,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item1, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item2Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item2Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T2 item2 = default; expectedStructureType = item2.StructureType(); @@ -9749,9 +9749,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item2, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item3Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item3Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T3 item3 = default; expectedStructureType = item3.StructureType(); @@ -9770,9 +9770,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item3, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item4Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item4Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T4 item4 = default; expectedStructureType = item4.StructureType(); @@ -9791,9 +9791,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item4, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item5Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item5Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T5 item5 = default; expectedStructureType = item5.StructureType(); @@ -9812,9 +9812,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item5, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item6Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item6Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T6 item6 = default; expectedStructureType = item6.StructureType(); @@ -9833,9 +9833,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item6, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item7Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item7Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T7 item7 = default; expectedStructureType = item7.StructureType(); @@ -9854,9 +9854,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item7, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item8Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item8Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T8 item8 = default; expectedStructureType = item8.StructureType(); @@ -9875,9 +9875,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item8, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item9Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item9Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T9 item9 = default; expectedStructureType = item9.StructureType(); @@ -9896,9 +9896,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item9, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item10Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item10Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T10 item10 = default; expectedStructureType = item10.StructureType(); @@ -9917,9 +9917,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item10, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item11Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item11Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T11 item11 = default; expectedStructureType = item11.StructureType(); @@ -9938,9 +9938,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item11, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item12Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item12Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T12 item12 = default; expectedStructureType = item12.StructureType(); @@ -9959,9 +9959,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item12, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item13Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item13Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T13 item13 = default; expectedStructureType = item13.StructureType(); @@ -10000,19 +10000,19 @@ public ManagedChainPNext = (Chain*) (newHeadPtr + Item1Offset); - ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); - ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); - ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); - ((Chain*)(newHeadPtr + Item4Offset))->PNext = (Chain*) (newHeadPtr + Item5Offset); - ((Chain*)(newHeadPtr + Item5Offset))->PNext = (Chain*) (newHeadPtr + Item6Offset); - ((Chain*)(newHeadPtr + Item6Offset))->PNext = (Chain*) (newHeadPtr + Item7Offset); - ((Chain*)(newHeadPtr + Item7Offset))->PNext = (Chain*) (newHeadPtr + Item8Offset); - ((Chain*)(newHeadPtr + Item8Offset))->PNext = (Chain*) (newHeadPtr + Item9Offset); - ((Chain*)(newHeadPtr + Item9Offset))->PNext = (Chain*) (newHeadPtr + Item10Offset); - ((Chain*)(newHeadPtr + Item10Offset))->PNext = (Chain*) (newHeadPtr + Item11Offset); - ((Chain*)(newHeadPtr + Item11Offset))->PNext = (Chain*) (newHeadPtr + Item12Offset); - ((Chain*)(newHeadPtr + Item12Offset))->PNext = (Chain*) (newHeadPtr + Item13Offset); + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); + ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); + ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); + ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); + ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item5Offset); + ((BaseInStructure*)(newHeadPtr + Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item6Offset); + ((BaseInStructure*)(newHeadPtr + Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item7Offset); + ((BaseInStructure*)(newHeadPtr + Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item8Offset); + ((BaseInStructure*)(newHeadPtr + Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item9Offset); + ((BaseInStructure*)(newHeadPtr + Item9Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item10Offset); + ((BaseInStructure*)(newHeadPtr + Item10Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item11Offset); + ((BaseInStructure*)(newHeadPtr + Item11Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item12Offset); + ((BaseInStructure*)(newHeadPtr + Item12Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item13Offset); return new ManagedChain(newHeadPtr); } @@ -10037,20 +10037,20 @@ public ManagedChain(ManagedChainPNext = (Chain*) (_headPtr + Item1Offset); - ((Chain*)(_headPtr + Item1Offset))->PNext = (Chain*) (_headPtr + Item2Offset); - ((Chain*)(_headPtr + Item2Offset))->PNext = (Chain*) (_headPtr + Item3Offset); - ((Chain*)(_headPtr + Item3Offset))->PNext = (Chain*) (_headPtr + Item4Offset); - ((Chain*)(_headPtr + Item4Offset))->PNext = (Chain*) (_headPtr + Item5Offset); - ((Chain*)(_headPtr + Item5Offset))->PNext = (Chain*) (_headPtr + Item6Offset); - ((Chain*)(_headPtr + Item6Offset))->PNext = (Chain*) (_headPtr + Item7Offset); - ((Chain*)(_headPtr + Item7Offset))->PNext = (Chain*) (_headPtr + Item8Offset); - ((Chain*)(_headPtr + Item8Offset))->PNext = (Chain*) (_headPtr + Item9Offset); - ((Chain*)(_headPtr + Item9Offset))->PNext = (Chain*) (_headPtr + Item10Offset); - ((Chain*)(_headPtr + Item10Offset))->PNext = (Chain*) (_headPtr + Item11Offset); - ((Chain*)(_headPtr + Item11Offset))->PNext = (Chain*) (_headPtr + Item12Offset); - ((Chain*)(_headPtr + Item12Offset))->PNext = (Chain*) (_headPtr + Item13Offset); - ((Chain*)(_headPtr + previousSize))->PNext = null; + ((BaseInStructure*)_headPtr)->PNext = (BaseInStructure*) (_headPtr + Item1Offset); + ((BaseInStructure*)(_headPtr + Item1Offset))->PNext = (BaseInStructure*) (_headPtr + Item2Offset); + ((BaseInStructure*)(_headPtr + Item2Offset))->PNext = (BaseInStructure*) (_headPtr + Item3Offset); + ((BaseInStructure*)(_headPtr + Item3Offset))->PNext = (BaseInStructure*) (_headPtr + Item4Offset); + ((BaseInStructure*)(_headPtr + Item4Offset))->PNext = (BaseInStructure*) (_headPtr + Item5Offset); + ((BaseInStructure*)(_headPtr + Item5Offset))->PNext = (BaseInStructure*) (_headPtr + Item6Offset); + ((BaseInStructure*)(_headPtr + Item6Offset))->PNext = (BaseInStructure*) (_headPtr + Item7Offset); + ((BaseInStructure*)(_headPtr + Item7Offset))->PNext = (BaseInStructure*) (_headPtr + Item8Offset); + ((BaseInStructure*)(_headPtr + Item8Offset))->PNext = (BaseInStructure*) (_headPtr + Item9Offset); + ((BaseInStructure*)(_headPtr + Item9Offset))->PNext = (BaseInStructure*) (_headPtr + Item10Offset); + ((BaseInStructure*)(_headPtr + Item10Offset))->PNext = (BaseInStructure*) (_headPtr + Item11Offset); + ((BaseInStructure*)(_headPtr + Item11Offset))->PNext = (BaseInStructure*) (_headPtr + Item12Offset); + ((BaseInStructure*)(_headPtr + Item12Offset))->PNext = (BaseInStructure*) (_headPtr + Item13Offset); + ((BaseInStructure*)(_headPtr + previousSize))->PNext = null; } /// @@ -10081,19 +10081,19 @@ public ManagedChain T // Block copy original struct data for speed Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); // Update all pointers - ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); - ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); - ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); - ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); - ((Chain*)(newHeadPtr + Item4Offset))->PNext = (Chain*) (newHeadPtr + Item5Offset); - ((Chain*)(newHeadPtr + Item5Offset))->PNext = (Chain*) (newHeadPtr + Item6Offset); - ((Chain*)(newHeadPtr + Item6Offset))->PNext = (Chain*) (newHeadPtr + Item7Offset); - ((Chain*)(newHeadPtr + Item7Offset))->PNext = (Chain*) (newHeadPtr + Item8Offset); - ((Chain*)(newHeadPtr + Item8Offset))->PNext = (Chain*) (newHeadPtr + Item9Offset); - ((Chain*)(newHeadPtr + Item9Offset))->PNext = (Chain*) (newHeadPtr + Item10Offset); - ((Chain*)(newHeadPtr + Item10Offset))->PNext = (Chain*) (newHeadPtr + Item11Offset); - ((Chain*)(newHeadPtr + Item11Offset))->PNext = (Chain*) (newHeadPtr + Item12Offset); - ((Chain*)(newHeadPtr + Item12Offset))->PNext = null; + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); + ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); + ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); + ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); + ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item5Offset); + ((BaseInStructure*)(newHeadPtr + Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item6Offset); + ((BaseInStructure*)(newHeadPtr + Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item7Offset); + ((BaseInStructure*)(newHeadPtr + Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item8Offset); + ((BaseInStructure*)(newHeadPtr + Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item9Offset); + ((BaseInStructure*)(newHeadPtr + Item9Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item10Offset); + ((BaseInStructure*)(newHeadPtr + Item10Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item11Offset); + ((BaseInStructure*)(newHeadPtr + Item11Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item12Offset); + ((BaseInStructure*)(newHeadPtr + Item12Offset))->PNext = null; return new ManagedChain(newHeadPtr); } @@ -10409,18 +10409,18 @@ public unsafe class ManagedChain /// Gets a pointer to the current head. /// - public Chain* HeadPtr => (Chain*) _headPtr; + public BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; /// /// Gets or sets the head of the chain. /// public TChain Head { - get => Unsafe.AsRef((Chain*) _headPtr); + get => Unsafe.AsRef((BaseInStructure*) _headPtr); set { value.StructureType(); - var ptr = (Chain*) _headPtr; + var ptr = (BaseInStructure*) _headPtr; var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, _headPtr, true); ptr->PNext = nextPtr; @@ -10430,7 +10430,7 @@ public TChain Head /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item1Ptr => (Chain*) (_headPtr + Item1Offset); + public BaseInStructure* Item1Ptr => (BaseInStructure*) (_headPtr + Item1Offset); /// /// Gets or sets item #1 in the chain. @@ -10451,7 +10451,7 @@ public T1 Item1 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item2Ptr => (Chain*) (_headPtr + Item2Offset); + public BaseInStructure* Item2Ptr => (BaseInStructure*) (_headPtr + Item2Offset); /// /// Gets or sets item #2 in the chain. @@ -10472,7 +10472,7 @@ public T2 Item2 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item3Ptr => (Chain*) (_headPtr + Item3Offset); + public BaseInStructure* Item3Ptr => (BaseInStructure*) (_headPtr + Item3Offset); /// /// Gets or sets item #3 in the chain. @@ -10493,7 +10493,7 @@ public T3 Item3 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item4Ptr => (Chain*) (_headPtr + Item4Offset); + public BaseInStructure* Item4Ptr => (BaseInStructure*) (_headPtr + Item4Offset); /// /// Gets or sets item #4 in the chain. @@ -10514,7 +10514,7 @@ public T4 Item4 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item5Ptr => (Chain*) (_headPtr + Item5Offset); + public BaseInStructure* Item5Ptr => (BaseInStructure*) (_headPtr + Item5Offset); /// /// Gets or sets item #5 in the chain. @@ -10535,7 +10535,7 @@ public T5 Item5 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item6Ptr => (Chain*) (_headPtr + Item6Offset); + public BaseInStructure* Item6Ptr => (BaseInStructure*) (_headPtr + Item6Offset); /// /// Gets or sets item #6 in the chain. @@ -10556,7 +10556,7 @@ public T6 Item6 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item7Ptr => (Chain*) (_headPtr + Item7Offset); + public BaseInStructure* Item7Ptr => (BaseInStructure*) (_headPtr + Item7Offset); /// /// Gets or sets item #7 in the chain. @@ -10577,7 +10577,7 @@ public T7 Item7 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item8Ptr => (Chain*) (_headPtr + Item8Offset); + public BaseInStructure* Item8Ptr => (BaseInStructure*) (_headPtr + Item8Offset); /// /// Gets or sets item #8 in the chain. @@ -10598,7 +10598,7 @@ public T8 Item8 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item9Ptr => (Chain*) (_headPtr + Item9Offset); + public BaseInStructure* Item9Ptr => (BaseInStructure*) (_headPtr + Item9Offset); /// /// Gets or sets item #9 in the chain. @@ -10619,7 +10619,7 @@ public T9 Item9 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item10Ptr => (Chain*) (_headPtr + Item10Offset); + public BaseInStructure* Item10Ptr => (BaseInStructure*) (_headPtr + Item10Offset); /// /// Gets or sets item #10 in the chain. @@ -10640,7 +10640,7 @@ public T10 Item10 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item11Ptr => (Chain*) (_headPtr + Item11Offset); + public BaseInStructure* Item11Ptr => (BaseInStructure*) (_headPtr + Item11Offset); /// /// Gets or sets item #11 in the chain. @@ -10661,7 +10661,7 @@ public T11 Item11 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item12Ptr => (Chain*) (_headPtr + Item12Offset); + public BaseInStructure* Item12Ptr => (BaseInStructure*) (_headPtr + Item12Offset); /// /// Gets or sets item #12 in the chain. @@ -10682,7 +10682,7 @@ public T12 Item12 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item13Ptr => (Chain*) (_headPtr + Item13Offset); + public BaseInStructure* Item13Ptr => (BaseInStructure*) (_headPtr + Item13Offset); /// /// Gets or sets item #13 in the chain. @@ -10703,7 +10703,7 @@ public T13 Item13 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item14Ptr => (Chain*) (_headPtr + Item14Offset); + public BaseInStructure* Item14Ptr => (BaseInStructure*) (_headPtr + Item14Offset); /// /// Gets or sets item #14 in the chain. @@ -10756,7 +10756,7 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul { head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); - Chain* itemPtr = Item1Ptr; + BaseInStructure* itemPtr = Item1Ptr; item1.StructureType(); Marshal.StructureToPtr(item1, (nint)itemPtr, false); HeadPtr->PNext = itemPtr; @@ -10826,12 +10826,12 @@ public ManagedChain(out string errors, TChain chain) chain.StructureType(); Marshal.StructureToPtr(chain, _headPtr, false); StringBuilder errorBuilder = new StringBuilder(); - var existingPtr = (Chain*) Unsafe.AsPointer(ref chain); - var newPtr = (Chain*) _headPtr; + var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); + var newPtr = (BaseInStructure*) _headPtr; - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item1Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item1Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T1 item1 = default; var expectedStructureType = item1.StructureType(); @@ -10850,9 +10850,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item1, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item2Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item2Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T2 item2 = default; expectedStructureType = item2.StructureType(); @@ -10871,9 +10871,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item2, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item3Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item3Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T3 item3 = default; expectedStructureType = item3.StructureType(); @@ -10892,9 +10892,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item3, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item4Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item4Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T4 item4 = default; expectedStructureType = item4.StructureType(); @@ -10913,9 +10913,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item4, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item5Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item5Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T5 item5 = default; expectedStructureType = item5.StructureType(); @@ -10934,9 +10934,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item5, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item6Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item6Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T6 item6 = default; expectedStructureType = item6.StructureType(); @@ -10955,9 +10955,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item6, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item7Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item7Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T7 item7 = default; expectedStructureType = item7.StructureType(); @@ -10976,9 +10976,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item7, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item8Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item8Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T8 item8 = default; expectedStructureType = item8.StructureType(); @@ -10997,9 +10997,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item8, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item9Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item9Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T9 item9 = default; expectedStructureType = item9.StructureType(); @@ -11018,9 +11018,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item9, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item10Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item10Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T10 item10 = default; expectedStructureType = item10.StructureType(); @@ -11039,9 +11039,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item10, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item11Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item11Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T11 item11 = default; expectedStructureType = item11.StructureType(); @@ -11060,9 +11060,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item11, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item12Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item12Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T12 item12 = default; expectedStructureType = item12.StructureType(); @@ -11081,9 +11081,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item12, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item13Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item13Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T13 item13 = default; expectedStructureType = item13.StructureType(); @@ -11102,9 +11102,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item13, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item14Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item14Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T14 item14 = default; expectedStructureType = item14.StructureType(); @@ -11143,20 +11143,20 @@ public ManagedChainPNext = (Chain*) (newHeadPtr + Item1Offset); - ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); - ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); - ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); - ((Chain*)(newHeadPtr + Item4Offset))->PNext = (Chain*) (newHeadPtr + Item5Offset); - ((Chain*)(newHeadPtr + Item5Offset))->PNext = (Chain*) (newHeadPtr + Item6Offset); - ((Chain*)(newHeadPtr + Item6Offset))->PNext = (Chain*) (newHeadPtr + Item7Offset); - ((Chain*)(newHeadPtr + Item7Offset))->PNext = (Chain*) (newHeadPtr + Item8Offset); - ((Chain*)(newHeadPtr + Item8Offset))->PNext = (Chain*) (newHeadPtr + Item9Offset); - ((Chain*)(newHeadPtr + Item9Offset))->PNext = (Chain*) (newHeadPtr + Item10Offset); - ((Chain*)(newHeadPtr + Item10Offset))->PNext = (Chain*) (newHeadPtr + Item11Offset); - ((Chain*)(newHeadPtr + Item11Offset))->PNext = (Chain*) (newHeadPtr + Item12Offset); - ((Chain*)(newHeadPtr + Item12Offset))->PNext = (Chain*) (newHeadPtr + Item13Offset); - ((Chain*)(newHeadPtr + Item13Offset))->PNext = (Chain*) (newHeadPtr + Item14Offset); + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); + ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); + ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); + ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); + ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item5Offset); + ((BaseInStructure*)(newHeadPtr + Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item6Offset); + ((BaseInStructure*)(newHeadPtr + Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item7Offset); + ((BaseInStructure*)(newHeadPtr + Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item8Offset); + ((BaseInStructure*)(newHeadPtr + Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item9Offset); + ((BaseInStructure*)(newHeadPtr + Item9Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item10Offset); + ((BaseInStructure*)(newHeadPtr + Item10Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item11Offset); + ((BaseInStructure*)(newHeadPtr + Item11Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item12Offset); + ((BaseInStructure*)(newHeadPtr + Item12Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item13Offset); + ((BaseInStructure*)(newHeadPtr + Item13Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item14Offset); return new ManagedChain(newHeadPtr); } @@ -11181,21 +11181,21 @@ public ManagedChain(ManagedChainPNext = (Chain*) (_headPtr + Item1Offset); - ((Chain*)(_headPtr + Item1Offset))->PNext = (Chain*) (_headPtr + Item2Offset); - ((Chain*)(_headPtr + Item2Offset))->PNext = (Chain*) (_headPtr + Item3Offset); - ((Chain*)(_headPtr + Item3Offset))->PNext = (Chain*) (_headPtr + Item4Offset); - ((Chain*)(_headPtr + Item4Offset))->PNext = (Chain*) (_headPtr + Item5Offset); - ((Chain*)(_headPtr + Item5Offset))->PNext = (Chain*) (_headPtr + Item6Offset); - ((Chain*)(_headPtr + Item6Offset))->PNext = (Chain*) (_headPtr + Item7Offset); - ((Chain*)(_headPtr + Item7Offset))->PNext = (Chain*) (_headPtr + Item8Offset); - ((Chain*)(_headPtr + Item8Offset))->PNext = (Chain*) (_headPtr + Item9Offset); - ((Chain*)(_headPtr + Item9Offset))->PNext = (Chain*) (_headPtr + Item10Offset); - ((Chain*)(_headPtr + Item10Offset))->PNext = (Chain*) (_headPtr + Item11Offset); - ((Chain*)(_headPtr + Item11Offset))->PNext = (Chain*) (_headPtr + Item12Offset); - ((Chain*)(_headPtr + Item12Offset))->PNext = (Chain*) (_headPtr + Item13Offset); - ((Chain*)(_headPtr + Item13Offset))->PNext = (Chain*) (_headPtr + Item14Offset); - ((Chain*)(_headPtr + previousSize))->PNext = null; + ((BaseInStructure*)_headPtr)->PNext = (BaseInStructure*) (_headPtr + Item1Offset); + ((BaseInStructure*)(_headPtr + Item1Offset))->PNext = (BaseInStructure*) (_headPtr + Item2Offset); + ((BaseInStructure*)(_headPtr + Item2Offset))->PNext = (BaseInStructure*) (_headPtr + Item3Offset); + ((BaseInStructure*)(_headPtr + Item3Offset))->PNext = (BaseInStructure*) (_headPtr + Item4Offset); + ((BaseInStructure*)(_headPtr + Item4Offset))->PNext = (BaseInStructure*) (_headPtr + Item5Offset); + ((BaseInStructure*)(_headPtr + Item5Offset))->PNext = (BaseInStructure*) (_headPtr + Item6Offset); + ((BaseInStructure*)(_headPtr + Item6Offset))->PNext = (BaseInStructure*) (_headPtr + Item7Offset); + ((BaseInStructure*)(_headPtr + Item7Offset))->PNext = (BaseInStructure*) (_headPtr + Item8Offset); + ((BaseInStructure*)(_headPtr + Item8Offset))->PNext = (BaseInStructure*) (_headPtr + Item9Offset); + ((BaseInStructure*)(_headPtr + Item9Offset))->PNext = (BaseInStructure*) (_headPtr + Item10Offset); + ((BaseInStructure*)(_headPtr + Item10Offset))->PNext = (BaseInStructure*) (_headPtr + Item11Offset); + ((BaseInStructure*)(_headPtr + Item11Offset))->PNext = (BaseInStructure*) (_headPtr + Item12Offset); + ((BaseInStructure*)(_headPtr + Item12Offset))->PNext = (BaseInStructure*) (_headPtr + Item13Offset); + ((BaseInStructure*)(_headPtr + Item13Offset))->PNext = (BaseInStructure*) (_headPtr + Item14Offset); + ((BaseInStructure*)(_headPtr + previousSize))->PNext = null; } /// @@ -11226,20 +11226,20 @@ public ManagedChainPNext = (Chain*) (newHeadPtr + Item1Offset); - ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); - ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); - ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); - ((Chain*)(newHeadPtr + Item4Offset))->PNext = (Chain*) (newHeadPtr + Item5Offset); - ((Chain*)(newHeadPtr + Item5Offset))->PNext = (Chain*) (newHeadPtr + Item6Offset); - ((Chain*)(newHeadPtr + Item6Offset))->PNext = (Chain*) (newHeadPtr + Item7Offset); - ((Chain*)(newHeadPtr + Item7Offset))->PNext = (Chain*) (newHeadPtr + Item8Offset); - ((Chain*)(newHeadPtr + Item8Offset))->PNext = (Chain*) (newHeadPtr + Item9Offset); - ((Chain*)(newHeadPtr + Item9Offset))->PNext = (Chain*) (newHeadPtr + Item10Offset); - ((Chain*)(newHeadPtr + Item10Offset))->PNext = (Chain*) (newHeadPtr + Item11Offset); - ((Chain*)(newHeadPtr + Item11Offset))->PNext = (Chain*) (newHeadPtr + Item12Offset); - ((Chain*)(newHeadPtr + Item12Offset))->PNext = (Chain*) (newHeadPtr + Item13Offset); - ((Chain*)(newHeadPtr + Item13Offset))->PNext = null; + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); + ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); + ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); + ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); + ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item5Offset); + ((BaseInStructure*)(newHeadPtr + Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item6Offset); + ((BaseInStructure*)(newHeadPtr + Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item7Offset); + ((BaseInStructure*)(newHeadPtr + Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item8Offset); + ((BaseInStructure*)(newHeadPtr + Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item9Offset); + ((BaseInStructure*)(newHeadPtr + Item9Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item10Offset); + ((BaseInStructure*)(newHeadPtr + Item10Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item11Offset); + ((BaseInStructure*)(newHeadPtr + Item11Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item12Offset); + ((BaseInStructure*)(newHeadPtr + Item12Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item13Offset); + ((BaseInStructure*)(newHeadPtr + Item13Offset))->PNext = null; return new ManagedChain(newHeadPtr); } @@ -11572,18 +11572,18 @@ public unsafe class ManagedChain /// Gets a pointer to the current head. /// - public Chain* HeadPtr => (Chain*) _headPtr; + public BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; /// /// Gets or sets the head of the chain. /// public TChain Head { - get => Unsafe.AsRef((Chain*) _headPtr); + get => Unsafe.AsRef((BaseInStructure*) _headPtr); set { value.StructureType(); - var ptr = (Chain*) _headPtr; + var ptr = (BaseInStructure*) _headPtr; var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, _headPtr, true); ptr->PNext = nextPtr; @@ -11593,7 +11593,7 @@ public TChain Head /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item1Ptr => (Chain*) (_headPtr + Item1Offset); + public BaseInStructure* Item1Ptr => (BaseInStructure*) (_headPtr + Item1Offset); /// /// Gets or sets item #1 in the chain. @@ -11614,7 +11614,7 @@ public T1 Item1 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item2Ptr => (Chain*) (_headPtr + Item2Offset); + public BaseInStructure* Item2Ptr => (BaseInStructure*) (_headPtr + Item2Offset); /// /// Gets or sets item #2 in the chain. @@ -11635,7 +11635,7 @@ public T2 Item2 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item3Ptr => (Chain*) (_headPtr + Item3Offset); + public BaseInStructure* Item3Ptr => (BaseInStructure*) (_headPtr + Item3Offset); /// /// Gets or sets item #3 in the chain. @@ -11656,7 +11656,7 @@ public T3 Item3 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item4Ptr => (Chain*) (_headPtr + Item4Offset); + public BaseInStructure* Item4Ptr => (BaseInStructure*) (_headPtr + Item4Offset); /// /// Gets or sets item #4 in the chain. @@ -11677,7 +11677,7 @@ public T4 Item4 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item5Ptr => (Chain*) (_headPtr + Item5Offset); + public BaseInStructure* Item5Ptr => (BaseInStructure*) (_headPtr + Item5Offset); /// /// Gets or sets item #5 in the chain. @@ -11698,7 +11698,7 @@ public T5 Item5 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item6Ptr => (Chain*) (_headPtr + Item6Offset); + public BaseInStructure* Item6Ptr => (BaseInStructure*) (_headPtr + Item6Offset); /// /// Gets or sets item #6 in the chain. @@ -11719,7 +11719,7 @@ public T6 Item6 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item7Ptr => (Chain*) (_headPtr + Item7Offset); + public BaseInStructure* Item7Ptr => (BaseInStructure*) (_headPtr + Item7Offset); /// /// Gets or sets item #7 in the chain. @@ -11740,7 +11740,7 @@ public T7 Item7 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item8Ptr => (Chain*) (_headPtr + Item8Offset); + public BaseInStructure* Item8Ptr => (BaseInStructure*) (_headPtr + Item8Offset); /// /// Gets or sets item #8 in the chain. @@ -11761,7 +11761,7 @@ public T8 Item8 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item9Ptr => (Chain*) (_headPtr + Item9Offset); + public BaseInStructure* Item9Ptr => (BaseInStructure*) (_headPtr + Item9Offset); /// /// Gets or sets item #9 in the chain. @@ -11782,7 +11782,7 @@ public T9 Item9 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item10Ptr => (Chain*) (_headPtr + Item10Offset); + public BaseInStructure* Item10Ptr => (BaseInStructure*) (_headPtr + Item10Offset); /// /// Gets or sets item #10 in the chain. @@ -11803,7 +11803,7 @@ public T10 Item10 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item11Ptr => (Chain*) (_headPtr + Item11Offset); + public BaseInStructure* Item11Ptr => (BaseInStructure*) (_headPtr + Item11Offset); /// /// Gets or sets item #11 in the chain. @@ -11824,7 +11824,7 @@ public T11 Item11 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item12Ptr => (Chain*) (_headPtr + Item12Offset); + public BaseInStructure* Item12Ptr => (BaseInStructure*) (_headPtr + Item12Offset); /// /// Gets or sets item #12 in the chain. @@ -11845,7 +11845,7 @@ public T12 Item12 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item13Ptr => (Chain*) (_headPtr + Item13Offset); + public BaseInStructure* Item13Ptr => (BaseInStructure*) (_headPtr + Item13Offset); /// /// Gets or sets item #13 in the chain. @@ -11866,7 +11866,7 @@ public T13 Item13 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item14Ptr => (Chain*) (_headPtr + Item14Offset); + public BaseInStructure* Item14Ptr => (BaseInStructure*) (_headPtr + Item14Offset); /// /// Gets or sets item #14 in the chain. @@ -11887,7 +11887,7 @@ public T14 Item14 /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item15Ptr => (Chain*) (_headPtr + Item15Offset); + public BaseInStructure* Item15Ptr => (BaseInStructure*) (_headPtr + Item15Offset); /// /// Gets or sets item #15 in the chain. @@ -11941,7 +11941,7 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul { head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); - Chain* itemPtr = Item1Ptr; + BaseInStructure* itemPtr = Item1Ptr; item1.StructureType(); Marshal.StructureToPtr(item1, (nint)itemPtr, false); HeadPtr->PNext = itemPtr; @@ -12015,12 +12015,12 @@ public ManagedChain(out string errors, TChain chain) chain.StructureType(); Marshal.StructureToPtr(chain, _headPtr, false); StringBuilder errorBuilder = new StringBuilder(); - var existingPtr = (Chain*) Unsafe.AsPointer(ref chain); - var newPtr = (Chain*) _headPtr; + var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); + var newPtr = (BaseInStructure*) _headPtr; - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item1Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item1Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T1 item1 = default; var expectedStructureType = item1.StructureType(); @@ -12039,9 +12039,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item1, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item2Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item2Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T2 item2 = default; expectedStructureType = item2.StructureType(); @@ -12060,9 +12060,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item2, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item3Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item3Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T3 item3 = default; expectedStructureType = item3.StructureType(); @@ -12081,9 +12081,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item3, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item4Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item4Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T4 item4 = default; expectedStructureType = item4.StructureType(); @@ -12102,9 +12102,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item4, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item5Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item5Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T5 item5 = default; expectedStructureType = item5.StructureType(); @@ -12123,9 +12123,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item5, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item6Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item6Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T6 item6 = default; expectedStructureType = item6.StructureType(); @@ -12144,9 +12144,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item6, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item7Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item7Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T7 item7 = default; expectedStructureType = item7.StructureType(); @@ -12165,9 +12165,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item7, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item8Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item8Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T8 item8 = default; expectedStructureType = item8.StructureType(); @@ -12186,9 +12186,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item8, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item9Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item9Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T9 item9 = default; expectedStructureType = item9.StructureType(); @@ -12207,9 +12207,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item9, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item10Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item10Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T10 item10 = default; expectedStructureType = item10.StructureType(); @@ -12228,9 +12228,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item10, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item11Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item11Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T11 item11 = default; expectedStructureType = item11.StructureType(); @@ -12249,9 +12249,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item11, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item12Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item12Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T12 item12 = default; expectedStructureType = item12.StructureType(); @@ -12270,9 +12270,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item12, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item13Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item13Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T13 item13 = default; expectedStructureType = item13.StructureType(); @@ -12291,9 +12291,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item13, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item14Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item14Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T14 item14 = default; expectedStructureType = item14.StructureType(); @@ -12312,9 +12312,9 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item14, (nint) newPtr, false); - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item15Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item15Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T15 item15 = default; expectedStructureType = item15.StructureType(); @@ -12353,21 +12353,21 @@ public ManagedChainPNext = (Chain*) (newHeadPtr + Item1Offset); - ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); - ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); - ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); - ((Chain*)(newHeadPtr + Item4Offset))->PNext = (Chain*) (newHeadPtr + Item5Offset); - ((Chain*)(newHeadPtr + Item5Offset))->PNext = (Chain*) (newHeadPtr + Item6Offset); - ((Chain*)(newHeadPtr + Item6Offset))->PNext = (Chain*) (newHeadPtr + Item7Offset); - ((Chain*)(newHeadPtr + Item7Offset))->PNext = (Chain*) (newHeadPtr + Item8Offset); - ((Chain*)(newHeadPtr + Item8Offset))->PNext = (Chain*) (newHeadPtr + Item9Offset); - ((Chain*)(newHeadPtr + Item9Offset))->PNext = (Chain*) (newHeadPtr + Item10Offset); - ((Chain*)(newHeadPtr + Item10Offset))->PNext = (Chain*) (newHeadPtr + Item11Offset); - ((Chain*)(newHeadPtr + Item11Offset))->PNext = (Chain*) (newHeadPtr + Item12Offset); - ((Chain*)(newHeadPtr + Item12Offset))->PNext = (Chain*) (newHeadPtr + Item13Offset); - ((Chain*)(newHeadPtr + Item13Offset))->PNext = (Chain*) (newHeadPtr + Item14Offset); - ((Chain*)(newHeadPtr + Item14Offset))->PNext = (Chain*) (newHeadPtr + Item15Offset); + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); + ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); + ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); + ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); + ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item5Offset); + ((BaseInStructure*)(newHeadPtr + Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item6Offset); + ((BaseInStructure*)(newHeadPtr + Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item7Offset); + ((BaseInStructure*)(newHeadPtr + Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item8Offset); + ((BaseInStructure*)(newHeadPtr + Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item9Offset); + ((BaseInStructure*)(newHeadPtr + Item9Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item10Offset); + ((BaseInStructure*)(newHeadPtr + Item10Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item11Offset); + ((BaseInStructure*)(newHeadPtr + Item11Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item12Offset); + ((BaseInStructure*)(newHeadPtr + Item12Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item13Offset); + ((BaseInStructure*)(newHeadPtr + Item13Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item14Offset); + ((BaseInStructure*)(newHeadPtr + Item14Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item15Offset); return new ManagedChain(newHeadPtr); } @@ -12392,22 +12392,22 @@ public ManagedChain(ManagedChainPNext = (Chain*) (_headPtr + Item1Offset); - ((Chain*)(_headPtr + Item1Offset))->PNext = (Chain*) (_headPtr + Item2Offset); - ((Chain*)(_headPtr + Item2Offset))->PNext = (Chain*) (_headPtr + Item3Offset); - ((Chain*)(_headPtr + Item3Offset))->PNext = (Chain*) (_headPtr + Item4Offset); - ((Chain*)(_headPtr + Item4Offset))->PNext = (Chain*) (_headPtr + Item5Offset); - ((Chain*)(_headPtr + Item5Offset))->PNext = (Chain*) (_headPtr + Item6Offset); - ((Chain*)(_headPtr + Item6Offset))->PNext = (Chain*) (_headPtr + Item7Offset); - ((Chain*)(_headPtr + Item7Offset))->PNext = (Chain*) (_headPtr + Item8Offset); - ((Chain*)(_headPtr + Item8Offset))->PNext = (Chain*) (_headPtr + Item9Offset); - ((Chain*)(_headPtr + Item9Offset))->PNext = (Chain*) (_headPtr + Item10Offset); - ((Chain*)(_headPtr + Item10Offset))->PNext = (Chain*) (_headPtr + Item11Offset); - ((Chain*)(_headPtr + Item11Offset))->PNext = (Chain*) (_headPtr + Item12Offset); - ((Chain*)(_headPtr + Item12Offset))->PNext = (Chain*) (_headPtr + Item13Offset); - ((Chain*)(_headPtr + Item13Offset))->PNext = (Chain*) (_headPtr + Item14Offset); - ((Chain*)(_headPtr + Item14Offset))->PNext = (Chain*) (_headPtr + Item15Offset); - ((Chain*)(_headPtr + previousSize))->PNext = null; + ((BaseInStructure*)_headPtr)->PNext = (BaseInStructure*) (_headPtr + Item1Offset); + ((BaseInStructure*)(_headPtr + Item1Offset))->PNext = (BaseInStructure*) (_headPtr + Item2Offset); + ((BaseInStructure*)(_headPtr + Item2Offset))->PNext = (BaseInStructure*) (_headPtr + Item3Offset); + ((BaseInStructure*)(_headPtr + Item3Offset))->PNext = (BaseInStructure*) (_headPtr + Item4Offset); + ((BaseInStructure*)(_headPtr + Item4Offset))->PNext = (BaseInStructure*) (_headPtr + Item5Offset); + ((BaseInStructure*)(_headPtr + Item5Offset))->PNext = (BaseInStructure*) (_headPtr + Item6Offset); + ((BaseInStructure*)(_headPtr + Item6Offset))->PNext = (BaseInStructure*) (_headPtr + Item7Offset); + ((BaseInStructure*)(_headPtr + Item7Offset))->PNext = (BaseInStructure*) (_headPtr + Item8Offset); + ((BaseInStructure*)(_headPtr + Item8Offset))->PNext = (BaseInStructure*) (_headPtr + Item9Offset); + ((BaseInStructure*)(_headPtr + Item9Offset))->PNext = (BaseInStructure*) (_headPtr + Item10Offset); + ((BaseInStructure*)(_headPtr + Item10Offset))->PNext = (BaseInStructure*) (_headPtr + Item11Offset); + ((BaseInStructure*)(_headPtr + Item11Offset))->PNext = (BaseInStructure*) (_headPtr + Item12Offset); + ((BaseInStructure*)(_headPtr + Item12Offset))->PNext = (BaseInStructure*) (_headPtr + Item13Offset); + ((BaseInStructure*)(_headPtr + Item13Offset))->PNext = (BaseInStructure*) (_headPtr + Item14Offset); + ((BaseInStructure*)(_headPtr + Item14Offset))->PNext = (BaseInStructure*) (_headPtr + Item15Offset); + ((BaseInStructure*)(_headPtr + previousSize))->PNext = null; } /// @@ -12438,21 +12438,21 @@ public ManagedChainPNext = (Chain*) (newHeadPtr + Item1Offset); - ((Chain*)(newHeadPtr + Item1Offset))->PNext = (Chain*) (newHeadPtr + Item2Offset); - ((Chain*)(newHeadPtr + Item2Offset))->PNext = (Chain*) (newHeadPtr + Item3Offset); - ((Chain*)(newHeadPtr + Item3Offset))->PNext = (Chain*) (newHeadPtr + Item4Offset); - ((Chain*)(newHeadPtr + Item4Offset))->PNext = (Chain*) (newHeadPtr + Item5Offset); - ((Chain*)(newHeadPtr + Item5Offset))->PNext = (Chain*) (newHeadPtr + Item6Offset); - ((Chain*)(newHeadPtr + Item6Offset))->PNext = (Chain*) (newHeadPtr + Item7Offset); - ((Chain*)(newHeadPtr + Item7Offset))->PNext = (Chain*) (newHeadPtr + Item8Offset); - ((Chain*)(newHeadPtr + Item8Offset))->PNext = (Chain*) (newHeadPtr + Item9Offset); - ((Chain*)(newHeadPtr + Item9Offset))->PNext = (Chain*) (newHeadPtr + Item10Offset); - ((Chain*)(newHeadPtr + Item10Offset))->PNext = (Chain*) (newHeadPtr + Item11Offset); - ((Chain*)(newHeadPtr + Item11Offset))->PNext = (Chain*) (newHeadPtr + Item12Offset); - ((Chain*)(newHeadPtr + Item12Offset))->PNext = (Chain*) (newHeadPtr + Item13Offset); - ((Chain*)(newHeadPtr + Item13Offset))->PNext = (Chain*) (newHeadPtr + Item14Offset); - ((Chain*)(newHeadPtr + Item14Offset))->PNext = null; + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); + ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); + ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); + ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); + ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item5Offset); + ((BaseInStructure*)(newHeadPtr + Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item6Offset); + ((BaseInStructure*)(newHeadPtr + Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item7Offset); + ((BaseInStructure*)(newHeadPtr + Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item8Offset); + ((BaseInStructure*)(newHeadPtr + Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item9Offset); + ((BaseInStructure*)(newHeadPtr + Item9Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item10Offset); + ((BaseInStructure*)(newHeadPtr + Item10Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item11Offset); + ((BaseInStructure*)(newHeadPtr + Item11Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item12Offset); + ((BaseInStructure*)(newHeadPtr + Item12Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item13Offset); + ((BaseInStructure*)(newHeadPtr + Item13Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item14Offset); + ((BaseInStructure*)(newHeadPtr + Item14Offset))->PNext = null; return new ManagedChain(newHeadPtr); } diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.tt b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.tt index 42f5120923..7b072af330 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.tt +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.tt @@ -213,18 +213,18 @@ public unsafe class ManagedChain<<#= tList #>> : ManagedChain /// /// Gets a pointer to the current head. /// - public Chain* HeadPtr => (Chain*) _headPtr; + public BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; /// /// Gets or sets the head of the chain. /// public TChain Head { - get => Unsafe.AsRef((Chain*) _headPtr); + get => Unsafe.AsRef((BaseInStructure*) _headPtr); set { value.StructureType(); - var ptr = (Chain*) _headPtr; + var ptr = (BaseInStructure*) _headPtr; var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, _headPtr, true); ptr->PNext = nextPtr; @@ -238,7 +238,7 @@ public unsafe class ManagedChain<<#= tList #>> : ManagedChain /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item<#= j #>Ptr => (Chain*) (_headPtr + Item<#= j #>Offset); + public BaseInStructure* Item<#= j #>Ptr => (BaseInStructure*) (_headPtr + Item<#= j #>Offset); /// /// Gets or sets item #<#= j #> in the chain. @@ -284,7 +284,7 @@ public unsafe class ManagedChain<<#= tList #>> : ManagedChain for (var j = 1; j < i; j++) { #> - <#= j == 1 ? "Chain* " : "" #>itemPtr = Item<#= j #>Ptr; + <#= j == 1 ? "BaseInStructure* " : "" #>itemPtr = Item<#= j #>Ptr; item<#= j #>.StructureType(); Marshal.StructureToPtr(item<#= j #>, (nint)itemPtr, false); <#= j == 1 ? "HeadPtr" : $"Item{j - 1}Ptr" #>->PNext = itemPtr; @@ -315,16 +315,16 @@ public unsafe class ManagedChain<<#= tList #>> : ManagedChain { #> StringBuilder errorBuilder = new StringBuilder(); - var existingPtr = (Chain*) Unsafe.AsPointer(ref chain); - var newPtr = (Chain*) _headPtr; + var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); + var newPtr = (BaseInStructure*) _headPtr; <# for (var j = 1; j < i; j++) { #> - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item<#= j #>Offset); - newPtr = newPtr->PNext; + existingPtr = (BaseInStructure*)existingPtr->PNext; + newPtr->PNext = (BaseInStructure*)(_headPtr + Item<#= j #>Offset); + newPtr = (BaseInStructure*)newPtr->PNext; T<#= j #> item<#= j #> = default; <#= j == 1 ? "var " : "" #>expectedStructureType = item<#= j #>.StructureType(); @@ -380,7 +380,7 @@ public unsafe class ManagedChain<<#= tList #>> : ManagedChain { #> // Update all pointers - ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); <# } // if (i > 1) #> @@ -388,7 +388,7 @@ public unsafe class ManagedChain<<#= tList #>> : ManagedChain for (var j = 2; j < i; j++) { #> - ((Chain*)(newHeadPtr + Item<#= j - 1 #>Offset))->PNext = (Chain*) (newHeadPtr + Item<#= j #>Offset); + ((BaseInStructure*)(newHeadPtr + Item<#= j - 1 #>Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item<#= j #>Offset); <# } // for (int j = 1; j < i; j++) { #> @@ -421,16 +421,16 @@ public unsafe class ManagedChain<<#= tList #>> : ManagedChain Marshal.StructureToPtr(item<#= i - 1 #>, _headPtr + previousSize, false); // Update all pointers - ((Chain*)_headPtr)->PNext = (Chain*) (_headPtr + Item1Offset); + ((BaseInStructure*)_headPtr)->PNext = (BaseInStructure*) (_headPtr + Item1Offset); <# for (var j = 2; j < i; j++) { #> - ((Chain*)(_headPtr + Item<#= j - 1 #>Offset))->PNext = (Chain*) (_headPtr + Item<#= j #>Offset); + ((BaseInStructure*)(_headPtr + Item<#= j - 1 #>Offset))->PNext = (BaseInStructure*) (_headPtr + Item<#= j #>Offset); <# } // for (int j = 1; j < i; j++) { #> - ((Chain*)(_headPtr + previousSize))->PNext = null; + ((BaseInStructure*)(_headPtr + previousSize))->PNext = null; } /// @@ -465,19 +465,19 @@ public unsafe class ManagedChain<<#= tList #>> : ManagedChain if (i > 2) { #> - ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); <# for (var j = 2; j < i; j++) { #> - ((Chain*)(newHeadPtr + Item<#= j - 1 #>Offset))->PNext = <#= j == i -1 ? "null" : $"(Chain*) (newHeadPtr + Item{j}Offset)"#>; + ((BaseInStructure*)(newHeadPtr + Item<#= j - 1 #>Offset))->PNext = <#= j == i -1 ? "null" : $"(BaseInStructure*) (newHeadPtr + Item{j}Offset)"#>; <# } // for (int j = 1; j < i - 1; j++) } else // if (i > 1) { #> - ((Chain*)newHeadPtr)->PNext = null; + ((BaseInStructure*)newHeadPtr)->PNext = null; <# } #> diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceAccelerationStructureFeaturesKhr.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceAccelerationStructureFeaturesKhr.cs index 30cec6947a..c642f30156 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceAccelerationStructureFeaturesKhr.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceAccelerationStructureFeaturesKhr.cs @@ -40,9 +40,9 @@ StructureType IStructuredType.StructureType() } /// - unsafe Chain* IChainable.PNext + unsafe BaseInStructure* IChainable.PNext { - get => (Chain*) PNext; + get => (BaseInStructure*) PNext; set => PNext = value; } diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceDescriptorIndexingFeatures.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceDescriptorIndexingFeatures.cs index 9e9bf8ac5d..f370c44dc0 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceDescriptorIndexingFeatures.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceDescriptorIndexingFeatures.cs @@ -40,9 +40,9 @@ StructureType IStructuredType.StructureType() } /// - unsafe Chain* IChainable.PNext + unsafe BaseInStructure* IChainable.PNext { - get => (Chain*) PNext; + get => (BaseInStructure*) PNext; set => PNext = value; } diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceFeatures2.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceFeatures2.cs index 9b12590611..0f3bc822ff 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceFeatures2.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceFeatures2.cs @@ -44,9 +44,9 @@ StructureType IStructuredType.StructureType() } /// - unsafe Chain* IChainable.PNext + unsafe BaseInStructure* IChainable.PNext { - get => (Chain*) PNext; + get => (BaseInStructure*) PNext; set => PNext = value; } From 92f98ed72d2ed3508fd7eabb2f6a96e3fe1e8e37 Mon Sep 17 00:00:00 2001 From: Craig Dean Date: Tue, 9 Nov 2021 12:35:25 +0000 Subject: [PATCH 31/42] feat: Implements `IStructuredType` Full implementation of [proposal 1](https://github.com/dotnet/Silk.NET/blob/866f2dcdcc7817995e9fb633213e7630d510ee35/documentation/proposals/Proposal%20-%20Vulkan%20Struct%20Chaining%20-%20%231%20StructureType%20correction.md). * Adds `$VKSTRUCTUREDTYPE` intrinsic to indicate that a struct implements `IStructuredType`, and includes the default `StructureType` * Adds `IStructuredType` interface to relevant structs, implementing them explicitly. --- build/cache/vulkan.json.gz | Bin 227740 -> 231590 bytes .../Silk.NET.BuildTools/Bind/StructWriter.cs | 76 ++++++-- .../Converters/Readers/VulkanReader.cs | 169 ++++++++++-------- src/Vulkan/Silk.NET.Vulkan/IStructuredType.cs | 19 ++ ...rationStructureBuildGeometryInfoKHR.gen.cs | 8 +- ...elerationStructureBuildSizesInfoKHR.gen.cs | 8 +- .../AccelerationStructureCreateInfoKHR.gen.cs | 8 +- .../AccelerationStructureCreateInfoNV.gen.cs | 8 +- ...rationStructureDeviceAddressInfoKHR.gen.cs | 8 +- ...rationStructureGeometryAabbsDataKHR.gen.cs | 8 +- ...onStructureGeometryInstancesDataKHR.gen.cs | 8 +- .../AccelerationStructureGeometryKHR.gen.cs | 8 +- ...uctureGeometryMotionTrianglesDataNV.gen.cs | 8 +- ...onStructureGeometryTrianglesDataKHR.gen.cs | 8 +- .../AccelerationStructureInfoNV.gen.cs | 8 +- ...onStructureMemoryRequirementsInfoNV.gen.cs | 8 +- .../AccelerationStructureMotionInfoNV.gen.cs | 8 +- ...AccelerationStructureVersionInfoKHR.gen.cs | 8 +- .../Structs/AcquireNextImageInfoKHR.gen.cs | 8 +- .../AcquireProfilingLockInfoKHR.gen.cs | 8 +- ...dwareBufferFormatProperties2ANDROID.gen.cs | 8 +- ...rdwareBufferFormatPropertiesANDROID.gen.cs | 8 +- ...roidHardwareBufferPropertiesANDROID.gen.cs | 8 +- .../AndroidHardwareBufferUsageANDROID.gen.cs | 8 +- .../AndroidSurfaceCreateInfoKHR.gen.cs | 8 +- .../Structs/ApplicationInfo.gen.cs | 8 +- .../Structs/AttachmentDescription2.gen.cs | 8 +- .../Structs/AttachmentDescription2KHR.gen.cs | 8 +- .../AttachmentDescriptionStencilLayout.gen.cs | 8 +- ...tachmentDescriptionStencilLayoutKHR.gen.cs | 8 +- .../Structs/AttachmentReference2.gen.cs | 8 +- .../Structs/AttachmentReference2KHR.gen.cs | 8 +- .../AttachmentReferenceStencilLayout.gen.cs | 8 +- ...AttachmentReferenceStencilLayoutKHR.gen.cs | 8 +- .../AttachmentSampleCountInfoAMD.gen.cs | 8 +- .../AttachmentSampleCountInfoNV.gen.cs | 8 +- .../Structs/BaseInStructure.gen.cs | 9 +- .../Structs/BaseOutStructure.gen.cs | 9 +- ...ndAccelerationStructureMemoryInfoNV.gen.cs | 8 +- .../BindBufferMemoryDeviceGroupInfo.gen.cs | 8 +- .../BindBufferMemoryDeviceGroupInfoKHR.gen.cs | 8 +- .../Structs/BindBufferMemoryInfo.gen.cs | 8 +- .../Structs/BindBufferMemoryInfoKHR.gen.cs | 8 +- .../BindImageMemoryDeviceGroupInfo.gen.cs | 8 +- .../BindImageMemoryDeviceGroupInfoKHR.gen.cs | 8 +- .../Structs/BindImageMemoryInfo.gen.cs | 8 +- .../Structs/BindImageMemoryInfoKHR.gen.cs | 8 +- .../BindImageMemorySwapchainInfoKHR.gen.cs | 8 +- .../Structs/BindImagePlaneMemoryInfo.gen.cs | 8 +- .../BindImagePlaneMemoryInfoKHR.gen.cs | 8 +- .../Structs/BindSparseInfo.gen.cs | 8 +- .../Structs/BlitImageInfo2KHR.gen.cs | 8 +- ...erCollectionBufferCreateInfoFUCHSIA.gen.cs | 8 +- ...ferCollectionConstraintsInfoFUCHSIA.gen.cs | 8 +- .../BufferCollectionCreateInfoFUCHSIA.gen.cs | 8 +- ...ferCollectionImageCreateInfoFUCHSIA.gen.cs | 8 +- .../BufferCollectionPropertiesFUCHSIA.gen.cs | 8 +- .../BufferConstraintsInfoFUCHSIA.gen.cs | 8 +- .../Structs/BufferCopy2KHR.gen.cs | 8 +- .../Structs/BufferCreateInfo.gen.cs | 8 +- .../BufferDeviceAddressCreateInfoEXT.gen.cs | 8 +- .../Structs/BufferDeviceAddressInfo.gen.cs | 8 +- .../Structs/BufferDeviceAddressInfoEXT.gen.cs | 8 +- .../Structs/BufferDeviceAddressInfoKHR.gen.cs | 8 +- .../Structs/BufferImageCopy2KHR.gen.cs | 8 +- .../Structs/BufferMemoryBarrier.gen.cs | 8 +- .../Structs/BufferMemoryBarrier2KHR.gen.cs | 8 +- .../BufferMemoryRequirementsInfo2.gen.cs | 8 +- .../BufferMemoryRequirementsInfo2KHR.gen.cs | 8 +- ...ufferOpaqueCaptureAddressCreateInfo.gen.cs | 8 +- ...erOpaqueCaptureAddressCreateInfoKHR.gen.cs | 8 +- .../Structs/BufferViewCreateInfo.gen.cs | 8 +- .../Structs/CalibratedTimestampInfoEXT.gen.cs | 8 +- .../Structs/CheckpointData2NV.gen.cs | 8 +- .../Structs/CheckpointDataNV.gen.cs | 8 +- .../Structs/CommandBufferAllocateInfo.gen.cs | 8 +- .../Structs/CommandBufferBeginInfo.gen.cs | 8 +- ...eritanceConditionalRenderingInfoEXT.gen.cs | 8 +- .../CommandBufferInheritanceInfo.gen.cs | 8 +- ...eritanceRenderPassTransformInfoQCOM.gen.cs | 8 +- ...ndBufferInheritanceRenderingInfoKHR.gen.cs | 8 +- ...ferInheritanceViewportScissorInfoNV.gen.cs | 8 +- .../Structs/CommandBufferSubmitInfoKHR.gen.cs | 8 +- .../Structs/CommandPoolCreateInfo.gen.cs | 8 +- .../Structs/ComputePipelineCreateInfo.gen.cs | 8 +- .../ConditionalRenderingBeginInfoEXT.gen.cs | 8 +- .../CooperativeMatrixPropertiesNV.gen.cs | 8 +- .../CopyAccelerationStructureInfoKHR.gen.cs | 8 +- ...ccelerationStructureToMemoryInfoKHR.gen.cs | 8 +- .../Structs/CopyBufferInfo2KHR.gen.cs | 8 +- .../Structs/CopyBufferToImageInfo2KHR.gen.cs | 8 +- .../CopyCommandTransformInfoQCOM.gen.cs | 8 +- .../Structs/CopyDescriptorSet.gen.cs | 8 +- .../Structs/CopyImageInfo2KHR.gen.cs | 8 +- .../Structs/CopyImageToBufferInfo2KHR.gen.cs | 8 +- ...emoryToAccelerationStructureInfoKHR.gen.cs | 8 +- .../Structs/CuFunctionCreateInfoNVX.gen.cs | 8 +- .../Structs/CuLaunchInfoNVX.gen.cs | 8 +- .../Structs/CuModuleCreateInfoNVX.gen.cs | 8 +- .../Structs/D3D12FenceSubmitInfoKHR.gen.cs | 8 +- .../Structs/DebugMarkerMarkerInfoEXT.gen.cs | 8 +- .../DebugMarkerObjectNameInfoEXT.gen.cs | 8 +- .../DebugMarkerObjectTagInfoEXT.gen.cs | 8 +- .../DebugReportCallbackCreateInfoEXT.gen.cs | 8 +- .../Structs/DebugUtilsLabelEXT.gen.cs | 8 +- .../DebugUtilsMessengerCallbackDataEXT.gen.cs | 8 +- .../DebugUtilsMessengerCreateInfoEXT.gen.cs | 8 +- .../DebugUtilsObjectNameInfoEXT.gen.cs | 8 +- .../Structs/DebugUtilsObjectTagInfoEXT.gen.cs | 8 +- ...dicatedAllocationBufferCreateInfoNV.gen.cs | 8 +- ...edicatedAllocationImageCreateInfoNV.gen.cs | 8 +- ...catedAllocationMemoryAllocateInfoNV.gen.cs | 8 +- .../Structs/DependencyInfoKHR.gen.cs | 8 +- .../Structs/DescriptorPoolCreateInfo.gen.cs | 8 +- ...PoolInlineUniformBlockCreateInfoEXT.gen.cs | 8 +- .../Structs/DescriptorSetAllocateInfo.gen.cs | 8 +- ...ptorSetLayoutBindingFlagsCreateInfo.gen.cs | 8 +- ...rSetLayoutBindingFlagsCreateInfoEXT.gen.cs | 8 +- .../DescriptorSetLayoutCreateInfo.gen.cs | 8 +- .../Structs/DescriptorSetLayoutSupport.gen.cs | 8 +- .../DescriptorSetLayoutSupportKHR.gen.cs | 8 +- ...VariableDescriptorCountAllocateInfo.gen.cs | 8 +- ...iableDescriptorCountAllocateInfoEXT.gen.cs | 8 +- ...ariableDescriptorCountLayoutSupport.gen.cs | 8 +- ...ableDescriptorCountLayoutSupportEXT.gen.cs | 8 +- .../DescriptorUpdateTemplateCreateInfo.gen.cs | 8 +- ...scriptorUpdateTemplateCreateInfoKHR.gen.cs | 8 +- .../DeviceBufferMemoryRequirementsKHR.gen.cs | 8 +- .../Structs/DeviceCreateInfo.gen.cs | 8 +- ...viceDeviceMemoryReportCreateInfoEXT.gen.cs | 8 +- ...DeviceDiagnosticsConfigCreateInfoNV.gen.cs | 8 +- .../Structs/DeviceEventInfoEXT.gen.cs | 8 +- .../Structs/DeviceGroupBindSparseInfo.gen.cs | 8 +- .../DeviceGroupBindSparseInfoKHR.gen.cs | 8 +- .../DeviceGroupCommandBufferBeginInfo.gen.cs | 8 +- ...eviceGroupCommandBufferBeginInfoKHR.gen.cs | 8 +- .../DeviceGroupDeviceCreateInfo.gen.cs | 8 +- .../DeviceGroupDeviceCreateInfoKHR.gen.cs | 8 +- .../DeviceGroupPresentCapabilitiesKHR.gen.cs | 8 +- .../Structs/DeviceGroupPresentInfoKHR.gen.cs | 8 +- .../DeviceGroupRenderPassBeginInfo.gen.cs | 8 +- .../DeviceGroupRenderPassBeginInfoKHR.gen.cs | 8 +- .../Structs/DeviceGroupSubmitInfo.gen.cs | 8 +- .../Structs/DeviceGroupSubmitInfoKHR.gen.cs | 8 +- .../DeviceGroupSwapchainCreateInfoKHR.gen.cs | 8 +- .../DeviceImageMemoryRequirementsKHR.gen.cs | 8 +- ...eviceMemoryOpaqueCaptureAddressInfo.gen.cs | 8 +- ...ceMemoryOpaqueCaptureAddressInfoKHR.gen.cs | 8 +- ...ceMemoryOverallocationCreateInfoAMD.gen.cs | 8 +- .../DeviceMemoryReportCallbackDataEXT.gen.cs | 8 +- .../DevicePrivateDataCreateInfoEXT.gen.cs | 8 +- .../Structs/DeviceQueueCreateInfo.gen.cs | 8 +- ...iceQueueGlobalPriorityCreateInfoEXT.gen.cs | 8 +- .../Structs/DeviceQueueInfo2.gen.cs | 8 +- .../DirectFBSurfaceCreateInfoEXT.gen.cs | 8 +- .../Structs/DisplayEventInfoEXT.gen.cs | 8 +- .../Structs/DisplayModeCreateInfoKHR.gen.cs | 8 +- .../Structs/DisplayModeProperties2KHR.gen.cs | 8 +- ...playNativeHdrSurfaceCapabilitiesAMD.gen.cs | 8 +- .../DisplayPlaneCapabilities2KHR.gen.cs | 8 +- .../Structs/DisplayPlaneInfo2KHR.gen.cs | 8 +- .../Structs/DisplayPlaneProperties2KHR.gen.cs | 8 +- .../Structs/DisplayPowerInfoEXT.gen.cs | 8 +- .../Structs/DisplayPresentInfoKHR.gen.cs | 8 +- .../Structs/DisplayProperties2KHR.gen.cs | 8 +- .../DisplaySurfaceCreateInfoKHR.gen.cs | 8 +- ...DrmFormatModifierPropertiesList2EXT.gen.cs | 8 +- .../DrmFormatModifierPropertiesListEXT.gen.cs | 8 +- .../Structs/EventCreateInfo.gen.cs | 8 +- .../Structs/ExportFenceCreateInfo.gen.cs | 8 +- .../Structs/ExportFenceCreateInfoKHR.gen.cs | 8 +- .../ExportFenceWin32HandleInfoKHR.gen.cs | 8 +- .../Structs/ExportMemoryAllocateInfo.gen.cs | 8 +- .../ExportMemoryAllocateInfoKHR.gen.cs | 8 +- .../Structs/ExportMemoryAllocateInfoNV.gen.cs | 8 +- .../ExportMemoryWin32HandleInfoKHR.gen.cs | 8 +- .../ExportMemoryWin32HandleInfoNV.gen.cs | 8 +- .../Structs/ExportSemaphoreCreateInfo.gen.cs | 8 +- .../ExportSemaphoreCreateInfoKHR.gen.cs | 8 +- .../ExportSemaphoreWin32HandleInfoKHR.gen.cs | 8 +- .../Structs/ExternalBufferProperties.gen.cs | 8 +- .../ExternalBufferPropertiesKHR.gen.cs | 8 +- .../Structs/ExternalFenceProperties.gen.cs | 8 +- .../Structs/ExternalFencePropertiesKHR.gen.cs | 8 +- .../Structs/ExternalFormatANDROID.gen.cs | 8 +- .../ExternalImageFormatProperties.gen.cs | 8 +- .../ExternalImageFormatPropertiesKHR.gen.cs | 8 +- .../ExternalMemoryBufferCreateInfo.gen.cs | 8 +- .../ExternalMemoryBufferCreateInfoKHR.gen.cs | 8 +- .../ExternalMemoryImageCreateInfo.gen.cs | 8 +- .../ExternalMemoryImageCreateInfoKHR.gen.cs | 8 +- .../ExternalMemoryImageCreateInfoNV.gen.cs | 8 +- .../ExternalSemaphoreProperties.gen.cs | 8 +- .../ExternalSemaphorePropertiesKHR.gen.cs | 8 +- .../Structs/FenceCreateInfo.gen.cs | 8 +- .../Structs/FenceGetFdInfoKHR.gen.cs | 8 +- .../Structs/FenceGetWin32HandleInfoKHR.gen.cs | 8 +- ...icImageViewImageFormatPropertiesEXT.gen.cs | 8 +- .../Structs/FormatProperties2.gen.cs | 8 +- .../Structs/FormatProperties2KHR.gen.cs | 8 +- .../Structs/FormatProperties3KHR.gen.cs | 8 +- ...ragmentShadingRateAttachmentInfoKHR.gen.cs | 8 +- .../FramebufferAttachmentImageInfo.gen.cs | 8 +- .../FramebufferAttachmentImageInfoKHR.gen.cs | 8 +- .../FramebufferAttachmentsCreateInfo.gen.cs | 8 +- ...FramebufferAttachmentsCreateInfoKHR.gen.cs | 8 +- .../Structs/FramebufferCreateInfo.gen.cs | 8 +- ...ramebufferMixedSamplesCombinationNV.gen.cs | 8 +- .../Structs/GeneratedCommandsInfoNV.gen.cs | 8 +- ...tedCommandsMemoryRequirementsInfoNV.gen.cs | 8 +- .../Structs/GeometryAABBNV.gen.cs | 8 +- .../Silk.NET.Vulkan/Structs/GeometryNV.gen.cs | 8 +- .../Structs/GeometryTrianglesNV.gen.cs | 8 +- .../Structs/GraphicsPipelineCreateInfo.gen.cs | 8 +- ...icsPipelineShaderGroupsCreateInfoNV.gen.cs | 8 +- .../GraphicsShaderGroupCreateInfoNV.gen.cs | 8 +- .../Structs/HdrMetadataEXT.gen.cs | 8 +- .../HeadlessSurfaceCreateInfoEXT.gen.cs | 8 +- .../Structs/IOSSurfaceCreateInfoMVK.gen.cs | 8 +- .../Structs/ImageBlit2KHR.gen.cs | 8 +- .../ImageConstraintsInfoFUCHSIA.gen.cs | 8 +- .../Structs/ImageCopy2KHR.gen.cs | 8 +- .../Structs/ImageCreateInfo.gen.cs | 8 +- ...FormatModifierExplicitCreateInfoEXT.gen.cs | 8 +- ...eDrmFormatModifierListCreateInfoEXT.gen.cs | 8 +- ...ImageDrmFormatModifierPropertiesEXT.gen.cs | 8 +- .../ImageFormatConstraintsInfoFUCHSIA.gen.cs | 8 +- .../Structs/ImageFormatListCreateInfo.gen.cs | 8 +- .../ImageFormatListCreateInfoKHR.gen.cs | 8 +- .../Structs/ImageFormatProperties2.gen.cs | 8 +- .../Structs/ImageFormatProperties2KHR.gen.cs | 8 +- .../Structs/ImageMemoryBarrier.gen.cs | 8 +- .../Structs/ImageMemoryBarrier2KHR.gen.cs | 8 +- .../ImageMemoryRequirementsInfo2.gen.cs | 8 +- .../ImageMemoryRequirementsInfo2KHR.gen.cs | 8 +- .../ImagePipeSurfaceCreateInfoFUCHSIA.gen.cs | 8 +- .../ImagePlaneMemoryRequirementsInfo.gen.cs | 8 +- ...ImagePlaneMemoryRequirementsInfoKHR.gen.cs | 8 +- .../Structs/ImageResolve2KHR.gen.cs | 8 +- .../ImageSparseMemoryRequirementsInfo2.gen.cs | 8 +- ...ageSparseMemoryRequirementsInfo2KHR.gen.cs | 8 +- .../ImageStencilUsageCreateInfo.gen.cs | 8 +- .../ImageStencilUsageCreateInfoEXT.gen.cs | 8 +- .../ImageSwapchainCreateInfoKHR.gen.cs | 8 +- .../Structs/ImageViewASTCDecodeModeEXT.gen.cs | 8 +- .../ImageViewAddressPropertiesNVX.gen.cs | 8 +- .../Structs/ImageViewCreateInfo.gen.cs | 8 +- .../Structs/ImageViewHandleInfoNVX.gen.cs | 8 +- .../Structs/ImageViewUsageCreateInfo.gen.cs | 8 +- .../ImageViewUsageCreateInfoKHR.gen.cs | 8 +- ...ortAndroidHardwareBufferInfoANDROID.gen.cs | 8 +- .../Structs/ImportFenceFdInfoKHR.gen.cs | 8 +- .../ImportFenceWin32HandleInfoKHR.gen.cs | 8 +- ...ImportMemoryBufferCollectionFUCHSIA.gen.cs | 8 +- .../Structs/ImportMemoryFdInfoKHR.gen.cs | 8 +- .../ImportMemoryHostPointerInfoEXT.gen.cs | 8 +- .../ImportMemoryWin32HandleInfoKHR.gen.cs | 8 +- .../ImportMemoryWin32HandleInfoNV.gen.cs | 8 +- ...ImportMemoryZirconHandleInfoFUCHSIA.gen.cs | 8 +- .../Structs/ImportSemaphoreFdInfoKHR.gen.cs | 8 +- .../ImportSemaphoreWin32HandleInfoKHR.gen.cs | 8 +- ...ortSemaphoreZirconHandleInfoFUCHSIA.gen.cs | 8 +- .../IndirectCommandsLayoutCreateInfoNV.gen.cs | 8 +- .../IndirectCommandsLayoutTokenNV.gen.cs | 8 +- .../InitializePerformanceApiInfoINTEL.gen.cs | 8 +- .../Structs/InstanceCreateInfo.gen.cs | 8 +- .../Structs/MacOSSurfaceCreateInfoMVK.gen.cs | 8 +- .../Structs/MappedMemoryRange.gen.cs | 8 +- .../Structs/MemoryAllocateFlagsInfo.gen.cs | 8 +- .../Structs/MemoryAllocateFlagsInfoKHR.gen.cs | 8 +- .../Structs/MemoryAllocateInfo.gen.cs | 8 +- .../Structs/MemoryBarrier.gen.cs | 8 +- .../Structs/MemoryBarrier2KHR.gen.cs | 8 +- .../MemoryDedicatedAllocateInfo.gen.cs | 8 +- .../MemoryDedicatedAllocateInfoKHR.gen.cs | 8 +- .../MemoryDedicatedRequirements.gen.cs | 8 +- .../MemoryDedicatedRequirementsKHR.gen.cs | 8 +- .../Structs/MemoryFdPropertiesKHR.gen.cs | 8 +- ...GetAndroidHardwareBufferInfoANDROID.gen.cs | 8 +- .../Structs/MemoryGetFdInfoKHR.gen.cs | 8 +- .../MemoryGetRemoteAddressInfoNV.gen.cs | 8 +- .../MemoryGetWin32HandleInfoKHR.gen.cs | 8 +- .../MemoryGetZirconHandleInfoFUCHSIA.gen.cs | 8 +- .../MemoryHostPointerPropertiesEXT.gen.cs | 8 +- ...oryOpaqueCaptureAddressAllocateInfo.gen.cs | 8 +- ...OpaqueCaptureAddressAllocateInfoKHR.gen.cs | 8 +- .../MemoryPriorityAllocateInfoEXT.gen.cs | 8 +- .../Structs/MemoryRequirements2.gen.cs | 8 +- .../Structs/MemoryRequirements2KHR.gen.cs | 8 +- .../MemoryWin32HandlePropertiesKHR.gen.cs | 8 +- ...MemoryZirconHandlePropertiesFUCHSIA.gen.cs | 8 +- .../Structs/MetalSurfaceCreateInfoEXT.gen.cs | 8 +- .../Structs/MultisamplePropertiesEXT.gen.cs | 8 +- .../MultiviewPerViewAttributesInfoNVX.gen.cs | 8 +- ...utableDescriptorTypeCreateInfoVALVE.gen.cs | 8 +- .../Structs/NativeBufferANDROID.gen.cs | 8 +- ...rmanceConfigurationAcquireInfoINTEL.gen.cs | 8 +- .../PerformanceCounterDescriptionKHR.gen.cs | 8 +- .../Structs/PerformanceCounterKHR.gen.cs | 8 +- .../Structs/PerformanceMarkerInfoINTEL.gen.cs | 8 +- .../PerformanceOverrideInfoINTEL.gen.cs | 8 +- .../PerformanceQuerySubmitInfoKHR.gen.cs | 8 +- .../PerformanceStreamMarkerInfoINTEL.gen.cs | 8 +- .../PhysicalDevice16BitStorageFeatures.gen.cs | 8 +- ...ysicalDevice16BitStorageFeaturesKHR.gen.cs | 8 +- ...hysicalDevice4444FormatsFeaturesEXT.gen.cs | 8 +- .../PhysicalDevice8BitStorageFeatures.gen.cs | 8 +- ...hysicalDevice8BitStorageFeaturesKHR.gen.cs | 8 +- ...PhysicalDeviceASTCDecodeFeaturesEXT.gen.cs | 8 +- ...iceAccelerationStructureFeaturesKHR.gen.cs | 8 +- ...eAccelerationStructurePropertiesKHR.gen.cs | 8 +- ...ceBlendOperationAdvancedFeaturesEXT.gen.cs | 8 +- ...BlendOperationAdvancedPropertiesEXT.gen.cs | 8 +- ...DeviceBorderColorSwizzleFeaturesEXT.gen.cs | 8 +- ...sicalDeviceBufferAddressFeaturesEXT.gen.cs | 8 +- ...alDeviceBufferDeviceAddressFeatures.gen.cs | 8 +- ...eviceBufferDeviceAddressFeaturesEXT.gen.cs | 8 +- ...eviceBufferDeviceAddressFeaturesKHR.gen.cs | 8 +- ...icalDeviceCoherentMemoryFeaturesAMD.gen.cs | 8 +- ...alDeviceColorWriteEnableFeaturesEXT.gen.cs | 8 +- ...eComputeShaderDerivativesFeaturesNV.gen.cs | 8 +- ...viceConditionalRenderingFeaturesEXT.gen.cs | 8 +- ...servativeRasterizationPropertiesEXT.gen.cs | 8 +- ...alDeviceCooperativeMatrixFeaturesNV.gen.cs | 8 +- ...DeviceCooperativeMatrixPropertiesNV.gen.cs | 8 +- ...lDeviceCornerSampledImageFeaturesNV.gen.cs | 8 +- ...viceCoverageReductionModeFeaturesNV.gen.cs | 8 +- ...lDeviceCustomBorderColorFeaturesEXT.gen.cs | 8 +- ...eviceCustomBorderColorPropertiesEXT.gen.cs | 8 +- ...edAllocationImageAliasingFeaturesNV.gen.cs | 8 +- ...calDeviceDepthClipEnableFeaturesEXT.gen.cs | 8 +- ...DeviceDepthStencilResolveProperties.gen.cs | 8 +- ...iceDepthStencilResolvePropertiesKHR.gen.cs | 8 +- ...calDeviceDescriptorIndexingFeatures.gen.cs | 8 +- ...DeviceDescriptorIndexingFeaturesEXT.gen.cs | 8 +- ...lDeviceDescriptorIndexingProperties.gen.cs | 8 +- ...viceDescriptorIndexingPropertiesEXT.gen.cs | 8 +- ...ceDeviceGeneratedCommandsFeaturesNV.gen.cs | 8 +- ...DeviceGeneratedCommandsPropertiesNV.gen.cs | 8 +- ...DeviceDeviceMemoryReportFeaturesEXT.gen.cs | 8 +- ...alDeviceDiagnosticsConfigFeaturesNV.gen.cs | 8 +- ...DeviceDiscardRectanglePropertiesEXT.gen.cs | 8 +- .../PhysicalDeviceDriverProperties.gen.cs | 8 +- .../PhysicalDeviceDriverPropertiesKHR.gen.cs | 8 +- .../PhysicalDeviceDrmPropertiesEXT.gen.cs | 8 +- ...alDeviceDynamicRenderingFeaturesKHR.gen.cs | 8 +- ...calDeviceExclusiveScissorFeaturesNV.gen.cs | 8 +- ...iceExtendedDynamicState2FeaturesEXT.gen.cs | 8 +- ...viceExtendedDynamicStateFeaturesEXT.gen.cs | 8 +- .../PhysicalDeviceExternalBufferInfo.gen.cs | 8 +- ...PhysicalDeviceExternalBufferInfoKHR.gen.cs | 8 +- .../PhysicalDeviceExternalFenceInfo.gen.cs | 8 +- .../PhysicalDeviceExternalFenceInfoKHR.gen.cs | 8 +- ...ysicalDeviceExternalImageFormatInfo.gen.cs | 8 +- ...calDeviceExternalImageFormatInfoKHR.gen.cs | 8 +- ...viceExternalMemoryHostPropertiesEXT.gen.cs | 8 +- ...lDeviceExternalMemoryRDMAFeaturesNV.gen.cs | 8 +- ...PhysicalDeviceExternalSemaphoreInfo.gen.cs | 8 +- ...sicalDeviceExternalSemaphoreInfoKHR.gen.cs | 8 +- .../Structs/PhysicalDeviceFeatures2.gen.cs | 8 +- .../Structs/PhysicalDeviceFeatures2KHR.gen.cs | 8 +- ...hysicalDeviceFloat16Int8FeaturesKHR.gen.cs | 8 +- ...ysicalDeviceFloatControlsProperties.gen.cs | 8 +- ...calDeviceFloatControlsPropertiesKHR.gen.cs | 8 +- ...eviceFragmentDensityMap2FeaturesEXT.gen.cs | 8 +- ...iceFragmentDensityMap2PropertiesEXT.gen.cs | 8 +- ...DeviceFragmentDensityMapFeaturesEXT.gen.cs | 8 +- ...viceFragmentDensityMapPropertiesEXT.gen.cs | 8 +- ...FragmentShaderBarycentricFeaturesNV.gen.cs | 8 +- ...eFragmentShaderInterlockFeaturesEXT.gen.cs | 8 +- ...eFragmentShadingRateEnumsFeaturesNV.gen.cs | 8 +- ...ragmentShadingRateEnumsPropertiesNV.gen.cs | 8 +- ...eviceFragmentShadingRateFeaturesKHR.gen.cs | 8 +- ...hysicalDeviceFragmentShadingRateKHR.gen.cs | 8 +- ...iceFragmentShadingRatePropertiesKHR.gen.cs | 8 +- ...eviceGlobalPriorityQueryFeaturesEXT.gen.cs | 8 +- .../PhysicalDeviceGroupProperties.gen.cs | 8 +- .../PhysicalDeviceGroupPropertiesKHR.gen.cs | 8 +- ...hysicalDeviceHostQueryResetFeatures.gen.cs | 8 +- ...icalDeviceHostQueryResetFeaturesEXT.gen.cs | 8 +- .../Structs/PhysicalDeviceIDProperties.gen.cs | 8 +- .../PhysicalDeviceIDPropertiesKHR.gen.cs | 8 +- ...DeviceImageDrmFormatModifierInfoEXT.gen.cs | 8 +- .../PhysicalDeviceImageFormatInfo2.gen.cs | 8 +- .../PhysicalDeviceImageFormatInfo2KHR.gen.cs | 8 +- ...calDeviceImageRobustnessFeaturesEXT.gen.cs | 8 +- ...alDeviceImageViewImageFormatInfoEXT.gen.cs | 8 +- ...lDeviceImagelessFramebufferFeatures.gen.cs | 8 +- ...viceImagelessFramebufferFeaturesKHR.gen.cs | 8 +- ...icalDeviceIndexTypeUint8FeaturesEXT.gen.cs | 8 +- ...eInheritedViewportScissorFeaturesNV.gen.cs | 8 +- ...DeviceInlineUniformBlockFeaturesEXT.gen.cs | 8 +- ...viceInlineUniformBlockPropertiesEXT.gen.cs | 8 +- ...lDeviceInvocationMaskFeaturesHUAWEI.gen.cs | 8 +- ...lDeviceLineRasterizationFeaturesEXT.gen.cs | 8 +- ...eviceLineRasterizationPropertiesEXT.gen.cs | 8 +- ...hysicalDeviceMaintenance3Properties.gen.cs | 8 +- ...icalDeviceMaintenance3PropertiesKHR.gen.cs | 8 +- ...ysicalDeviceMaintenance4FeaturesKHR.gen.cs | 8 +- ...icalDeviceMaintenance4PropertiesKHR.gen.cs | 8 +- ...icalDeviceMemoryBudgetPropertiesEXT.gen.cs | 8 +- ...icalDeviceMemoryPriorityFeaturesEXT.gen.cs | 8 +- .../PhysicalDeviceMemoryProperties2.gen.cs | 8 +- .../PhysicalDeviceMemoryProperties2KHR.gen.cs | 8 +- .../PhysicalDeviceMeshShaderFeaturesNV.gen.cs | 8 +- ...hysicalDeviceMeshShaderPropertiesNV.gen.cs | 8 +- .../PhysicalDeviceMultiDrawFeaturesEXT.gen.cs | 8 +- ...hysicalDeviceMultiDrawPropertiesEXT.gen.cs | 8 +- .../PhysicalDeviceMultiviewFeatures.gen.cs | 8 +- .../PhysicalDeviceMultiviewFeaturesKHR.gen.cs | 8 +- ...iviewPerViewAttributesPropertiesNVX.gen.cs | 8 +- .../PhysicalDeviceMultiviewProperties.gen.cs | 8 +- ...hysicalDeviceMultiviewPropertiesKHR.gen.cs | 8 +- ...eMutableDescriptorTypeFeaturesVALVE.gen.cs | 8 +- ...ysicalDevicePCIBusInfoPropertiesEXT.gen.cs | 8 +- ...ageableDeviceLocalMemoryFeaturesEXT.gen.cs | 8 +- ...alDevicePerformanceQueryFeaturesKHR.gen.cs | 8 +- ...DevicePerformanceQueryPropertiesKHR.gen.cs | 8 +- ...lineCreationCacheControlFeaturesEXT.gen.cs | 8 +- ...lineExecutablePropertiesFeaturesKHR.gen.cs | 8 +- ...ysicalDevicePointClippingProperties.gen.cs | 8 +- ...calDevicePointClippingPropertiesKHR.gen.cs | 8 +- ...lDevicePortabilitySubsetFeaturesKHR.gen.cs | 8 +- ...evicePortabilitySubsetPropertiesKHR.gen.cs | 8 +- .../PhysicalDevicePresentIdFeaturesKHR.gen.cs | 8 +- ...hysicalDevicePresentWaitFeaturesKHR.gen.cs | 8 +- ...DevicePresentationPropertiesANDROID.gen.cs | 8 +- ...itiveTopologyListRestartFeaturesEXT.gen.cs | 8 +- ...hysicalDevicePrivateDataFeaturesEXT.gen.cs | 8 +- .../Structs/PhysicalDeviceProperties2.gen.cs | 8 +- .../PhysicalDeviceProperties2KHR.gen.cs | 8 +- ...ysicalDeviceProtectedMemoryFeatures.gen.cs | 8 +- ...icalDeviceProtectedMemoryProperties.gen.cs | 8 +- ...calDeviceProvokingVertexFeaturesEXT.gen.cs | 8 +- ...lDeviceProvokingVertexPropertiesEXT.gen.cs | 8 +- ...alDevicePushDescriptorPropertiesKHR.gen.cs | 8 +- ...calDeviceRGBA10X6FormatsFeaturesEXT.gen.cs | 8 +- .../PhysicalDeviceRayQueryFeaturesKHR.gen.cs | 8 +- ...eviceRayTracingMotionBlurFeaturesNV.gen.cs | 8 +- ...DeviceRayTracingPipelineFeaturesKHR.gen.cs | 8 +- ...viceRayTracingPipelinePropertiesKHR.gen.cs | 8 +- ...hysicalDeviceRayTracingPropertiesNV.gen.cs | 8 +- ...epresentativeFragmentTestFeaturesNV.gen.cs | 8 +- ...hysicalDeviceRobustness2FeaturesEXT.gen.cs | 8 +- ...sicalDeviceRobustness2PropertiesEXT.gen.cs | 8 +- ...lDeviceSampleLocationsPropertiesEXT.gen.cs | 8 +- ...DeviceSamplerFilterMinmaxProperties.gen.cs | 8 +- ...iceSamplerFilterMinmaxPropertiesEXT.gen.cs | 8 +- ...eviceSamplerYcbcrConversionFeatures.gen.cs | 8 +- ...ceSamplerYcbcrConversionFeaturesKHR.gen.cs | 8 +- ...icalDeviceScalarBlockLayoutFeatures.gen.cs | 8 +- ...lDeviceScalarBlockLayoutFeaturesEXT.gen.cs | 8 +- ...SeparateDepthStencilLayoutsFeatures.gen.cs | 8 +- ...arateDepthStencilLayoutsFeaturesKHR.gen.cs | 8 +- ...DeviceShaderAtomicFloat2FeaturesEXT.gen.cs | 8 +- ...lDeviceShaderAtomicFloatFeaturesEXT.gen.cs | 8 +- ...icalDeviceShaderAtomicInt64Features.gen.cs | 8 +- ...lDeviceShaderAtomicInt64FeaturesKHR.gen.cs | 8 +- ...hysicalDeviceShaderClockFeaturesKHR.gen.cs | 8 +- ...sicalDeviceShaderCoreProperties2AMD.gen.cs | 8 +- ...ysicalDeviceShaderCorePropertiesAMD.gen.cs | 8 +- ...DemoteToHelperInvocationFeaturesEXT.gen.cs | 8 +- ...alDeviceShaderDrawParameterFeatures.gen.cs | 8 +- ...lDeviceShaderDrawParametersFeatures.gen.cs | 8 +- ...icalDeviceShaderFloat16Int8Features.gen.cs | 8 +- ...lDeviceShaderFloat16Int8FeaturesKHR.gen.cs | 8 +- ...ceShaderImageAtomicInt64FeaturesEXT.gen.cs | 8 +- ...eviceShaderImageFootprintFeaturesNV.gen.cs | 8 +- ...eShaderIntegerDotProductFeaturesKHR.gen.cs | 8 +- ...haderIntegerDotProductPropertiesKHR.gen.cs | 8 +- ...haderIntegerFunctions2FeaturesINTEL.gen.cs | 8 +- ...calDeviceShaderSMBuiltinsFeaturesNV.gen.cs | 8 +- ...lDeviceShaderSMBuiltinsPropertiesNV.gen.cs | 8 +- ...ShaderSubgroupExtendedTypesFeatures.gen.cs | 8 +- ...derSubgroupExtendedTypesFeaturesKHR.gen.cs | 8 +- ...bgroupUniformControlFlowFeaturesKHR.gen.cs | 8 +- ...haderTerminateInvocationFeaturesKHR.gen.cs | 8 +- ...calDeviceShadingRateImageFeaturesNV.gen.cs | 8 +- ...lDeviceShadingRateImagePropertiesNV.gen.cs | 8 +- ...hysicalDeviceSparseImageFormatInfo2.gen.cs | 8 +- ...icalDeviceSparseImageFormatInfo2KHR.gen.cs | 8 +- .../PhysicalDeviceSubgroupProperties.gen.cs | 8 +- ...eviceSubgroupSizeControlFeaturesEXT.gen.cs | 8 +- ...iceSubgroupSizeControlPropertiesEXT.gen.cs | 8 +- ...lDeviceSubpassShadingFeaturesHUAWEI.gen.cs | 8 +- ...eviceSubpassShadingPropertiesHUAWEI.gen.cs | 8 +- .../PhysicalDeviceSurfaceInfo2KHR.gen.cs | 8 +- ...alDeviceSynchronization2FeaturesKHR.gen.cs | 8 +- ...viceTexelBufferAlignmentFeaturesEXT.gen.cs | 8 +- ...ceTexelBufferAlignmentPropertiesEXT.gen.cs | 8 +- ...extureCompressionASTCHDRFeaturesEXT.gen.cs | 8 +- ...icalDeviceTimelineSemaphoreFeatures.gen.cs | 8 +- ...lDeviceTimelineSemaphoreFeaturesKHR.gen.cs | 8 +- ...alDeviceTimelineSemaphoreProperties.gen.cs | 8 +- ...eviceTimelineSemaphorePropertiesKHR.gen.cs | 8 +- .../PhysicalDeviceToolPropertiesEXT.gen.cs | 8 +- ...lDeviceTransformFeedbackFeaturesEXT.gen.cs | 8 +- ...eviceTransformFeedbackPropertiesEXT.gen.cs | 8 +- ...UniformBufferStandardLayoutFeatures.gen.cs | 8 +- ...formBufferStandardLayoutFeaturesKHR.gen.cs | 8 +- ...ysicalDeviceVariablePointerFeatures.gen.cs | 8 +- ...calDeviceVariablePointerFeaturesKHR.gen.cs | 8 +- ...sicalDeviceVariablePointersFeatures.gen.cs | 8 +- ...alDeviceVariablePointersFeaturesKHR.gen.cs | 8 +- ...ceVertexAttributeDivisorFeaturesEXT.gen.cs | 8 +- ...VertexAttributeDivisorPropertiesEXT.gen.cs | 8 +- ...eVertexInputDynamicStateFeaturesEXT.gen.cs | 8 +- .../PhysicalDeviceVideoFormatInfoKHR.gen.cs | 8 +- .../PhysicalDeviceVulkan11Features.gen.cs | 8 +- .../PhysicalDeviceVulkan11Properties.gen.cs | 8 +- .../PhysicalDeviceVulkan12Features.gen.cs | 8 +- .../PhysicalDeviceVulkan12Properties.gen.cs | 8 +- ...icalDeviceVulkanMemoryModelFeatures.gen.cs | 8 +- ...lDeviceVulkanMemoryModelFeaturesKHR.gen.cs | 8 +- ...roupMemoryExplicitLayoutFeaturesKHR.gen.cs | 8 +- ...iceYcbcr2Plane444FormatsFeaturesEXT.gen.cs | 8 +- ...alDeviceYcbcrImageArraysFeaturesEXT.gen.cs | 8 +- ...nitializeWorkgroupMemoryFeaturesKHR.gen.cs | 8 +- .../Structs/PipelineCacheCreateInfo.gen.cs | 8 +- ...olorBlendAdvancedStateCreateInfoEXT.gen.cs | 8 +- .../PipelineColorBlendStateCreateInfo.gen.cs | 8 +- .../PipelineColorWriteCreateInfoEXT.gen.cs | 8 +- ...ipelineCompilerControlCreateInfoAMD.gen.cs | 8 +- ...CoverageModulationStateCreateInfoNV.gen.cs | 8 +- ...eCoverageReductionStateCreateInfoNV.gen.cs | 8 +- ...ineCoverageToColorStateCreateInfoNV.gen.cs | 8 +- ...pelineCreationFeedbackCreateInfoEXT.gen.cs | 8 +- ...PipelineDepthStencilStateCreateInfo.gen.cs | 8 +- ...eDiscardRectangleStateCreateInfoEXT.gen.cs | 8 +- .../PipelineDynamicStateCreateInfo.gen.cs | 8 +- .../Structs/PipelineExecutableInfoKHR.gen.cs | 8 +- ...ExecutableInternalRepresentationKHR.gen.cs | 8 +- .../PipelineExecutablePropertiesKHR.gen.cs | 8 +- .../PipelineExecutableStatisticKHR.gen.cs | 8 +- ...entShadingRateEnumStateCreateInfoNV.gen.cs | 8 +- ...agmentShadingRateStateCreateInfoKHR.gen.cs | 8 +- .../Structs/PipelineInfoKHR.gen.cs | 8 +- ...ipelineInputAssemblyStateCreateInfo.gen.cs | 8 +- .../Structs/PipelineLayoutCreateInfo.gen.cs | 8 +- .../PipelineLibraryCreateInfoKHR.gen.cs | 8 +- .../PipelineMultisampleStateCreateInfo.gen.cs | 8 +- ...ationConservativeStateCreateInfoEXT.gen.cs | 8 +- ...rizationDepthClipStateCreateInfoEXT.gen.cs | 8 +- ...RasterizationLineStateCreateInfoEXT.gen.cs | 8 +- ...onProvokingVertexStateCreateInfoEXT.gen.cs | 8 +- ...ipelineRasterizationStateCreateInfo.gen.cs | 8 +- ...erizationStateRasterizationOrderAMD.gen.cs | 8 +- ...sterizationStateStreamCreateInfoEXT.gen.cs | 8 +- .../PipelineRenderingCreateInfoKHR.gen.cs | 8 +- ...tativeFragmentTestStateCreateInfoNV.gen.cs | 8 +- ...neSampleLocationsStateCreateInfoEXT.gen.cs | 8 +- .../PipelineShaderStageCreateInfo.gen.cs | 8 +- ...geRequiredSubgroupSizeCreateInfoEXT.gen.cs | 8 +- ...ellationDomainOriginStateCreateInfo.gen.cs | 8 +- ...ationDomainOriginStateCreateInfoKHR.gen.cs | 8 +- ...PipelineTessellationStateCreateInfo.gen.cs | 8 +- ...ertexInputDivisorStateCreateInfoEXT.gen.cs | 8 +- .../PipelineVertexInputStateCreateInfo.gen.cs | 8 +- ...tCoarseSampleOrderStateCreateInfoNV.gen.cs | 8 +- ...rtExclusiveScissorStateCreateInfoNV.gen.cs | 8 +- ...rtShadingRateImageStateCreateInfoNV.gen.cs | 8 +- .../PipelineViewportStateCreateInfo.gen.cs | 8 +- ...ineViewportSwizzleStateCreateInfoNV.gen.cs | 8 +- ...neViewportWScalingStateCreateInfoNV.gen.cs | 8 +- .../Structs/PresentFrameTokenGGP.gen.cs | 8 +- .../Structs/PresentIdKHR.gen.cs | 8 +- .../Structs/PresentInfoKHR.gen.cs | 8 +- .../Structs/PresentRegionsKHR.gen.cs | 8 +- .../Structs/PresentTimesInfoGOOGLE.gen.cs | 8 +- .../PrivateDataSlotCreateInfoEXT.gen.cs | 8 +- .../Structs/ProtectedSubmitInfo.gen.cs | 8 +- .../Structs/QueryPoolCreateInfo.gen.cs | 8 +- .../Structs/QueryPoolCreateInfoINTEL.gen.cs | 8 +- .../QueryPoolPerformanceCreateInfoKHR.gen.cs | 8 +- ...PoolPerformanceQueryCreateInfoINTEL.gen.cs | 8 +- .../QueueFamilyCheckpointProperties2NV.gen.cs | 8 +- .../QueueFamilyCheckpointPropertiesNV.gen.cs | 8 +- ...ueFamilyGlobalPriorityPropertiesEXT.gen.cs | 8 +- .../Structs/QueueFamilyProperties2.gen.cs | 8 +- .../Structs/QueueFamilyProperties2KHR.gen.cs | 8 +- .../RayTracingPipelineCreateInfoKHR.gen.cs | 8 +- .../RayTracingPipelineCreateInfoNV.gen.cs | 8 +- ...acingPipelineInterfaceCreateInfoKHR.gen.cs | 8 +- .../RayTracingShaderGroupCreateInfoKHR.gen.cs | 8 +- .../RayTracingShaderGroupCreateInfoNV.gen.cs | 8 +- .../RenderPassAttachmentBeginInfo.gen.cs | 8 +- .../RenderPassAttachmentBeginInfoKHR.gen.cs | 8 +- .../Structs/RenderPassBeginInfo.gen.cs | 8 +- .../Structs/RenderPassCreateInfo.gen.cs | 8 +- .../Structs/RenderPassCreateInfo2.gen.cs | 8 +- .../Structs/RenderPassCreateInfo2KHR.gen.cs | 8 +- ...PassFragmentDensityMapCreateInfoEXT.gen.cs | 8 +- ...PassInputAttachmentAspectCreateInfo.gen.cs | 8 +- ...sInputAttachmentAspectCreateInfoKHR.gen.cs | 8 +- .../RenderPassMultiviewCreateInfo.gen.cs | 8 +- .../RenderPassMultiviewCreateInfoKHR.gen.cs | 8 +- ...nderPassSampleLocationsBeginInfoEXT.gen.cs | 8 +- .../RenderPassTransformBeginInfoQCOM.gen.cs | 8 +- .../Structs/RenderingAttachmentInfoKHR.gen.cs | 8 +- ...FragmentDensityMapAttachmentInfoEXT.gen.cs | 8 +- ...ragmentShadingRateAttachmentInfoKHR.gen.cs | 8 +- .../Structs/RenderingInfoKHR.gen.cs | 8 +- .../Structs/ResolveImageInfo2KHR.gen.cs | 8 +- .../Structs/SampleLocationsInfoEXT.gen.cs | 8 +- ...rColorComponentMappingCreateInfoEXT.gen.cs | 8 +- .../Structs/SamplerCreateInfo.gen.cs | 8 +- ...mplerCustomBorderColorCreateInfoEXT.gen.cs | 8 +- .../SamplerReductionModeCreateInfo.gen.cs | 8 +- .../SamplerReductionModeCreateInfoEXT.gen.cs | 8 +- .../SamplerYcbcrConversionCreateInfo.gen.cs | 8 +- ...SamplerYcbcrConversionCreateInfoKHR.gen.cs | 8 +- ...cbcrConversionImageFormatProperties.gen.cs | 8 +- ...rConversionImageFormatPropertiesKHR.gen.cs | 8 +- .../Structs/SamplerYcbcrConversionInfo.gen.cs | 8 +- .../SamplerYcbcrConversionInfoKHR.gen.cs | 8 +- .../Structs/ScreenSurfaceCreateInfoQNX.gen.cs | 8 +- .../Structs/SemaphoreCreateInfo.gen.cs | 8 +- .../Structs/SemaphoreGetFdInfoKHR.gen.cs | 8 +- .../SemaphoreGetWin32HandleInfoKHR.gen.cs | 8 +- ...SemaphoreGetZirconHandleInfoFUCHSIA.gen.cs | 8 +- .../Structs/SemaphoreSignalInfo.gen.cs | 8 +- .../Structs/SemaphoreSignalInfoKHR.gen.cs | 8 +- .../Structs/SemaphoreSubmitInfoKHR.gen.cs | 8 +- .../Structs/SemaphoreTypeCreateInfo.gen.cs | 8 +- .../Structs/SemaphoreTypeCreateInfoKHR.gen.cs | 8 +- .../Structs/SemaphoreWaitInfo.gen.cs | 8 +- .../Structs/SemaphoreWaitInfoKHR.gen.cs | 8 +- .../Structs/ShaderModuleCreateInfo.gen.cs | 8 +- ...rModuleValidationCacheCreateInfoEXT.gen.cs | 8 +- ...SharedPresentSurfaceCapabilitiesKHR.gen.cs | 8 +- .../SparseImageFormatProperties2.gen.cs | 8 +- .../SparseImageFormatProperties2KHR.gen.cs | 8 +- .../SparseImageMemoryRequirements2.gen.cs | 8 +- .../SparseImageMemoryRequirements2KHR.gen.cs | 8 +- ...treamDescriptorSurfaceCreateInfoGGP.gen.cs | 8 +- .../Silk.NET.Vulkan/Structs/SubmitInfo.gen.cs | 8 +- .../Structs/SubmitInfo2KHR.gen.cs | 8 +- .../Structs/SubpassBeginInfo.gen.cs | 8 +- .../Structs/SubpassBeginInfoKHR.gen.cs | 8 +- .../Structs/SubpassDependency2.gen.cs | 8 +- .../Structs/SubpassDependency2KHR.gen.cs | 8 +- .../Structs/SubpassDescription2.gen.cs | 8 +- .../Structs/SubpassDescription2KHR.gen.cs | 8 +- ...bpassDescriptionDepthStencilResolve.gen.cs | 8 +- ...ssDescriptionDepthStencilResolveKHR.gen.cs | 8 +- .../Structs/SubpassEndInfo.gen.cs | 8 +- .../Structs/SubpassEndInfoKHR.gen.cs | 8 +- ...passShadingPipelineCreateInfoHUAWEI.gen.cs | 8 +- .../Structs/SurfaceCapabilities2EXT.gen.cs | 8 +- .../Structs/SurfaceCapabilities2KHR.gen.cs | 8 +- ...eCapabilitiesFullScreenExclusiveEXT.gen.cs | 8 +- .../Structs/SurfaceFormat2KHR.gen.cs | 8 +- .../SurfaceFullScreenExclusiveInfoEXT.gen.cs | 8 +- ...faceFullScreenExclusiveWin32InfoEXT.gen.cs | 8 +- .../SurfaceProtectedCapabilitiesKHR.gen.cs | 8 +- .../SwapchainCounterCreateInfoEXT.gen.cs | 8 +- .../Structs/SwapchainCreateInfoKHR.gen.cs | 8 +- ...pchainDisplayNativeHdrCreateInfoAMD.gen.cs | 8 +- .../SwapchainImageCreateInfoANDROID.gen.cs | 8 +- .../Structs/SysmemColorSpaceFUCHSIA.gen.cs | 8 +- ...TextureLODGatherFormatPropertiesAMD.gen.cs | 8 +- .../TimelineSemaphoreSubmitInfo.gen.cs | 8 +- .../TimelineSemaphoreSubmitInfoKHR.gen.cs | 8 +- .../ValidationCacheCreateInfoEXT.gen.cs | 8 +- .../Structs/ValidationFeaturesEXT.gen.cs | 8 +- .../Structs/ValidationFlagsEXT.gen.cs | 8 +- ...VertexInputAttributeDescription2EXT.gen.cs | 8 +- .../VertexInputBindingDescription2EXT.gen.cs | 8 +- .../Structs/ViSurfaceCreateInfoNN.gen.cs | 8 +- .../Structs/VideoBeginCodingInfoKHR.gen.cs | 8 +- .../Structs/VideoBindMemoryKHR.gen.cs | 8 +- .../Structs/VideoCapabilitiesKHR.gen.cs | 8 +- .../Structs/VideoCodingControlInfoKHR.gen.cs | 8 +- .../VideoDecodeH264CapabilitiesEXT.gen.cs | 8 +- .../VideoDecodeH264DpbSlotInfoEXT.gen.cs | 8 +- .../Structs/VideoDecodeH264MvcEXT.gen.cs | 8 +- .../VideoDecodeH264PictureInfoEXT.gen.cs | 8 +- .../Structs/VideoDecodeH264ProfileEXT.gen.cs | 8 +- ...VideoDecodeH264SessionCreateInfoEXT.gen.cs | 8 +- ...codeH264SessionParametersAddInfoEXT.gen.cs | 8 +- ...eH264SessionParametersCreateInfoEXT.gen.cs | 8 +- .../VideoDecodeH265CapabilitiesEXT.gen.cs | 8 +- .../VideoDecodeH265DpbSlotInfoEXT.gen.cs | 8 +- .../VideoDecodeH265PictureInfoEXT.gen.cs | 8 +- .../Structs/VideoDecodeH265ProfileEXT.gen.cs | 8 +- ...VideoDecodeH265SessionCreateInfoEXT.gen.cs | 8 +- ...codeH265SessionParametersAddInfoEXT.gen.cs | 8 +- ...eH265SessionParametersCreateInfoEXT.gen.cs | 8 +- .../Structs/VideoDecodeInfoKHR.gen.cs | 8 +- .../VideoEncodeH264CapabilitiesEXT.gen.cs | 8 +- .../VideoEncodeH264DpbSlotInfoEXT.gen.cs | 8 +- ...oEncodeH264EmitPictureParametersEXT.gen.cs | 8 +- .../VideoEncodeH264NaluSliceEXT.gen.cs | 8 +- .../Structs/VideoEncodeH264ProfileEXT.gen.cs | 8 +- ...VideoEncodeH264SessionCreateInfoEXT.gen.cs | 8 +- ...codeH264SessionParametersAddInfoEXT.gen.cs | 8 +- ...eH264SessionParametersCreateInfoEXT.gen.cs | 8 +- .../VideoEncodeH264VclFrameInfoEXT.gen.cs | 8 +- .../VideoEncodeH265CapabilitiesEXT.gen.cs | 8 +- .../VideoEncodeH265DpbSlotInfoEXT.gen.cs | 8 +- ...oEncodeH265EmitPictureParametersEXT.gen.cs | 8 +- .../VideoEncodeH265NaluSliceEXT.gen.cs | 8 +- .../Structs/VideoEncodeH265ProfileEXT.gen.cs | 8 +- .../VideoEncodeH265ReferenceListsEXT.gen.cs | 8 +- ...VideoEncodeH265SessionCreateInfoEXT.gen.cs | 8 +- ...codeH265SessionParametersAddInfoEXT.gen.cs | 8 +- ...eH265SessionParametersCreateInfoEXT.gen.cs | 8 +- .../VideoEncodeH265VclFrameInfoEXT.gen.cs | 8 +- .../Structs/VideoEncodeInfoKHR.gen.cs | 8 +- .../VideoEncodeRateControlInfoKHR.gen.cs | 8 +- .../Structs/VideoEndCodingInfoKHR.gen.cs | 8 +- .../Structs/VideoFormatPropertiesKHR.gen.cs | 8 +- .../VideoGetMemoryPropertiesKHR.gen.cs | 8 +- .../Structs/VideoPictureResourceKHR.gen.cs | 8 +- .../Structs/VideoProfileKHR.gen.cs | 8 +- .../Structs/VideoProfilesKHR.gen.cs | 8 +- .../VideoQueueFamilyProperties2KHR.gen.cs | 8 +- .../Structs/VideoReferenceSlotKHR.gen.cs | 8 +- .../Structs/VideoSessionCreateInfoKHR.gen.cs | 8 +- ...VideoSessionParametersCreateInfoKHR.gen.cs | 8 +- ...VideoSessionParametersUpdateInfoKHR.gen.cs | 8 +- .../WaylandSurfaceCreateInfoKHR.gen.cs | 8 +- ...in32KeyedMutexAcquireReleaseInfoKHR.gen.cs | 8 +- ...Win32KeyedMutexAcquireReleaseInfoNV.gen.cs | 8 +- .../Structs/Win32SurfaceCreateInfoKHR.gen.cs | 8 +- .../Structs/WriteDescriptorSet.gen.cs | 8 +- ...scriptorSetAccelerationStructureKHR.gen.cs | 8 +- ...escriptorSetAccelerationStructureNV.gen.cs | 8 +- ...eDescriptorSetInlineUniformBlockEXT.gen.cs | 8 +- .../Structs/XcbSurfaceCreateInfoKHR.gen.cs | 8 +- .../Structs/XlibSurfaceCreateInfoKHR.gen.cs | 8 +- 731 files changed, 5271 insertions(+), 811 deletions(-) create mode 100644 src/Vulkan/Silk.NET.Vulkan/IStructuredType.cs diff --git a/build/cache/vulkan.json.gz b/build/cache/vulkan.json.gz index 98d27c384c20597e96e200d39fdfcf4e683ef045..c7fe1f78229e2c50b77c59dec2cda7e03277220e 100644 GIT binary patch delta 204246 zcmV)AK*YbC^9`nv4zNXRe;3}im1RxzuNWH_xN{HI-iYK!oP)stltkM+(JP{4#{mWg zEipECXi-ePIg7BYCE4ga4f3p2b@yfPJz_R^X zAii>1{+^wK^>^H{IOpNc0&DnCC z|764LH8A^y=QC$xj{3KksEDA0>B8!3o4eYFJG$uiP{~l^yv#u<`ayCglA4RkFXD<$ zK*1p0li7-Oc5y+I>P|_ke`Lm_veV;Algg5Z&wqXZeH1*5tn-$9vpHgQ+$XeIFD|k5 z^yDr)a4~T-Y}$>NGKMu6m^}-fN;>oI_E-jv=idjvC6EjZtKS)Y)tY0s$8q6(4%#dJAqI2+CEBFJhQ$R09V@5sL2h{C#5>%O;U z-pCVc01+36y+dvvZp%L5BcAxEwIu*-%|Z~97?__@%uQBe5_0A#Zw*R z*B~C^kX?sk9WY9)f5i?*c0EpX0J(6MC1G3`!=y7&2UFg7n@3~uZ)c8myd^pG?#7y4 z-5I_AGP)2JP8x1!S{Sw}HnLlMa36Isa|L`U&gMfr*T(277z@_%lhSpL&3sBoWzvs3 zD;CvEl+b&ESp84zz63e856`R%I{!#>N7phYk_^Igd(OtOfBhiYVUgV-x#00;lU||D zD-3=HKfr@VbI_=f6RtP(Pfql7GP)jpMxS7mdKOtb6A+HkE9sD_q6v{h*mtS`>>E6M ziuOVdABX!n&oyjcgZ=Pj>xR!!krr5NbB{OO;>*mO-0n)T!0zl?`KcCc{)n1pVy77V z{v$99xBg~*f3yjX?y*sf?}KyCT^!v%$L&ADXE~lqqUTh~vL0zT>E#6|*@r|-nKsoX zDZIvd?LOW6&v@WH$VU+|U@~ML^$@3NypWw>4m$l?BDpNcNs;4CobrnajdC(pf{2|~ zrAWq3O_ZF_tAmhaW$8ZcqAVflO4EG~MwXD1`Upu^e?V3zC0h~6C+7U6h^fq9Sz5RZ z#!DI2K}#HmtiC0?I4gfIcnNbl38=gcJN(@B=jFodfS)e9t-cG{B3%AvaEozuki)Gs zCkA-wy%ANN6B|7*jCr|Ox~a>SqF3L#g3@&UPI3!>wVbPDMXiE#NLSbj*pgchEJIC3 z1I-^Ze}OK_eYnv|UrQ?uKx{ZqE7+9>8pmC39WsO3=kwkOMT0RI0|Q>hLEYiZptGhG zlRL8PmBAPP0+YKq&o<0em+?Fy*6i7dNK!!%cGjQXot?-U%+x@Rx_Y8P?76g^JvQ0} zyl6YqE~Owrmb7*D{q{Q$cjT;(&QAV$?`@9of69<;%9|kN#vvuNMa0|~w05@GG!c;l zzeO8=-qSYzq(%!eI+hPdzreXqK0y5i;3!x^A%!Diw*i)VRI z!_gF8F?zQ;Q`mC2x>4_Ld0eP>_sv{pf1OgmAP0+?X2f}_IdL`UJEQsB-{MEPTrs^J zn|Gsbw?DJN=+YM2%9>1TF@U^bXzTU_PrWBly+F|xBbizQ6F>~Kr5hzV9qSQ9N0cB) zpHnPBU}OV+Xje;#PNrpKx*0%zhU+}BZ^7Z}tkVLawaJ-N zftK#XvL+ItL#)&ZDO1oCZ1A6 z!SRL@Nuk?BKTr*x4Ne41F!E_dXxRwEm_Wq~?-bsj% zk0$7U#ktQJb3m;V8w1h+oX*>)GN`baaF(@G6ni-{fL(bHk7Zz8S(jHCP>L;^8KA&z z8e zP3XMwiPeRKxIs^Umm4XMDXLMG2NhSTrco)mIrFIKmuJ|Q_gKTdwQz5`FCA$|gjOHv z1LXK@MT^mt?s77kjj1tvX%4|X(AVj>=faGOq}Es7hP+q>a9k;6!<90P-q2XE&IM1J z(k-^I%qr+fW4hi9SDXjGt#)iV@R?DHf~T89+#KTO5Wk^+L(K5@{t!Rh9N{{SaNK4Z zlY7z5w88DNT)?(QU7e{nnV%N2Z#0eRypXVLLqq{PQ5&R~iS~D<{$ysVh+3#F0&j2E zI7^y3yozwzGkXkw#7#Ce_Gj7Q!5HF`92$%s4%k?fjJ6#X;z?j%nT$u8L-z9S8@dl; zXT7F{$Z=zT(+>sgb4MD+cERcgH~6lx>4$nw*&g055DoCYfRvEKw+}-jye}Xbv|TY7 zd>k(&@3DsCUxVYxh#O3w#(|zp4x%${NZvP2^3-P0?SGnNal7B#Fkt)BQy54lx_S4_ zoQ&k+VWr_1Kf&-NP5g_n7}sFu(w_bLuC5)9fwz<=zyNoaTyU%W?>oO`e&6^i7qXHS zBD>$`%8%R=jp%4ZM; zI%`r2^6YN*@Z=M2gDvag#hBt~CZTH>q}*tq^s$4pUny@%3Ru8ipL^ducmac)asbVr zSXb?`5SrJdRN9p2_Gc_fCCvtlfz~*Oz?WSh^809<@e!aECZQ80F>IIRP*}@SrpxjtC_G1_iM-*IZ{faC(P zR*IB;06*anS28hmU=Bu;TZt+Vx;ndU3UquuQ&fXvR(J+fBsK+ zZw*o!oNjjf3p_@h4c}ef(7i$ z0n6#dx%&+rfG@yX1i9)Ga4*2qg(>MAu;={dT`r^^EZ{CDzl66!s+<$6cQ=plD&^l& z5(6&_01MyJ3juN{kQXF>lYVM-z|GN{Sm0wwg6DMWoGl5!O@Jk-3t;2xt^dPW9xcd^ zl|VWTf`PMq9uf9mb5Tx5BWwe3dpGL*7i2jmm9>BJ`gy`vV@hg#wsvK;8;C5yLHp@~ zUOW9k2lgv1wwgKunOTfGOb+do~`ACXlFqnWCXp$Ry;)VjhW7 zacPBjH6DpO*0>97ZNNt!HKYL-Gqz?(f#%+S;STl+zMFjk9xb+%fg&8cdxum+!^i&L zbtD{15H(x=SO&kATxw>+&%@D8vVQKLExy9IrQdes;#U*s!F;|ALwE64j2?L2L$xeH zL3jl6-G_TBY98=^Py)Zb4Zl0|+GK|SC>i!_a$!VQXReYKi%ZD=sW|2c8v5fmaKeLM z)^fIXMVN*lL%>US19|0;RSIsx8DyFBuqioD?d^TA0{elNE@aO-qcIpSxtt*S^YCA# zj^GI;k~*0x5r#rZOf^pl zwj!N!BK?!Ke`nRIwb<)~s#OT)>J_NgzL4qT1w$onf-|YFAQb>ujRo;zTgO?9Aojv1 zdLx6k4RybNkPH_C1s1#;BCd-8_pnx$-qR3jur4eNW#WJ_RGe|m8O+!^J=d|w@m)+i zk_oWJw{g^Di~;DZrA6|C*6W5(*e*qQVu{LYP6pN#6$BQZk0%;WD>W*O#R4?)wbY(c z6VvGRKrgph0NbY@wd^3c0BukqUD!TS%TJxYc##W#_jA_o-`Nl=H*q&fb$=Y`B6m9z zuxepzaz#fg2UNALvqB3bT3DIWJsKNduo}-86VoSNV8$U=U*PE@s_7P2?o6-HZF*D20!nv{yix z(LqWmATOzWl+`?H(mGOiw%mnX(`79XM86e+d+@bKt-UXQO454YV`@uaYRjcNr7*P>Fr7$X%66MP zk-&7KfazQU)45z)R0`9%0;blP3`3nsR->m`>P!LGu?$lkXSs^kF(8HOScR{6eN0oh za(zsB-2+m%&LnwjFO3tpIB9Q;CmIR;8fkAUh)QtTX0kK9h{-rH#}JB2u#b{%G4N1- zxo{WdFbpizFF;Gpfl;!7x;`-EG%yzrt}K#nA6|vX(Vf}5Oe%qG4LCXh77CX}(jmpp zNx7rGK^0bp?h$u^PPBsJ_~>PE=`4<+LM@DRWA>DB<};1xt4%o#X;}uubk^i=Y;wak zi({6FDoY^BLth~sZ`22>{Z$048(`OeqX`zutw|?4pt=Is?uhhXnqajYZD)rbk~|4* zZ6w5nMaO`a-H{=Kc2`t%OmL-pGMsD2)s|hw9j-QGy>v(hVI>jsnMN|ayizoD9gxi; zei>L}%*diuM5Y0JBcT;_AA?}+9xds&A3b@iBOlT=efjajPAG{9{d$H(r5^o%QpmCK zVT~b8W%CO&Rd&eMrI>r*t)85f@YYK`(y(?7m)?!*Jv@S)7FB%-_yu(6=x!h^b7NYU zR~TfAs=)MV`Ac~a18b=3k{vj|OZ=|!RqbZX9fpa!pf|YiJY=70jzoQWU}~-3+%aK+ ze66Fy#PWuY6SGSk|H0-^)zRRSlYT6Jbx8DO1}M%+`u7%8xDcCRL*n|K3Z_NoFC57RqyC_c3lG08A&6k1d4vN!0Uvd?6RQRAKD+PqKZCSV8J1*S@B}! zWD}@w@=Q|hkyO6bp+lXEdRwnAg}bVqxoYP zzZ?;1RLP5VupdT6#|GANHi{&>@W%r-Y!&?S&1mwOwwO)*cw70$Avjy~+YotW{PeN%Pt)lq z&Xeaq3x1srY`8E6R{u7QfYTd5@(3aVRx9288_hw}chC|G?}9vigb#>+BgO2enk{*S zwoma^SWlQBId$=W;COM8F--{3UP1cWoi)HB{ky4&|BF41m76~@n22I3Vxsg@4HGp? z#A711BF25NVWpR6rH;1*@gNjEq(Ohj0##p|7ZZEDVfk6{?_$q4%udlR>)2C2vu`&n zS%-O$T;$hbz!Zcx!i{2oY1zz>@#bV`kQ3I*lQ#||r7jEgu^R&uQHS;DVThqf3rjxJ zNU2xU!QK?Zh-FCTv4(A4jBOHoMjHI!7mh=0P`mNmHTeeSFu;PRn;m?GgHN{P!VjDc z4l4=+e{C%nE)M=d2&CR~wDg%O4ei-<(H|L8GN))V>f3kLuxH|bBp`DL-cVWzdN&&O zwdpzrJ3vv4#YlxJlw7l%@fs2!GDA1ik^{wC$2)$a4>TvR4rT1U9kBwyZ{Y+MKztVm zl&#&!e5N_3wH;G39WnZ+XlQO~=wtkc{!zI(P+dP*yX(yrZ-^NSSGPa1O?ygaQED7v zmcs^iLn&NnKjblgwY6fhmcS@$mn6l@BeRB6$P+VZQhyrWvARS^z!S)T+*8e|ukF-Z z%kKfYV{Ggb^$udh4AkQJmeXwDi*K$sPP=0W)!CT~VMi@rC1hN?N_#nZ1YG$VxY7l?~#nc7a z=li57VWgf*K$@B$|N4E}tTQq@bdH(i05pHXmy>^$#b{m|{TcnI#%YuZn3rw<+{Dcj zNdmhxM+0+znoAKm*MubQGbw>2ZZ;{|bgeWL>|P2_NFc$Ur8AJ1a$VL+0|5j7G6Wwx zs6jb*I zWDP(+)x{*##*%{*+gEu!r@Y}J<(YP8kIG?6+Mlgvwz`8K8_I_8&fJlR6Gu7x%s^xqWcj3>&?Jts|KyzJ*;J`?aBj2++IY+Mse#phvQEq_Ln z+SXiNNB)_hGh}S^%_;mZSR7#e3`f{he$*v@R+*jVe`Q}I18nOo0e0+$WAC@?mj&HA zOMxEa$RF#g+1FVm#fE>b0sXlQ_;wB8Pc(o(kpX{P1NgQE@NF6JCv|ZB9(-kmn!92!1< zy}&-4XxoPqCJnqfxmq_u7ZE2sB9x;nEWL+SNh^4?QCVvU(e38uu{mdgoI|=7?&jp_ zQZOM-LZ6k9^mEy&uef zBtMR8vkaF1BjNp7>y5KqIN_p$KUHp(AT1MIEyJEM>D_huqwZ(cTAfHR z0#X#?5HEnFgvrv$bItIcYvj%=IB3Xb&@qgVU9}jv8)xBc93ekOv!Eft3J$9|HG0O> zkds8anVv`Y@MCK@w(DRU&Osc1MZb$j^@*S|-0Mju*=1N^n_=VM=5Gsu2 z0>43Sao|QE$clYhbcI0fAKl0J*5v?7f~y%hhXf%X#SHs>5j{lhDM!ZVe&3 zl;myUsU*|Sbh*HLZYd-^Q-nmxpACK@NRTXA2+WPt<%Uk~!VP4LmDz+F$QaY*N>1)U zF^=>WWN=h)2j|4`XvLL(!{n_-0N3DVFjgzyqi#~n_GhvHj)KD(+@vPK7?1l_yGw%4;87CKv}+}4rdS42)XS2#S7gI#tHY{*h>b-pjJdsk z@-}iPAkSj}sU4Z0R~zU_tTRY+MK{0XVnmiGWC)>8Kerr8VtwF$tXAN~BB4pz%n3oa zv@i&WCG0V)z#Sl>NaJN8*tQO^6K4%(p7*!n5>E^;-Y3>Ki8Vgf0egTUQaX{mI_SZy zKegzL2{Ggo9gutOYV#Pm7^-9Lnd9lz&Ql^peX8Zk2>c-I_%7)8l`(fm{m}%%!6qvG zBE(uQx!&`C(s}ac3QK%DGzL~z3{~mQi>o$wi(CR`T*aAKUN%Cd%Py*MtpYGEdM(1I zzOdQUaqfkFI7%191-5X$FKy;uOpJjkwDpgbE`tfSj0?xkdR+z;WM87WL(17W zs8lb2Cx~{JJ%=Ft2N4{c3|ZxWqj3>Y!k`?lpuc94>|f4m{^)qiJw2SZ z78yPH#u#_63^?Kma&p~C@c;0?N+t%Re?r7W8rc}TqCvn!1V}@Wn6#UWuyvi4bMN^c z_Gg#E7;ysap&0}28e^kl^{uI8+AQE_@c%z53#+OdPNkOgwj zOS5bQv+!OxR$R=lzIR`3CBOEqj`T8ro~Xi{S4G*C2YIRp^2T}gL6NBj^v1aDqje+; z7Nx$D&|faXz^e!rfKEo1JlJ#9mGzd#?TYJa4UgN>KtCx0rC=fl16|=_h(ic`UGI#( zXl=95$bVFz?Uj*qCWbW3geH&QeZ9Q-W*cIcdQym6X5B3M65J1?*#vG14o3Aoy>vI!Rj|L#O5nVN zaA4#nNL*hWu*b?^X%#i1ErBsAr6wRb$WD}z*^ugm-P+5kh7_O;30|aUyI3`UM4+d- zfbJ&3u9YB<4Gb@0XHyyUXZq34RtqiYXX9QG`j6`Di!q^YfGvqiBBo)X?ufKr5`jEd z25BxAl^|kzlmx&}>LQ<@i{>Jf1Q`L0ry~e}s`&~D&|USJ?FX9@ASWhRVWhId?vJKC zeCpQ|DcHJzY%@P0{M#jf(#oxW3rIKXr{sT|hgq8nvM#TK@UA7bqJp$}NFdV2EAoMt zj7>;EM-6F2461%>;rLR_#Kv4GFIrxK19`v3GM_nM#Ro#I-cY&p#?jlO! zz?#ssSA*R>FRQ}$us+o6#pxWRQZ(n=$aDZi{Ac>{XG@4G6Ohj~;!w~B(o8|V%CRz& zPL3b}R+Ddz8h@Z=FK2X7laM|fdRq0kbL|7_NG0OeyDaD4;NT?sL@ zwUiWIK>)~?U$;b6;T5=@VT*YX(O>gH3q)hF0GYPl3x9;NNR3_(gqWQa035*TTC%xB z_2a62c9QfpNuBuEFe0i5enZ;t#5mx`sxmkOIp>zBh@0i2;K0|p;sR%dA|V{d1&5|~ zoixE|&`S`U4k0zi8mYOS`y?@4fr9HU_A?WO1Q7IzM$o<0J(}bSn0w<6HO@tlPc=dw z!k61VsDD)z0S}G-3=pFt#X);Z6fFQp3f^HH?bE=><>?HIfsmo8p(*94HbdM zu@4T=bA3Qhm2alg;+siTv&%r%b2FVv-%P4H9~-{5o9VR5&7`U`7SW_~Go6;cnLcT~ znNF2&rc;@l>66x*=~VS*I+eJYK54y~PStLv(|@9y>66x*=~Um%bXw|W`lR({I#s!u zPK7tqC%re*E(X%~)|;vey$^`=Eqlsc;7^)d%?h?&g$vK8hm5ZH1-a|FdN>KO1Yc@GW?@I z>fK!$(<=yM2E#fr2NT`6D(!t^m)NPL1vr>4z*r zswY?zBQBZOw2#j0U>9UGA!LoQzo_xg4u5|f`m2;g5H|tZ6SIr_aVR;iqisNWo))wa zkYjhHYiYmuq4R*uo){pfbOOMNyd?ae8lNY5F3z-))Wi1Io9BVEN>d~y))^G_%%N>f zZ?Qjbjv$tlKT(wOd(^Z~Q8(C90;I%y0%6oTtvi~Nzp8gMeHV0taOsAWVQ4vbd>hDcP4+VAjwVCwElM~jF7Dpl z2YEKaD#QBexsDFYB`Se)pChV{)-NbwJq8k{YYb;aSpW|}5eSGlZ zL_dVDqzd6w2JFy5Gq@^b(!ot*PQaBICvM3k(VeO$(V4%oBCT51nfaBJq)FzPAyg&) zu%7l%NiAz4O+*5%HAteR6|L!XksRWW8W*<$;`I8;B34>sg7UNb>@EiI?tky7sl~+g zU1u$gnKe_$h~{&lDk|wqM5@o7Ppvo_}gvCkl| zf)s`ji6<8uGx}DK7JpDd$8eLLsfLrTt(*&NIF!I}mJzsy7kVLY8hzBBQOWBSw`ml4ygq8wL9(53%U?117P&mk8kaiu z*=3Z~N=v?T-{rMc79py_kpaCV&#(a(@Jy?g^^c>js!P8Mx$+lXi;tJ$t-9V3%HoyQ z>1yaHN))Rn0r*6p13g>HU2civ?&kS2ZWeM?JwWLCuLL~r`+w))Zq?!ZmxRps{&T=8 z`uMocbV)~_*qhG6d|Y1upu!qUV^(5{9NLnCg9Wxga;S#hDCA3bQ)P`Kyx0azdVv*( zxbB(aqF0fBFM51{su^=Jv}zj<$O^VwHBWB0-6d8pvC9QZ*RC~wR-)Z*VE~OqfNJ|? zwtlvorLC@_?SCh1b7@eIX=hMZRn+!a3piRev`y~`#>Db6w*+%`ITNm`wM`}14z9v& zyvHmjdsPF(nT1xklPe%s>lJj|Yqc*(E4Gq8XZ#@eFGw>svCA1jDv7_{!dASC_lqij z9jkT&$S`yH8+i{}bhD`D3nZ7e1jh7=768=QWqiASOn(fMRI@$DGy5tvU{WZJQAX4< zL9QDt7asb_9Y2*7F6CSlWQBJ}!=8n{bf7qsA0pNmFn+Lo=UnE<1Y zhHO~sZ6@PefHpdwx{wl{nhY)(EZB+vsL}D%gk=Q;1dur znE~fgdF^qD7KX-%_Hc7&1G}KK$xST@7 zm`ybfew7&|5D$AA-3W#Vd{VtUBfI!#nTn&>1ils(6(KSmL$XRji&m`|o0?s)o8g9~ zLrJ&39PjO?w_)v2#-q;xe5^s1PQ52uH*^^U556leP^Z=)E)}{QjV}9U4x!%rieL3q zvVTLNpnQT+3ngw|`01l&!E68W{{Gu{wa8uj#`^XR>`ED_`$=zJI-JzG6D}t19Lx$} zE5)v|aE80aqz9LH7wie(wSuOypFU~YmMk5aeJR&bHcv%q z;vRv0VVjd{I-@MzJXg3`E%hO~tPa3QGJlnJElo;_N}25=NeII-KlE!P1!$)BHwUkFYCZO+&wSUWw z#Yv*wS8W$f#UbEZ+QFBbq0ELZo~BHID`~a+#QQz&a!KsTtosCRVg5S7t)$%U(Z;qp zh#I*9jReTpAV-yDqhgZ7m2_ z$ga!zb6J36WYS^xmXGgP&neo=tABRs(~}fZT%0Ew*0J0Hk5{qaM5~s(*%X_(T$DzJ zGp|Ir)XLc&ozPuG#x%qAB!~3Mm_Q;#Y+5rNQ4H|vqfnWt5F`Yvo(4hVvAl(E>B>kX zXsf0_P>jN08$qfe^?~55mi9nV7APq#Rp&a55)+sT=?)aDOkBIwQuVth7JpVD&7mY> zHAN7yR?HlrIAya22v!Z*s04BOi~$OkAB=CcR85?CDNA76uV4W%omm2Ih~t$oxc+79 zLe8Oz-33yL)G#0!UuGtzA_{D-mTH!nm=e{Dha4>hVpuf;je-sWKS4-Ic^u&!jruA0 zMUq*0{8(n?OQuKVS6ZATMSlRRnO`(1lywiq_-kGh|QV3oAq zBsTRkr+VQfEV0T+lSUZ_^_fP|5qQfDI{8+>461Tt1ep@Vxi?1MC=eQ| z@tM8pW-V9S&E8%&)+-1KC^Ss7hU3{ZX~!G(80Xj*2@};y%w5gvY=2$8h$m6>I_H4xjN9yqB);QBD`Z=@XAZsG|XaIi*S{cXDe9eI+zT8 z{*cflMmDpD$>92P4y3B9aNx|V!W2Zo|wdz zqESxP{(sbqxO9ni4slVHHG!-+lKg)AFxzrmWwd(7FUoz_X}cV zwAP3iozXiIuApIWGO~K$>Yns&AVe0I7E#+XdN&7LIVjHpo)}Q0iat4_hEGCEI|;c- zJF0{*M(*(G(GZJZQbmSJ$WjtTCwK(W`4W5@jx2$IXd>xcr05t5#fgP33wU(c*KeJ|3>7k>(0~+uTrLNA`TgfitDbx93q!_5=v`=`wDZ6VlwF{Iy|ZhEj{)S6C~dJb;+}i(Lmy{x48&U zjvNUY-OE-RY9J+vWrGj(Wi(=X* zdJp?lcYL@?MgC2j4L#M@yw_xEdzkEl?x+YQ6$bZiVoYlyb>E$&^#rlGCTR-8C+SvzyAe2B~vrE@ZY^nbqT#ORXZhuAt1 zoRVYB7JZ%^#UsKbNO(X9NlH>VPej>D4i;#MvvH~iHSMHI2TWE69(7QS222)%KhwM9 z7G{g5b26*1J;@f&C24X9IoEm|)ayEtqQZL4V{nToUUwO{2*lgBw4_FhX9Obev#6Lx z#y4`Rw?7~~67~S^ihqr_+|^S^(ZX&mY!AqNF$G(1zcCC#PHH72(cVxGDXEr*EMi(3 zk~(hZ_w%qDEPqlvspJul(>iXuoi1c5j)t+FRCKsiLr84&>bOOKTUw^Fl8S+nwozgp zE3FtPvW8RxMOmcTP*;hVMhb8~(8WQovs{nKDrzmwdF&&!f`3#aOdOuCJav(O2&AVl z5~5CZj#^fkugqmARn0mxQdwb+vIwGDPJj4BnE;dp@4J^wgvM~BT-Fh!7Dc-bI)Zg! zrIVmZSdtM2I@O%kh6|k|M?S8_>Ve24jThEJdeo(7j)HVlxWw#Y7WQ0-m_x_0emczG zE8m-Y`e-q~j(_`B*OH<~Jwz`!D2jB5!@r3Bw8j(O)^^0(Jorj><$kt%*O@<-jaDb7 zymyW6Rbglv^-DDclW6zE@^aOnN18pcx~dVPSnQPuO81@TV7tNV3}@^3&cnKTVk$bc!+%6FRJDwxfIAB%1;k}`8LJYm!ZZCIwj^n)uEGpO0#_jt(yEUTbys1A6rrmS ziD~O(xo&_-y3`#p3egFwgXg*;*bChoooj zagphz-s36fN{cM~vU6h-zO&el=K$8({vhrsn+O>yhE+(1*;KfY=XJploLV1w(nO=X zz4zuULQ1;HqW&4(S;y*fX%YL$KB{|Waer4JD{1Rq`oX>9k3%m2Mdi7)PnPTmBqq&3 z8SIZbuuJ2KH3CKDw#XU#v6h^e?fnB@g4liryqJsW^U780n;K`w%sTX5#11v!&Fqn< z#Z6Q{>YdScu4x+gx#TeJ)<@OgHSNhnRm7`cy@}etmI&Mt`4p*yS0lJH;-;@$u76UM zv^lh8i|`p>3r@3MSsQm=N)V#v$KUm2N|9DbQd{@gHa5W%NZ{q>>_o?jHm0KiO5ox2 z>_m7BkfXEybnhP)e&wjwE-CbB<$=-;891rZ8}J@Viy$0J-$8e0kB+mRf{&0Ze9r5* z(z-#i#6)hXIjk~D*Ojo=TJ_4h_7-l?bLYXry=tGGCi@f1Mcb{OIRe~W?9qkakZw`T zTJ(>4A=~acosL=&w{6j|kj)<_MVdE-_DPiNkkJfJ5!fqFZyOjWQ}!ZX7`e5w&~Z*_0`!A1dbZ``@F`=hB4 zvXVnMazqgAY=l)7G#?=)a-^hu?1!LQ87Z-#2?$xK!;fesPMg+@ z{6f6MxJwSU%~UN_gQ1 z&L*;1){6Kq`XlhpMTU!AM2Ft8+Mc`GJlf#bntT4lT?hV8)wNK2&yCID@dt`FC;XegsFjm$Ur|JF5$ zqljt^+aL5Mxena*BY&kzg%q%yuVOkx*xNN>SBvN-(TgIw1iwb6ilcCph7Npq4u6H- zTxBbEF}R4Jjxo9I!rv2chKaUDZ#E<)DT<;5n^g$DRt@#IaS&xRg)jtO@&baCoi&-< zH1qe|->w0)J@?jmZLwNvn)$WcpV=5YwY!$hRv8(z>5V*ODSuPhs60WUJ;FvCO0K_0 zcm89Aj(lu_C4;wnWp+Q)38JLQ6$6y2dP3rE7tWLCKkxCClTb9`c3}*x{%sPnSUTyA zrK2;I^pAF*oYfTDe`4(H`q|EI;rKzq$$lAy*t;buk-~aUa-qc_&Hm z&3=wLRg;D_H=ewwkx7Eg_%;LA}4-#DW_uuLNFe z2mvLC?R`rRKR3o!0dTbobPspnggec*`^f zakkOw$f$%^9+7nG^!9Vrgd)P+Z!sjHNx*~G$PF+}+v$#cgmn2db zkfBkyUw?1?AI_4-H*j2&uQu&@*8gk_;~)o4Zt4s5!j@j|$9V2_wj`xpF_q?77P|Wa)Ip_u1<0kB`lMm0!gcydAXkgmM5nq zYkwstfiX!b;x^4Gm+&tqBm?AVxq%Y1+3;@zCw*Y9VpM$~;x(d^Xe1`e3djDyQ6Nxt zC|H~hj(vi6iHu@yYb!ftYb*anBDnu2T*WvWR6Oxnc$UnHtsD^W_y8k;1Mn%36aN|Qm5MnX9FPwLI( zZtG0uZnG?ywq6yq8$7xpYyvgzV}`0kMR#;%g37Zi?%A;ti;7Qmg`OEDCDksLWPkLT zU0A}nT#ogcX>?aQ+r>k&w@@W|qD|?{dN@E{tkxWVtbvNS9#LsmA}V$TiNd|mQ#Tgl zF5P4-i?yhi7y+ynFr*eRaLUG=Z`?)FJtUcaMa^JfkEz+k3YnBwh#^yt^&aG&yMR9c zdbHYcOJc+KoOPlbUzIe4p4o#xk$TiYk9CfZ&Np19xfTER#|f-<=oE_)StVqV~lLZS^xGI-!y zdcY_07?t2BlNjX)(5NobHrT20glYp=X>;t%h(eM4J<)p?Qi3#+@**@awtqqT0%0#X z@Ag2bEzM9%`W@JS3mgoHTO;33F=nr(DoshOUZ^3Rs5*Y4?utaZ%+~PlN)51MsWP+i zucC!kbsX$F7neGIi6+Iuqo!Bsj4DYmxks(TXjEH5(tU)tr(S1zH$WaHSO*S#;!!P|Bm1vooxA#Aq2|wI@U-5gUn7;x~ywo@#Ey9R@#xAK)LLg|JF{1;Y7y^ckH2Q3U70D-$X;Ua%SRRMW7sB#AY5q@}IF$#${z zeS03d?s8X3BR|9=aPw<53dev_z;Tdl8P6)oUMtct)J`I65m25hJr`)4PUA2yn_dh5JTYJHkua`=XRwD*8UzUzW zige_ZI8dU`bLrGh+FXl~4g}Q33A)FB1#mqXXk${qnjc1?-~(Y4Emij)ANtfcs}l^LCF-zTbzs*mXKy z**{EWbfoS44H^DZ}&Ri=8-S#!rJfNqmiw2Yvi%8yQ+7KLY~ z!bCLwyPY`{qpYv0c2*x~YD1Z=$@`B$d-{jTNfln#>)*Sw%<*uB?uNgv;T&vWE>e(Z z&X*7ZJvC5#0IfQKlR8o;g-q&hZFfQvm?3FlA&{cW0ys~cc`kqIUY=Ir7{HoeJp79~ z-;Sfzl!#8}N`%u2qnK)j#9gVP->ov$&{^R>jIzUFKV-=%OY{uO(IW16im*Up4Sbh1 ztJoa`pa9o-twk>njee>dC<1}^+v-7?t|T#MVJ*Q=Ko+vjiV&etI`y+iCUOTCae+8h zFpdWI?**t1ifV@^%yW+0H#mQVfifenS0u`k2(Kp|2Qc9`Zc1l zxM!J>hv5qBd9wg*FY3j16DYim*KQ1(kQ-)%VsnGK>2f0fbXA5ZsXhxlqy3OkEbPFf z{tN9QyaKhrkDz$Imq^TATp1U+p1e4gsVjlz_qd1ZsCuoml1NBM8Lv#xn{RavPG_0l zKfoD7?+H!9n!vo`Jy4uT$N>4Kh5w4d_8_(dgFmX*S>}T*%IzijVw(|y8%r_)cpE<=P1A#v>lX-sEA zil_5bG6#uMOsaoR&&&=sQX+=5G%G&k2o8-b7y zl;^35xbz=+$Snv00iH2|=45$@aaS`t`S`zsaBg zNEP!mLzD_{KY-f=pD#Pn#Ob6X>qNf>65#yA;szn$@5IvvDZu3NQ0s7aqqCf>EUo?4 zps1KXw=m-yL>A@C92es|(P|y_wL1ryYK3oltKCcWZxh3(kKaR?F|q3|O3GqVPXSQB z@+BGOdOTyO10@MRZ!f3V{~&DOqjt}=LJ#M~S)~gF(qxG+TCt7O)JFlvWcU=1(4vL0ScHIK4NRU}A)w6<#d617JQK2;v#L`@& z>3kl{Kl9TPVu~^w8Y^~q%1cIYDDmPJtxPn3b7H^0$i6PC$1!w*#{c>Pc! zix2+hqqCa4GA7D3VFD2Krk!W#+b=L)bR3=kl!7LpBwar*uC>hUB}T>=ucsItmSm@^ zUNprpT-oCUsbAsJ@qXOMwSL?o7FZ6oZ88|c&LX(n(rRPdQ#J%qv|1S@G;G657`pEy zuJ;Yr&K8wa*Hs-_cFd}_;yv~^gc!-^7h5gICU;DenxDE$IRlzWIW1ccJ%`Bh-RewX zJDEp)*KF|aQpgTE%oggfm2MJUOpEY4z&xXI7GZOL*?i(*j2iaqdSUY+?)d;YU{w)B z-tM+vSF_n8+u;lrIf!co$P+w0WW)@`O}l%*js~!@riJbkOyTpX+GdH=wted2j8BFV zxoJ3l#%fpwI|9g2&!Ojg%O$=iVUK(7U^=ONSL0JiaJd_{dNfd>cs6zXJBsPDEIqtS zJTZ?Q$gzw@3e5UsU3+%|?aBjtoY|6>c?4rnb;f8swX#iI+rcWd8|7&K2n0IP4PbPQ z-Cf70ZU8TmOs(uZ`pAngz&CvSTFZvtxDFJQM8ShCodMwGW?Lk&Y7kLMW^xmP+-Rz0 zXVh}0@G@E)vgTDMhQRDGBI*gMR>Z_aI?yd=&fFFVKHSBH-h>!jQci=L%Q@FLKC~jJ zhU>-eqmj019^{m_9Mq?Z`VKDQ+A7a03gMjUnD|k799L(<5dBnRkIjrU^ATDN=F@ZVa)wGUN&n2qfs)Q;m z_Pt}BH~F0jYE6ftEe_3RxbNvj6s++^=X%o$GYhQDkZ&z!xzO0#xjMKc&{@J^BjjR5 z*S)qqEqAKi`jILW6Hk~~=r0C-fw9tHI4|fc`vVNQ2|t@qaBWOblu=kmgPtZNUFs*v zOTDcv?7qWz)(R|-2NMeuNQ1iYB_dneZra(zejQ8{kV$;aW-BV6KUbnB z!vW!CYv3H=odkyY8%xApz^T6W*Dtq7s&gi47KpU(g$N(bnPZY(moTjY$%QDVj~14a zZ)QpqPa2#9F`7jJ`z3HKUqk1?Q*_M+-Hl%hAasrKBeG`t-$iWXwxK#Md3ShS?w80t zL(Ou^uj@UXJ>RNH66KVD|G)q;)XB1%fC@zlOY(SY5@bIu^Khk+>_wPg|01GE=Wt0y zcSx}k91e!uqa^dxZIS;vt2PGmNbV;V`EZp5#)}sG9sxpSiBOwky~@M5az@>)vEUUp z|7e%GXmKt`dSl~XN4yfes7=DC&WUx-YKpNcF?t0x%Mj z&xsV3w?yIWM2KW`7^|~vl=mrOt_*9!t0aJQ9H&VRQOLM%I!Qu2LLSx-V7STML5(Rw zf5U;TF=)8{&bYPAVHbu7Eige>HmZ-#TiM60b=DV$SYBchi%!?f`H%v8DeqjSlRlRdGop0vBC{%>IYTvFFNaAVC)6W9M}q3$7|; z2-KnB*J4~seUem?g*h_cO>lpOVaKoWgvFv9{3RgPSB2vW&xDxhNBXbfh9STF zu{8e~Bom!Peuxb;6*n!81rSlMPHd-EW)#f>uMvg6aExRciaTthOxfmzGO47_uElw; zxUQ0*m|nM*!N?(LAXRMli*VrtMSLgum&irI78HjP9P$Kth9Oe1Dhry^A5E2L(26pC zMNaN`VM-965{V#H{naF(>${xN{xNBEGQ+DdERZ1>?eBAWJZ6%fay4}=m|}6riqDQ zo?flwQP)s_MP9!#c_Dp71zVDGG^aFT;NX*MeE1MRZvP!Ch{z3}{=`Qbu%{$$$?)!z zkv@-YfU$!RP=De&0$}+zhFkHXesf`X7G0Q0U$4vgNxSqAFvItB-B7hIh zf`TM?wSkkhZlWFZ4^=5{eP{mY9a4+j^ZoCIU&;P_a#b>vH-L;_k|<9F8(1=eKLxCt z(ofhNDhy>%Tk$r6Uokstzm{Fa1!m>~Zf+0ut`iW@DUOCQT52?tqZ_yD10O)7q@NUA zt!+FSQVo?B+EhH~CH+>a66H6?Yf->nR?7cIeuk>h2^5g3MjzodU8IrS?hy#un_*^{SKm z%80Z_8$cBPu5Q0ErCjO%#94PKI_Y$I38T@OboE2EcGdP|9c4WwSm6`EL6PMk=*~Zx zh%s4}cgQp}fRRSzwin9OwPglDlOf?jAz9P;HO?=vzfO z%MLoeLuXujp zCCjw_REuIn_K|sf8wXLwGi!xpcj(0u9IVFa42LE|nq5!ZSqKrCS4B8Xp}ks`Z?m?6;UW$|O|&DMoMslq~! z0}T1wA9GTMPLaZdYG%-+>Ow(Dan#&J3(?$A!zP``nX!~P4UxIu9W6OJxfWDSV9p~y z4FM(YSnDNc6ob$JUn*<=FDefh^LR{I`$24|$tA=%>wbKSIW|k+W7fE1fV%098R_O0 zj!SDm8vjwtSYg{x@j``xJ)VAM4`K+=1SFl;k#%Yl+(*Vy;pLE5}{Uj4zOrm9oL}w|k3mpu)Dh%Xgp7ltrk1v8x zeo`;E3B2)O`u^B^+E$bz%xhd3dOZ#)u;kihTS~Y5*Y0(n3m8vP5-PPPV{=&zxj6=S zZY2ZdTxSk>I&xV$UXtD!xw>BpcATk~H3SGjjk-?}$eYY)bJ9@|@uPGSG~u>bsZCE3 zQaxVmB8nnv4p@A!E>a!KU7S}%DVkAzYO%~D`xvV99!GlJzlnn1BobAkDyM9K>) z5SZFJ$w&pi`N9cHhtnnglyf;B$oaeYVI;Hjwsx9GYGaI#*18a?FP>o~%`KF9vb?<0@inLE_<8>GV ziosFI=jT*$K|~m0RHp!Tn>CGn!O?js93RL#vnzg7`!!Zkqgo91{?z|imS(ntf_oH| z*bu;p)X4G$gvc3rNsIp?ghTJ{))Gj6J?n89G(h*(*B85qBAmottRFePFE}hcOn-my zeFN2Urdz;L{Teg2zBQ>kkB}Pp9c~Hd!HJj!+n>jPK<~wyN!!&%W2@9MLxb11W5RM4mm} zP5rK`zfeG^4r}pBOfK8RKpf=rPTKJfK#=~jJuK6Vr_b1?9v-IkDJQS`PLPuWK~cqJ z-ME`L&`0t(>RgEQX*XGC$(<>{hM6~VP#7Dgnk4I3nCMJ!^yiVQ)*oVD{vj^s^#Y9P zct&gk2s-bG`|z)c9L|w|_$^>w*|lOTw!y6!+wp}J8q$^{0X#@6$8rEJ&F8UY*)VbD z#;u#)wP^nr4XCFUopV?V?@Ze`D1y%;tKLqXWI>4dxydhwb`mFD;0tv2+CegDl_usK z^uzBYP;8OQy#rE+B`5g1qEvN_8k9kgx_G+Ue6iVE-?UfA(3dTMTMD0FEqh?ho`Y}N zOelHFJX=UEG?mE^dbxuSo+1VJn0kVC_JE*jimz8p`47V+_opQ{4}A6^7AjX2xOd+= zH*6HxnAm(cLzBc($RcQc4Dnl28Z5veUk2pD`1Mo>+FXA$Pw8_W5~8KW*Sh*1W@kqT z&YApewwX_r9}+)NU;q^WLNWkTZKn^R&xCBn=>K5>fta%h-2$R?BoMihbUZK*-Gj63 zc-zR4empTR!OyXDg!0eSwI;O|3w-GgS&$`@5yaKqBw#(4v|pLW!@`_s8SZ)XXvsHN z>;1pX8>j9<>zwXu+IxM7v$VMRO$w}KUiB-tt5H;k+R8KsOg3PBpLZ0jcVXOiAv_+- zvgOH&Ct9bECLNs0QND#m5Zju~n1r?bG&PhhP3H8(N^`pQ&{i&Mm07em{*ZSiYekK_ zo`fTNVb~845Hc2ZNCejz9M@_t%1ILid@cNosRPvP*x2~7Dc#;9DQN6-`X(*v-9Kbi zH)oXyoij4umJqPR88#msR#^#Ko>RZCoyr9G!Cc0jlKKJ`Ug_da{????8f$i#l!aEE z850Nzt)HXx$lg~ZQ1*;X4_op>1Kl>)UPgF^{P|Q$!V8UA;Sm0Z*${ZIPRw8ll|7*v z7c}G6(}+;4KQ(L}H5=0H!LUe*_10TU$^TZE$&FOp5d&bOBb_b_Ajj6N_E+;b|1@<^ zgS?r%XPuY-;kmPS$HhUg7Q+c{nY-YGc5JLBYhYK*NgHGA%#E?pT zK*fj(DLgfY3NORj*Wi{%Jy!G3Ua4b@uC9i}E(Zj%^LqBlFGmP!3_@9SVTTd#VPlZ> zIap*3O9Daxp^2EjY6!d zAQOd5A3RAYLY-M-O>d4Aa;yY7pnh*X9}DkOaRA~16{i2T$+WZ?-mayS#qm7ll0VyRXN z*Z{<--wV0EfxGJspV}D(PQi0?WY-A-15FicNb6?~Bs$2xM7Tw$I{+oSbDHhUbDW-A zSfIs>7g*?j9;q|IB&>`!n3**YruycG#s`r~W06XAR;JwC?zORwA7BipySUcd=n0YK z3InD#&y!p66BT@yhgBUZLmF&)ZthForR{!Ohw5G}ff{;J_okwkFeOsF0YXr3LmQ=Z+R2 zyl3q%b6~$V{Hj7TD{n|^1f9aEeB0Ns&YK}`Cxe;Q(uMkzQ}f*L4k;S#Q>E%zik$ zDGa7N6EW8tpL^H@_*nCM4L0h~GHmLNy-&EDp50-5!Oi4$oZymhv_hRCuyzvF>8koiio zOA8@ExH|>1^PIoydQbZ9K!b(KhE!D!^cY>|2H#r!8%@y3nC+jXhvUWNCswJkpNSO> zprB80z*N5w4(iK;?spBe4(&9lloTrBW#>Oc_GG7kbppIn2Y{Xa6^O4u_Cld{q(?#lh8 z&{&&EbuZgNli(h(all#y?2&~@S{3PH-bJzg?{I;w{%AOF9!#iK1?H0GV_&xx-}sMy zFP4lUm<<<$iMQskZXRkz{$h1na)((7ii~x~qjE9&237Z(=?8dgk8L z{TezZ;)ZW%FZg=ae7)GiI7rT+jB-i#;Uepb->5{0OmBrKGk_Pl$!r35`C?hRYt%_h z-)5$dCYY23y`N>0NJK~4CWO(*uNWK`XE?2@_Vb>J>lvkT_(~`-~pCgpcQc% zQuV<~j-=uYDciuD5Lv1|DypIsO>-q?T&}V`{GDY)g;6w6bPA1}t=e%`_yKRp{<_Z^ z{Oip?T@GELVi#PN{;0+V1|N>HYj>*rzW*_uH4##9`s_Fk@!PPStyVTFhlx$rFkQbc z-&-ayE%W!aIk= z!%)wot2bz47BHqKaJaJ~44Z(9!uiGo)-IlG0}}w1U+hf2UL)|_1k_{e>I+z~I6~x& zYZy_}0k^}ZfX+DiKNiDT%4$7k5un~Rf10tg%|fCFQLn#u5J`}c#5@}mQgdO+E=Gnm zR@+hk)x=*ry9N7g04}P~D~82#_qZrN2h80NUBnUZ$`pG^vMHNL{kLdP8O3nOb8giw zAXxc}-5B34rmqqo9H1CY&o9(^pd$oJ0rA3iZ8&Qoe`%i}RfHw$skLAwcWI9hc=)(c z3*j7QlBbh$lz%U{Zr61IZ0b|M(O>HuBDO9wC$v0Bjt~cuzd3;d|NWy|%eg7))~A$k}x+%e4T;S^NAj1X$5DQ~B3Cb;eWA@OR%8 z&3X9JlP8hkZ{LFx8K>!4yQhm3LUz@IKKFK5j2b#Fn#$`uy6WLG`}ipkMHXEi$c017 z0+1rVo-nYub=L*7t+K~=EkONT%I!2{%loareZ9&yNNQFU-Jp0r|!S=8$nMS zWv(&MYT*W;?CvX*YkXx}sC$ia%2VLjW|LHn!<*4WjoR;VQTLEQ(&Vfz*Y07i)e(UR z_(D~`S^cYFjcvi62+87^w+g0d-5^G%7V_A|C2Lta>#V#;I?E*1{)lOk!ME7R+9<^X zX;M0+ZOnRtVtA_O)V%zPDKkK&pYlQ>yjE-=23L(&T zlfth3mHPa=-OYutglD_Cyvvd}KY@+22+GZp@lZvWP606Td56H{*pIi7slVDg$9=6T zQR?mGaK_KFWDh+m?(HjgPeiLawt0N)l-ajl{+rXfxXcuI-?sGlq3XlaQ|yql@Hc0> zqSg!macoh2?xEzvV>ib>ZK*Szd3K)OTfS768+o7M@*a+7Tf^6EnqEioM7A+C8r*6` zV#MqAS*C>OZB@u(0d3_a(Z?oST$nqi6%-!$LX{r5+| zCT%Cu0^iG3_xt?g?mqsFBO>kyk52)gq+TSz*Ap_?yI=1+Z{7zNAclVJKTf|=^L3jm zwPzQhckwpmiQAKAFCe0icqoR!H$FYqKtAB7eK14#TQ|a1w9oguy90O1=|};VKI4a{2YPs|kDozq->* zC;MvhN9IQ`X$Z|e;5tQe2pMbfkkF$-ZMTrSCA%;jfNOdIbo%_`cX^ zBJKCIuOGlR+~*H=X`wy(He29)NTdBEBnH~YZ3PRZ2w`l7_w0i>+e&m-Z9Wab4^Ea8Bc>Opg}R*4iz&TQuc;-}ljAPPhOwJP7_0)K+MAwi(gv z_Y0tgZ+(6=iaGFH#%`EBx2nP`nf-I0C6@Kt)9HF1;1XCG(-_0%(gMy#PWT7ebnkm% zK!djpO%ODFx+}l!Uv3#7GFs?5JcuQIY$f9JDsyot3n73!_caSLUJ{@Xoo@Z!H*js31Zd=CdUYZYqPbF?2k8Kki0(LarOtJ8yE_PYNk{ zx;cvc@a21b`28X*q8a}I4ztvgTedP^D?x*tJf84V;MN1Q*+cJVMakdhT?)93n0vFy z+UAp5dp!FRl^f>Ae^K@H*^K>?dfcdR;7Q!w*siU2m-|!E;cbie z5sKNx7%$Po&+l1t%L%lJIX|h)?K<4kJGxH3p6mk1Ou~Q%9x!Hr@9#%<9LnG(s5!S5 zr58H1Gt;JON+SGg;<9CuLTI?gnb{QkZT!IVcGdZJ(8EhF2&s0mMEsN&499&n8k7yJ1Mue>^DosjFsJ&e@oda$MFsJIPm@J;1Fz>ls}P3a&eqhN)od}}-U7~Y_ zkCB^gVy*`|_J;NviuAv~jnJq#7s;D-A`0m;%(;<+SRK1MfCx6~W1g~MWYr32gLz-T zjm=g?Es~fe7Gk%*58sS5wJr7$3ht?6EPfoyBUjK{|jd*1a_-jjv(%uZEMrGp83sa8K9%9A&!)5W4FQV0wc*)#jMvW;OspI z;k?w^UR{Q*v0_Dp+VA~r%+_Ytr08Hkfj5@e8>-zOC!=E+O!k||9uA42zEXsftc#Na z&fq(8n#~4TSTX3tRZ3*+ny(h#_3w54Xy8y;YXBOmDSOEQ)0bI zpnCl5U~E?c`+XYxlBuq1*$oe*t91~D>AHi`t;715k95^I!Kh?_2PBC9 zW;@F3%f*4b4vI9m*SAJG#LjCeDhh!nhs}~~_HXfUKg~VR=+9eGjgET0FARXC5di0b zm+fiT-`dy+!2Bfke+QCD=+}`@#eqOc!^tCuH&sr8?ENtf+K(z=9KL!s$5Sf1wa()F zUz#O4YYT_IZ46%9e^&uqpa0-HNw+xtX0%XUO|AivJ>S(rYu|jF$yE+M|2?KA7IbxF z=yA4<7i(E;|IJ(*pW=Sb2SyNS`MV1|Iku=grNa7`_XqrH>FQdSwjlJiKj@s1ZvK+O zfR^2#bUdq%JL!0jM?dymxeDKjM*UGw@o+kJf+hK?xL?#u?*Nm0lnKW&>s}I7N*0*} zhXwTmG#JM=H7y=e&iePBDASZL@xo{hz+cvs-F#6{E9N>fxV$U8uSr~}j{(o?NmU#* z=-XdgJTmKHDx)r*YMSzQlI3dm`NL%k^5|1yQkH^tuGU_Ep|q~_8~B{~QzE*61CANe zIlv=7YgSk#Y60o22A`&{5t;TR6z`F|zWf_Q1uV5-P&pL#r8g;eH|aAu(o{})FO84` zzOHS^_gfk7erdNWRAqWh`Ftz?>rgKLKZi0IS%!hO7}-OV_M=9Y8gfrUp<^Cx6}r-NR8;x&m)RcS{fUoPR`^Q!5)QUi~%y zkv_<5y{R0szLM)L#EA`b5UH?~2}wd$`FoNi^-yP{c#{)(Px9gH;zoV z+4G{KC8SDy>P2lXQg?N%k8&~cF53CJ+Q-k1TSj^c>!oXL8{@0<&l%B%4Q_D7HFzHa zUt@`!;_vN^7{5HojB?Ph8tWOb&qrman6k`0vkvY7)=z)!UA962uJdWBbOyTJVTS#k zVhhRG+lWU4i(4+<-&^V5BiV@TFcYD=%IOxI%f%l#jm_AM#C+{+TZP|FA3p77?P(qN zY%4E@?$7t3H>03`I}{@m*4>UWXSZONPP^**2V9CU3wBof4Z}(5;Y#$ovkhUVEW6N$ z+Msk=!wA`@aen_)$Hc=yh<9bJy-ZYerouytjKLceKJ8g!Sa)7;#SEuY6MUBU8%A)i z!u>|(PBKjEWAV154kFKkyNAl*lWy4^`E|4|t!hxUl38A^O)EGPUYliqI}W`$^~6;* zC4$7ufnC?6YTI_Z;j)hLL`GaWOdl@k+j;x(C6S}Yag-+q*hOTe5zqWZG$~-&XEX7~ zk8=lM1I!S@V6BfW4m)-)KYa0A0}tgi z;p+-{hS9A6tH*9xed@z*y~Lx*m|(EW+lk}S{7If4aqMRAH#;?KSB7$qF&bd87u7(! zeO+9t>Fnc>t|1jW`GF>pY4X5YMfe5{A|E3i`XN_F7~C94Qb%pw{6u#-?82-slI5E& zUnWi<@8zGk2|D#5s9X5t8l@-lAG3XKzzrs!L=Cg{ z`&4eto_vV8r1RFlt8b09Ndt7}n`uqiaSGqN&!!uSB>KO!f?n9ZZb!CkLHt>H@V^ z@BCB{Iy{P%bW^rrnFXBNfF5YpZU z5VEEc1ZW?uvxrf5`Y# zwi%}st=rS89sW#kM*S zXC~!=uz5QLl>(b}dOa-*5{R=G6y6)5t+t@=hd=WFcj-$VF_7H^X%&Z6{N;Tmxd#K5=$}Jx zTg&_H9R>4`>FDqFTRt`b#i)$r9dH@TPgg?1Rxtr_fo1k3_nX^HIWgfQ6g(a4+i4&0 zGoG1rKt}rC9bdULdr+gFB?oUIN828ypZebqu2j~6(|}SPHdkR-FWaIVPa(#V z)3#g3C*=$!tXRi=1>1*UQ9bjAV779)&Ne~wDzzI-TQ`$lCdeWzMG(lTH!<1I>7K-` zyN9*TSABkfAZA(r1`TEZIPXeXk=+>%Go=NS{S{KyTQqE?g8^9 z>4f$bITq>Tw5noe)kbUM>$R((BWh+M1>3JfV?1$AGO?IDpHtZLH zHa^RT_=)(O$Q+MGkJi0<#Yv>|qHnT(@GNMu%79^Ep_=XJ`BH-@Fr$Z!#UqBf0N7O{ z!bf|Z#2LLYr2%WDM%jq;kh$`KnnL`0?*`$viEsAr^O5w@?YM*wa^14`P5(p3Z#u8*wRQHGYS{18 z&-$N@YtwvUS({QvK&^t?fpU}SUu1wGQ@HDBidITx0#?@dmm>N&QM>qPxbgiR&d$UI zGP(}o@}&lP!t`7J=3ZTMdI>LduqX&@bQz#XeqS0s32zjrUbQ$upCG;gY9MFTk-Zb+ zM;LAuY*Dow>~}gj4m5t}goz%lb~67U^QlBY)M_&P>uAZs;rgs9!<5FHK{E+V8ck&p z2UH_zIDthgGcz!D%~Q;aY5U$`=L-{RN^)48#xaXl(Q0H(*_<1ewKhMlc$dj2Q6V6# zaZYzZL%g0USjNF&vk1?F)3II>WK?_s1MG8%gOCXQLW{dn2ALE+!yz^(UnBG1XYfn2 zL2DDf?2UV3(fCiwrSuk24%ud~L=F+rDrFunWr&1znQI>+5tJHOS)20y-FW;|o6Xh+ z`5)Z4;K6N?0pqt^b9xe9@{5&<^BW-JL_f~&$@>1ETj$%R<+>z8egv7yAFCWc0@gZ$ z79n5ihD0d6E+{=AXE#6QuX}bNaicplqd?3%)+k*kAd9LwRDLXetSoQ)txe!LpdY({ zw0I*mi3_iv-NOCdLh$M69OC6E*_goCfG>-8`-k0biOl|9_v7z*;JU9{0HE;CQ{hUi z;kWqUS3lX}&}h-4Y%ZahY56BHtvGwFxTg_RVVgk7awZ69T?`#Hdt;WPn3hd|6!d7h+*2 zzaSkEfZKmArx>6QGeGK(!t8&b?8sZXL-DKz2Tv)yU!PC8R~#vO$l~5Xu34p((Kn&? zwpMnNItOE#wTTJAXZ~Pczai%OV3;w@W#(|)PvNB1pK`A;1fZ3FZxH8!Oq{|~`ExjA zGt@A-%2>tvWY@o^Ilb{{PUaN2ucCXSpw8qY)54$)?v{5V{VRB4&GLC5f?X5WFtJ}i z=RI|Z6^u3wjxeMGnx)P<7p>#L8#dylIX4M5LLKjhpfiNnaV7^+bU#SSv z5fr8a6%K4J0Kl>dn!7yp96Z)0o88yc8r+;sI$D#$SF_Y^mM<2UgA0GuF$uJG^JwtF zoLo*Pc1^&*o2DG}8x~5tQfWlt#^c_S$EywVu9SLeX&5o1EjZMEUUD9Wi}cnTMolWc z_ZUK3m7`Z@FmDy!Gt}^qr`)&*$)=AYG;Kax%fJ|I1@vfm8Fu%NqLG!za+KZTFq|OE zt&gLkCXfB24X}cT|J@3|qg^65n`QF28m~K5Y!o6hMau8hco>->0#FtcohU#g%&7dM z#pFY)h0!X0aS&CdSvrs8P7<;|d|%*9U>DuVk~OT={51V%s?-{}I;ZWCgwFr1rnK(& zNQReD24FERB?IGOL{bhcq;i?pBE&7li|a_*mR49?{SXr-SEAyf%XCG>ht@&hT_%E( zSalCfrT1Oliv%_?o4)K!Hu}<8r$b5JHxg6#H!*K@K@Xd>6|f;{^t@?a^ILaI-t@0r zxBwD@3Y8fY@e+X!hdRXH_dN$0tBfz^s80^C?aj(zyHcrqb=aP^oAA1=ZC9)HIY`rkGRRs8-!<`YanRdl#^z(@60j`+UYe%M< z6(9w05qd&;=vB>SRtonHhG5CcYDJPx9UW0+3$ba?ma^!}_-d%*A(r0d^vdPDV)8V{ z*=f=s#))J2%go)3{{C2_x5B>f`;arDu$oz52f38|FB^EX9289Ep7iYtqwGtGytJw) z_nvJdtA8uv-f~DId~0-HT%bT>YCPPt^VXC^dsoXhxp92;N zc4(+r!_B32TtMny37$LY4wErYJ|!`%!)3d8RCSJlu+;9=xmhV1FV6)3nfohzPQWo= zq8ajb-lHy*I2R(&AAKMaDe#+EaH1WHdKTeSH(Wa&(BxyCnZl(K&tARYp4rCmo`*j# z=Vf2IC957y>Vqa*GkK$6xb9c9({wA`IS$%QJ=RThvijuZ&;&O4;QSTV{ql34sAzu zZ9FyXJ-3bRU0s`*_su6MP&HZw7yBOI4RcdMS990*XyY%JYI@Q44Gyt3p~~i7=}3tG5PAL%PYm?<7fVO31AXhq zP=jG(Ml+SE(PnBlGMXWNc3k|^ly<38%0-G)MuP4Euf){RZG5#y-2>Yso;H z!&LZ~OjA*910%8r)$jFStN}q1!a+l+y&(E5K9f_Tx463}gXr=ZMZn7+2!KlE=fh2% zsU?_U$=WND$1nl(l|)~U=g*En3LQ$5RxT3OYiaVHO*#Z^NS<^=fX0}G-4b(~^LyAb z+^S*h7d7LIJ6KfEqlM#DMGUIfKG=4Ayv_Yr$Yxdd#@mpFFC0yt_R>5Qv{Rmn}1r$4C6Mub+s@Q z>$-`j-sDgzhGv~~H|KVAr}^rP!Rts$E4mFEKYTN0wF`<(K!D}i18a@+lHNZwnpKr) zAxZ4VyH(fDE1MaZK?sBnl&#|&*gyW>sDtl_`t5M1n4?65Ncn9;((uGziK!Giav45i zd*!~ktPX%DK`8|^@CMdJ9z%=~Dw`iV^B!LcpKnh0yq~M4D$!5z#}KyR1j^!7%q$VT zhh+t#bA-kqHT@Rm+sy71uHOyDN!pv+tXqtk(pMg`_b$QV6oFzxZ^;xA{XF4*<}9q4 z{`Y#ioY9Pod;WJKQ;F8PDb6NWAKoCNcn|SA_yhp=1^Y!M|7~&-wLC-g74R+SihPT{ zM>n7c`K-6dg&xx1V*?V&ty0&eg{F3*RG<>mTNqdX%nGdh(IwFX&>tWE2sf?gw6@8F zWS4eoYpT4~_;@K&FpBu6K$|L+ZhO^!FUhtVF6wIPs_0pCdZ%f^5azNUEwX%- zf(lSncrDkX{lh^p**(X(U&h2icmbGIaj?RKZ_A_YTES%6kC*QxjRI}o8E`$n^ zR^uBNP91@6|J`pu$wY(vj}+;IlK&)j2H&4h5J2LF^hW$3_R|IU&*0~O=L>!_Xj%+F z+2t`BKTh3gB$?E&adybijR=d=fu-sKtqh)UZT-5fG1o9wcN z82W{9n3_&B!2lgxrzLRXyr!Hf34g`p)Jfwd7TaO$ZsRRg$`hJ40+)E z$!_ylz_|B;gm&5qG5$neBoIO|^n^(}{>c(0!$e;qOuVQAAx?~vZpchO*nNkwTiM1& zxEkZDY~wy0$Wkg9iPu12Zj>GaApAv$*AqqTmrvcqsR`Y+@0Mo4-uG;p5-c}`_`v$H z4Dhg_`M(sN_dCm;ug!9mC)e;?v8utM6n2Lv-de}hFReQtTCF66-hr81;(AsJ#BV>| z(n>g~fTDVwEMv(d&@;6v=7JM$oF6#nRgYo7!-uR7SF>2aKGc0_VHi+`c!hLjPvGW` z-gwO!s}|ceSFYm8SQi!9HbwlC^VOU}<#1kCytq()9Q+@u-Z46pHfk15CYU4>I}>wa z+qP}ncG9tJI}_WsF%xTIV`5|S-Ou};v%Ym!{plOM`bYQbYwy}sb=7v+d}BJ5C#O{H zmmV-8S5r=)7OdPs_8Y3ixP6{Y{5ub+=8w!TEoR`RlhZ#??*Hu0GGLZPN1_a*qU58y zcd;v(jMO1W;9CFS{C<%Nd4l|y(g1MG-6{!9W?s(?Y*3Kd{yVxK^hz0i!ujlYp=A^2|nUp1N4T%A#mVs=Ar_>PJHLgUEmLCp;|Jn**Ha+M-JJl7sG{{j z2@8AK*R=?fs7EM_UP%MKLE7Y8y`H$nx-;Uk)HK8Lu=qr$=sgbTFq%zEC_{4F`Y+Ya zwxq|$ndD0g%7JadYX3g;xtll!QoMC&cX<`1`zg(k6O!sF_W>tXAL{f9WAxDeB46nj z&yD{oT}y=Qz){j{b-IMkT7Xem;`_PyMJ#z3LORAI9=}5JVnGGVOnq^DL5le?y)^sZ zqE^e41Eu(8EzSIKbGMQ?bE7mmzNte(wMqJpyw^HRm`7K}838p^Ry(2~n~&{Dl{ku8 zBq`|@rHOn#)VV2Rt3O5Wb?eWXh~s-5n^6PR3WTknaINvfkNI}yZ-7AmW8$j6G0O%} z>rfh$N|tgQkjvvWIB~fzy!yIY8@kYFD$a z#$Uti0%=aBQ_0f+@cSUupZz@EyrYh^xIwmnimDuh(m7O6(U;8_iL7`PoYPW0M67F9 zWEM4F)_vwwAA}XRJTb3Qu32=axw(rFw}g>#9(qtS;XNacz7V^?%GFhLb1@qx%@%4X zUuAER-@5n`6IR+y>)MF!7>5w?RqaGcf=5qS^e6d#C3s{T5Xo)aVZ#V66V9W(*oxQr zEt>2`Qg!MfamGChn$}39TRPL)gj}0hHiZCI(kIh&oFqPSPxx;V(v8P=GaL3;%&HJS zNekcIKhH`MJFc#nyQj!}_n;zW!hpF?eNTgkz74cld{TZ_-A)1ym|YM{4^NPyb4Fb#vm{_3bSTQXV>a@d-J-j@D1B$a@LddFCAFB>t|e(0 z{(ULhVw8=%u`zj}tTM6F%dAi=_B6hZ7u2MaV!y*EXG~W%6JFke67~JTUCG;Y{>L73 z>iI8?&KtdZnagDb^+0rbzA3JcN{Y%PL+1BFz@Eo7D?J4_tK|+#6hZs_=wdH)E#dl99O~N8#?5;F^osC|LqZ6|RoTm)}I*?h>D88MBUU3>8RV4N@>MqC7E#qdgY>gIJ zL-)D)g)pUmB1z6R2ajEhm$Y%H?CF_gVO1pe395;b0-ZBWA3q)3N_II~xGw8^ADA@= z>h3(vF@xltGGz6 z%@p0zto!pxTRT$G)Oefuvvwe4QT_&wV6A0x3_T-WV!JZ@$_T{YDF6@FArumY(lKPV zzdg|3ZM^IryV9*%3oe5WU%q<{liDkgxog;{1!o~P>e*M}IgZMNPu$-c(`IHKK(FG`;lD$z`kwvC`{~-_AT9GmI&QC3YCSe>k3y0}pKv1lGz)X- zmdq#0vMiZRwJkP>sXwqWtE5I5VVB9z*gQCgJ zQ)VxM#j`8<*5KcK2)Y#%RTA6x=yA(&muDDC-{oSwhW}3JWoKG%O0xVpxpV)MDsq+U zX{33=v-yW%uiM}}TlSkGE_Jz`)R*;*I6I;b-liYhzioRlMisU#x`(xac5sCyN3U8m zStOKM{d$L+7$rG-7dKPEXKz7S($45YFnG7!D&MMer%ShOveR3oL=z=Vz9hqR26u*o zgPgJ%9(p&8@c_S}q29`B%@kt6z2zUPU1%+}8%z%=Mh0;em(ghNNGRZ+E<@}W%-X{f z-?kYZWpjdmj_HXEB|+c-UtsD$-49D`@lwPb>iZL(#O>#HC|I^-ec64~HI;nM%`iLId%oIj&g16HZltkGDD#HLL{0 z98?V2a}H=u3Z+n`z|kU;pXuKZJnmzAjA=t|fTM zp#^%+#or+r6t|t9d@7F=(uKs=w3b-o=G1!=-!ki?b_3}ALFsYVjl3qp^)7V4R|)*x z6S7GQ1!f+N!LeOWE>EA(i*~lLDl6u8&;La~Tf1jIc>4xDzg|Q2J8m6lKKCoR`Z;0D zR&E>HlA>+=usGTI9aS~_q97Y}Glf(0`RH9<&kZ?6^WE~VpCcy)waXpph};cn`zieW z8xXvAM9A;h#Py)^E_^!s5U!1Z8sGmx1ywj4e(aqV-b3vBr<5Zrw!T$kEJY5dK*{1kxtfydGuCzO zeLqYmna6@?6HB%87a3B!(95bCjDUk81wbx;XRnQ93^I1b5Ltvi*WAjM*}9M$4esq50(P@r)i#p(d*z%s1 zG*L+L{*kRe{9ZIV9pgLEet&|K&X<6|z(6OLi2yF+*IU#)D*n5@e@ToECA;IPM>Jz~ z{?}~7KTPdcNk6S_nXY578(W(e-$ymb!$Y_0Zt}!kVBz9D`6@DM_@U^5^m~sk8udQN zTER~6;K+@8YZSglex^|AsNVp|`0u?|I+zH?IJ?*P3sqRO$X7z6l%K)IRlGYIz72Z0 zc={3BxOw&hT|>$rbno}|;TNTKd-)5+BvqT8@q}|F+jFK=Nt?u_anqzr{&u=lwy|gf zrSNB8Bbm-Q?Eib2($lli_bW*ek>+C9=GC{vYHs|{?HZ6B{0y6vGp{s7q>DYP!&Tih*>0ndTuCR+VND|R)8 zsk)p3*)PAaGLBVDAukax?N9!xDGf)os%7=p$!mM_RcUSJjb!gqwL z);m~i`nwdxCYg1IW&l`Gp5G>~HjSRtbzW6M91={|avK!9v*m_wKJRgF4y4ceYgmAP zR5c;!a`b9iAQGa^QzrVTI?FZ$;q3W-AAjQcb>ijzq)x;@Z-nBzH3MhpifbULBdH32rLA4#HpB{I25q^^=_ z0$$mV9cv;IQHY7iO;ANdJLm+B&=H&oZ2eYrrU;Hn?m8Bux%3fadNE{9a17llo~-4B zWTVygMcr~wKz;eKtY|@?Siz=qU;sM!DQ9lOCp#`vx94=}RzEu$M>)uFZN7YpX$ArjF27Ty0_TUhWYf#}Xc7`~Tp-;v=vpM>X@ z!w}sAg;8p*lEE!$IG=F;(k+a|%D+w*k3o0NMEq`GB9fwiP37P;HzWDBFE#AqaV#r$ zgkUx2XrVn2{6_LCoEO?-`Qybytb>$x-V55HI=W(f3GnFGoI_)7DbtX=b~a`B<;`5^ z75U~=0a}m-4Qw15%2em#YXD!T$^C6f(nT%Eo{r{uz}G53@A4${Z|h6r-cQbfGvw@D z;MX44Ho`~;|KxU!UGP^0kex9-tgP#5r^3ej)d4}lV|zfw!qYpgq^U0Drbh$1U+uX4 zl>uMF2mtVp&idSRL!sOgs#Nld%v|(;^6hKcmKM6m#dBLnr@MMK#Q}^4!P!Z9yeD1C z64tHkZ$_{xPWyfRb4jJv=PmbZBcdt+uMGwy5k+cdmm9+Ok7LTi#iJ&V^+uA&cLBwJJEu0nwLX_2cMd7j}g-U=6#;c@(Ul3ny7#$}sO?|^W)h!Gi6YHYTx=7i~Bf^>Up2#!@;YtuAWo0RxJaptPUxL zFbcyox#UR0h`@I^VI`no!N+Sj6p#ILR3n1cM!>1D7XvrM`2R5{k)C{{pDbL}alf|y z3=xi{8m4T4#VO+CI?%G%AHt#%NxHH9hqK)<=xk^>UTyZAS32p<^3lyhP?%6O%YrBg zo-S!|5@K+|1Xl>SvLQ^Dx^KUv_dzx#C>@wuny>|t7|L#O%b-X5abhT`o`dY}M>=7j zZ*g~O8*@L0MVGkPZe*c00r%qsYJ=cZUjOMYo3zBQE~((*jJ2?$G2pImgBu)y>()G9 zYfqz=CrQzc4s_s3$9-q_O+Sb`Eh6=+O}`II6^=;J!3qMVuD0z5)}|ppQ37L2xfA(F z&tN*Y=)}NJysu!B#E_WbY3YHxtZdp=U(+?rM@%EpuW3xv;H|Kz8^2M(t0Agg+N-3v z>Clx2gsIzC#KGURy^fMy=)6reTwYgya9RI=W~bqDa%`?Gf&B?S5j{_A5%0N`Lz~ zAJi=-KOWGIoR^z@YlZVE!i_|5pL2j>o`hL7p-nUNy|A!tMy`;`--;n{PWDliLE@ z8GWni^{KJnXp$+oeBJMw`_EtDUA^`Fs*9m85wN58_Dp0}5h>5;w87Co9DvMo2z0TW zz^Yi86qHZHUg)^?^;JUsSJxJ%*paUhh{rcT%*xVHnN-s4XYl9r+R<*Ip8cDr1XR?= zPhxX;YV!*!8O+09*D)5#J^ZYPOXk(=p^x_Y`(^2@JA+Eljp%I zD2JSl4GiU`9oV7AkP@;16q0y22^fiIXo>RmRHpZx{{#RsAAL_wp;?ij3^5;(TwY*+ zc#s(J99iZ~5-RLAK*DL)-71KCY;a6Gx2@Se7w(U*W zBPj<)u$bMqgoc+gjHyZBDE^59-JH1MI&K0Sa%0XzR^68CINFB_QjJuF8W!0>F+u}5 zpln_iV&lsOqMxrnjrm46LL|f;H-H)smeeU(0WFNw7B@KsDPORQT$fN&um>WFnHWA5 zJ$})Fx-EU7AJs1_v}#S!_#~OkGG-Ee?WPH5g^? z0yjAus?s(sOjMjB`0*tPHa<$$zJx%c44RwmHDbP2qEn_EQaT$fYB9WE5FH^lhxMtR=c^5BHxQS#S>c-&XLw=jR39OMvWP-F-&cb8J}Ym~0!*K(R= zzfvjKP->l|Y+`9U2G_|&c7k0nsaXyi=EipSy=fP3%b%ZdmND)^rfz|9!QZ}CH(~Vo zw#e?0zjenD&f7Zux4P$E30!jE&&k%$#VB!7li4Lkibd>;MW9hOs=588J<@6OExEQw z+5>l*C&o8RpTGfDeU_1@PDpINN5Ah}UM-Y9G@}zxAsoWE%p*~Efs0sDDR|_Nhzx?l zW<*UmGCFp-;F3!#!jv+F%__r*T7LC-z@&;=Ct``%ojK0o5wk@6acuRR-c$APUr^Ar zz7)?~D9*zBQBe8K_h_^QqJ|oMR)gs|>i)yUoH^drZ@wB(pfg1l2}$Enl}}+d#bz>O z|4Bzh!MlM>tSVf-s8fD+Z^^K>KBtXN8=8T!!uVJJ)wYH~4Ap}WT}*6{2U0A2Sn{H? zXbPlOBv5WE1L*{=3<>zox>yic3Dz8q{EX9N@YhN^7kivY_~9OScMhx@RuAU<2G7it zS13;?4^)7lU~%E0u^(*IRELe*;E9(NnBa1zhe%neS4mXSF}SZ)zYPw{fy#&IUYNM= zF8l%;t&~UTHDU8VTuJDZI&WjYlaWlb=h94Q7kl84ddYmM;QO8Qm_v|gm8t|teiJPD z%!1iG(ut13bp4u3MuZB&JUG#O9vA6B}OE_`1Zx`)6pics7MK3+O~dX3g!;Y1^zf$=u9ycF)Z-@wV?=?Xp+I* znFDs_x+hNhiwBDTp3Yqs(b9i+D^2_0yUaOx`gZM8_}Y_)8upC%fN;>@q%iRBGz0k@ z18pL!632!vP_@I6TxN4D79RKF=^3lbN6+UI1}sSp4muzNvi%Byh?sj8nZX$@@fVn+ z1cc-p`n%6R$o@pNNjG1|kVi0|67ZApvNC{*6;7gCW=@Q2kMD2zFP4}!wcp42zHUDQ zpD{dDs!|ZQ&^w?#Rgg>+Jr{y~7JgN6#k)DI8K+)ZnuGES$B8LxTg1{U(iZjo{vH!Qa*K2#QJu0^ zK_=EsI)XrPotDs(M7odg^$|64*tH^nhJ-0nquO(+s~xg%k#kZ$BZ8M1agkXJC?dBM z4SYo?gB1F7&Pf{-K`DqGNc-gGDVPS_gYJmMzYhm*+Z?&l>1LOHr_<|un6$Iw#y?||<)lkfleLQK6yLfvhnb&e&w zle~>G`nxgTuJLB4wE-^ ziC`*^jX_ODr6zktZF`oZG0EyAl2 z{}y5J)#NBJt|axuukJE(8D7vIgnvxJT!Q|6!EXN@#|OL2!>I&+baYM z7q4eglakId&6MPXI$tH`P3|x8G3%@0Trpp6Qg*}e{@nAtBjBX=!#*)qD114$;#Izi z{3qRn!L(T3+0COaK)nc}m^rsK-_edXcG2Mg&dwb?e0%?4lGZ6FnyWS_&o)|m zjC>$M-*Zu@LSO+^v+C`KIQ@2CN_vWnZXTalW{5rqM5e zZc}}vzubB?agcad>74LSk-DYt%ra~nF@Go&7J!EgT`;>Zec{I&73!Q+T6R9i_N7T#F)pFaX>dSV$TjxY8mtY*i zYE$)WX5jETNR4MbnNxe)1Uc5xmkPm1a482zw>Tp@R8rZ>isuyf0g)LJ$eQhM>z z?-0zU&GMgUdP-eZnBDjwf6Et;zB_k3`d3G{o`yaaBAH% zhx$YThg&mkJ*7^{5dHwYwelW+pt$iTStDFDt;c#zrbLpjvp>NywmG_0Y=hXv+ zVOwk>ti`|c^;^4+rqjP^h9*}fy*e$QP;oca^wFGc*}vK!{-+_@T0pBnPA zE<4R*@cEsDFL0@3^TN-R_?&DP@gI?7u@Jb-xvHONe$0Rr9F?Qm@AgV`$Q`O3s(S#w zq<_13>4GZiH2ZkvzP!crt0z~wNWNZhyf$p{DB0FObdn4@%tN-k(wz%_OZPURS+I3F zXKd8*t@^_pGc*<>TAC!@ric#|pxf5wqy2o!VX zH;OfTOS8PH{`KGsEw*YC%(5LR$?iWna<{%^1?-TNHFV&FO?w=_VpZ(1@Ik5m!Qoec z6wl5I;f5{Tx~%VcZyCNATA}z}-p03|T2 zQbI70^tzm_o30OEXmkZbzC}FBtt>!W5(#*_jLvgLsHu%25}PNJy${bx{du|Y5cP}7p<#~MUqa>I zUw>wS$g~Gxj3YD=lDkxd#!icY9l!v3P;e>!{92ynRoYg?Zu2~wKH2r9e7uu#hyeD{ zXG=SMJOQ+{qaA|SF=w6vY(H%=z+u&^nY#7BmH*dspDlOc0@t?$ZcfQfIw?$i7{R6( ziH@?-H7onCs-t|)e5~-A5eB7GVA)*iBISra%#<2PXOlTc8%W|(Fb*r@eJK&r@%daQm_GHtb&HSk{ z`^(t(auagMA~>T2BQcL{fVftn@IpmvyB0n0yW(8j#?RqkmWSxS6a<`xFdOHqx@755c(GG?ICFRLr5vsuPHqWD_)!Nj=pg5O?#&SOtwc{07G1#uNPD3!v_{GwW#g968$5bAc>V^5ACH%!re=`F*W#}HTo{Y(?pU(-=+P}_w#M^q`>Wj zhOsLtZ$k11#Gd=f{)de46SCYS+ zz3jpxiQ)nSh*%}45@NBu~2{iNNptBze9?@u8Ow?(i>@Bu0- zRh0RBc4jsHwwXcY+``ents;8*fQfG5^XOpR_w?xztT$Y}f@o%}Pdb;IF=A(8i1q+7 zZ>pZQ^l4#jJJWHCnn7DpY4MulkVN~z~(u8>IQuk$4)&&46P@Fk_v9m{!+`e>F zn+nc4x*EY%^^IB5cL+%7ttsRSvp_&{%GsK*K%imjkUy^3*&tIyCr?oJl$1(>=!QgW zcU`@WB?~pPD`J)?B>ZFn&0i)`m%n8BC27h`1ja3sGOf}nS(Ru=PzEMEjoUX@zh)E? zx!g?YQGWf6!vF+5p_6OX+zXSdXhY^s36KjAZ~Kvq@-kO>Fmc$yb{WOL8zihf#p2n< z*w|R)IMx!Yqi|`BE-P^SNgV$(6G41lg;PpAF^@47MLO~$mtBIQW&EU|(W&3FhYkj2 zH9q$6gBM9AN+*6tPUJihi$tS}%F8lhJVAb)>rI4v0v7-bMoYzBEa4O4Ce->z*o{jX^_Jdg@LdvTkVEFb$WeRaQ?&_^w5$%(N8g>$K;dE zDL*@z_yaN$2-{eBSEQ!kTJ)aXC?c+6d($`GUppjv8+s(Q{#q<%;I&(|PTFHh;TFu{ z?d$u`aks7h6H!QBQW14^Ostwm@hRbFQ#ZYHu8G<%k&wbj;+Tr`Eb@L%x)dcE&`K6lIlF-u4*NrJ(&x;sp$dF|9j+eZwp%O&H&o{p}(}1_Z`}#H8b-WO@3nFckPSn z2=Nt67G8MG2ECfc(0#J8+%|O(|MwKye2CVy(oyS=M((5P8N`gS(pKw_+i_lkGOdD` z(gYy(OGr*rrjjIZbRk7Zq5M5d`!GvIUC+f#?7hH3DKp;4=pBtSU_4?h zbhJvDEzjupnd&bQDONf~=>kfqu_RjKt}?o)=I)1b_HY+QDec;$-=T3))%;yrWO9PdT}{}Tc)3Gh>pF+j%Z%y;ioo8sq6tQxn8l7p#8p!d`LjX%`v zveSo#Si{j-d7{AuZ}N=Jcmpgc*O!sf5pOa z_<-kWPpNFtirl!;`?;r-8RZ$|*W2RPRa};*a__BMxlQySg)_cka4Kyy1KRgUA&gEN zMQnIa=tk5<%Sv(1luZQb$dd`?&@toZaOA{v|h70lmpOusa?0{_< z`oU0R5YcNam%&YIwY^8q4sV`DqC0WGv6^GVi(`1kzzT$Dd2LTMrgKlIFZD0#tIyS9 z%{geWl4vzzFJs6#0Xqb&tUMpV9+bJAFjAHeYNDrpEq%%0F1adS$Lez^PVs9fN(8* z|3UkqEZlO^kvMk!+9EBzmloTkmmGzEgjf3Gr6GmivGFlvc8pvSJ>e<#OPhfo6c=20 zN*ooPkc|BK2l$Rt=#<%J%02TPK}p7_ia^X|U~Dq-wxJ<<|<p+O70s0CR}mrg+Yq`aX5eb3; zwq}ASSqVtd%6L$Qs(f|#OQdM~R4MkbnXRMd1+e$xY{n9_VuFn*UOa!i=;@hzX&)C( zx>!xG0YhRh#@y=v6tM`PwRqG|fy!2mQ}I1*tL&lpX}s?*W`$?R4`a#p%+Y$4)>ppy z`u4lpL{@~Ysf&D{<9~cxT`!G_@oKGmj3qj=4@?k>E`EF3`VaPKkFK;0w-wAkq=~wVi`y{_{Ui+th=hO!Kcx(t`A%Kk7 zV;;@w0}?U1E-S?lQ3dh`i{v*C7mx)e4RfAmNN+usOS#HjkFWH!P!?`bSMiY;1&F%< zVPPpTaoF^8)EI#>qHUQRo92#@j*(;Tk&8=(;@X^|oWt7I$mAr_yah6}q4s^8N*O_t z4P)k9m^8P2UWzNLePIp-;nDDmVntC7TH-TnF4E*qdYeI=P$bi-R*I9O5|284hhDvI=Z;@rmnUc4pn=rF{n z5LgDkqEdu2)JQ^<#pDZ*=2ZHnR<%DBj^3);Vg{QcTtIN^r+>ZhC%R53aH3WeY^>mN z`TCFC!rIv75#4O-x#ZJvZAUkA=`*?RBga9QfbNbi``@#(-|I@c2e8@u#@X|Fe={|< zaPDF7Q{$8V;0!e8u722G+U`Fz8R=m8Z+?73^B{f=sHP!Gmtu2io~!pf$(Kxv_!?Sw z8aMHzVfYjd(+vL(U~mBtKWe3kLtiFBN3GRJF+(Sa;WqMbc!4CGd%b7Qf`9?nm>ewA zoBd?xlO3sd>#l)kF&oB76l{2G_zXY-0UED=Ttl%j^=$TdP@-!FP|D@r;JqGk7wh>h z9sMU*S6ng6#}$%bcdB8E-aAt0lc18$WDA*CQfF)lnXE=a+aA!YNlIs)x4OhYr>vQQ zv9X;aiZnb+XRCpwF!q$Fx`*CE+5CH{3lDw;b7fiQL0i{$g~nPLavi1Qsh^mD6%qr3 zbA!55C^B|yhq`s-*h2Y_ft`c3tx12lxGy8Rjm*v&ORNh1_|0z+K8b||^@WBB^h!GM z|K(s4!6&QQk`7eOD9?#DS4-+xc*RMN@|y%YnuJA_K%uuu8-R^Cy#-mkP{rDC_>2w%$%LxM*^fZzi@vS5pHSVqWT&#!02ZB4}tc8v_~Ne(&XHHw1Iyvte1Ke(GkrpG^D zW&@HNtSqn<`CHw|?pam|wQb>SG)VL2d;jkR%jh;)MCKU48jJeBsu zw$VC+kp7Zd1+&)Hv8o%uv+OYKfQUQCp?SdI<`l2Ic|med z3A;cOkBl3c6`}g1gSfuwKBk<1T+?z-5DC|@7pD@liC~=d;i71MP5sK`^F!Q|3%>|m zTmZO(DPoyFBwRAk#z$ij*jo~EK%pKIBMP5ZqD6j=hsjFg(+?TC#Mlv1++*&!f+c0eG4n&S==L=8Mp+AOIskQD%zN0o1+6NsSL zrI>3ul=E_4ZOwuhO?gKmT-AHzYLijaJ|KGF%XxE~e%0C%Q0=1~M9VillFV&HCILcD z3_KUwO=;EgyzWX8Ct%aWQsaDX= z4##S+A}Fg_HE$w8b##)f3=+0ODgpTDzG_bRObnQQz)b>0TXcB9&3_o`f4-F>!>Dl( z=tE7>pfKEdk{Lc(EKYdv1FY`JC~T?RG3#HAWx_?Nh<~bVQG=6o2axaz^DE{EIhn7P z*OHsAR;W9M>hN59w)QUtH=H1NHa(&Y|*dabX?j&^h zO$th`s$_e>-8fxjC>OE#>rqM!(X049A2cG0V-s|G5-ULPl3k0vFT_Frf)_Zrd?Lq0 z9~^G^!}TNgXOKmcG{(-FDhnka67L2>53i0K)Gy3>i#MoE(=qe* zmD!ryt;$5#_@W@uQiiF>`;w(N4!iO^E*O@PAh_EsqlaTV(U^;z>I-j<~%REdr=z+Eh7X^1P z8VWI!<)RuN<+vMye~VcHHBXaolfP|xsas8x77}&%Oyy}Y#{%X4g@i4R@FiP3I^e2= zU)dlFwCmw~lG-cSB5Woc>9op_TSS{rmY4o0FN*<4WCWO~R|y2o!#8*H!4BKIPr+VB8_jUv?sXyop(jOq-RrA6(lqgim57cw8G zh7vL_UxTX%B((dmcjqTz37JM_78!^43N%Q>xuyCJ`b*sjY9_Hj6ZAMdG3eLd{+Wd> zH)=zdIOE?!^RSZ0#*6-NF^lNuL?Se_00HAe$xF56(X&g98X68o+KA^oL!?xh$TVu_ zX5vM9yVLDJEym)yyj4z;_PN1{fvO4xIKNh@;(u`jy?Rujl!E`wD4-2c;7gVpXI#T| z!Gk9ut}%rj^Xsve!({t-qtiG7PYK>*`LKp6TN)lE?W@=p?`{!UG5o^$?UDS#NN+Hp?A?(% z2=Arfr8)7*f4XD8Z2AB5!qmJ>`^>)VX$WlLBn$o2qRbD?#ATLF5?e*bm((wbnq6?9 z-S>P6o9W=aojZ4(l{NxYzQoxp$Kw%oXli|0h!>3#oN&y-qEy5vbx5uA7KwsrTm8uq zx#pwcoA`Ok6?1JVmP|``{h&Y02IPY(PVI(O?^anZgPe1cLw^K|(4ZxQT#_8~D6Bwo zDjYU;xGN+~iBqGq?4imeSYF9&mvvC{bJzDwTuMU4M;ufZ5Cr@P?k3U~w(`?FVfk-% z8h=i!KP#hGSRWrbPI@gur&7IO3H#lx%zp?LzWZZH?)@qIFSq@9<^`NX8(J%3sKwBN zoV9P(8BpZsFLf=M@6y5O0G@UKfUjvMQ9a?7NMc>qQJ(ai@RgHE%Rz`47(W ziHBQtiCxKVILt{5h4~CSuE#~gKaHh*t=;qOTXg}#qf}S}tms*~MMkKy0@Zx~C^yzx za`-+xXVJ~au)JR(aPS-&tajzuW<Jh{o4q@pYDS6(7Z9u~^UkcYtTg zbjIz?zEX^-{l#LI@^LH!B1DpE`{Uy9{{A8+F1W-Al1B)NhwZ8O%}11VjQ;r9OGqt) z3fL4brZ3`6dcm34)|1mvRex#V+KfNE`2lpJFhKFmH2Wbj*!F=L5+s}%^vEcIL`9X9jEN$A zMpFHSb=nXtyqAdChDAklN6PlIDBRp9M;H;IeCbxN@H*iyciQ>d=0%jsANnh;)88&Z z6u+mgK}#bq838jM<`6Lg2}UHC97M>^q?`f-WHA=>nXTGx58A0U7B%*_pKuIBh9@!=_(XGdyF`i?)=An?` zr43<2Gaf(Mam_`Py`mC=)Ek(=Ob>}{tPItdvDzoSM#zoSCUhAT)jGuWgi^oX&oHWJ zRVDSf9#!&R?w))&)T>JZmyIB3SAw#d#>>Xus{x{I# zCfBv%*0@LvoTB7QjFPotxDdX1&N=pQ_-;#j|AJ{?E9&p;JxE;yCO}}OcC<&}05WMtU2BVKs+J>0G?ca~x8p3;C(Cw#V2r4?}F+Ivb0vQZcK%`$=^shhb&djM&qgR zVfC2JN<}}UyRY6&abt#I{azP zsuxpFT}S8bKdbJD#P&HAy3Jp>J}Ib2ZD7NfJ{yp;#e}t{-vFpOds}R-&4()0^(M!> zpRN+p`S0^10rBAgTogG}Go|0r8b#ghDtw|aI`p9z3O=e5)liM*4}Y{%)7TPYBE3V^ zKsRV&u!Ol;nqT_$&+1d0T+r6W^f|@8Z27+^JP>EDW0b)@a#F$XkX}~V%v}^xBhZ1i zXlb-(NF29?WJ!Yi0SUD+ ze*_F0kuc)d`nl{p_~+?0@n%VQ-Cx$}u+1uuqNqcmtG9F*VBjN*?IuMTRS5wfRTrZ* z)zL{@WD@1a1~w7_t@f|u1IOwH0lz)W2IOJj!9YpmHEDa&nV zup?zyd^SmnGpoZdm`2OIYbaTcH4#>uQmNB-pdj=6+F(LssJ52i<@G9^weUjwaqhwQ zD%GvsGdmKe{4Tq$)-iPji$(^AM<0!EabHxwwtc)yE2!Ho_9L}M-kv2QCx;8Rq4S{B z_QF$?iond`d^*KmFN$Ca72f{JvcF_$mFHNiZa)q%JE#HA1=(1)S+iTzD+|cHn;R9C6q&zkFt)kk70{Ti@TF20DOl1;A0)_(GkHJ$3qyCOB zI7|L9P*L*#JOL9h@rQb`9m!cA%72Oyz)q_QuVG&K$a~q|U*7Bhe96!G20yB5%CTm{pe~K*FjyveC2@ zNOhRf0lErfD&lFJqI7JFYzX3 zf(K1oh8tr$m2$Crwaj}cHrXvGANkZO{~7k92IqI-WXAfqXRajL>-N=pxKLHFCIebF z*LEtWmz2k|;k)`*BCwrPnieb@q$|^lS_HLy|&h9}zyNm!QSOqRg^4wzTLC75brxPtyGlG+tdbYmP|9>NU8?fnZ$APnIG@$E$0M?*=ol{t4&{Z-I3Qk(Hg{rEm zyBb#*-Ik+ml@34J(V_{B(|UaL$!}<9dA3$o9hlFW3YRS2BB1rRIYEw(CYKEVoC4R= zzK=7S3ng@UF4YopOQAe(;E$n8z>fOvEm>rm+LwmpZODpZquAAfTA^+Vl6W#><;E86 z!tW;uKrqiXy~CVB+R%1hxiOjLJF$KrBBsj!$J9GO$Mt?;+c6rWNn_i#Z6}Rw+c~lA z#!l0)vC*ip)!1xozSH0T{jm00&m7L0wPxm=^Xz@!*Tw*kDxN0!NsblRKg?O0_se*z zWQVsx5OoB>4b$wAO{J>xQ#c~ID%>7Eva0@w^cSn-Qo8hg7Tt>=U{9u3P~~X3oC3X9 zV7NIqZzm7+t$@I~*R)l5rU-HOowo+2EXQydv$cC#kB9+4ZGGMVF?miN=OOFMieu2D zq`K>NiM^|E$`siap%m+SSh+zND{1?Snxs)Ol2&8D@$r2k?2fiAXk4BmHz~zqVw=7I zxpAxc>O2EEyxkF>WoDW9!o15UM&@-K{aO4>M=o#?&Jyv>JF8^H?eoNuN8~qGj zSuF*7B_4GZ4cf9y6)!aa5i$-7 z`%EP94e@^&(_CMxkngWOE@I_+Q!^B&UZK6^m0 z&*1&fq{tI-%-?5Bw~Y!@i5hu}7anO|n5wNJm6*^DsQ)*dh`7A|*&JQ4%yFFmwA=%% zNce_U@k&YP0|DF~ymn_=gIIs&Sq08ia=0ce7I15e@3bVcNBSfy2Pd3K=TUOku}}4; z&Utu_SUbc3!!0$|@=Yvh0HmVZ{0x?jGJKG5#y4?L%DTmxEp{fj_pTiPA9*>egDzG1 zPU4c)alokP3i}tYT#l{eZX&?Nr-QvIy@+K_k)^?1=tZHCoq0+42(2MXBYIJni!mDP zij6a4YG8bVxs+|23(1`=8o8~%z%_yj;3okhZBHdZa~Q9|WUmpR?CJh(?avOiU~S4Q zRe8q5sJTsY^vT!azkl>yAi$bb&3IX+QyvFDNa{x!e-efZW6awifhSlP!|`)LK`!9w zu|j?4DL6nCwua|`b!40Qw-T5YV#php1!;p!vVcDtdy(iK@htm(oj}W|JD01spjHfn zW`Pu(itol+oC4tFVk#D9g|sm*7{#9aZl^uYf_Jj~7sJCWf<3SiL&B|W)qHfcH6Vq9 za%cS9T9AFfVWa6MJsm4Xdx=j_8$3;cFL}=#yD8z({=ZVfW#N{Zq!gw5l2e0;rVR6n z_W6ywHL>tux|uR$B+mz&7{GS!m+^=3)<>E9Udf|?^eixa*nn8JK!4GGK?3wpM2>(5>%o^C(SH8{o7Yeqm^S~3%(1ry`4NUZR zQ$TK^ZKFwDMGn4zjc}DY`**0s_~op*EOr{sdiw^79!TY zA`}&kWG9nk2QKWxgP&Pm+q6Bp{w@!;z5_TQRzzY@%=M5#)7eCA+hNB;w!ARqMBduE z{kB9nw{`F@>_m73sjQr>R*%J2VVzz119AsP4mm!0JYh@RCKaR*Gq7^x=0=f3IUnoM z{IqGT5Bg=vqokq^nEH5%hOCCH;tl*g)?Hc1L+a35rHeoC{sdMDt%~v}eiC_})6NzVFY4#>%xjRA zO?Kl+0(jmg9iw{dI7qF)lv`EvvJx8(bNdK$+`Dt9gd;N!N^XbBU9G+LmOc*8{n9*L z9~BVz^m_{tkQ>r~M0dn+A0YS*5DPk&NFeI6g25n2UpV9>p`af}EMu$s#VZM%(9UAvQDON;97e-Ow3xl#Rkwj@ry(SJ` z>Be`Qhu^#Gbn2-(ILkE6t#q0XnKMIXnS>3XlPKww2r>|Rz)8kS_w{C4h5L*?7vUk~e((>>e`-obHER9lqdCBvv*fb5`Ilj`yz`&D1Vu*c9qfpXa(v*rXP! znP>ue!KvS{4j0J5uw!XA#fccerE*oQF(-OeeBjd~A7LgIITD_ZS@0{tum5{cG>i1r zT#I!F@MK~xjHIFm&Vg;jrgqsD#4Q0~?%yG~W|b!h9Kttv$C zfz$OJ@dtYU4W1*5UJq&7ouF-H>z*V0e+oF-RUk<7sP4vD{X9EeW9w61b zuYPOwTmm*%ehnkF(2^^mo`Evs6#eG~Fr8bp^)AZxmz6K;3?pMjN)j};Y+@@_3Z4E6 zuR4`YjU+-V_%nB`l#m0SgFUX=b~pQLsLM&}PL6$TEwV6-PQ{5xh!5-<+M{1q07zOS zkbItx~eMJ;XBprbX9V*%6B zUMca}B8^;s3h!*B_=6@$vSC(08gLuAkl`w^eaLECIjBnzA^qL)_xIf?ucxt*8th`a zSK<-0h)|q}-@gLs6wwliiA98ifj}s5cnEYT@-7JUcDL(1Y-gd)ms%&rmugcboI;M5 zEoLSm`N@wx`VTpi{rb0Ri#-R7vjlc{Jt5`a-v4gNstYrdbL17Fr~elX$#{8| z6?)0mdZ|W+p1m^18$Z1h^kez5Tfq@Xt@7cjkV1B9k-yVHGA~g9{NAv5z}-as@bete zeKi%a5s0MxCT$VxOz%lUMDr#O2-6VjD3!m4+!OL~pIiG*H7DxBuM#Ri%tN`sPwPX3 zce#j4Pg8CgWe1)K!bmV*%()w6uk1Wf(TLfpNt*3;#iJ7%y)M z=5ybu@0R5ki$nShEaD^IqQ09e-_G?Y%nGC2Vo*Pe6qndzp;Zu+cyvk#S+$Dxf5xp@ zvud4%2xZwm9q#Cwwv|D?wD}y&gX>jo20O!FcM3k1Tsr+%BNMaSD|H-4&|S;^b6w@& znc%!}P%#N1V{iyW9x%K@uYVrUqZQK@fZnTAuqA~C-gEs3+37unDvZw5n?E|jY1tLHaH8^apFvG--u|~KE#^FfwXkw7niA; zM)pB)v4~3FW&)6`vX^76_w$4lXO@(BZKQ!p^bLu1kSe~cGh}}4C8y6_cV8V+v)SZF z!O)s5=NVMGBT9q~$a0GCetP;(aXRwP@DDtPl=~kLBYvVmJfV=_4vt2(`Z^^wwtnb- zYsDMZzEmYV<60}=0zshgAEk~jCga9MmnMlB&6^y2o^=q$oI!*PXWo&U1dc=y+&MeI ze9T68$E_wF@$t(52~$Lg!h-$JZvV3$-aay(%+yM?*bh+d#`yh|!R4S%G!l0T2;zys zDjBVfB9U?z6rWV2UA+E?J(Sll_fg-eoyh3-7)~TJ=X*Zn-bh~g&Uts&OfQp>5dAyG z-O4SKfS6NHJ{EYlfmU$J4?do+(=ia9e4bp zM1%Ryx2!F6MVaAF$lz+;MS6Q)rar1M(Tai2;vaqB2i(}Vr6t1yka6XzB2{1Muyy|E z$JVHFli-o;+%#iOFFSz5Vwm8elZT*t7!F6Lz&Uk73r6eb(U(Sg>m&YTF!$1W!~vgA z6i8%$GcZ`uiZ*T(Or{3K>zxSZiqG#W)hlPH+gXp$@~I}C)h{Ixo9^0h8>rjjk)Z`V zFN(}eO@6YU`(*qAn&r8?LPXOt&eixGRCLt21XuZ;I)p8L?x7`A>4BKFmJd5i`ZYE$ z>*yW#S%R3|u?Y7Jc|UPeVGUFhJ^J(BQ@In0LqAk7(gjLzxbWFL+M{Fce^e&4TnH*# zl=((W+)JK!D5qH9LL@-Bp9y{r5xyKGKhhAX{iGAWfluuZ7&M%bj*>x((Lste5ym0q zbes)=ZFx71JfRn@s9i>*pf8||ZpP^K z)s?%j5JYH4KXj8L#Br>Ge0{5kXB|J;0s9LtAUzIlNuZX=?>}G!IU4OgpgP`XM4Fo| zT*Bdh9u=h1&ADg8&g{HRJp~7Zmk-W4;C}#^P}GU2!l3bw-Z+A#nJUMfLGkE$IpGRy zMmXv2`H~2bvpj`>7HSGfao6G_j3`9{D7ST{! zg>XfVk%BWOyD^ch z7k)`PQgDW>hVp_bL&gRocOO8wt=^)u-+>al3`4;Tdtt1SI)NF#DLKHrL=c*&H24Ft z|BDR9%UP=RV0pPCBWRiQ;)c~FhhpXYs_z;xAN(2=kw+>SF~Zwf_v*`5s&vRS5Wl8` zbm&fnPB=rPg-)KwxYt-d>t?Xf^YXA@`iY|#q$;b7ju0sc)Beth-D;=2 zil(?qR=7F(`Gan0Nb<@gH#J~8!{r<9V^KUubj>=&QedniA_z)&1;D+Ypr0DUvH#Yz zh2yRZBe`4yP!Ta#Iu}s!ncHa!4}{Ssp|i0cG8(+|d4I-#QBiVINzimitdJ=42=(Nn z$)Q8>+M92dOR1T*0oL^4bpQ{D{yclaM;PTbbxD2`OVITyA9TG6FGOluFanuuO@E<_ zVJ!-yIGLo;g5{{c1mcZ%S=mBzgM$JdGiR-?2jE)MQwQ|1S(75c<$i@x)UOd+2Iq|Q z8gsT3_2eWPH}mhPWD1OYYHzZ8jfyGJT2Jk8^6M~F1e;~%G1Q$GteWykME?B}Qbf@A zGd9ZOxx_@>$B3{p6($q5;!A?!m+<4KKyT4~ew%tM!MU&l!>cXd|coGsMJeF-@@ zCje$^`FwhA6(d+s-LPK7x6I&+`%Iw8@514b+l>X7c~2#1kJwi7%TBuGYRm9s!C2f zH%jyoK010Fn#v@V9Fv}sc3~tG-2o^)8raDjuqL+HbsXK4&SBEL-$h?AYbOUIsPAGa)34($##429D# z?p<=4mPxz{V?p>ug`3|u)mtShZ{ZwNewMekY$PB^Y+-F=}- z$o6}%D^S8rj23;r%F?+ZmMl3SpaW7~llE2n&}bEnY}!g}ID{>1=S^B5?oB@PpBi7- z5*`s>)`bv%Ez6_St&xuYLIcUzfW5>=_~tX*r#~!1wCQY;aU=XOY+OVrp{V>Qx@{X< zCI(+_^Nh@)PPiTEVAeCO21qMJp~o#0CRtN&0_&295ruJzB*T)E0`jqoU$!j!j3n#lP3*Uq zlDm>iXOSmvRn%!Bq$!V9qxgC$bKXW)>3q?i@4xG~(nBwW@Y=e`+X4b~YR<%Nf3XU+ z@vqb<$d5!C+6uOK?gCWVL9vsDodn&N`$O2;w_W3<4Q+&-R`3kLj3i~%jJtNZDHO@D zpewZ7=h>v)>n1Zj4&o~gO)30+x{4YD+fxD*p_QBRhzJg~$LBcQN*-Hd71u-5c6}JX zFoEtObdgzYX|Z^nG*lJgL7rKCbqjNLfF)d8TPj9_Pq&40dRQ0^*{%ULXZK`VVE=<70rowMt{+U9J^GcY)|mV7;bpG?2vk{OwB1(7IFg zUTNjpS11>sbUn+7&No!H%9rT3@(V5#v?+`Bbe}H3AV^RG$#1gRz*3w2BbRu-c^cdn zH#h$_iZ^TY{dp&5)1k46BPe3=w@Bl1EyQgp&wNcT8_@NB=B{!E)6|`R7Ov#%k|>}Z zILRYtOl``=lg8)xx$}c2pC2uB>u?va&bw|7Zll$4)XAI}5eNt731)?SW zN{^#w2UyalqRF%(!(f`TQ|X>1zBi9H>=WQO9&9^K(lGvwzfJyflmGPs^-A z`6*S_qC+}zh4J}0i*tB3_H$U*M^6joclj41xDPYcnBZRG{0+Xt>|S#j9($gY9+b!H zDrl6(#|ia~1Mbc7NV3N32k>vaP6idcV(y|}Q-H-ti6OF1S0`E5N*7T6*No#Ub^WCw zD?*wD)r%sw#>q#_B6BJkGvdEU$AekEXIa1LF~@qZ+iX@Uau*y~&ia7fuP9#i0(qT) zkK5x16!9@J*d_@<;(_o8kT^!rs1)(*>RRA*@`>qo2YYSXm_|IBJw5NIJ=C?CO*J4- zC>9+upNs)~`3yOGQ$icPVJJy8)&d5-?hk?H(rZUND>5Csfi`XN<5+D+bLx&SBJ z_*Bt1!4&>a3^Z(sDVhaSFxone7xqB>hTh21o1E|S6c_J=O$sdXkc9O^*Qu-APqml?SEN_i5zAYjaWF}Q&&4#?f#tXH1jf(a#yKh{qf*ecYGy;00+cY%s$!e= zE<3LypoeLEw;Tb9cmBmoB8M~{Sj)SQJzJ)BxErf)juamWOiSf}f14MVKo8KCwPxV| z{AliTcLA}x@t?)J?HQ8W#235Xc;Se;xaz7yKv#2u^P;N&orB#*tkW6xuDH>xbWX)d=yG$ z5Ul2AqwkyS*&Gd5H#e{!tNW5og1>4XTWrFdTS~X6iwtLz09B}$Yw|ZN0Y=5@Z(L=4 zV!8HhYXrOUt>B1Qlb{4?$rR-`tBb^bnXICTeImlU-Fx^RA)ve6%XC~{60Y9T8nAUo z(^x%~Ut?FTbL(I9dlC>U;`9?m_Va94Lbm`oX z=f&u1F~n zu5lK``bD@pjVynVlT2MQWze*Oypumyeg;CC~K` z!_D*_R8zzvgS?DOX_poT4ojY35C1k$O@alSp69@StUd+&wA>#^a`5X7zUi%PsRY6v$nZHFmKWBerT_ zi!?BpKc!5R>6NfTykD|45&z(sP5^HWAk2m#Dg{W)H?CFlhu-^@TMLJ&0#zrKGC_QN zB0CmZ=IM#+-Ek>{Sg+p2c2R$}^qXmt??4Pj@e-4dOp?Ts1*U}c0-da(K)phqCi5hy zIhgGN$OYkat-3->Nqw>|acFgFoT>NG8H=Fj)1LFN|55gVC><=8tnBJq4`>V7*NQwp zam8KRM)o>BJo-23*}J^MUVY5hXP4n5u97V^bU5#=&IROtz^s2;bH&{u>~Mp1M%f`8 z5HKJ%8W4!|MSTdx11CF&Pu`65m5lTa*#Eewr*=I!wST=nuU)OFlj1{AQL0lxp}^44 z2EQYm_f32PIykldxIdpx0JS|IK4k`*(g~#fr^FFc+$fHX`00`a6DKyWgT0RjL@!+R z(`tcs!4jOfI1p9fpupkIeMtz=r-#A`jDJy}|5$E`fOgrEu&G_oy-pw`p#N|pcvVd_ z@!MN1E)?NIcwAx}1b>&n(lY+=PUG z$V8FHr>EqUgRP+$;*rYn!jr9)(NDSKXGJIBIpgh_D%Q9%XX?sSnhGRuWrSaK z{bjDxoIyU#Mhssg_v^(i_omedjp6XrAXr#25TBbI_P@OTXB2`dlbVGwDOF~{+5?qI zMWV+GEVI!tCBX3+O-fEN7j2AW=i-0U{@R4zeM4bHhqM4f0T{;-*dizKZLe#GI#`T6 zz>+3EsY|_obPhi23Y@67zazZ3C;G}y!((|oGk)ZjJM#=Pg-W|K5~2IJwTi?kZ30|y zTgB3kts;&YIkiBcCX!NGh>of*Olg{1y+PoV zJG4vC6?RKWOh)3O=$N!jmfk`}H8Y+;;Lv+(P_D6k|0q{d89KPg(>hLe%DiFZ)vC-a z2?B7I@$x9_cs?3`2wWb&>Ly+0Tx{dKyn=O_)fv=_@&C_x0(**IxlpOzesf!qnZh+% zejj&7?l}*5WaouE&gwJ2*f`RDK)uquRwxQ@scfsLd?oD5zsBwL&bmBt%9Cm+AEo<- z|08N+#w;MyvkpPE_aV0W5pYFL`&b32A#_Y`w>w5Z5?+Z$mV+y8I%Q2b^DP=w$KqV3 zdEl?NV)*qi%N_31V9n9@`ZT<`l^S9xI%|YJZsW{l8bPo|_xVIHEs8C68J{veE7{t5 z1`{J*w{D7w1A01!!~Zba^-2;wwyZAn+l%zKML}nu>ggh@B2;ZOX3UU!fF(6BlD8H< zxG3fd?ewMnz66Dm0(nO_Ry-z$E@f zNSmz29459kF*v;oJXS?4yTQ98Goe<`6E*abgnhyDtQZWnjTT8gj%93c(g;vZB)_Nt zt=cTxPcJe$C=_0PdkLfxw!46(%mhJa#tQQH?)4d8gR{6?*wq_zCbA~7x{TgaP*4(S zr!6_!KFB_Pjga4*^?Jw9Stb}`CMiEVc81cvjAj7%txp@Lt_I^@8?-Xs6zyWU&;9O{b-?WvvflS@VCds$A1PoSpg#`A!KkE z_a~^~GGoC7#L*XjY_YY`A3w5u$SQ+|W`@MOoN?CZD6Q`;u@2AHS=%>HNkDYx#Cpzs2?J z3gI#d{N=YGIuOo`ZcP5`H;JBkg*~4DUCgJCHF4KcHtWR@%yNU=!?y^pk)kT18wwrE zZME`Y9DE6eL+2|s6&JNNxv{0IR;_?STi#2x-p3JQ{NHTEQ-S>bPRQyS91G64R$v+U z!E#!12Hsmd>E1-m!(EZN(DD}8Z2USp4OI~4Tr*j&^uW8yhC|0vieMK2y-Z_vHcvwq zs2r$lD*QcyJkF&_Tlf7;W$utX274{e&vdZ##V&U^=H%(>F{0?AlCY%d^Rh!G2GdjM z@a^f*x9n;9KOs*s0%gK*dZ@vS9`AV)If6T2I>*)~wV5YH%Arp~TK&sY5?_DrRxJ`8 z9ieLT4FGqXXN(^~bNijt3~;D9(p6_Hpx=BVzh2$22}sPfN*|w|0I%!VHkz98e$W-! z2T(m3QoAv2oWk{aMmz?Ld<>6y>ln2^nPUlHEm!>*HDK@#yN@sC{gHcNJY}5-A7Lh% zpDefZ^slD}#bFezyv56u8yC?gl|7G_PWR&#a81+||0tXHa173&AORt`1=XoiHhmXW zqg0|D?(`!$tD;*?3hZ(Z(<^z|D`f*z^L=al3a`z}#wgr^BaHMHS;#(VkLosVH^g zykuWa@9Q$vSZy`FQFuyOI`(6NUEv@QWc{=x->$Q<`{3o^FG zo;?`{L8=L_E&Yx1#wl;V8$GX4CqST7lhrBq?6*l^3#p&%$f!>lrSTmmwROk%vC!@- z&H5gw^#ZlhLuQ+zTF0j(`3-YBzsAk&mztGcX-(@D6&7^l)m1XMyrL4MO;FZA-|uaI zFQ$j8_OnK%%M7iK&TU~e&gLHuuC9ac`q$WYlOM3PclneuqaP^m#pVYe>_Akp`{_o` zdFrb{4-|k~CA6-zllVQtQKBdylC9FBS}mdGzQmKAbG`o)(z$a?vA;~`pOi`ZpWSrE<+5wzOMOZZl9hU#P!b&ET$wiLzp%^1(8!A$R zHmiK&4Evwn!>gFd=LF^X}V3wrGWo zU=dBF`llJpzp62sC<}$4ha;D=JkCBa4zjFZz1!$|GzF3@QTESnuRyGo&6btT|4Q$J znnEqSqV2oX{qo|<;8MzzQKBrLwlUDhAgylCjiCv@OE#2?vQ-k_nBy?)tY|)AR&V-} z&Q48^3?7=lCR)Vk-j63gk8W)g{XEo@j&Pl2+3)_=0@fqTd!K`F?4-zR^XABsflYRr z&_yrR^DPnakh~c1H{CD@{y8Q7JIvQblxL^PqX@DAJooQvi?RpQXHe61U5%W{<0hiDM= zcGZ@$KfINm=r5eR;nfiv_Uv|}TVqjDS84Gu=o7-uUIDzDv$m{z{pL@~yGdFQiG)31 zGS1qn^WXQ<4xo~EeEHQz2M_lxCJq3>LHO)TN||e)N`IuV)*ZW zBzJBJ`{sU2pR2riOz@Gdm|~`ybC&$AYuQzY0lB)%O_WqrP-Eth@hG~jwnt7UE8(VM zQbr~rrcgn&{sZ(4`LfRL##EYiH5;1!AO42rb zLi&>cFx8!m)J9coM;6LN^n7QaGPTVst-uO^#2S>)PHOe-Up%JVH4YPD=PegT*Gmq~ zEmH!yT&LG;eq#Y@+!I%Dby( z#dDrXv#FyS6l_A`ZWoFVaC4ro!_&C$!qf~wLqiZ~xGCnob3b!fOH{(yoyRtVD(^N@ za5_OSfG+QLs)q#)C#Tc73!nq%{vEAW^6$JM(139a8deeP#?p7@vCn_@RxqvE1*;jh zKEME=lcbWN4}CzV_JnlkBb9e2QuTxO4@7|Wm!g$-L-5^cyjsE&aZ~2pJjGb?7&;Pt ze(_rJKd*d&b-Je8N--4JJ1y`$dbd0KGkC?sMELfp;Yp|1uKvdq-*1>s+_yT1hOv44 zADlYhpZ2;4o&e!OdH)#sv7pY|`}BwOzLlf`ro8ayAEc+{SFeWL+ZNA71L2T`6Bi+?Gq!=Q_- zmwP|DLBOv~@a=SLaAIM-Bm4iWtOmk+s?-}-8`ivoo$qPoaQrK+VhX8T{Q5{4D0?L; z*@7c$I-1u-E_7D4su45@z!kTuNk^#|`qL;?g^AmMO;fL6J+%7S;w;{Lka=GzRvjSp z#&XGpShDnq9$HQ8*^x}7AX`e>{UNlmd4{K>p@yojUCI?%<76LfxI{_ZF6y?={6oYo zED?WZVWtbNh)!H9BDMzWg~RpxZDb`xeC40nz;vWWyDi@K!rMpx#ym4;a4IwN097d% zJL3U~5ZJ9VB;84ENoGx4r_@@Rc0WMf7Q&AX05Jk0z-;0=vwD z8?IERw2cvS+{G>FOyz#qNg@W-I$WixE@#z}9iJMX)~KFwxLIudyB}&dWn9(s=+BnF z+vG(1iL^dJ^*vL9#G6s(n272GZ>o{VK~E zyt)({-m#&+SpK4dImMVjht7y(BX){%T(Z(0GuyXlcb3vG>idCsj&}3wV$zmMkA1Zv zMSwB=l!a)6#puE+8Cg9iAs6qVA%$zaE@_@)K_x2^zgjDJ6Nyf!B;o38?g#d&xsKDO zyM4a+(^-^f!GU&G>c>fY20;9!j3*|a&uJK3`4&%vow;%FkEb0X5}bVuIhd#~a^Z`Y zGST|}?+w;nQPnO)k@ZGl9%*x!Ygv&OagAVQ`yf1g?gr)2CGR17k`DQzVUBO=tf=05 z_$_i6w;+&St1B>&-kKy!`*AsSdh|19lRQr9jB$yo!I#W0b(!HT62Ms7XiqxvkN&R? z7&BYH!Ct7BmQhrvTkf+bfnyz7G;F{F8BbBg!b^BQQ(Bn~rEZsY4)(d2VX5PpR+;7h zjjN;YkM&^MFXU0H7=hs-QvJcN#1gTXSKK@$s^j<4Bxtw4iDz)g-!ysBg#X|a{S??I zJSMY723{#ZQTq9tm=a&i7L!zMYp>z`O@>xXk&$-iYSIOU;g7j3j*y3}P@)+GgM&zARa0wdp?O8*5GN1Yd8c+nk7HPGBTtAjP?-n~>zxIVY79^(0< z#Ayoxi+hPB=QKP(Wb544ysqpD<-oH16>#tD)Tx@Kx4cnZ_yO#)uRxHDBs2LWbKw{m zf8@{xoSaR4uem+gd3MXE6O41+7B8O0JGC9jWFpnOv5xxUg_{@dTblOWa{ezuQQZCZ zIdru>&Iq643aO4j>574U(>3{HKeZe1{WqFyo>S=Vo;9AzYVn{Z8?1e^+iIeB2aw}Z zR%FZ@ioITZE;Am&6b6bW7&&iT^r()ZS&6JPFq{XacHV@bs&yv#QYpwFF{DBrv;Z>sX_J?c~A7<3r657xB8mOAqy*d zC9jfftI9SM%q33g5+sC~_D`v>4zpf-31R_Dy_FxSiS(`BtN-#*T|>>XEI z7a3o*kU8^|LPA_OLHc{lkQ;`$6wb_&y8&xnHZJ5(Ll!25^`%LB?8igz7bp}@66n}8 zqiLo|oq}f>(J|43r#n8oq&Tt+!i&v%!}`5F`+OQB{1NkTe$~3>(ux@(xaKmLJ=2wl zsbEgcaEH1oJ+vF{SPUjAG8xznxt3}b1ym`e4pYi=yKp<@)&OT$78=4(^48w{+1P?r zO9i;vy3N*RUX!Uo68Imi!Z&ALBrTpmpvvo-6-y3Pgw}gINfXXXH}ru!(wn-TI7Qwl z!=jI!fjNz{sxcDWHHNuoH%fV#Z;!07K`EnQj$Q}OD0^Dyn@k8e7Rwf?al+GNJ?9zG zpS{3#iSHTv*}y`wQqWP^P|IV?>0Iv#ns1ANQK)+?b+c`!=}HdOV0bG|{tWpvJcQ?| z(^OMCSfj9eh^05Hz3i^zEI5B%7OX^YxBP6gYalwzyXG#?zjEf9I8m&jIeF%R^}Qny zLDO~H72T|p42Rvn7v^;N(i(>!4t1&HBBmd~AYEQO5E#U=x4}>ucGwDa&!NunvK+MI zDi3vLV*Vv4nflyQna+Fxqqsa8RipE(5&MfV0omj)VnXQK_;Pgy@RGk`yh6iL3G5W$ zCDmfjq_JP`543RiEXXdKkT=Il(bs)2>YC72^Eat~RXpzdBsq49j5NkdxKlmbi*}gm~^cTIfzt z?6slYJapPM%_ZWE?(44YzKS=w$W;NIiRNpAg{f1KOgFA(k2wO+DzlFpLjwBM$$T0! zys4Vx@xr8R=<9neEzqD|(|LjfVac34OK^>Mv=ruKO|71SQC?K}Zxbm;E>D+148y+! z_DAL@uS&V|2I??KSz8{J<-=VEJu(8MXsL~Czz}~}m1Y8t6eS{x)qWiN=7#5*S00&>5EwVl? zAZ^~Y*2BuFBYkpl1?L2SPe1a$@8K<$h*B69KSFdo`F+2Ypdg~{Q5lK&0jOUa55v+vZDAB8qr7y1jv@fQ@Ac;?sb7;QMal}EJxEdz zdAt-SPrWn{DvuoA$Pj(s^R1Tc4iz{s=PmA(r}S;JxEeXw>bU`g9Ca(7{`eFZO>IUC zB5{pAv*6D}kUcwbYocgPNV6%7Yvhq%FNCA~O>V~OK5d%Vu0EI)zp&)WelzAV=8^H} z_1KZc!>3=#mg;P0y70}_m$0MU{HU@TN$aAX^Ztom%t!@fU6=Rd_>HW|v+Fk;60k)7Y%^ivPm->)O3^hnz+o^F)Ek%L&!rT} zkr)ZJ(qfBD>9EWT}PXyF7nC4t)_ zhU9q+-=+T?V8*B9K4HSP%~~0Wyv~f`jPN@+HCoAZZh8F{k+RjnzKso2q|2d2kA1Ab2|o>9}X*;Ua|TI1K(wFayYXJS^l@Jl+gpzfxl!w&*_BFC>5 zRS<3hIZi)hK6V2I?|j&&GAbq74Q*tfU>@f~vV4buQTYm-@BvJ8HEH=fTaC&F1xq;@ zo<~)zC)Jd+uU)ibt8fsg9V6odec&oN4R&l6!XjP+bR!!+Q!=~n6Eu>E2gral{n2l*=|`7?ANf@q(}Y9oUc!4&zmfm zQ#1$pPi>k$*H~BfuWrZ9aJ6B#R&&{16j1IY*wZ=)8-H2xL?7TsOrMWU z@hJWhNt$AuWXqu#ERk4j0nr^rKivZ7znxWo%pWle7GObsrU+AcVvoOJyD_C3p26R% z?QX_|vvKtke(OkbL%>Bfp0b42kcR0|#s0@FFpILEUKjPEVS5-U(6O5K7GgguP>*uU z+dai7(w2`sf0j_SUDvqp{8sphFOe(MGL%da*=<0^eDv@2Cra47FCLBemk0?cy(CLU z3d=KX#Z70Ix0oJmUP^OcV@s_Ni@In;yZUG6R^Rv~rCKDfczz!&L9_^qFL;7~U`a*c z1Ifd_Jz$kMSXU*jg+Wu&_QcMl?4Wxo*0$34Im*m6Cwv}6;d9Yo*Vk4>!66VH`Sy+8 z9QsvR0=M==wzu4^x19X}fBhN-P0kMUQTuiPdZ<&+v5@icczQ&Yvmm^aW3SV=Vw$<{ zp@_5-L#t5$MMEL}>kXWs86in}gm|nMK>uDV&7=@=>57hu_eOYs=1?JZY$+%@m}F98 z*r4v48Ql%(wFQPkTW;ZQ9P$H?+gONdGIVEeL@mg2!j+j^$`_~`2uP=nFJax2)^%ha z2nf#sHDJ?8mE8I9mo-SyzYn=%g(SKt*t*$Z#An5<8tMDY>`d+({vB^!UM21(5H=%# zFeqzI4$+Yzq{;7n?4;>o>!{A|qdW6`7iRLeAgCQwHlM)j_$ew|HT>UV$pKZll_JCE z<`f=%kM!0BX4##((03itZ+zTd2xTa8M?z@%S{2-Blx>yyur0>eIE-iyE3wh3#^baD`&qeB{hS+hC`+mleRMKPKUoglvi@h+vVA?ZfgONg!&iY{t;>Qu;bHgwu4ZBciPD@rz% z-`-1GnL@tOK1~#+p{LNM0806cQbJ#~RTcmI!ezhhud+h}f`6#fM)(lFqds2y_{l(_ zpeHk#BRuZJ2eh5Y_2|*ujin(yL(4rVB-DrAiLsLL_UGXFSbt+=}3dz7J z(buJY@j1ofCEV)3KfthlCs6emZCEFP+8uedGqv}`^*mY{g;h{NzGV9h~M>IZ&bAf8d)n!6?%4)Xdv@ zSB~Vx6?YHzN;44`@S9ML;&(};m@xL{(tx*y@7IVnPU3rE|8%GHCL@J0Zm9c%xf74p z`#NL~fAO;@p33;wpnmz3KkD@e!4o1ANKn~uoa;K&Vs%kQa|D~veU!lpP}v?+#{agX z*?AywifxMm274HP1MY~+z8x3VGx(zgJQD=id<}C~nz!3w4kXH-o9DMxyb`7|J^cyB z`{okqR<+~!t<0in-I(fML}1DAwzu?6iCGy_8ICA!h(A=a>mD3TzS?=%D}9yfDV7e# zUVeaGgC^>c67)T#phS6?bNMB4bOg&JQ zyex*0cNvX>o8*_}?9X1p3B6s`zIGAr+!9v*AD+HBx{mkzx-l9yYHZs^W81dT*qPXN zlQg!|*luhmjcqo@d;9sm>$lDy_nBFDX3d>-=b8QNz0WyD= zrwmMs#~?{oj>@^iv_5&m%`Y|#JCfjhsZ`I!@8D)KwnPhB;z)Xcw8PSfC4EV&~qbem^ed;_A} zG6~{wH3BygIt!aj*Rdf`r^T>>>NlG zwrlwG8Xu4|KqvKdY)hf8q&G7iIK=VI4}gHWRLKK01#hx7{Bul{HWCroON9(ik&?zXxK>Q&Iks zfse@BAI9x=%L%)NWjnq8Shvw~DGxwfHYCNh_rR(8f?8wMllI?_S_1cx(=1JcI9N2^ zz(L56ga9P22s`Ok@~P%8g@Vi}YkRdh8Ym!T3j?}IA91ZAd_jBkIU2}95P}1`I**zQ z1OE*gk8sKS$M<@{GP%AFB}EH5^!%Y48(Tiz_irsquZa_}`=*-+4s4|EbpC87BqUIl zU+}_#h47V`F__wo@OKr*xNVLE_k4-R>K5Pf#H8P`Ect;s`VwrxVOuAvhf7S+1LuBePy~rzCS?< zU7m{XV>pvT@pZWB2b}!=h+}_#APwuHO*f)toy^f}p?NpptSRUu{D(DoPT+%L4MXHA zJ%&hUNIidyuS8R}_v=xUG>n0J&X1O&Y03n z=rHq}Eq^(@7L=3#PdUx@Du*P<3yvLqc@tlHqjtL5W>ny1CNd<+)Ec@={Oi$Lc$eb# zLvP~Ls8-dQg6%2x;Kj!o(A|5% zR8yZAP#F?h(4KVki4~q)VqVWkA~0KBz(xRAOyAhVn!#S%aucb)PC;fUla(qqvGl3W zXSES`hSxwCw5Ka#KBsWQvf&fN8}Uz@_BKM8DL%ZY1o#^jq0ekM9wpkuxpru)gKx}s zmNvouP3)EiFxP>D+Lc&1phpRL_RKT6)}e1FB7&Fpy`=VIUf#3{kEt2uwr@;H%*z^E zrp^zRR2)xk!{=MkPwl;%1rrYZp>j@Doe<221_i{x*OsvNaV~BO~p_oHIhk@ z!$!hH?v|d2IGzbffUz!kYzkdLaA)72c#o@`0JtsMz^3lAT(U4V^TZqASU0#zWI6mds1ncsUq>hTc(lqn2NcJUx2`z)FM4g|S zlVEJbYPf({dp%OyA4!K+_L4A+>(*sxmzR6KL%*KH2`h@3sDmPG5$8|K%0sj%O^yri zNgS85=F^^Zc1!u(zHwK%Dsxc$;S0{-&jf_3(te>@6YAB;btU&GYY?nZ*q7-)xSK2n zZenfU9vY@j9RJj80L^FU#}9lSSt{0g^bnQwgU^wj(^$=AW^{vXba*u4dnBfVX6VW+ zdZfGY`ZYq{m?4>&E1#tz;E*YPts&4b`)!3*{rP&$m5J*lLjT#mrIeH62MS0las!SE zdy%o8u8GU>MvaCO?*$f}2j@TzaJ)N-HY%|#JMCEDZ}yV9J1hH_CVgZg%)I4<5+uS_ zWfVq6pw`S@(s4?BJs?uzZ`>eM+L#B8AS$y5+kym z4w|X8Z1*0xV%v6dBm65s(vzf;m$Uwm6K1XRZ-9sbp27vXo@WUE6@@~yg}?t4u^HL zOfNqgGQ($nnsaZ73h3MaVxvB!ZL;My8L1qvHYlq$k<=NW8~n2dp(F5{WPfy#@;XcG zT4szHKcTE+@X*B{0r$H@z5}pJlsP$ZoO=N#yj+4WAUalWnJr^pqScVgpsr;t>J_RR zt)c>B+vWE*)qW;G_mKn3yZOt7^xg_%e01p`(iAOc++fylwC`qUzj_Q&W^fsD^K+(K zZdW5V?Q)@gi8GHJVOdVFkR;MRF>7m!pFt z{pc8Zo;&fAJKwJMC}hTibU!tD24sI+>stN>Gy9cI!Yn~1&X&z18gvb#Z>%^bF;7r! z6(85D(8R^)C(g)e94;Ekq(C3PZIy4`%%*>hw%;u5c(b2HFByG#tWIQ$+Lt7TZsyF> zFACy9GixUTxfl=a=YR#POgzPA6xYrR`M=6Se}o5I+jL21Nf#%AdpYiacKE)PDv$23 zq%#b!6=jdSB_q4#eXDx_y4VdLXv%E%dGmn_mV z5o_Ztsmk(Ryvtbg_Bj115}q@@PUtr{`}`Y*+}Cvz{3iH&O~A-g)mv+cjbCTnCYAQU zOh4vz>;kz_OWKT4Q__LHFhgp1pENCQU5x*X5Bu|5Pd%zai4=+js^?abws|ctlA=pK zct;1+1slTBzNzZZ-h8pMo<`^}mk@M{eKpI*+aA-Zt@T@s{r5m<_PE$&#MK1jY$AL}Mp!Yx_s8HmdQuX&Xl4-< zB#oMr&}p*+j?fA0XV}l0B~Z3REMOnP868VUwSUaYBxBKH>t}c}Vn_Z)g-4={6St-1>+Fo6uxZ3c9 zdPU@`^L%;!%t=c5V{h_+{U?m_{Ec}`vg0!n_+HL{-!a;e{?Wm@1&aTus`jBpE47nv0nlvhbzH4apk5*R9Wu zr|C0F6IzqAViW66g#+8)NpjU6{d(=^WT3Bj+45Rp65kC_cvT90JnD9t9WOcgu~WKG zG;d`YRU|^Uk{}ywZFLF7-~ppaO=>JbW=K9@A(NI5P%g?nYaF;r+RyELFBBA6 z;PxRP`)qBSi?0QJvJ7up{G7&Fu))7- zhQP=S$rS8Xcjfme4tBRV%rbxXZU+Sb-QW~ECz7=cc79BppE)81?b!%zyY&lo$(`@Z zo9I4RXJ&;MLi$?xQ`K}nAAk_m*MRwlJ)eWp)%v0@?@cSo+4o4`${L0}U~8eT!u3p- z(4+Cn8b4ZnYvCCyudl)vqlSag9_^#PUU5M>S1<;DeQ~Mh0e_y2H}bNAbYzb8rbBZz zSmMtdk1O}wZzURO^@4q?uLtcb`DO`bR^!jhqKo%uicu%r>8|YET0rC(cm-SqceNud zZ64KoZ|Fu>B%sX+811Hg<_>|6PaC}dpvEdwd#@D9!fa^0tJv1V+c-S_rM!3sHD#fw za>Vrn?jg`GL})g3vA4AS)Z+U}%$KwD;KSlZc=NxxN-2@FQLCkux3i7c;UN%V<5S$Q zNu1;mGNu3qfCiKib4gNBo)ka^q}w@3Rml&p?kB4A&()vf)l2BVkGvXa%(yta=!ew{ zBW!}b99O;BTEI?z`4$NV)!MlqrFtt@&Tom)FrSEHmDOc;yt2QR@)#UuiFKNhu3*Ng zDGSgau*FM(k;0KikPdpYB+MD2(`(iy%jVDflZsc3Gy`eYN&XGb=pL)V7FNh*TG|eu z$~p4dJOu+P=1r|8;zmPGc~7=RM3U)ll*J}aV{=x1pJgfP&# z80A%@=?Q0Ask7Y{rrYiQK|pN}UNv*{i(fdxYGiR7Zm$)Z8(N&N`u&Kv?0%xkv%ZM^ zK9^g(#tgibz_V|C!`C@qM8fVH5m8@S$__QUlPmRQUNCpiK+acS-ki)&U%nZO4#uy` za7~$OUPmw{fR^z~g@&_dQKZ&Ec$y1hyVtt52ib?bPqS0t%dqQs6-=5c zI-i%iQgDGX)J4BH%#sP7Ewlq;Btd3Y!i;IxG~T%3%sK+8p;v5w3>Re0+>cF8zqNV2 z%{Aj=9B94Hviw zLIj15h)fj^ceGqbmg`Eh&_e*!-8#5_Y^{P3)fF!e|8uK?QH3M9P!TlH9;2@pg!g;V z*ZfT&vSKz99wiP(-6Uie9$4^>7fb8FGiiLh!00p?Od`YoT55HBfiKs9^)eJrDe5(!p? z0DBIEiVYLJT|xA5<&R0rD-U@o2N#6mmmF zsp=S^>jP81#owmwz2xzJqAnlT?c;s_`EH7F_W_V&n3AvQik`e=n40YN;p!ClU}*(a zY2UrnY}rW>RC-T*{Yn}z^Ka$-)V|n%odca23B=o$H&(7R5O_zeB-!+A;yI1W!QLIu z?H|F6{OY`A=>|@J!JcL0Imm6H*?ElyG*92??rUu~tlvvIA!+5DH!plgK2^X_w^&;e zKBHuone}?l3xUcYK)Mci9Q6v+S*YHEz3$pzF@urT{+Vu3B_Ep7WX-@T8LbZ2BD$ra zms;j%E@ZE)-^+-Wdp%D)kFOUsV>+f&nR4nTZI@?kvIe+(t#DcXoB6YkdpUn1Vg@rj zl&x|rw-~09=>LbI1#LPUOw3gE6N$7whu9bB1H~Ccw;7A}(w#3PVxp1DP@6L7nm>(2 zsU$gcbUGzylix{uPjZe`CrZv>d0}}aui;WrKv63p^GMt_O#fpRonvjiHUy>vq;X^e z`8B;ab$nipbK(qg3dtk>ARkAGZy($ZKwuA&!|2+1F zvkOsUV66+&JWm(dh^QRRi#cdkmQ*%h8=Bj7Y-Xb}aSyR|M~)K? z9Sx_!y=lpJRx3BiQ+fBVzuOp|C2xNm&O9DpEFrlP#0sP-TD;uRX01I%#;TX}m+yI% zE_obW^8b*mvEvcH&ZMy4@10j*YW<4KRMpR_``s|2pRN@t`{_)gOc{WCG-fy82{t*` z>w!9Lxf)1H2Kk3~Cxe6iGbp}ARsJRB!sx)`1HV+ASlqx@dd#I*aV+?*+K3niS8DBC zTrTGnN7?J{nP?N@RcR-JxZ7*>rM<$X7iqnF8>$>1K0J`#01X@UR7D)G{~^ z93T#~29s&#jYewAex(v1G+p~cQgn^wMJ?k_-bfyXly>;%{RcziYK;D{HIg+6K6S;4 z;TP-rgz*7PJu=ohVxT?q^L)mLD9+ps6nr7`8@F-q3!C{@40fu4RvZUESC7E%-Grlr zj#6cH7jJSey|`HX)7b1lpH^8`3P?4gx${peH1V7k17$+RYj#j8Q!4RpFyL|?sSqeP zg_@$v#R8>C32k@31R1sDF7JNE?m7CA?6S~?p8Rt{A$RRt0gKy2aP{s)YR3-cv+-t< zx+IPfBII7ny}4Nqv+p5pQabL8=|@>zRmbhkC4wIhISvf@roF!!`Z1JNvum^7wI_$X z#jnBB@C}#1<&lqU#MA04vTUXt1YlP9w9SB@>pA3TP2pm;D_Q5rzwvDwv#mSlnkS+! zG_0D?bG&8;0euj_R)4mkg_G}*?*qks6Khwx5eWGRx3MWuDhrjN_EN(x8u_*w#_583 zHGmb;3qJ=v4%vSzinvL%Z(OJ;@(u2PYWP{*Ie!;qz+1}gOxBILq=ys+UY)J;O#^-1 zmwu#W<7U^8S(tl*qHh>3toWqoAgA&VY?{kyqZ$C;I0MNXst~O(Ml|*8N*3x^lO5qm zmUEJu2AaGUD*jUJHY8ar%wlb%G;gG2U=QQ>_45RWsj*aVy@`PYs?n9%VXi%=g+u-Q z%%Y5`20f<|)V;d;zFwMWMK_lGN1+DpCi)8Kt9G(<>R2L6)IYy+S&SjReOS;xBO48b zg9BFwChbZe%}j$JF7-Kw(o>{Pg_KsX+2<7hvqr~F;!W8VmPtVW|LD|f#}B2W#Cj@e zb7M;uC5cX-WM4SaZT2({6og>$W$|faarKAYtsh}fWL~VoQrcd&6C8+)Kak1>iT5rw zztq0e9uIID0oJJXF3cjhZFppl@(e(rVy-hj-R&s|3Qy5JtGkOoo_ju4ZG-ysH1NeS z+AM?oQ4JLZw0M3QqbCTNko!$5VtDjWlBXmJWy1>{Fem(UX2MFH^&x*V2ALg4MuHq+ zD)6aOP`%_7Mm?xS)(GF{b1Cp%sUKCYO12bwbDTEnLj_&wfRmczH#XD?IN(XoXQwms zL|?=~dL6eb`Lb)?z}lRcJ7f<%QNoV_wkQu#1}8Jc!BTstPftiu z$k`Y9R|OO*S9PTFvuSk#iw_}c!JxoHhe2U$Luc!wAsDB*(ezKa-nnm)qNs)Kn;o!= zo3dq(6|eD+x#M(V+x==RsVOrM&o68D*CmOfBcQa(u_$2H(^tp(m#Wn>rlu+=<^w|M z!Ugpr1&x&AOqC8nlOD*52ssz^Dip=gOyA%d`gX@jqNV}?9G3Jt8GpESFRi4(L|~$w zA9C(jCW*|rNu4bLyub< zN+c?fMdg%>=$&_)6^&4l7H&^ZNdFk3X&BrWYkKMU-OcfPk2zBMqyPDThcI1(tqp<> z0Js#hSWPOSwTpT`Wqu{XL{_mM|HNvgW0TY{rVyqt@|HlZTA7RF8Hw)oM6tdSM!wjvNvY}=MUha_CbE!n|r1z{hsIBqbJfSfna4wU0GBBG zJ>>ng`yDG$^bLD(;mySUDC$S?FnTgr<4q}AU1MCR~E@%gkjh2`N45XR0mR+ zS9g1NUZzLaif>!Dj~BP1uId0?yL7-F#b%h|7kO;Pdu#YF^(Um!zoCW{bn7}YWO z3#}u5s!zwQZ7ixT7iO?y>~cjGhh4{O7`vFs?Pl>G&?`0l;(Xbf4(Lq0gq+01b zXoz%u>xsZo$(23+k<=rM*Ao79N)H8yERmu6>@7b0Ot9GM>?cc3z_CPWF*F8k!N-4r^&^w z*B|`XVPx8=&gw#|!B3gWpQzTtK#uRp6xbyk5Ewp^C)gEb_f;uJT-FXccdZ@Y=0_Y% zEb3v<<^a>Dg7W{xPX*K;VkW163$5TJpTc&@q+6OvW%m#zH|e94>I6Oi{LLfS%d=+x z^K!MaUicI1GC}f+^XE}%uv}ZjQTO7-r(^c2+q$#|sva{Vo=l2 zRN1VuO8H8SbczFsh(}+3`}95VnNKBMPW!jLiPULY|Ju+U41#GRBi&xDIT{^Vk+!2H z=mQj{Q6Y5lN$*cFwb$LQtZ^<9%i>dZ1%V37#Lmv;)RCI5wjXKuGEkzeYF zefx9XzPTC5u?dC?k6UgETS)~9O9OS)*}-l&va^ z^~S(2EXw)L9@sT(M|{3pEx0S?mOi~QqiKA+x*w$70*6d-D|fUx=O!w$FG1whwT105 z%%_NwU#oSrvW)ZV$v(W?%HUAyKQNNd##7{46 zBXP9@tW8E;U=|gDJY4*gem(i=_b@WHfcZ$K!9xR86@KsMQ_q?8{00{Y%F4q5WKHxr z5F(wRLk+LStWYFs^~u@;N*;li>f_4?4yIu_Xje|jmyXY8j!FE2hHZXFMO#VUKF>34 zfrQ?)U-vl*o_{%)%6`A_DB)k8Z(kR|5ZUAHzOS}hzICnjh;=GuR0%tQ6?9buE`KAY zpucN3cAnDS``}k*6yTkVmFEffE8x$!tBJ6Ob*tN5;>7VAz*HPig+2eWF8y+?0`u2? zAy!d|#UIV>gfao|Ci>^OjRHr>v#wtYfA@*Y@7QO2E)xqy)+fuuc~k^cMB+&oej5Dm z$8jR++RU2`lnbcF49iL>P2A!5z)#)798%qshEwXJ$n4r5*=w>G1>c{!>B!{;FUOSS zF&|E~#50H2>0J6b61DexFdeaeyER9|bk#=IM#8K2GW0Rr+hA$zcVcDw*WTQvB{BXO zyWTZrre8&;s5@J(4NGxcStEdtQmzj(&Jv$d?Rf3}Z`zzbhg+YbiZatM zrcU@KS534l%bD^}Dxk$2kppw7694z_(K&g-HtW5g;Rb)LkBHPCQYk-g|1x`ZdP0{Q zR1_bZJZSohUt6EOriCwJXlMkA7xvl#p91;{`DyE<)qF=JLz$rcUAgxM%(DddihA|? z;Ptyz`*Q3MG1Wq!y71Mw#>z>SQOU$}F1?;#1MfJ4_2J~yKu)a~-c4M@6&hQ3g&F;Q zG&;wA&%5Fhjklb^qiBDIj>KJrqM6`V9IiGLeX7heQ!gwW3RO#P%Hyjz)_0Q~@w-!(B*Pg_sfSyfv-dGO( z8~)Gdd_QSt10kq(?E&K9s7o90u5$iLg^N}HWr)8()#KclMB{}$2QTFH{o2WM`+GxP zFK3Kfa6yB~2Tee!R8>haY2VB@IgH=}#PuJHJj2rUASOZY_{a&NPbs+ILRLAr09FDu zmd6S}jU~YorkiG#5TIORU?ECa+JLS!2rZ z!#D*_o%;Bhzli%bu0I+?X|hnEUHmM~y@XL;9*;C=vxHLq`nVSUVWp`X<&Hm~s$?`v z0u5RfzKS&HetgK%c|y*~!nJGP__y0W>nUmFY|QjV6nP;G$JnKojub({gN0?SYUqg& zV+T74ROT4k^dnF0{{2J3$);$RYHy;MLzV&@O9!yAFj!rv;YmpSwipZ>H8YGn_{otb zF@gkLxze$*SYaNZKPg7xgKpl)1tC5GEo?dj>orhm7?MLhBB)*&c(i}RhG1oPrBIPu zmHB3t^XpRjSLEM6cv>w2N?Wf}I&)toS8%UUZutrFTa;3nh&hC9A$eEA!pJ7r^y23M z^lwg!Bsr2_A2qoMuy$6U-A3>;PE6?@g3%ZEuJmUnq1L7tt?$Du*h)QJO{YrxkRHWL z+lLak-o{T(4a;Qk8PO+F&EtIe?v66}ZBW(OAdE6m^m#k~sYh@{qqlnL!`hMji=l2% zG#`}%%M<0Sneqsf=ZP>{%sft}st*9gOI(bx5%uDsy$F;97VWuvKi~;ZaQdXIE}OQYIGMw-tAr}T<8{3d)=-5 zp~?3bwXqx867<}PZg8LBKCb|4bu9y`Hj_89lqO|GwkpguhV;C4s!X0>bQE+Ha>&cF z%i}?Gf}yCsf|ERW)U>U7vgPJVi3XnabEE%EOCY!2=33gHQ1^x6eB8en16Wh9vt8LkI>+BbPtEBT#`f|{ALyHY6wt&bW3~km|1(ZwG2JJ-?3a-CXh!&I{Ik>fg}aE zE;lrwap93THAbPAjS~km^40gEoXNO?EOz$BxN_F(kCzzMT41(-gkq3_{a zrC58%7@V`JD$64w0i{J)$KX$2CU1t(NcS@Hn@BEC!IYMyWiirD(i%&p%k<&P^)R2R zS~*f>SI%Ww2Rrj1bZX(LZ;GEnXY;1(xrY|r;Zi9?RxRwwqANQGADh3~dnbMatW@-e zkXeQ)EWP`1apungID|N?+$`z(m{{=z zWA(5cZN0hXHw1IOw(vx#F@`kc1gSEJ1&I3@gO}y4{*Lb^j<4u}BYr_6V^H3EIm*`t zgBWe|+^W{7Vc_HI5*(BsM9sDqt$b_{BSc4Wv9!riutbD`-&JHO^QsdZVecK!S&MX0 z*V{t6xy1#wc2P$bivR~?OAJswha7-oIRIIc!qS zCM=sYN@3YLMc55wl%he-vS(Y?kDYFoOE3z}fnfHGT{RxTs7SA*vqR3vks1{6jr(oA zLcu}gFCSIGnW_I0S$*j{80v(^i@d2Yl_9=2qAs1=T{v?j0aFz^|MFIGnY%G2F_HUk zR*Cp8a6tSA>OEJ{>?M^i>>&#=mh%;;A?B#)@5ukDAccQn#8{b{EGZP0Nsv5mmhSvA z!Zo$$m-iwhsln%DKz%4s7+KZ4@TdkdQ*$4HG>yOKgt6&x}eq5eL zxB-%m z_u`+}w3Gs-Bs< z#XD_K*US+1l}Pmy&GXXh)Y$6Cju<48hODxI6_gHYC)g9*OTYVI7a9zoZE;1dvd z_76Y(UCr+dD(d>iJZ@oxGSqu>O`lU=lFRiVnlF}_D?+E_Ywa7NM%!Q(bfTvo-#>R7 z*tDSHz9U!^?V}qnKCG-U>)yaAK@}OWJH<0#^-V_Up~L4u#3jL`urkN0Nyqwt|L2;? zwS0Dr2ajAJSJa+yWQhFlS?o^u0$`t%J#VaXiRW~iV#};G^J=odN^4lQ5CCONuTksc zGFF^e(x}0Ql@)RyxA1n;#L?hvR#;k}VNVC*e)lSw6qD`*Zh&pgQr zq)^!<)z1(9WsM&>_2(23E2c4*2HUblooq}(_haSt3POQ6xX#VT1bQG2C)Xe4 zn6Is{$GtMA8BUN!f6#t`aPZ@w$QNT$JA;@V26H`C#QOMorNw)K!<}o7e}ZK+P+H(R zEWTxf-<6i!nX2PoDK>nu7!|2zsPu;z3ze4Kzahk#OW%wnZLs*34@~_aZ)>J&7yYH#$hcq_;DJW;(G;RH?f!?$IRrBdKlp|mR`*zT zpa!_Pi150=NL22IlOUa28uXw_oK7`qT{H)jvgimb3ePEAN1MIg0pB_p9n?#P+g(DD z>V6O|z&6tI%RUFN!tXFBq4 zxzcIOnD8hiSNP9dK#~&3Xzx->oWw~lR7Q7E_n*ocB! zk!t4DaRG0LaU$GPZVoian9CD^J8bti5nwP>psZmM=w!;F)I$yf304A*Z-6rVCyPu+ zeSol!KW0xPGDjAawK;K=BTz?Vx*zb%z4yR!rJnoqUVD4?{Rx7fW?DO%Ai2KTQz!2e zzTKWHy;TJ$krmxNAvh_`T)7BTX#nofwfxQQOWjIx(aJ$X(vK5kff&=cVZv>sxOIFu zn6};mCyDTFe1b-TmO&Fu))GT+=frt}d%!PB;^()Ppj6i{CIw{x?d!}H7n+W7lO2#oi$F% zdI!zdm$cJ4!R}~#hRaEZuK$ziACUi>IXTk=h0?vYH*QwMzR=%jR00y)f{3f=A4Cx< zHd-nc{Ch+(DTS@C->>ViW_1||NkW>+nh+A%yl6>&Gcs{zE zA1-jE`bH8a>5_Em`WZ-#^W@N%$SahaWC!=u^Q7Gvu>igFzhn=>G~q?zVJT#{++!ll z$q(PR4Tc%hxa^A*p*?P45^lV#BWS2U;*a~;WV{XURkVxtTJ@T3Z z$(cufDdsjNN-ZJu8VKaS@p~YmJg$Z!C&Zt`%O#kn7(+6#WrNOW61P4|N!AsTrX4;h{MnHr z@B9k^UGfB8J3ybRs*EL=FWd7a?QK!~z?dM$ovo(WW>}b%W2Ci^>z&S&$Y! z$*Md0og(C5aKdVIX?0n*=sD@Ue2d2SFrs8!Oq0fC7NNA^=Y0LsT+7?crUOBFB3NWS zBgANCCHEDDvCdWkS8|Q3nK4ii)&NFk`%O+1z;_?MHF+Ey&@;z+YCZmy`DnNS;k=HTZDiKy5{R$5-i3``fhXwU~fbVJ<_N5V%IEcCT~n#4W$6E zS||!np*=(b6`=eMAKR?`7NJX~-nNiAD~H2h1#atn52loE{xVx= zJ~dC~EJ?i9rdg)AUghw1z;rb6}~t#Rl*al#~BW ztaD=kyt(Ryv_E+t0vk<(R?u&#Ii9$nwmC}b1-Y`YX2Mj2PuHG$lZ_tyO9V&wUm4l+ zAne;b(-Q5jbIMPO|Ym@zSq$9sFC6*S6#h4kWv~f>JzDPE%+2UYWgVN|8 zITiB9%;KTw5V|;bSCD7{d|(5@`?#u;%>+*U-H^|S@1+w{p7*wJWiv0Th+wbLrI?$U*|525=+r)5a(}>slzEv+9m@`}5>j!y!qq zQI6?QX<`i+2=g(e7a+G=U-nuno&pC6>E7?!A4THjJkKHnDn;bS08k1kOyxX*J!Px8 zY31^_u0qCj*^sb{lVh3FuciYm9H=?eIc*Z0HN=~-<3d}5o&=4zd^B6qLtct@zCSM< zw}iB}zusX|V=?+o-Qo@4D>%_#D`5##48ZJFJ$wB49syf4f8Z2VBoSFby?oMATKLnX z=K>Ax3mdMLM)4B~Ezq*Po7KHLrj@K4TbLxDG39Wcbtz!1eK2MwYcX*cG^l!+ve9jt z_4|%9jOeZT`wpb^++V@L!<-1m;boRJ+4aqCpJx~D=l`5wPm#O2v^BIJ)_z+x{-*z^ zhmOtXxepQCfxZ!&=T7zj1vcN&076}80m1$|J1W(c<1-*4Lg~l8i1xMrv2>q(C(K?0 zhf3(pQ!_kRyTvH8a%I&YA%0?M62&hwYnAfFyTObDdk8yBTZswMYUgXMu}R!vHSH2s z#bTbt*3B6EfBb!XcBF=PW`D#Z|51zNGOe#5Tp4)HwqDz&N1U2gsilY&0X$dM4c0c` zHDCEjYczlp79x$Mse-7_x|3oZ_~xy1?Xk8 zLw2OO&HWJ8LHbVFYHfI=a5L+M zddzGt+B5$3r|n?IJidy$(GoiSZBYY#C5wT5&=h7*$cLWPeikgHf2gUZ(KKuq8-;7; zf@{Xlobxv?y*352X^AHN%&_xvZG?dltCtI4jp>NuR0mJ)XN!LEK6?CD@^Hn{ySMXt zwo}Q`SZV$OS<=-wWeAQ?qPN31CSO%FgG^ZmE6kSSZ=F+Fpm?Yxby=vx)xBy#p%+`Z z0-sUbD^Et1FmvF{uY}~s?QyqG?cDBsQNmpncKPE|V@RbvmouipW`^!ERjRBNbaZkc|nZuUfcf zCae<5sk~D3zZ5NAjoN=PPt6EU8df{qFORxXFRWODNZu$o!xcaiH0vhPS;Jy(8e(qB zR)d(WmNfUqFjnah4aUD@)l|O{eohANAGPUE;-kd;Dn~1dLkhRF3Akil>0|0n*4Nu& zBJ+d!v*_g%TC@q;wRyyQXZo~%JL1v*NcmpBb0K0DlC za=LMgKH_hBke?o**0I^$A@QLD#%0TvkK0tSfm}0Oqf3y(S%E_(1ymCPzPBqdv`8-! z+Wrf7UIkCxp5h|DolV`hPBcXQTPv9)!2sAbw9LyFti={MhaIKGg?VtmcB6mR%ht+hcGvtLxKsXUA zjqMG7$qbC=@^2iY(&~j2#9D;kv-ixHk+EhKt1pVOA~4bAHVcLPVcm?rUvG(8A3Qg7 zt{hWsr1vI{ZPnVStk+`m3*0)6@=j-lNk&JtS$TN2?3{ALW=cB7wHzI&ML+zD1w^M< z(9x3P^}Ufq>@EBVTkV$~U;m1{Ws5lJ5Rszgg}Nx8{I;g%jZa4_-WG8lXkT@a3)K)5 zlFEOYTcq<6c<+kI<*K#3k;*CYjmK={Oq}Wq$RvH+XtKLI8uM%n);k0hjA@=ra=lz+ zm0e9*>KS1jYR(?CVyFf5Mje#wt+`?>Fr4QjaSzWANn_Lf98YCCF{%$F63FIQ2#&54 zw#&a1-L`sXr`&U#QjQYwh|BaJ!vGmG&P5p|h6A4!AqX3~sZRc}T=N|V(&TZLBSV%_ zBiUfbvZ~rosKipbq6sP6pR}U8cVq1_SY}7m;5ARS)VtFWoPcAuFeX9`!G!NFBa3=$ zI#x}+3q|9NE#x~L%X`?`bm^@Xe&hG{ z8q$ZDv82{n6C!;Cp9P9?wMOpUDY@^h`73QAsiwEzQ5?i%DVcj6JhHA-Ux$rFO6orH zFA(B>JI93vVLez292LFDU*Hp8r# z@>#Gl%iXZjW)@Mj+x@o24%1BsowD(y;oXI^bDz1cFXbBt#0mlm6tIF&iF0qs4PuvC z@e9GXlC43dFl#Ro35d*TzC@P|GvkEHB6^C->PyJ-au68`_dvp|CaMw8!DwR(ns8rz zCr=5MYyU@9N()M8*;_47vW}CYAEm{8_Nn&jE!DC~)_Zil zE>L!`Say(EcGggjHs7e<(rNF%RFUXt|>!w!x^`f|*GA@;R$ z+qT`?+@pkG4>g2&1+tmUvPM5vwNLy;_-bqnOQb^ewK62 zWBeXM6?VM??N`XDnQrMqW!0SSD*AB%zSNR^ob2?|$DD`aZ%+3wA92j4E#F4B4DM!gttRDHmoiFUtrp|-Qw?lr<#=a+_fDD5vOjnb+H#r<7(>p0@ zJFXUc&KjP;v*GRBQ0)(KT~^yGF0Up;tdoIQLD*$diHAXIL_kyR&)e!G3UsEuY1N=kA5;k@HKs%`p^Rh- z&qUu_U8;~&+seNtHP8O*1*7ax1-IaReC7V}IcbS3AK?-*d$2-&e{en)p5nx>o#2i^bd*? z7k||7ZEnAGn^jrc+xLKtC6*dDVFNdyiMktf<+@DV!YyN|nQT0BDl_2-loUNff-dy)v!7q*IH2 zEf`8+#l04k$L(~(3WIKzki@AUojLxL?Cynk)g3kBg6ZKuxM%B+4so;9)Ab4GxbNq& zpZp$x0h~9LDyVtjHDTy_R>N#Fo2okw&NLmPb8*vftFY>%qO!FJgx!?a3-F^R`iuhfyGSDpzsN8KW%iBE*uw|v^xMo?fB-{ix%E?UKTXWz# zvK}>U&)M*EfJskhZ@$w8`6BPH zDbWyYPQRK>MQ2Uo4Qyi?dF#9v8wD!oMU}hO$d460Nq`FKF_f-c#F6^DOSm&Kfy*!YR?UQx@G0gtCugUmt#`VtV9W(px6*6`xai+ z;NtP0pz$UW3!)VOz#r8BdRaDU0(A6wwfnFadx_jepO$4`~J z_G%qtK3B{CGyTk^Dh_eeSIl3Tu% z;NBD>HVwgUt>xRm?n+DTqKpN43W#*q5VD8agcd~biNg_jiMDpz%hC^9S@un_F=`?i z4h6OzUkg_Nwe`%Jbn^h*4OXcFX|)_!N`u>ovgY9bc#(G@XC~NX;Kj~N0j_Sp;OP`*i&*Sf7P;;jU%1$eJp5MrLCf?om#%wX#$S!DLa-1MIs(iW-&H8+zZ ze<^efvj%;!>m2pIb-5!PKvgC>Lz&)+oWyNH-Odkms9)8No4Tae^($!^*0&8E;=>&uD%tn44(_V7OQpQ9 zFf)Mhe|lJ2FB4yyfEO4;KE9?Lyl1vNPKYHdc}#hzP$vIk`XqG-7OqYsEE)8EzmED5wtK(ohi8+~QxSD6QoJggR1L`Xqvx}K90 z&?(kxDiajn)-OzLSfoll)`kzwCngNW+a1y*hHx5)(H5;nW*;yQ8nC-8xxWm^6;K#Z zqZW5&hEw*knjZYe?)81cA$HS&^8 zd2ttUYmfYI!&6bpO2xBtFzs#98lCjjFJ*u3XifBvv44Yse7AhKWQiKTm2Ov*n0HqK zTy;yIWsQMgC$2tXk)vf2i1u=-WLeny@No*EbNvFFeBgsJFF_sI{f$uDh#_HBbW z?g`)PoHJ!=t`6_QJJid~G=@6t8+3nm^7*;h@KU9?(@J<$>CQP>5*_{hewgUc_jI+R zU&(fw6E5NROM)#LJ8mSX8LJmeB_dhu{=iz;BR5JzE_B>jz74oIdu{Yy$fN3ZEkto< z^3(%LxkHn`6)C#&sIs?@P#Y9_2)x{xjt}+{JUJ%0>FrSYoKx9wu@T0=XskkMtj;i( z9GVtRq~+WzQ<^luI{>&la25|aj8q2&G+i%>Af~vCN+cb$?$P*E4!&rhvR00NkZYUcPO*Z@4ThF7?#r>?G^_QEBI* z6=AbVdOV)+)|)=gls&7iQ~%VeoS3@;xr9QiLq{ofPp&%9=1gk|5-?@VSEq>YR5EJw z&sWBPRAg?=PF>CE&Pj5tYI##5rlUk|OZfMP9+X##fJ4i`)Aj7r=v>&7lWol5LJwZ6 zj1hk$VdnMss3WC*DTMt@?S5qj(>Jz7fb;fd_OB08?}dan~x06ASBDqPTt6Ny#;DS#jWvW z=;*%!y8cC|kRkkJucUJa=jc%biLY^uP?Xzw|SM{s9$GlOEp08rw$#|Y#M2_i*-T5y3 zQj13NhKNO((XkQG1Sede0UhB^8%~V$RH%>Ygyai3DCRRH# zn0#2VP_My_Uk?_1(L+5A?OVFAmGLE}v@`5~cin}nXS$#2UeKFB6#*s(97XNbG z3P))!CEbfG+?Re3(d27{@5xzMX66lI3&9>*Xcb~*3KB4VA16BJ3RAUc5V`jU^%N&{ z*)fB^HVzVZ_CpI~4aY4Kmp+Io$NeY)c_rcNvaZ`Q$(-Nu{mNYM_GczSWkxZI9aCL|aJ9!?(x6RA|+zeMZb zX)S;VdL4(CW-52yV;2=iw5#jFAnRi5MZY4qD-;R-N#G-fK=E*i^zyg%iZkz1O@CxU z@dyW>Zyj$|wvGt3)__|VY%BzlGM@)lm3E6$3G8QTqrsA6NDI&i3X_=>@IgAq!7D1Z zyI&Z)nUPgc!kEE~VRf;Aejq*LT_zt$k-vRRf9zkaU@us3nPuL}s{QyI;FS6_0e)F%4&D~q$md?+5J22+Y@Nga3(qzk+jYa@71 zmn5IPNGU<}l|`%8%K#H#HepqRhDA5aN~5AWz?!LwjzYJ}am$>IUu zBSmgsr~P{(<>bUARspo|Uyr=sj=*ZN<|(3w;c@OnsGZXM!EumR4a;ef>PSjolkfWv ziaG$PAI@!3{F4(@$s0Nc5LF8~H}=Id^-o9cl>f!>!BU_1(OjiKBqVdJ;K5DZNl_0Kmd7`T`0r^GlhFAMS~5 z@QoYh=Dov&8yDRocVUOrr8*m7{!J^0jRk_xDC1yuiB((izfb?=7yEm8JltHIET!H| z9gJj7toQbSY-{=dDZ>x`pK=mooPanhMDq(*r(}WHXT^i%d#MzA{s5Y6Ws9m!gcWD# zmCK2&W-jn+`Ep8Ippu-Ou(jenB7@GxxzgnzWRZWbp-!=V)pMC0@q2WGFtW}P{G$1U zAsmgP-L5vSbZ)&EEv*qFO`hf7%yKf?p>{^hRR$7i2^2ectK&06t&I}@%sMk_?=F;o zozPnL3z>Bcu%fNpUCh?tRfJ_#RhZsr6a&sQj)=eVRRh-Bt130u!xFfHzaX(L?0(eP9;MKqyJZMQ-9%nkciG%HTmtw z@wDN~EUyAaXGs#vioxMae}jDz(fmDDu_{L9#MPHkZPxO1uZ}%ZLmdj+?^kxJj{tC% zc^#nXJeKPh;dwQdTUuNl!y)%}X%0YnI3}QEDr{mK=b!x3&$}w4SpO(nHM#dZ^i9TQ zZZmP5f>|$k9-PCG_I7pl+qXTtvfnQDzI|sjY^z$ zZdI?=R8GkkBeQ!FOSo+ITqbX=$mSj^eO^1vu%<`H2=1lWWJ?itY3(q4hO>DEjdL>O zxMNu*m3|^(+urKo0MKW!b7s0%#{DrmC+~Ram^*~oZakn(I(+Tc78c$_2fD^wgBDgp zsi*hzN7T~BRALbv1#EiJMD1i$1$3p0-oO`yh^uckg+R>}*A_JOFGQ}E*0V#cGEKqF ze~&Xv=!$mEj&%W%-&JYzjK3~beqZc&IPdV+KHFCeU%$IO3FEQZ;8oC2&`FiG)1eUK z#y+tuD&+WyF+X={?J%=22l!Hc-yRuHa>ebD+T@01LlTNL^*6wHQeRMD^) z9t*l^m{?>-!f!|sU`CaIQ}Ll^Kez6RHXze zzAY6&3gpVU+YCicoOw0~*ka-%=Sw-^kS4`#?&{;?Ab@XqI#@ViFk-CPCqaEG+f0{=zdAMs<#X?0jROBg@6ZWaS_3PPzEXjd%(x{i?1lqX??_1Jdl>;Y?qD>;_m? zfZHt-4RQdyG5r+&cvFiS*=(kf+n1!5$q31QQteh6CkpU!XwPp|6U%i}YTgCbVdfrR zowfTkgghi?u7ras!>9O%7hRV}Ia$v@ZRL#KQm%bI`S2if7e#vb$NHDl5L{v3C#M)5 z`mw87hdjF^Yuwaf@ zXJa#lW!jp5&36J0Y*LbqTaq%bX(_e`;$Gp1?7BOy6yI7URf(0XWD0JRyYNxo=6VT| zQkx@zt?$c1=TPNiKiPDuR*7d~|67cw(0!0eS>#ryK)NN7Q^bWu*;gRX z2NV7r*#D_b*bBFa{pS z(zsYuYeGm4_oJewn59BxL=oD%v#egli)J&cV@}iHV*1XTEl1iuT(W#uqqU7IMAnHC zE)Jyb_jI|iHoboGiJPk46W^h^q}-|shLjd}^iFjKvcGcKd$njh?%^olDT@QY4*UFM zbD9TtC#xAZjxO3v^n9z~s$0QXJpXB!(R;gwMl9Q;TsHIloq@Fu{GIz#02~;0rhxo72~IU zs)S^sM4fbP6yaPJsM9x*X0-$2Yn~dxtQXS?h8MFVI(de}>9s)MVFvlrTVCbOC3u7| zYe5X>`FN!4i_q;}C(pR+S2H? zxpZp}R;ur#|D(Hl`a#7XV(M$p=AU!}F_2u6f6BZGEZ$7r2#z|^BLNAOim7?8p3mtN zshVWx9}hRLA`!Ey_N(nD^T&qP2$=gwu`b&-Tz*6rPqK5iZ{N0klimGMgz4q3E+8QW zVJUD9qFePS5cz)p$S03w)D1BI_I1X>1OQnnH4g2hDA3Volt(DmKNz|?D&xvF;0cS zK4>M8@}ic8$I678U^$;2^EJzY+e{!&Q$UV$wq`*RN)cc2mTCR$ zV!53j?rOCAg#F+3xzd-Q|K0E8?u_>k-@*dCERJG0|M#@ZVav-!?Sj%^VN}0H zt80QG_n%j#jA*NenEBeoWK#;}LCy8o>J1{D3(*$u)UNd@2s=13vcotXQU&3MW^s_! zs_0KMw;zzbj_W1K-nx_By2F*W9I_w{RGO`OgPe~BrW!*`#n)0pRi`Ryc=6{Qwco~o zxn0N!9VIuG49$w<_rizbXdljf^%xujDO-6ZDBGz3|Bb4$K$}MK+9TO!)d{SJP#Lx| zE{IfUFK7#eil=%-TzWKJ>NeE@r}CPR6xbZF&na38v8VwnV}5Qq=u242xS>FJTrwFv zG6QI3Ki9yKQ@(_-O{|Dx2)B|CIX!3KutUH}05tQ;;*1Qp)=|)()bojy7<$uDpd~aj z47f-ifva1xK$8Sx$5$2nZXGs7)I>W(=|h;vSmqTd3&sqk>0G~IB}U$N6Ywql+f%@U z%?LF!)F^2ii$}cFHDz+FtZ;04FqF<9QEz04*shsJwd=&AiXX>5YS$zcrPNQru5{#2 zI^~h;(ECN?B7Le5dR-mUnYO(h(}}5-WFt=c@N%-aR3nZS%~itLqB#DP83P?&INbPc zSwVvF=zjRTZFU>05> z{*)7t7PSTV8`~JW+@UGA3T^~sq#9ulg<1aOb{4h#aA?b{N`PcP&>7bQQSRtq6n@Z9 zPaI}+(_hBnZTefe%v&gn42hpYSY3-N=lgiq#af~A-+;6bi(7lb(tYsWW{{bGnM}{C=4;9!K?61nb}@Xg(2xnw0^`8F)aj$6E~PXv`n( z#dUF?FHg4cvGdVc1C56+lSY|4#Yfi=reTM5v2S_~qMm4UV}pLetXdgG45MxC$IJD& z)n!&#Vb}Pn0TVAzhj*`{HPI7!F6W}7j{{Ue-aR>09tENhAYu#1f7!C-&?Lx&n4j7b+N~n%#Jb*ws>kAl4NIaWy~qt^sGRQADl(P@R@o=ngORH zCOi`M>H;acH2iIv>Le7ddLW?HUjFQL5GU%O1Y~$JFY17_F6Za`x9YE$kz+$5(hy|9 zlooQAOyDZ%Gd+z@_hJfIa(x4s2f-aKd2(b7*OlmDP^2u{crJkM91gzMf<5@yKX51r z$B9*N&FCW?Mq2Tkd{rQUD$ELKMi-xuh}d%5h+bWWNmj&~Xrx9e5D zZ7y-1a9=|)F#*0`I)scoPC$jUfbh5B#Qht6`s;Gu_1zA<5Fww*!{I^(4Q-EJa5Avi zVS!kPCr;RJb`pLm*i+i-P^ilAt4&j-OIO=9e75_+*e1r`4>5!&LxcOZK<38lHjix| zUD!P^**`KGa@izdsFE1{yw8^#$ z{B&iP8H}~;%Smzm@jedeZ{0sr)^bDrznmA!G^74Pi6^b( zZ&t$a`9bDWl2;|rj5I!u%zJ@NA=)VN`;S0f=q2BrDpSppxJ=$7)0fvKUGcHNkUkH7 zo~UouyDGQ!_5s}>@0;qTk{KC!j#}N~bi|rP;2aYTvDIB9J|;|z9a}k16ElPZGJ;WL zTDoDg-cgMHtXvGYA$)!#u|OW=Tk)C%F%FG!Ox$|2&-D{T1PO5Ht=2bH13D@fS9l59 zf(ly+{kZrzd|Rlu;%oJ>k`O8nb`GD94lP$$^0FtqUaG24K)e2Ym^}viGG}SIp7I#L z_09DT1t*MNIc91t8B%D@g?t>J<#e^;>(R?vM=4P+MGzbrbsptwLmXs{Qzx7#xbNoq82(%8QP8IXnJ zbj{&BNyck_Rw(~4+Kbb5m0^KIx4||enOAA@>^K|J72jOhKyMhSz?g8f*}X+N0fkNO zOp3WcyJ;@6GYVB?c)3S`iP-n&>p17JV}ZmNp8d={@Qv!e4+gwT2KwF0qjEMf_4}_B z|Ly54^6#{e7<0=>xdJ0bjBpJ&{AfYS`*Puv7ePPE?96sfeH9I427&QjLH&RBf1uJQ zgr6Lg7v~N(UgW}so50TSlOzGp>2mQW|>ULnh5xbmN3}gTAUXvd>iOWkz`ow=i zFf(n#EKw$f20?yy(d0f=H*xaBmz*)xTj+x{%8|i`1-`6ePXgMPsxyeZdDT>NWAkp4HJj8 z)y+XHaf|c(67hgk6vG=aGL=?3uM6Ty|T=fxWZNq19!$}BKdvl1-|l`RMpUi6h0AqL{)2I6E;1hrK-M^<#Dy^t76AlUz70$i*S!159hpY?$beK7S*C-RJef&p z6LdQAX>iN4+1VM@Crg`1Ck+Pj<4jDqK9VndseK5_tgDR24O^-|I9XNnXTDlDe9b|W z&PQOb-1&bJNl7DDZ?}j~c;xzx&Npz3-03X^dW8r7_zsjT5`}D%2;|BWUN`{LS*&b7 zFf3RX$ysa^4UbZzsDbyRT`EKlUPqeGTG%nj*EQ&rw+|UBWi$@6A9)qw%8f?ackBK1 zG+)qzR#$5LrTnqZS#Zl6H?${Ijp=*Xwa7htDUz$U!$}bRjT5r*C(cGwlf44O8}am`Vr`mJ zCkSCQC5K7BE}3tS+YK1vj=Rhq$x>-OGX!NoUmG|E$I*Dy{sw;j1N-;=GwKiUGCA)1 zYuK(l{I|}{oKCs(H!t*kE%^P?eO8qmtfJ)GkClPbG|ipN*EY^3p2zqOE&oheo)xm& zS}*A88MUIlizlf&PVx+3fAu|)j?yQc77wFb5o>LDPdw6f6!K2SULRPUo1%H}n(II{ zjuyJXV+yU>am?zdZdV+{3}-?#AsnvTgc6JXi8=6uNrDnGcQ(P#4*&DG)o@}pjE8#7 zGM+#Y^wYg<2bsyya<@a$~i4qa&#pclU+w#7GH zJB{!Hx=@WVILV+L*tZ}H`6LiB7mC?B*Y1atJt$N)*#aAl=E-37d*LsS$I=IHl({c) zPi=W^>D1BLOD7%-kNPPuEafm)(LA%>g%L>+rt=p$oi~Em0-7r{nzWzcZG)N9E3W!4 zEFhBoY4>bO&NU#z_aL*>MTuAN)k@N{Lf*3iZaDc>;#Q|w89x2@um|!{Ox)D^s=}|t z@94^v9^MV<9K12=V@ZJYDv3ZhemN~E5eK2qaiIyN=PT7gW9JBG{CHc6>bhYRBz}3se-0BaW}L@87@_z{ju6DiA^o2{^N@ojgq>YS;%igrD5-0 z%xB=}$T~{V3htGG>wSXNWTHy@M(cdCTCv!dnz&Vykm*0TmtIeh_(v05edM9tZFmjb z+$e0PE|(_%RybSyf5S+p2K}5AY(>h`LKR}5(3w7EQvaBQOxBc6%`wu6l2Up&->x6t z$y63_5X_dCqt=2^9us=E(yXA{X{--#9dbzfzcac8t@#iEYOYwWh~c7@U?jrOL#^Uq zQRz4PPVSb3%4BLTm0s6&#Iast@UqF8O3*37C50B-gS~)Jv31|zE ztL``+vB@w_DSE#+70M$)Un$r>u&c|WddxjBg)}9fFp!iZDj&*EZ~SP%wtjjjUDv8h zZV~2r#k@IiiGsblEQZiAX&25tXNAJ*FE_*O_s#+`aEq66FE`eP(_pC)Y5aAJOh6os zz6K}cA>OfzOk2I{0g zQ50@Cdzd3VqE9O0O&rV?iE&7R5kKMBmrsa(xcuimuH*1EKe@)X%s3uASY zD7S%-GcYZT7J~Y0?5y1Jh>LH-7wi$J9;1xqdy$&0B&zmZ5R{dbWW?kx@|#4Hv) zqQo1zacdRY?B!;M=pYi6eC`l&9)uPO{Q{wd&+5bd(7GRTa;XN(gUQRe+L@vFH>HLh zEhMNdk?vvFoBld*+hQNU3HtW1r{>T4-Or|}k*Zb{P8hoCGz?W8@WY2u&9BZb$vtLV zQgp`;)(O0{;JUKRG+BjWVd$ikB;Xua?JulePC7_nD+T_F%t!WPSy|Sz)sXp~^7UY> z&(IyWkpIWdAUga?>8M;PrPbXecTYetpjFIz+C?t| zL+-RKI(V#qeX+9?OwL|dFFLtGJK_h{i(U^?P`$sKHPV1rQv3mzs}4K#@M*6j4c+xe zed4LiSK5f(_4kN;dto&+y6$e1)lIf1G!5OS_V%&PmX2j|dFE@%-gPK$JT!)arYlQv<^1y_>A73Eh{;rb;Jbjt1z~b~z zXtLDx3f8g&4@aSLmMdmy&69+L+et?q0TY}+EoX(=8z-3*#u3c&O+`Jqgd%ME+JBQ6 zY^3Y;4bkq)4Z;}J2PA*F-s3gG815&yjU`ra0y*#j8M(;(qgM*?GUqq?+LxVbQy7*N z;ZF1aE)FU+;&ZXsgA?c`Ut2@`7>px_#;g$iqbaZ^iriM-Df7hN0#aC7dt>0dwuywL{KF6l&Ak9BXu;RGOL+Ull11-g$GO?!Z55 zc7soOy)`>)+&Vq*Q(dhl%+We)=c7GCX7BE{8TIf#g9uY3!5Po<4(zD?mXK{tOESGm zY!9I$L;Y!+F79nZk__AE%L{E;4Fbf76uc&z?d-11< zh*QcFS=S>`**BkUNsFQ3_tHxw+zAoY9PJDiCh=_v6Gdc%=;1t4UM>?@>0ZBDAx_Jt z#)hOV%0<|@2^CBTs%t<)6{^sx>{x9Y6Edxz$U0?r|s~k?7XzvkDKQWC4aq{bZ~9 zWw&HFsiWzMq_R2K{t&I^b0?$7zDiE^Fx#xc5ep}ywz?Afb7~+fG*PL=%@sq#I#hGN z$5*uq^29MF64||6p$aYcw;I<}#uD?H6JEJO@UC=>j~hki`1)P9udEpljbH&?EzjS$ zD{l;q->0!S2yMp%od>-dy>oRJYzVDosT7cHX0}c&8>{#pu$Ov8h8sJFMDQ2R4-)D+ zFV+MYYj~=Vnv1|)9xk#zE+V`B3dlJJd?(#>W}KSHBkVdtIRGpe%rp{0Dd2OUkRFm! zu;-~=@T)MWoVBk-Knr&**nJjQ9y`gEtMI1^>gUbQr$0Kio0!28g^j0zW5lQwGL{~pGIPlQ=bA| ziyS2UT4YFI{bu!J9U5Eg@Jy9E= zHrZ}gx|@2UB;0VJ=qew zJyPV02}cE^d&whflQzM_ymN6JV9Al@FS!X$2)3^kdiMXX(0YgOZE2fe_iRBqdbTZlnryRXDQ-_EB8l_BZ47Ub~~jaGE?LnLN( z@aErik^IR8+iPnIcgG9K0sI~@X}{{T@~ma=Ea0n1So~2c>{3rctVNo8%OTJz;Fi!u zYJPO&ttno}Pit%nH|NG%_oheJP&`G%D_-S@WPTJ*g)AAxtN%pxWA+E$X{r0o)!b|c zPF;V_Bhq4}z{`k+kPZ^!UiAJHF|s6*>!5Vw;O@c=()+)bYZ!>3e9goFcMK2!{CKi$jc;N>Bq*p5-wg2z`=}C5=&}v@Aio-maR{OgK0JK))&;-C$z4Ermf&0Rj zYo&brrJ1i9_-!&YB_SM&xnJsd15(MLv;$Ht$mO9OkF3?b319~%46$kdiK9-_!}fPt z<%yjmbf4aPC!1qcxguJVB9_I`uf3*ZS~~N=;|pKN)tFp}`jPe#AMX^o1*RIKkob?!Z3$O5?it2o5T@;o37Ec1)qK`HGXQG z;rHUA(~>8VwIEM(6A6AjawB|Vf+KHyBgJEQGpeEvUg9qKFu~JC2pV$DD7tfO`smIO zE$|wpZ)2ayz@Q=hM>I{Jz&5u2X$U@}lDkYFyO|ULXcDFOaLSp_@%o}E5CnBR)O!>~ zJr=$f#;^}E+IA{NyHFU%(0&{;G@k#%_6kY&5s^tYGa8~0iLkUdl4u%T9%@>{+*!%D9r`Pf?BhB`JjdpYL^Z}bkCD?Mr z8E?p0mSv?j(D8Ep`ML)QNbI%b4v&#$P*}N%2&fAfT%GjWhP!x?!OSObSE}S`TPakI zoweord5v{6{R$eRtm!D83g3Ly^D|DLoK;Blg0SP{zPA;e!XT9Sj3@hWCJcd;@$N%v zx33g6U+*?ALz;t)bH|*vlwVUR5ePiFW(p@i`(*0GDY=L4%h`DbxO088y_oVK|DMS2 zoLEw;FN+VY$V@h)8#jlRisZKW)$-r7#0}E=!Sm$aK*xiOVWrG%;2Z1+w*l|MtYCT|J8X<@-95XWK}W~ zCYEGi@3Jzs{rP+q`1@x&u_-u1CL!42AOk0Xc%(*RcP;Xi*Aj_AfNMzU%p#@)KS(y% zw@pespFL}y-#sQh87PKszkH$Zr{+Wb+7V0iXC}%KsRwRY={;#m<5|uJ@8YUCsH*vl zL8vp(y%*LaNe)0evzm&7o;TJOa{=`9e6DE?j5<2)D}2-ev^n4I*69l!I2(s59DF~e z>^ir2yGX4^g^ATDBR)(C&ZZyGy-FrnNfJ8G$?Zr#+jB9Xb%*C%EB;8r(-3%o&bd`N zK;q(hDx4dL%^fbWPN4OjYmQF^rNF(ldM;JVRpZ_WE>X4T-s>24mU(Y&GRfkjVP(MDaoe+)18OqKt6Mj%XUsCM=%Lwl_+?^UwoA2#VK?t`grVw-sq*l*G{u% z74*GUo#n_=`>vTbTs}5{oH_Kld+VE6Z?HK=!IotIVb&loI>(odb~V`CTUdxn)i$xI zI~b2gx!51)6yDbsbGiAI6%!An84^OiXp=!gk1Umz5}_kD8?7uRP+d)e)LO@2ZIStZ z_|C@lb6coOQc#-ElV}_Sg7aH;iz}&YFKe2LbId08oVNI$WnI22njz#Cpb{C$WvxYW_nh&O$FKU(L zRFIA4+eJ7Rh%?8T=#kpCJwOq;WX*Jequ1cYcyOhqd+-t_9{UDeU7-RN$u{NOfeGik zGa=D@G@3$KO0N|I%zU(S<~uELO|)3bteC2)JChCD)9A!?F(#ijJ>amMSk+?p#?T9G zF~FK}Si8uW+ig%64)J2id$&&OIys6BM=mNW&-Goxq(-q+mLD~f8sExOjo zdF{^fZ+^Bof0cb%s4iUlh5oZF*8OSV z-cJTBe}BUXRXBo%AF}2OKQ`d3GmJ`in~ry8>VfAE8bY3}9(0Tij7QmI8J@k8?2bv@ zSxe$A(%d9KDoVmeOAAn=&IB^G!yT?QHi5b{Bi(neocS8Tmj;s1l2dE2{zFghr>1OY}pVQ{V)LQTdI^jSM<|y8l<+V>MWaljm>dN z-=1@^j%yE*KzJc{>Ub%9I#DgPgQ`vwZ*v{9c+XQK%S`l-!PI}BO9CH9VsZaqUais& zdf0xXY77`{J6Wok3UK14_&c~oz)q2jpB4LG?pI|BeLf{hZ8FcngPx-Trfz(`OMEo7 z!NB}|IJiHLR&$E+jG+X^z~#{&I+!WS3$Sweobck^!reMN_VC2^$21pfe4+^T7}xh(V!I+v^lJyou)}?v{6&nvPyN z0uts~X1)V3`3eDUk-wDdg>{yrW~e^{OSq2EaGCN8ZLkA|y94Z*D=->);*7kf4Ys83 zRzh@V64$7#Fr3LZib>igfHH`3&sC~@O4?^FH>win6w$BzU7qZpxu>pF&j~qZTzob^+a*aXQMo$}-)q-D-c|Y)-A%qMe+d%h(H~27J zgx<(%{%tOyxZ3|D)+#RM$2=~C-l5yo-wSTaN!-fc?ooAMGL26(2!a|L_`Og)ShH&Q z;bO}ZppMv%$Js8~V#2kp#opL=1prNaA+HUHUa2!1Yj^r!1UYo4kvOvR7UT2UY5Ut` z8vtG8WdbH9Sh2Nx`88E^uvhZe!w3Yts?_zLBXE<2e*FH%890@jIiR`H-dj!oJK?Yb z#=pl}vF!?h(QXG`{aFqMOHH`@*nTwRCpYvb2CqQ!-!uR{Ys$a6Nw$+Ez;lWvwM=F! z(C`7p#`O8^RY?a%KaB>d&0$PfK(53n;|^P6rZQ^>M7j>#G4xo2X7ficy~@ms6K0->*vnQg7%*~ntz_Gja18!!pFcS?>zGYe)>*Kf8VCpjX$Cp)rz*}Ks-Kv%09?YjQ5xi|2U zIt{WCHFXVtlD8nR5jR6;2Q_gR0}SX4`< zK}u!e(@X~9XOoLMpyyKRmU!}CYYGVy8p_aD`hK8tnh>Csz3%JnsU(;GYTu5$=^iIR zfKic-kCcF9)>0wZRXfeD5rKoYHa?fyG!25^tUT~WD(8+R`%RzeyQr?SIm&6kU%&Yg z=l+@dl{3vuQ8rU*g%34VTAr{+`0iJ4o8FLK+t<+R5%UbR9pS(`9ew_PT)hQQ9L@Iy zN)kLc1h?S9-QC^YA-KE4;1WEzE-t~{A-KD{ySu|9-~acjUcEY1TeGv%v$MOieeXSe z`m}{YkyY_am8i$eXzazo;ALKk`?H+R+MDI%^~I{*J4BLdkA(z9N%mD0?Rl1LY$Lmb z6ssIQEz9rZQ9W|AY74OpHZwt&dQ(z2QZBCbvRpDJ>|>Co6zH#7fNcl*di&3t2YC?} zJ%__eTP`D*ry)6&rW*UeA5ee_Q@B6JtwaqHAMWD3EEE3L35`8%1tcTfKI~ZDAWA?A3Gn+_wKp4X7D7D~Ph0+Nh?(+J`14PnIz}a(JLZM8A zzC6pn`)S*wqp15b_02=ZqeDHg)l~Poag8o`Gs=Ag!LtL6eB|SH0A!=q=-Q2@+fH5; zcmMs~0iGW|#e$AJ1x+_TRbQO-JUU+N^v^L~*+aDT$=mdXYDjv%W|ju@Bg$~PCASBv z-ON)>b#`+)9y&us6C7+PsPPobMw2c~cW$evL?hsP>^l+_%;W|1XP$SZeO`A*#pBMB zGZK-l&wV}Fxa^(;@VM{1yT3CO+e0Cq;=)8{;>u+_E_VKmqanA$;gfK(HKT3IS^$nZPddG5ofdy*G(|(p4JD?>2}I2W^?z6nt?+ zZh>6RP06N*9C&fu>&;5Q>6Ji^kj*6?vJ6ry&>ae(`H+N(Y&3_)4F(|0{lAn*_V&cl zC~%Fg9~VYDiYOoM`^1{eU8E5IR;-_uq->vI(F$)mNQ4*ctlZ*KB&79b!CLV$bEJux zA{HOk=rXiJk+KXk+|oHi6PfCVKojAU7@{XF)uB>$!hraLF7hZoENsksL?Pkt)EnMFUuda-DEA!CEk40f*$~Q-iJcrK(R=bY-;sP#cpbXUEoxbw1 z2{^D5WNSFerIsw;r_!t@d5x)@q!5LD-SJ@58L?%>O75N$TXn_N#NP#J=#a<06`OY+ z>`8BV490Nybk6t;W`9$9%$OyO!^BUUi*Q*Irp5;1OxY%lX!3Tij&67MWHlhSQ-SY> zapw5MnJPhNLaipyq2WSahr<>9okGbCiC*7q>+_?&&%mLEzpPGk&y@UmKl@XZYJCOg z=h}99(IBxjZ*`q20AcRTBBM_Obvz%U--ZJ|SABOoylTfYmikGb8hjgsA#g^T)Gm{T z_`J%_Pu90WtETYS)}}L-?sdS);sQ*ZIL$6ogCF`Ai6uX?_-I|8050#7C= zE4{yB5$X_K3vt-4i9YKQL^I!9dq0wG`^yz%<}dXNA~Ly|MK*v{kf`u9_nI0nQ})QatNQv!XNNSOUrhhv|3{lWBA~U>xYn`)SpvZ z-`jJE`{){t4imoRd=0RGN{NbzFO-W|y{8AK?RvhVr^?0&PPpijY~}8eY;{_Zbo&ux z!h{x;Gbn^#)G;=a*9<;Fyb<9ah5W`ni;GL`Wmb~kUsGZV$E=>ndjcQ~o2t}E85+#P zx~Lj?6ZAqI&gW+r&AD7r2u49up>gVW@x+a?1k}J(D zpX4s3m>r@XyzqmFo34Y>Ue9wJ;EDC@_^)63BlY<`6!3~Va~%HWD!tD!je&a=Z{0km zQYZ#)p2HI3S>|^H#QEUztI6q~a`|NvbXz!q>&RZ_CWfSkGUM0~@q}{Ww0{jk@G6|} zHa7m7XE3$H%C$7PSJGe_wc4UHg#@*E9`5B*f6b!4Hl~tGcJ>%7G^q&GQ7G3dzp3Yv z9_@)oOq>{-2mD_wnZ4%sbOl~9v^9}SNV7|Whx(g^0e?=Btt}FoMQ-=T8H#27H%@^# z6|SRJ0aPq#PgVb1EDwS(B~^V@RL;m-xw3q@jgl6FtdDp?;uXzFr(7{`CPj{aXB|Q< zp!Zlz>B<^KZ;WSYqCj8BYmL4&P4AQTo-gEH%lQ#i=Lb{tyXl1o6)Ot+>a`ZIOIj{9`^$oxEO4NiZ{gu+HNcf;s;g^|FW{133gfjht zcuQ*4RHQiPu6!tTGV1h(rz6CMuT_VsfC|Xk)|wWL=;}3-;hP?0t~S&ex!6z^`N!|W zQbV@Y@9ZxR#;2~hTT8p3;d<`j?D=NjdyY547d^yPFoD46p?C32YFkP?uG|0cc5A)x7#;cfPd;S zG1UMa^g#A4Pj%NAy7kyvZD5(?)biK01>|BXC*<*$N*{0NxfTI^ny<%6Et?+cEMNYr zqxA*!uC{FaD1n$IF6D*P`~L9O3hgl7cw@Q*cYNOWiIJgTTUKOiecjG7VQSZy>uWuM%BmjorhJ_blOy1sqh9S;Mcv$||=d2CaPo|5yioI24 zWIAULw=WY%>e-bZ>ff4D;z8Yhp@e6Fng;HMn**e`Lx{FV;<|99bR;r7*^Xs3SP3kKz8kat8YR+B+ulr#|9U zXUcQCm1lbjxNFsxozQ7_+4kz#*9XnW^DKmQKdOhPg|I)MWu5D$`r^&12_|cNk7b&_ z&8Qa5rpD`3VvO{C`a0oI3AvHC{sPAIM1CDa0*7ZREhj`>zNlTk(colMt#gb?r4Gw5 zLxxk=*Cwb?su%O#{Xo?m-ZA5t3>$*=Fv2#bl640o@J__@T<;{r7t~21jX2nL7}8Sf z1lu9+=^FG_#c-^ONf*Koy0Up7K$3;HT%F5Sml z0Y!jjuc@;%uiR`BFJX|AQ5$b8-__6_>-5S_9Ym0rQ||6GN@1Uvv&#^ZW`wpX)_u~j zzs|kK9eS81TV8Y&%|iX-wemGYSaLlsS9_h(Phr0E`HAsQZn-9lcNo&zI+Csqityz= zYq<|wvQD`$(2(|Q&c(k*Fmtc)k>6T{uMr(}E_siNT-DS?Hir*nOKASfpo|(jZwdc@ z*=+$b78FD= znFn+1JY(bAQcC}VUhp1aK)3BJZ$Vmqvpet|uH45^YxXX6-$Uw3T9nn!;8NmJx5Q6C z%qcSw0q^=(S$iE^sARGSp3Pci64Q@Y6K$WKQ~LqjjL{2*ZLiwkQ{n6>+y}nxupK6o z_k>SOHxMU?_xCl%2?zKCRNM7`lT6?)jQv2f7%Px*A$EK(L*kuZ^_}lb^HW!XYm8zM zx;g!Ixn{m^(~E~Bfd2Gs?jajLm1i(=SnRoUUGb_qOXZqm34P7wgWeA}KWzBZZ!;n^ zB$W$r8XFpV5CpWKsNc$f&mzx3dZ_#EgWEuNLG=Zw&&uhaVXd2HD%V?0CWER_-8-n9Km(-~DIktFl1^oyS{y7t%?4T946= zE@8?(6@ppt(f8Ci&PT$f_yhq(YI@zwZqNV|oI`2J1JqOD9HgA*MFtO9@u$tC_dUw4 zSNex5h9BGMr?cWT7fW1~zRw=*e^)hEl1QzZ6vpcHArH9~98B-`kO^s!4@>NRM=(jL zgw)wYDA)4b%!6{AGQX9VqUgCB9(y?C+PzfN1#sT1jgvW<2L_chS170oqR8Oind<;U z^vtyH%;j4|{L7qdRkv4Lezz#XO@G9Zj#?K^XDJKvaBS~bCHgzP=C#&OCT@r?&D$TD zjqx_->?{lIEK7n49Ib{>L%QltZK-aFgxn zc}Lg?3bbGw8CEb;f3j)0)ivpg#VG)Lx81h0qui|A=$eL2Pjw9+8O4dG)V^ExPnz3q z+#GuE+a$^ysnM7+`+4c)Q;|f-{wet7NqnIR2E0>#^(b5F!e%&q_I=g}o1^iP?)ayg zomA8E4AOZJhfXFb8y*wQ$S>%?L-Y-g2H&8N1Z0jwP1(Vg4T)1!yF$RiIs#CPKEGwB zntVnJ0uCZ-&$5NsZ2?_;dlRf$%Bk4HM;A5>@`1ezq3#DxSe~gJ-e1RpQCnbw@aKY& zEH8nWftci61#vZ}n<3JwgHj{pp5yyP-5I>exsRh335D+BO`HWbXTld5vlVXAarX4; zE2I9G%yaYnDsv;B*6qwjDF8mTF#Cuvl*jodYv5%`M%*%FiyidOraD2>kK3PEP2SmX zHR;aLxAm{3N~B2VcuF+CU0YR2rfZN={nXbar;2lkO1Q%Pv=9a5itRQVUl%Wi6+QGH*w~MJ6b}`Nt${G&UAKx-=3RECrwP!&$Rq+OO z)h-T%u}S2G6Or2}f97CdLg~D{Nz;Cb-fh7zz}xV{DX!Nkm#~HE)Xb-{K#G4f+52;~ z@4>3o?`Het)VCo{zGAFk&zn)6M2t_m$Q5p|73?jZnl9!g4;@y+FD)h6-tC~;LPe9I zfLr{vvEZzj%xA(Gqz>SXHPn2%h0qG|<(u3Td2JRyO}aqm{V`n3tB*C^S0 zIMn6_Z)(~hTTod}Q>(eGmJKtnRjoV%;v1E)p0VQ{3%A>+gJ9Rj&zS-VGm-)slyRQ7 z1FDoe7JHoSHEmX_xQy<65OJ|6(N>}-=;udqV~N%w;pQJgaxv(&J-YASo|N8}N#H~e zO+U>;EZ5?LTzvsv3+$5^v8nf!=uJ0l%ksKsj|H=`EX@pQd#Qb2i0xj+VlA{=slRVi z{XA#IN`|_tNFQ@}2RMyhA0Y0Aot(HeDtut7@gHR8zDj+rM$iz0IW?iGsGlVqp;W4_ z(!6z4U=q&TGH0a3lP|r9K0Io+=pD5NsqYM*Z3`!zmiPcC^7NO{l+2Pab9?>ap~$aa zE*dC(<-jOl|LWz&F2x>1PlcQa!|=bMi6Tb-D)FQSVB=A;TEobeL=Co&_W%C)JhqXB zKX$aQ)4AwA=PHs21qcIgSRv-h3zhfR_C{L-G`6I7I|7HN_V! z;RaOD$6XZ)^P^gKwAXy6}LW(eMdtME6O!Nsh-tgMO)>ScLO=s&8|q z`zN>js;1Rn=51}YYJrJVea+!Oj5ASR*NV5HO{7fbG{q-lK;smu%{U-;O zFRYG}s47#1liaQUjZTdLaUX)2Ck@N~zZ~9M=}RhtXDHQ+WuAX%8DutVeSC#zk1bf| z)i)I$rv;5w-35g!kqAo6nbh^f7KLfTdrBr$LF!sYFy+|VNmQ>gxU>ceowK}<1{_?j zmWFjIQ^egrv!Ty@PE+yb9yW%clS-X$*{})cQLT2D1rf@u-)855?F|Dg!@2GXoV^L` z0}Mb1WLcBp7X2l zK0?_c=(aV`eo8Q2kr{8;IL};6Usol~Kn)FhjQ-WloCY$getmv=xno!t@w(CUnyG-p zc1~Y*c#8kzs#OL|ozV*|N3{``MFt+5%SXN|h);g{x%y{g?nPVY*5$OaOpbmulj6z9 zNpf7Iq!vmk`hhZU=#PvEMDbS4QIiZ!`p~xum_o)8zqibhS0MxCeuh8ypdHjdva&i9 zz>x=vSlmUDgcB%ld)}V$^GBu_Aq-8zz)xnl^-PN(#6y%z^QT~eZai?!P zKg;3DMuPJJ<=GzSC8cS0&iJ%cF+o{xqQWI-Fs`5sUMjA#a>0Yc#LPMANPVB?7U^k$ zJ_i;RTNoOz+CCQ^h_1)|#0>W_?uMV%yXjzPh(E-5_{e@2%QGc|;%&$me?sP~Tg z5z2M}<<3V{oz64@x-QH|s0~{cFc2qHrG+0hR`3g;!P{wxlPJOL{$8G+@?_dSQUzBc zU&{8);@X|wYh?1txH>sVa=%m#cz^lu;ZjTDTWxiJzr3b92e4WPTTHxRw?y6^fEUmj z-TSoB&+ClAku;Mx>o-v9q0jTt>V}NLFHdRPxS&^BEaNmgZf}sZQ_ag+_w4?#YlY1d zXdM9D^wQ6g+H}ub*0jjlCi6`1)YbB1Ehm~Q+Zy%n~Kx68+)(T%IS=J(5|?&l-Uj)%>4^}|SVz7946iE0b-_vzc+ zv~j*QpND+CjMsCzDePCkcDR0q=t|e@y?0xxI&en!cuLF4gwC(t( zsY2r|;jp6A=LFD#zItElcv#a?XcF)WEptaT`#N_Lpwjdje3kwk1+UP6bbJ z$NRKx!13_NL8%b^2oSROzAw@Uy$-oe;WLD1pK9#FO#kvSoTj&C)ciVn+p?Y*^>FuE z;+jt~DD|5p<5N~)wk8}UHyUm;umEjaGoxEyaYIrB-o1?2U|SA&>3!#a-+tGw#L>*P zd!-+=!#oWjOnZX^XROa~3s|aNz`(78Y>;8b*a-rJkKeLlYD^YL-^d_HOz zKi7S|+p8Ck6i;mk*&s_Tr(!<>Yiv3LeD3$A(_EziaxVP~%!n>0l^;34eRlvzSI1a! z;*Y%WWd~Zg6a8gs0Wj;XhhVU@TyfvK%1pKMXY(yUPxoFA9@1lJ+`*RpoM74ta&~Y` zGEyp^bH_PN+D4bz90|>5674WuvN9rW_f+jHQT6R9xrc0bZyv8J zjiL%buPI&!*2yw|^BDSQ+3J3Lf4U9#d8?$*gqNl?N!664q3tE)J zblGhgR|Q&xn@2Zmhf1WA&Snt52=j!}9rJ55HE(&biYi>wLUg4vY`9YRq}(1BZZgYU z1rR^xdtxbCA{MBZ{2rW5r=G-xe@cGYrF|Kuz@kO056V54G!265@2>`W=B=F84!8Me zXM|_~@5}oS;WY5Z_qds0WgWDh`0mWp0v|9LBJomNXUT4mPA`i|eu5HrGy!u@!nx^Q zpwA8g(kDoN#q^^0qxZYu_`I39!oR?QBa2Io!{gDj{aD5QN&;b=w8_~NP zcD0+gX;MCeUkPF{%2ULyy3Yc8UCX8)_qcgsUJ$?l$+L4)gZ5+2a*d%2jf@%1`KOq5 z>!?Zk_3G2FKNlp%gQlQZ6K*rj(_I~)-xgw`qLzy=Y?ivOSfI=ky?KXLp)M9`Lbxfp zHN}1ey2}g$&Zy#EVqQ>G-ejplUZ#BCNZaEGjgi;G6!F8(!F`3jOuuvE_qy7W5s$gB zBAmqoi^SEApdi_xi&O(yxm5#2??ZF5Zs6MgIz8rXmPcN=9Z z6NkMMAqnaJQCR|)79nX&b?cQT>~9TmNOwL1z=m)?w_mVQ`@0s8_p^5P^Vm-yEx42W zC|5-%X1K)aBHZ+1lqLs4W@=4SSum?>SJ3o;*~aR_n>auV5ya5`wb9sA?n?nsJ_ zWz-9CRAbN#AiJ|%S?tUXlr(MVei!>aDa2m=mAVmm1=5^lf@;p1Ex5 zxEN*0d7_Pm#I0NK%vA#p9jac1g3gdNXEI7*zV6{%pFZx{nzwsijWz&|y}4_#=ZMoA z_abgs(vE?$qn#Lw{tpen>xpi~r1vxoRKpzP-_HCNgThibCWNSO{lAt^XssKzD{#rvI;WDHRc3*w^&v0dcT@TDqyiPEdv+|`sPbpIe+JWPa4_yAdlb5G*QW|Y_J@`30es^41wZ6YxT@QP?%mb%SN_SG#d{rJN@yU7VlU`}m;m&+M zN;5u2^U+?+flA(a+i=zh-uEW=G=&@+B z{kcwHk}EnDrpU1nQ8h#&_(W9Ig4j?;RX1*R|4q_*=F^!^IWzNm=) zp^yop@EYd+hsa}7g&n70(kU~qLt1PR0N{ZBY4&G51WsJKj?*-GNiku~qeIw*JGHJu z4AH~WR4M*l60VKri`l!VWauM7|7k*`R3NaCFB(t3?Hs>xB@Z&hQH!;ZwXah7uic!U9U zXYzDOB`_^nx;#zQNxi!priQvjy6786@kbE1oR*z@Gg77QAszy4S-LJ~GQxDibjcX^ zRexKx<3%_Pba~V)+q6|>C~i^U*T3Z?%~*#Wh@|l3V7$^~>B`gnIVp3R4AuSrA}7ZZ zwk(^e;9uV~L@DCzkZISrcgI@=S1qLmVjGT!Lo|Z3ck_pHjnwxjiqjceq zk0Ylg_~<|-$G5{d?On&A=M!+hKGQ*k(^>vVvM}UY%LqA_aLLhoQVp0Zo+y=_r7=t7 zwnP}saRsMQ$|%s_@na5`)k&Kbe>r!8?c&dhhDLSiCR=id~_jW=w~1)596@XL2Q<0 zhqA@p(0=VO3IHlY4YWfh?2a~^bSBAeg3E-C+aK}MW~g#*jfc(vaqEE=(=R# z0ENpDZa%HPw>6NYuhQw?-%~HVrnS?aDcBXV0!;JkfLE$WH=!=eqIP+lh9~I@z?x2D zI6C!mBjUc53_(9qxCSR|={VU3X(b(HQ_V6SD0}bzlO4XO1o$*EO17;Nt^QAy#u;7R zNu$4fZ)l8&{{%t6W^($m%)B$(_GzPycEd6H=lN42!$OBu9=~!e6Q{_1vV(u9A9Ey5 zmULR_S#h)3arlR?jXXf6mO8!YfXu*Yw7QRS=5xQ@n}X~Re^O4WO zrPHs17-hwi?Drl8W5CI)n#yd5NdZf2$Gu=-@xLpW&MtdSES_G1)OwXwLn;F73kL$`n14@O>L)Hm(OTrEMEI15I%-g?i+0q<-9T-{qLPn9>_kJA_d z6mM4y8gK+PpgSa=d(IK0!M+z;yzJ-U_v<8yhyHg=BPPC)eTMhtb@Pii(EI(n&!yob zD)czdLH}ori}x?q}Qlm)IiA0IhmevD+%F=g}77@IcDr*=5oGEwxfmqqQ@3?NWc z>%2zc-9Xg>?sPvVG@&f^B_GP~smk1`)lqGUV@;!gw4ZA`CCTUPw^KyfRQOs)}!cwKD)Az$qaT19-By?_Y0f!bs8tV_EN*bgcFOI9X@L5)n zlvEDVd*8(uJMwSvOWmP*kCxZ^Is@AGFWX}=#S!Dnwy6|0sxH*kQMl3ZrT%`3&OpIt z-KpXM{J0ZSX{5}pm^kkKm2ig$OXA+EV|a!o;y-Mg!7E?G3QjfYU9gL>0(vI05G*+2 ztofH)`33$wfw{^1+GS*r)7ocL*XTFOhUl1%bIwald|(hUbDDU3F%HwI+3PMi`TD~p zRmIs?`+23ex+nckOP{+Clo=O;+V4)(54iuEqGcm&bt-JR7yD8OYM{eP3}hhUvE$}o zqt&*1bc>yzy>8sLG1OeC>M4una_Nt7^>{~apkY6VY_k4@Z)ahRgHJf=ntnqhY+%qd zEb+5k04*R_Nr8jt(S3<=GmHOUC_jcYQ0T-I}kAioZdyT#owQq=smAT^k}4l-1CTKcMTG#{KSrJ^5_ zQFyK&GKWRA@cpFnr;AzlH%^>#U;{s2tTGO-esLHf+sH@935v94T9ALRbX8apf{P-B zUNTr0idd*Zs3HJYwZ&%0bPEC3FHXZ?|H_{IcT-|curB%XM$UY!phyK3Djfw@Je(vX zY0ZRA?!1DYm^a?7v*c2uk$-W@LTWCYG=)#b5k}N@3zQaYHuM2Gu+$I+4|`XuoZC5%jK@l!)C8%JZ^J7P=PpT zJF`}MeeCnCN}czUdRtjw%u*ufKYZlTqIGD`q$Mh%+@V=vqH$S-+9Cg?N5 z8+bw}yBpM0I=frpv2=^;1y3wO=1|~%v2>BIhE}pX7F8?lr(d6XH%hyUe~6Crz;}lH z1}6d6$l@gZzOi1$GZGrO!5036IfKb-fT=qz1?#6sZtIE^zf$T=jyHJ?s z?44#FX!_;dW`^U8z_?`R^-&MGJPq;y_oYUIFCbQNdO{i&e(@=L`t@E8aM;ri!k-fc zGyRJCUMh6CF=3Wy(j9phriveRUT-nbnuu#PnDuV~0l2@g@j#k$7L;t@D$(XOXVa5#oseLm@MI2cGq;zHnG3@8!Pr_Ivn?z{QFVbcA8E6 z;rXge6S+}#z8}~yb6U)>n{bq2w*wyO8JhjL`7{2UlKtRU%<2<3afLpBd~osNs`f*r zUg={!%p8LJufn3ZJ1-jGXUmwuXe32dW;iSV%irK}chS{c5fghySZ(EMfqA`d9*MQL z4&$?w{dmq{@HVKC$@);#<@Wc-PYCzyPte(7V(lSW-NqG;zwEXt}3ZH8o$XF@$;3vLD2Yz zi?9;^NgL#QecP(}0u><_wQ%46eU1^G`OGfiIIGSxbOVXpr(P6_-5v`aoSb%a z57ZrY56)@-Bep$*x3vl^3kXs#fjGeUBFJxU>n)QL+Z;y;g3WKYgSO0y8Tjsj4*dy- zd>dc?0L&k(E>4JWZ@YW)laV@-7dtO578php+{7PzeR}w*#la`?XKKik6b*|nD>~h4G_Gqd;_+UgF&@pu*9$+}65!o7+z8k*n;p4P+<>Kw&%PO*V`fGW zT#oA!f5+1OicwwWP{+o0(5}^m#$=rX3lY4sd$}$I-M+UX=|a<;DAwij9tWM)B2A9* z=|Xc5=Sxb?%1DI7Q|939oV+|EjUxPqv7sK61ee55L;>h`+U2#5k81+3r&fM2qq4t^ zMQVt%VL7(@#0LPZ9XN+Qub4oSkpE#`^>vfTo|%ieWq;~~qNXPEo1#gGQ9l+mXVOGd z4}7t&7v-aJS^;aKK4oycBt+ujF-Xb`jqLE8!0-+Ucgpj zm2PzBRU!9+(`^N+=)2(d>8^Nv$$tEefFB&jpY9lsdg1G?0w_@wly-~G&y%D8f9$x@auxC3)lpp>4|Om>xS4$nb+ZB2OE zfZO}y?!GQUcfs*-;R(4Zuw(ot#ipLLxABkpp$^m>PXC}su&8V98qijQYeY)n2NK9_ zkm$FCbL0n^Z*lmSb@`MvkrI+ps{#1BfS|La>pMRAdSf=XvtFbXxW)vwh4}{E_(67~=?YV4jddyPxmUbvJ50aC zQ;++8pTM=t=Rua|GUE#LE})&F$pvk37xMDbgEp=f-t9Qah(Hh0-U|b+W5nrT7V%3v zWwQvYjVn5rQEr}Ae=5^>L&Ks$wplJK3KYML zyj?gH{k)Z}JD(&wktSS{{v60Fh(?+X!KU+n0^qK z02$L6Y+~Wl_hF_=-j((7#CuVtJF<)Y;P5;NcJW=?RWVL! z0jHyp{Aw5vFwSsFF0m4P@}lh)Cg|pb7<3kXO*||4A+2tMmH)3k#G`m)r{cV~znC~` ze%NIN2H*0pnZwr0^$OOdf(5c5w^BKG^uLe*7E4m<`6F?A&>6GuOIAhm|^-R?Nn~Y5^GW!biY+u)a_CT6s;Np%{-fv z?jyOwkD+(VM<>G1E-gAa-s{LDOBj%tlkK};$fx0pQo_$4h`keiP9$KjY<%l_)(6eJ z)qpmM7hJiNN$TkE1pK`Xe34JI5Rf|C(>i_RR4vwz!~;j#3!5MqpTVDJE*z>%Nq^C4@xRZ@-V}Py`^WS;Jl6Pm9d3S9=nt-q<5Xb zJ$%kI3igC{nM^Dy|Bj3>SApOwgL_g)pJBUYfDOiaQ9TROGs~ISGXe-iCA#(w@vQ9D zp44=Ow2QL_Ft1__^ufnALbkQDHdQ01-s7aXOt$@cu9J(v5Kid95dMY$t`Jm&BEzrT z3+^>8qwM)P^v|d%{_AeB%uo%IvKG48_YZ@)W@KfE2Q_dNM1D?b`O`((BF+)d2_@rA z2sshCpu(IFz-IH40B;b!%t3{kW1cZe*~N)N#f$eJvoF3B@3T<;=*THAd>oURY@<{rCDIdQ&=41L@>hN%H1ei{60F3%AtJ1 zRC2#)4XN;qmk4z9Ha1Wqwymi2W^7FU$op9%Q919@kn&fzjP*;U8rB~69p&tJmo91N zE$&Gjc|hAzS(K-QZmcfoo|1Q8ZgI3rXS1B5B1UbXh!(f+%+=NXg z$)(!4ZRd(+7)VnBX6m@C}NJ z2Ji=@-CA8%fn#^EBl`shg(`6F`eX?R1_TDf!$g+YaRRtTfD2|X?yMQM&4EcQD$bdi zSo%UGKHe0Lq04lw8Lbw<3PpP<@1g>mV$q8TK>b;mgy&?{a7|T>g|kn9eoEvlKwr3h znG_Q_5}`8`vlUu&M_mMkcuq*zuxANd%=RZT3bAQPHxc@G^hLmF+)WwLFHyaRL7**H zJ&&A+q01nK2Xl(%ekB|Fv@BF4RAh&=H%ug*MvRb-2pjK;$nb&)9r-7kM7TO4vN`e; zK(sYYGFWOs;FhCOlMD5i{U5@Frch#C%qYlw-Xn)^}iV95zow4`$sFDn>%P+W7} z<7VF3PjK=&0%G=Js`T2AeVW>+yL6<0HEo=a^g+?IB+aVKhv6Sj0hs?0gutp*n~Tf| z#VH>Rzw%7zq7pb7Z`jK4ss@3|K`^1~Gny82QcD<(rm7*5R^x!ykAX@8V#BZB!H~5= zt2}$qc}c0L!)e5|*nig(>P*t-5z1^DQTTz=ej+sclguM>Kn_lL7yoZ#UkuPJW<4NI z*zru!j8jIr#J|MfCkwqdLc-hPvB!qJ%tZ1Hz5n?0ZSn9ade8NE=G|*co_k9lY|c=g zP)QRO{uaNt-^v$z*f%4T@?vMR*PwZrn34(-fBdY#OyI+G$ zmwSt-6O8Gq5P|1xt;iAYN7UIhs`vZV;wRUZ(iq;grz3np{yF!bSlVuFXrgy;M_@m? zysKi89#Q%u~in0K?;$?i_R zCzPo&0go54b}x-adIoFIovW9*h#dFoZ-W5RqDJ(jt-cYD=sSd{s=?0phD9W6c3Gw< zrDVRwC@$^&D6WcAND2YB8Yk4p9pUK>MBM$@C`T4kb}85N-Ff zIK@^S$B~VmZ}OsNojT?7#dG+0FO;%4^2g#61V^St{LKv-@360ED4gOApN+hF!G!zf zeIi6tQb@Wt9t<$8|Hc54Jzy9-G2x1i3+aJfygFe51|UNK%-?${8u?_}B~TxP-nAWz z@?^reNbT5{-O#9RO}EtvL7iV2np}D{!QGwxnu=z*JucLU&FbQNgZN&?S0w)y!`WA&mE_i z;l7v6zAit7xU{Yx((c~(`7EIYO876cmd^U$(JymE%&>c(!cVYgpY*3_U_jV(qijq0h>sv<}6aeTHdlz!6#lDhF5$J z)d073j`rIeZ zRhv@0-CYyrbDU^cpD3B8tZlq1-pNa&6mTc*^%DPyOYrWHC~|ZzCvFD$?CtFB$yIc` zannOEyzx(HAie%$iP=jl-s+Hu`HdBPMtnvfv*rv7Yuxf7=F+G;B;uo?(MQAY+y5{a zbLrtQd}*bMAb$ycSJYQy#6gmpFbR?DOXII!0nO7ccDd zRH(!tdk7Qz19RK;QVOQJ0rljyX?(fs{odLf%BcD$Q^16cK0SH)be zTFPX$&!;a0Z5g`;`RwJFJE?z8>a9&FfbL`3`mlgP5-kIojir_M7n^G`2)YmMlxwF| zEq0_vd1;y5%`9OYpBpmQ3ij8zqJ9b17rXv1Ngw4*mnv6efL`H>+9b#w1=-Gu*<*V5 ztJW-Bqx9ku1lotU3N`1V-1&bZ9cItpCV&OnZigtF3TfZN`mEaPZLbRB$Q$q-cwSzA zy8@+gzxVIZxfW7>8h9hffy#kGxJ2TCW||X5%=|2NqtC)Ej5w7W@-*@M^SrjIo9yx4 zN|fe3V2daONZe3=L!Bl}^L<$i?qt52v0n_E8i`G{ z3%Lrkl*Yk19nF!CKRx;A2)TBW5$=+!>PH_VR~`xgmHti^Sw_C{-;;_{-b{ReV)jP}an9xNNV4H2g~ zQV-Gg5i++C##8dU;Y%aU$Mzs#dy9E}*O;Nqw7xANkU2gU18)p5EEZ1#nZLo1JS8JQ zA2EF-6Io~>V)DiXM)5gQ#j@S}M)AmzU{%>zZe}}ioU@9cYJIYBDfG3J1+2#>6AWDL z+ZU`V5R&hLlHna%6^N=zPfqc~)Uoiptx(6$ufb58FV48KqE0O43$wy(ek5S43@ffG zb~sY5_x31e0Hf4wbjI(aw>qvE-6!n~zZ9EAFIcA2dNikql(R*vg7MBjRZ|(UA2VDy z0WUlVCn)YUevEwt*wdNU&s5rMz=<_|I(bA`#ja(0Et^{Is!#&Ex@>jPn{Z|pbk);8xGnDP9#|X_AZYO565QS0g9Z!#l5@}f?*F{c4#P})^>kNvRaZ6h zuZ9!arwp9Th|Cw|0QyKH5LDRg{bz=KlFVVdxbdrV1`*a+t->6%mlI{&?u>VJ&dnRY zde(=>I2@YBs7Hpl5321LOZKGWHBp_YjW&d7C-j~x3-^WC31R!TU6t9sXe1K$A7l+xu%vd ztvGr=D`6PNLc}YTAmUcgN`QFYtOPRfR)%e+mXu6IAocc!x|TF222zMtXz(NSpTE0% zZ<@_Qj5zT?GoiE=iBp$yqXYZS{>E=5>z!iXW=62d%x2Ko9-V<_qan9k!O4yEiZvXW%aJZD3$M*)MPaC-vgm*tn5%by+2u8K%*G9I z34kP@T4XsoJ&7pbgsK(1**85Icllt?#Pu3NDSHSMkxyiL&9X^U6#sMDZ_0s2+bzN8 z^X(bA$9%>p#CmQZ`-wAtx3VNlg2Vj_G@peQj|A76WBUNdM5$*NDB~lU7sGAp-H&fN zgW~YLZkaC+5%Xmbk5gQuD+sJcmZu^rA4a4JK19L?DYN+PfMv?cH6dJa;;oUosB<@^ zk(%#;gCBiT#uc*Rep^%A`WCnJw(0Hn%5$QmH2Ca%Wh7`_3COjm;8&!@qIycDQepmstY3L;uGo{sOjHo#* z#r{v|R^_07(|-G#=WP8}0ylX{`P-%oX5C6;dbRXpKr|);?q2|L8Nk(wNsa!CV>h>9 zM4(fFxSS*yxD+MROt>^@zMJ-{YDRJ$o+Fk#A^!;(ood_lRZ6b$-DiA4)vQsijV0+g z!+Dh=9f8q5ego=n%o3!WNOrgj7h(phubxdvYYCvS$gdc{C4WmKoLv$fg!JG1Hw@pc zet_L7)~Y1&O#*2|t1-xx(5Hbk4!DCuqSa3NTlU_$`RLyUB{bks;2J)Wu}anR3w+n7 zib`aJV|2_Dmz9)FD=ePR=ms-SR9UyZexr|+C9Q#!niWbvBGaS)gSYa6TcL!04s7l@ zopD(P^i~MqUpl?fs*#$tSp?6by2egF^xF_0B;E7ZDK%d;<=-p%@)G}0;x9?m{u0Ht zlZ-*r)d51Sl2?TSOd`s)p+vQ#G&xPi4mAf=@LhE3V}>e+zPY$h({AU}MAsPJj!UBO zOO5?n`vZ^B@X5)ZdzN{hGw?|Js;F$~fc4J~rCwaG315z+rz-K-=k$~73yl)Bw*)mS zghTUlFAqXRzN%Hoxj&3j{Wnu^#yq^+uGyt!+0ECn(F2FOVsJ34Xo>juE|ILQTEA!*xb$z3`#h_( z;*e=~a@e#rkfwg?67ncuunHc82J`zgvcDf;-!B8UXOKn3ZEs)=B+xG+G%Uhi;QAwUVMi(Z z0ah*9BKj%(9rV+;*yf&qXG;+w4uPrAylq2}R7<9OrNqPUGt?zQhv`jzH3gfY%Jazd=yc8R7_1 zJ*xmOQ64b&g(yVEQ^-QezN7d27qBAnLmr31QxBNp_hSD6I3$CIM;@3p5cOALee#R$ z5#c*puUz*Q3cGpyHjgKwH}U1m$ELEvE85pYVb+$GFRb^LZ%#P6S!U{}OU`fhf*@_C~ zo9so7va$*@>PHx zoCf^2LvYNrEIpd!(f~wU#V$X|fdh0W$c+C;7++kK4-J43slyW5r8@C=cN6(YwM+Hk z(Q+g)!KdydL0|X~;GxLnmrAw-Pw;H5;Lmf!{TuTcAppD$sOS?K>_?5vdWd<0;IkX$ zA|)&?OxZ%4PvYW*>I3+d6t{&7>|dIssIi~Fz-)^l>WJNB>g6bSlWHQ z?RUr&2L;GT3?_Y1gn$1{>ss?2Nypv2K<6(&7tI?3Z{ zFFi*?wS)6Tw?PMiGSgJcv%yH!NL78;_C9)HkW?%sG@U6<3=au=w2@;?3_*#NO)O=} z(dP{cxq39-Q2I9%tDfH1hSDFrUC^eM>qF^pGLnf46D27C6o79+ElMRBa{(Dl(SRmE zk|(Z&-=Sf__I5NvoP~0wPT(@~Hs7exA5s?LG5h7GnIxB9F0NfkBJsiqvyKz*)rv)#0dfF+WFa~ycQ1iQ}cE>Az$h2#O(38 zWXx%5tDh3t`t0j&-#qYyQfXt7Lb#GXhj4kjxE2jLE?4v#a^hQjYv%4nJ%3v2GPQ%y)bE(3!q;RQD!B~Mn!~5rJ8eE9VM{dcv z64nADiM#vMP7**j+KQn<&O*-aEc@+ZXWHaX&a@NiRYMAQQ1BMZDy3q4Kzu=(rSW1_ zb-k|@d>L+bbspCucHF-`6p3}$HC|zfUR8E?jRn=^i=! z>WaS*JIM9zOXs*IP^ep;Gx^AcTv}tF)}ZH04N?#*C09>m7{W0>X8Y#y)yd-j1j|@vFKnTbsSNkP z;sEe_Bo5fD;J?8S?gkLlof(E<4~>fKOJ)o!ZN?sa9&boWO8-#>TQP~Vb9$WPWk{-Z zfiZ|0*AB=x`&J_}!UwlYAM2{pwK$XcsjEWJd?u@z=-nu5ScU3OdTrIJ6t7y!iUGop z)VTa3{V$f1LdZIpd7qhRB!M!LbPc$Pl!KHXWs)>@52eYyHwtl<;uF>7FpCk?0Dn-_ zc719PWRmI+DRA=0$oVjrI72C0+43rpQ_{F4Z*-T{(@k%Kc*+QwX(aK;VHkpO#G>1| z#wVt;vDD1VlwcT=<)h2#gRzqY>$|1ZRbl9Yv6n5D0}+Oqw-* zO^DX1m$eDP$9Q0FDUPTkEe1myeQvZCeAN`c?a$CXIKdxLvf!kagnE z$pswo^9q6!LNA7&hCagF<*7Jw$-Qy*LmvOs3KZXO{u%bXfDabN`_jf`Z2gtRn}v>G zXW07i)JxZpen$VwswL*HnBW~bc}5<5<7~aA^qa@Bel4E!oYN!2NKHA!P-v3WI$`D< zdzlKG*E(ULq0EZptWYbVaFs2~pccAoWdiR)otc4E32N}M?|E=l|A7de)elJbV zE%~je54n&Pt9e1SwB_UjN{7#vFDHds=oUh*vf#^G1;0cX{{7oO`u|tdHY>^JwC*R) zt;(#KI!(R$!3T1ow?^xIm;0P9vq&zK%u6DkFm~uQ;eFN8rMGI8A~l#_nkH1jU+k2y z01sUBv@=moo5&A>sUWuWWCPEZ5;PLa{iLh)*NaX8n8maP{^T-e@}DVWIKFVg47;Gq zr$~q(s7=@g1767@lzMs-On)cQ5xV|P@7= zKhf0*A%AVWi9g^{!Xp-?knb9SCkggnQ#be1Xhv`-xcGl|2QJA;w=f5JMVoC0RCEn zgtn9?=CDhF`AW37im$)YK{|IkW9NiY=}3pDOvdKVfoG<;K$x4{Z|?1N!D)v0N9`V* z2R_VF?Z&fltWp&;R(?5(9Pv!?OjG~#yh_$)L{?2BELEx;@EqNPQx!{Ng2enJQ@Yr( zCsXRo6Gq?PDVj*%-$v;T!Vz&65R^M=apmdXhF(bZ13p-Y$(CwE;FusutIL%B4iJqq z2Nx_!At?ykBwDd8o~@s?Yj8OAVabJ3j^Zy0cYi99$)|#6RS-^&2MMmx_-_AD3BoTo z0K@;Gfr?hHa5sj&Kj&CTje!g7({y;@md|VG73#j2i=VwKOXyrGiRHKncw}3r4|}Wm zYo7vVH?KNPMacgD(*TF zZbJiB3|hMV{bJCI%Nkc5^$ZezO4jW*1A3)(CR(=MhA88=?=FG78S%s=?^b0F`lzt- z;B<_u;`kR|SJkSY$rQzfpXMON!tI*}5-EmMlpXb~GL$b0QFMZn z)kiSQ5jbvkqP~1{DpD0 zq^f^z+qS~(a(V8K$-U7{+T~D`Egw%gri>=xyuOI0R8n|gMz`3El8lN>{o8&)8BH;b zvb@YmT+x~A*vvGCv9gM}`+M24`qR*c`ORI8Y`k9t;K+M|0{Q8Q^FSW)(4vx?%*6D> z^xknmLzAWie~I9xwMzq^E-`cb$8tz8#|=fh@nZkaW)5q}78Sg04y|ofefh+EJP)%d z5uL3KtEqHV<72A54fpK9>^(Y-DCqS|$S((Gp~~zTN006Gm%-}m7#40mbX0?5P&H~R z^?;H@hTvs$!wK*{jOF%AnS8EIb1E|hOWqLI$0VXDt{|l2Gd=h3#O1F(ytD%gk_ItGrWH7 zPrVI}R|57|R+$bMWRj7`QkBpZ*9~S`>Xl3a*I1?(=*^4*Vp>9aXO370qZ7=O6mfka zsITm37BGZ0xV0%~#dsO;#sJ1Y|J8PnPZ_}52OrtlZW%A9SJqePbtp@6l%H>1vJ%8- z)uT#d0{&21xomPpo+P!uJn(L}Fu)oMiTE$C9L!02i(t{^Lu0)rIw39mu~A8n$e^VEiEI^C)q!j zALKtMMfuFDQMSI<8HvP*8c$Sv@5lq7v{U4W9Wu!nVWvw4PDxPJAu^V6y{(QT8<1m% zB;(MfcEL<90FMHeg3=}&;PxljgAhwq*^vZODDnHeA`b-!yp9e9P;U|w$#R0D$pnk{ zNj8HBF*N})fZb7YK+D*7q%Ntfv#CSW5o}jW8SrCN!Q*Vr|6zdNRR<72ks&1k?HTfN z3Hdp3K-V!&yQ9t(vl!l4zX0TQ2n-t!lMb1vN>AQVP;?hLC8KicLt>nt(X-Fe#r+AV z@?9eRipPjiWNmd+hoe1eAy1k~a>iIKXA5XBN6X#WF-K*>O~MKJ&vY5+uYw70nJlH; zXzNl5C7{n3$)z}|#X<*FKL;)+Zv$;UM{fBGZA zhGovQC3#8dh1rf^Xx{aeHi4F(NsRTeio9X-e;$Y9dr!mw`4Zunec~TMZ?2|H)>&S8 zMq{^%CE-loj((d)gE@leYR_xwd&7fG>C`N*))yYSKHbsX- zn^J*l*vy)V!0=LWXL4UolT-lmzNiK?1#}W(2$Th$bP=O|n9)yVK3y1CaX5kLm}+m0 zyI&RP+%d{lFjFeh`TmYB1{B0H&aY{V)&Us z&8E0>(Krs1Fv4Py#0BXc-uEWTk}79xp@LYZXdb2I2jc(J^+75rN@6OYrhYLMN<J{Rc&7(!6CaNPm{p+ zA6qplBkl36lOl^{j+Ev!)g=Mru|;wil+++NxAaa4k827XN(9VMgs?Y6<`No25}%6$ zP?LmYyjd}X;ELFQ9kNm}nI3?+lgghdGSZYa@>R$&Cd%wnok@}Y#S`r(@)}JgdG@{j zISI@M_{z4^1qk`G-4C2z$r#wE%C75EYL>f*%Evn6DTlhdDjk?yh}q_f*f7>uu2{SQ zzx`S-V>&k&DfXd2lyrat784?SMK9;e-2!dP z7pX*7Y*aGSLC4XO>HexvXd$#mV%PXh$)Cnw26i*qLS^#hR z0xLjn-~*CmBu#!q*yBfdQ7!f%p7m;y!U$=g%RP^3GM9f}?t=%kq-cxpr)N)1X4p0G-trO{h7 zTHc}PXj{!;WB$lsmK~7Q2xH$i|A~wgJDl8%g7m2w0%h^i2G0;Q43M`>ExJ)&N zwIkMa*s_h8kv$VT67Bh`E7^tmxsgPu zXXDZ?RS^%<2|A%IpFddNu9>$3$Y;y&fv-n^H!h-fyeWmXoU`l>CPS=q*a+p5@H&qZ zE!sBIG*^V(Z=wTW2+!~LgayaYuEL?*yMC)bA2#{lNpX8AO^KoA&se$*%`bK~w@=Ks z8;s))XBUwiSZ*WmOJ?ssar?zdjHCXM8`AL?9g+p($Z#m?z@ET$oBwNBzn4B36?NQRM!1x71=;x_-gaFCbM zi4A+cI-@{nE?CeeKAubdiNqE8VAx@3o8*wF$7Ac@k>(Mj;VO|W6^z*_HXNsDUISot zg5R*8_9!yg`U%7H;NYP3{-OcCmpX$CX0}xN1*iDTo}jCFgQ|IJ&If-bu4Pnf(!103 zLMfqR&S27DQuv2Nb&pon$&frpeZ=Uz^!lm7nM|8*5|O7jSE`7&VW^{SCg=3*sWt_k z2t4tgNL8Xyo?H`=o^M!<@pJ|jkL{2USNxWNmu7@2)pE&23Gtpjo_u|zSsKg`Bi?}R zW#uG!s37xTB;`^@lrcb%dE)?8ZIG>6vqZ(!r%2tQ%}##1T~nGR>XL{S%Ykw1SR5VU zKv=zPk{7A-s}`g}724=G!LRu^O&jVD=B2WP#bTxgNIgD;zOS z?TI_^7J{(8ACqF$zo8Ysep^v56>&$ge*t_cA(ynaeGSG{`1OVg-(L(Yjf#QM@@Zs++iI{ul8LrYAFqXFNMLqs z+S~s;|K;c{kHAW?#aGuOWlAkGYqOa7(OeVt%z<%QFOI16K^2cOhsXF^;zlD5h!iB9 z8J*H4zg7Iof4(CoV|+)|qp~vPd-RkAK34qZAGb(KWr}z%G*lPxlf?-{whjuVWj(sq+luv!Q@W?C?mtdW`NK(OVx$krO zK>~zkabbR%sy%5@`bJTB#p3~>@(pNGm3#{x+%kMx@F4QsD!!r82B|u~Uf=`q_cy(Q z8ZoXeQg_Vy^|#|X4z`toF8wVZX%h=H!DrjT#KHb6>naH0Q>Na$8(7)j6!ErNBHilw zYZJ~brhk0RHC0oD4%Pj5_lkHAv<#XyCaqqbo4>l5F()d$rq_f0{%41|2QsCy8FOZ^ zOot0)dyZGnJ*B2o_KX(jL===|jq$SsIlss4fsA=Pb5&@JTLqO2`iobJ@mGimp9`U{ zezM4scv+n46eIr}b~70r&O5t@|Ixsa6vsZTr{51TkA96Q;{KU9rbHwNyRYKY7|ix= zAp)9<0Iwhh9WYXT!gZTV86PUHV4?k}ydA6k2&RSBD@8B`66l15uB_EwVHLDVJ#zu# zE#&Rak(uqzX-_KOQrzAO;*}LeY#Clw3||dhbsLzr+@-Zv=Vadba;x|*s#iQjDSbR^ zG31KY_g4rw;-=zkm>&J#8$-LMA;tL~c!yvfv77?MN!nf7=$utEMdH#B9#tHcKf81~ z0`F8XRDr9Z%jRv%0LAaO4N*mIk&476A>31Ki1Vqu#^cY!yWPLe6|0<%D#ksio;ko2 z*rXt4&a*PaxT_WP$VK;IkKAV6=m1{-YI{!nAUc{x3dBy8=b*_eR-Yg z8y+EtSsPv_Pj(|Y5^$rNcHefRBfvo!;pnvE2Zo3T2a8gO$tHZ2U0n(chK~Axkg5n1 zjgx=-95q6RfCGaBC5eU(1shby904CxmoG{Ih7PqTbCLCV^@)<78eOXI$tqUPZ>v2=-vR%S!{%RX_ZETUW!q0AWrX^!+d&G`9Qs-S$Bvx??)Y0Q^qK zuWkd+m@j3rF{4tITnzt6gfP?zfx?+;Hu|-=CDY%H_1T*8!pGLVjg@?Nf?c}NFalDo z%X;3QDihbwC|Ed6oxjJA29Ss=#S2b zAFDwYGq`Bxp=bB~=AkYF=Apv~JFz(~w{y)mHu|~WxFg^YVvk4_gSg5<5o1XlGiV0z zXZW(eYd=~_6z|t2hweqo#IX+GW8k0(#>9g$H007EeB08qBLc>=_|U` z>n|HT)R5ndZxZJ{(t-U_{X97#=7f2!PE?AGP^i`?7O<5HficdF0R5hn-j5#esw4Y$ z#Ik8dB`YQan8N3rGg80GVLj@S<5D}sZVm7O&of8xDLZufOG`Hq(%e-JhWD@6?%#l?yjyKg&U>5Q`*c6`ds z5!ho&;=aSC=NMWgB(uHKXcel}cHP?3J*^$)G1bhvX4GZT^B=D~ZayCLfTctVD}hRUV@!P~*Hr7XBfrS|X5LleT8*F-0(^6a{DyY_{@bh*{x%Qk6nZ$MXhW;e>(Z z_M9S{ABvyTr+ou%h5AVNpRpEq9%{ z#oo8fLSt)6d#qr4*odUSo+($BYgu3IchA&FzvXcvGaz|qj~(|>%3VN zd7Em#!F~4*N-n7oPE@oh_v0%>L&&hn4Ga3I-POItANesbaq!$#hK% zwCOy@*H@e@|57X%6v;^$=WJ<}5uro0vbo1NxwLr*d*7x!0-=>c#hU=#)n)SQ-c705NdVT*u zozkDUgq(C##JNB_I;%|QYAE$RKCOzw$xXQ-yla85dN-sHo5XPhqqbkQ+$pjcc3&}n zOhn(-hogG_5SsCA)whV3*Cf4C?&|ujpzA1NyTL2^Rnw?$?!%Z%JS8Ow*dR@RNyodN zR3GPLz6EN!m+Sqgw6906Wz6}?`(;FPR_RBj&$dolYO<*e5LYb?ca5K1^W!qSOxoD| zQ*3diRggxbOPw=gDq~I)O)-)hY{m3P*=a~rH4ASUl!{;t3XP?v_gfkc{BzqZ|F~!Z z8bU9@qKbFOTg_i~dL85k7LvE;SFDOk}R*bh@D z;;bsYwFSZjz0*{=EWoxr-V{q7L0A3k)B) zcl>;HP@QqU=Rzmxa(m=As8U|jtDRc3W)h?0X|<|}^H74pvj-JUO4`i={HT9p3X*gV~Wvl)am=WzvJ1m_T-40AE5O(;Cb=b z_?e5@rpjm1+rywYl_MF z#XH9Nd(&@rlgLk)hg$`558;jixcT)nTYdq7|DXV$Hnl&y=aRK*OqlvX=wXXqup~$3xH~nmWUK-~ZXIT?dhYjM)J~v!JWkS%gS2Hj5aI7)@A` zb^H3jdzdsRQOfevy3YuVB|4(PV5Oar{O<+HfRdD`kvYxj*&~mXyxCFODA_Xc)C#!m zc(f&(_4WgEsWIL}>?CaVmkI4mVDOQrL7u?$%{?*OOJV?>tcY9JyBzc>&&B1>!P{hJ zTZOlsO`(np^3Xf+E@f;@R6Fa~wyPB9N?7;*TFWOG?xf;$%2sppZ9Z&|zJ8rpf8ynh zX42_3vH-m<$9-qlI{V}Ac^{QXv!vKyZj*SL-+5t=p`GgBNHqxobZtHu2)J)Xnp768 zgjoV@3Sv&2$1~7#N2GXjynlbf@CTNr?*;*TEt4~zh+XUFNsdoRbw?oZqc_E$E}Pex4h zJ$8E|Qzxz45QXT`P)tapORM~;7)uu}15;F>&v`45&Q_x>Bs?8hkOr#R;RL#93|cyI z+pV^A@bT)Z%_8jlMV{E)ja&enpiP`9<0LqJ3>23|hkq->P}h7QbXF;w&+FDk41umKs!a9Wn#t z9EOBkK{^AZJ>(ZZDF{s{8ANiLz&z+hewB+z><{paXc%fxNVNzIkdk9$YEYFF;i-Wf zDiky-xTz}Cfk4V2T|C6aPy353Cz&(w^V|~keiIORu*h^puuEh2vuTfRXhU9cOC(TV z_Bi~u?sK|k6KMXJ{a#h1m(L5WyDo6EkQ#@O)N#=*p_buodNs93zH;=q=nE9Vlg3ZQ zm5tJ5LQ%@on@VMhUj2PnfnqzIjGQFq?6xN~`^n#_1SW7&bJ&1YYqIlTlqn*IX#WGgR8Bp zXv9>XVfe1*x^wTQ(raD5Z~A*O-de&YanwaEfJJk|PfjXIW%MFcbf`&xbCHu#K((#Msk%4^Q+P`-@K9HP)8qf zb)bPf*IrXWN9)q?i3QF%cpy@*JOuSLuK9ZIXnLWq94gl&ow)I;>ZfB@HBWHd?6zau z!vRc2ygcDy8$!0W1Od&_aF797m_J{F1DZ=pHw>iOaA9h;95ZmvuaxQjIAW|M`=9Q& zNsw0+=fyKiKFm;j+z=Z_E1JEf4VSR!zB&h&mG z`-eX;OXl=3kKV3z5~f#1jl!%B(Z(HK2T7$18gux1a1|K_NFq`50xryi`0GK z4os<9STrAOt{TI)pRsUhvXgZn6)|agxlklE;ZyJiG9Fubfj~t;x-Mh+$Q}q4PpnvD z(h0fA_~5zo*Xj*4JFpn4s%2Rq_`sW-$4oqF;+(ke2^5m(A?;&2ba{&>=`>=R zNAUrof<+yoT{W$;944bD06QxU1UCmvbNnJFrOadk#hMIXjIq)&2`C_H-j^J?6Fp2F zyAeGs|LKa5r;C)AZYy3k!T^0pe3+X}?KTjzlEvI0kjxLuHGX_XkyMo53AUJ&I8ebM zb)9KaVk^Eay^EMLTBWFfbb1Ndl4IKwx{As*_9>4ZQn84(tHNdj!0g5X3DDyv0ridLlJ zl^oH@5niN)qQ_OHAZN!X!qNwz+qkAE#h&gbcqk#hd6dCri|*OxgTjN}W<1@M;eZ(D z8o5?2JN!W`)Kky=)Ttg}D;OsCu+}q&BAAKg*%DZvp=Im@$y(jfLKY*^=knx$RGLd% z5hnp}(Z|}OJY?r|wobwU-sQOH^laF#7sqGa&x|$!MF#8iKWaDt*SLc~q=gN$_kTLE z8ky0!%I`6RRDx=lwC7QcbRw?ce~;+?9*J)LTH(s=sct}1q3;zNYp5#H^6MBwh4F|w zX`+f$Kru?SdTnVS>XK%~X7=ItJV{mC%et{w8drNgO#lrNCg~Z2o~rmU1p+j`wg*2P(sy($=Z%8!Yo`2gz+Fe6{M>Fe(K=p>L8QU1 zN1;cR{!iq_|3yq1Td@Z&D$hIJAyKTh?Z|NCi9wc&V2if43-sGoxntVX>uN#3VU*fl z+`3(EfOE{Ehg_qy(7oWnn9fIAA$Qn0T{qgW=MrE2nKYZoW3O|6BJwG^+ZVl}qyC1) zIw11!gWrdKa(-M|e(ExDjKW3?96Fo>%t)Ai9a(v;3+jW{KO3)K8^y2C_kl+*!kA9{ zJ|dquqy2!mz!=gk?-RbF0~X6+5yw&N^%=H@1bVNiKTEHMCfKhFE)yAxXjwRMMd>6f zz;LIB*PX2CEJC=I$qR(l99Fo9UX0$j7+|5Wwer9=dPmhao_3Dv<&gEN-KT?)*F~ZL ze33s1T7;h$&I`191R>e@e++!$>DZdZ|B@PLCwS~0o0HFiu>x_zZOjjquskDzzuM~d zqO*XuAOAqzTk3JpY^QiZXy9+`*7&P@;}5MEBWM0d?Q@n%f6AWgdow0_sevoDsXAaH z^%bfLZrR#JyuV(cXV-n>HB{fzuvLoX`o6JBLVTIvebXe9jBtUZsS$=!oBgql{g2l! zoa=#<_^C7Z@U?t)j8}XW%ZUqZRq0RIhTdP1~WW4qT{yHt>UIrXA|R z=z+DD9Chd@QC>@svaCppO)H%;&%7zN5RY)cNJdrGtPQxBam2 zUsl?t1cV&9+I*atQU=@ON_V!^MhDmQxJ-m0>!m`1VA;|NjA=m{tO!4%6Kl<`*z(@v zTPps3L^N{A8Y|IWw7HhaL&j&(qFpZF&2NCGBE(bDx+dJR?a{}xjE6&x3G~SfUrNNX zLFkK~Qn60A)-s;p_NJ$m?3Mx6`OP&VW_;FiAXOT=WK~NQ=~IA#W&5oR3@s~K*@>O1_W+}05&Yrl;z&}ylACLrtEHiFWb1>T~eHw^fmt0{_M?`LP7(8q*gJ>(I?m#nl z#h*or%#r*pmD~g_+57b8ZPJhE@ivw=gH?2e*AFSC`pupJ{x&Gfj~V$Wb4AL|LGWBWxOBwa`8T*P+tQxNNJq+ z9!l_>`SFsfC03GjX(NML@~!=|`hzklkbhl5Ger*s0H5AWcLO8_?-ad`Wp{pZb^ZL>{x#<#kq5^TDNE@XMFR9`&-yM=UJDDc@URr>IuXI6@~Xa;DQ|i5H#PLkjXSnp+Mrq*m@L* zzQbmj+h>Vadc$VUAcsnL&t$7u*tH?;5iG}d!{WKn8h~Y3ASLF!&T3r{|LbwiC;s)g zB7N7*I!jac^ zivIOP*h~yNNnap~We-cpUXN&wM0vdhouou2Jb8Gt6@ro{><5uYUyyXzNAX^Xj$EQ( zW{Gg>1Mt^78Mo~nn!`TnASIkhdN-^@+*0hs!l@(FG$p4z=qeYVWN>`RO8VBNBZaW6xdhTMeMQ4VQPLCv z9I`Hm`B4xAak3VXFxtf?-q*UF)eK-$RHCL>WUOK|!bkq#*V}0= zhaOM?0>kD*5A>5!P(*P`G#tC&T*{jJZuJ774}K7ojfE%GBrEmsp6cyZ7|5l7*Dk_uWfEVM4 zI)&n(NVF^w;=h^E9gm~D<)!w4^Y`CUL@8N#SV9mI<&}SXYpEMUAfty*!eSH*IEsZS zm@4Ao+4MkVh19MLxzsLcQ10IsSbL)3!J`rP00Dn5<)WF0dk(k9OH$K>|1CMD{P5rU zrY2vj{zEUh)MRKvtUO`0{&i{4;uAg1o$y4z_j}(HI0=2riPRHH#OCTJYh`mPxk8v|DINCL@um6KJ)$~7;~AS_R{Gi?j)s} zlEWLK^}kJC^K%k$NF}k5Wha0V{7cpycnP)8|4Uk(0ay-d^KxKCq;j7|A6*6bS4=5W zFmse_=PPm5G6`!_O9j`jwr8qx$Ek0 zZL#u38i25G1vjG$0C#$hZ`fq8;O+$`Am9|nocd_Dt(4Q4a{_ogK6>4s$Mp54%437z z22KL_k~2lp5O;loEE^m}7^lNkVlt+%cw=t%?GNeB?FFPf)0n90=ws{PCN5Bi!(s?=-?a@O6!dLzh~F7X+}} z+G6q@75aBR*);JZ+)zSzWNPU-?_D0D8h-;`7;x(Ues=gSsVv=oIrc>Oski!fdv93~ ze+JS#%gxOV&i~Hewv%XZFvgIz`=$Pz7?%Ebr7nywIl7 zAQKZjydCnWU}JKUiC~z~!VSVnBJaCzd7Hnx8!~I61_jn{K12oYOq{V~FlF;OcZi$< z{R%JHBKNsZ_xd7+zx%=y=wO&ZF{>lsyT?H!D5#8|{+hKKJ$uO&hzSg#mK;9`*dXw{ zF}#R=^(+Gl%{!VaU3Tuw5Q=e;p--eBUdv{26NNGbR=^N)VvbR4>p^%ZuzDYPHJ5T; zIZPZRON9e7Ubgs^g%LvcMzyaGBypTb ze`p=pxNndRqyoC$q&*-?4K9$RJ9zpVC0qzwGQdw*?@wS@sYQ5ctjqK2+(XYq@tTA3 zG8WIT?yCnP<>%k}>fiYh@Dd>wO?Vu-C5y3)DSky}rS}FKw_je2R%n#pwJe+i?|gT@ z{hiK8vgpq!vicFWZLatmIWgKPq3FB68vKq7hQdhl$7NNCr2ae(MXTw9g-h4xs(caW z%V9wW!lU@O6V6&XT(&qasuCOi8K&1`s)z#x0h6$FY}9xD)(SsggtIruYRQx5+9IEyui9rL4i0+PJ99 z{+wMyDbv_CUESKT5jWhdI`Mt~eF+CijXir5=9NxtSSIaf(+|*M?1n@ESSTx!2_tOe z0Lx6Xw$tUtFpm!zUj?SBAD3|l59P2Qd-*b$_`Vel$4Uz3xU@CTQ`@l-NDr!qyAxU` zXTdid64gz7n;r{9uYcYC;Z=?DKv{cpmze=+^J=dQlks2)MFO;mlbEpTeMmcyV@AD+ zIICvQN4d>sCnnUAK+A#I_$??!PRr5WvUOE)^^i`4)QM@5YOF^DU|fN~&T{x=IB*^2 z&e{w}v^Nv%IyaR2icYPE=TwB~irB=BvxHN1BXMgUl+BC=XO1=hud8 z;Y4cy1<@&fkpT8$s7ML4mXq6^cVcp->z+ zMvczmZ6`S*#oyi5K3n?<)xT(l%WMz(bu2w6O@QVwRAh+g5&wKK0VTr+%5YlsWzdZ2 zMYt~&30e3%wVonU^%i3qf$Trud%K8UNbN|)AGj`@nE=r~+2xNqXix159`4oC=~8Am zJUK$W_JEwp_IC_xqy8UNZvhoYu&r(59$bQZa0mo<26uNSSP1Uk1c%@jAh^4`26uON zch`h(l5@|!|G(ZfMNhA)>Z+dZrfS#TPouzwnuUuzg7*_-fJY-`cx{i#$VM4R`~J~2h;42L zs&kwF&cAA8e@k@0%TzG>EgylN)5ygucgVulkVhd0SKmLyWF?V$e_MeygE2GisCttE zUltM5oJ`t`G>cxCZzE#~Dk_ZYf#~8-u^oK&xc}sBeu?U%%Bk?r&|t;*Ez3nx1K%BS zZz7p?@I1&R#WV5g8t*+|e2wLfK}wTO`WEVKe%^`3$OPREV~hr&NX;_ISnTBUGKHe8 zS)+&)a#0|#^#s!_NO$vi)W0rB2c9YjK^du7>-LBj;u?`(4tm{otegwLQ<)0wHLk@ zek||YthijXSm@Qk>%9G3+}W66HgkP?rTg&dJZDLa3yxKvd94O6z|ol>t(F-}p5n$& z10%m^Vv&{~S)%OuOh%63v-eXv|SoKWiC!Al;bjBkAK+P5r1j9)!^vR#t9 z_~0jj^&Cj__%H*A{DaR1e_zIzx=T7!%L*4k@r$~vK)$L-4vPMoir{B$GnV>W7%VZJ zB!?}U#P6m<#j@Q&?h>+8YWm5Df+4fnbK%KwgiT|s{7uSfWOST>!DvM&qQ&#k1R0NB z;iC~zNciQsET;H}P{`{a2khfHh-e>eE!ZtJAyl=G&nRR7#xoeBAc`8+N<{YGMW5t1 zysvRp802Z``UMwbDhG$8ketOS7!;e$F58_cmpuF8c9}YVHcM1gh?{ zlOVI{=Rbml4Nk;T8tD;Uxed%3pZn8nh|BHtqW6##{Y^oXp%(18Cd1x;%uwNBzi-la zbz7?yi@})p0eVKxFh+d0;5f$at5GF-yEvk^1@J^tXQ1g2Z3U|sM#gbD6JOq9Rs3de z=Hus&Qd010{{AWUD)GN>iYKRw7qrmAaq_d(kJI>M(ltt5#9`EI0?(7UDC-oi;c)JUxYbK zV$8mU=)Lg%suNnMHn!ClPje{! zh>5v-<6;x%{a(hJwdS=3c`Pa3-E_U|7$k^ zGI+4Pk=rCl6wjTijW=4&yh`O475CFv&L3kMdNR2_SE${aPrtM;aE({8F!!c98Md|& z+*X*@aAhY?Hbt7VkM1QjGmes=lHhjTeZ+85qCQqJ(n$X9KSpfF`Jhc^V8w?}n8{QO z5hu#kJRjtTA91_Ry=~;hfAl`Hl?}rbct0`bvu5Skvs+7urs0dweDOi4?&GQo{}}ww zaScDMRlqajbL&G5(=|l6PB?%$tZ}HP!*#lOKmj7Cw3;m3e zcFc#y^TmpY_*~xdn2_0mcXgCY0Q;2!ny#ycJwmMllD6hx`(n0Xer?L^(X~eu@IN<~ zyzQ~}(i_8ksG8VYJ{SHN3BI2*!1r?v3OdfgBJ6iI4i(~$oc1k;^+A(AzW7&v8`oz` zL0JOZM!0yBsfNq5Mvd3_jP4k%eplOfP51IiJ0zF3>n!E`P@OA{)b;I{)#ZVoMJrbFAOp?TseW&>1_*(2cO4Jc4_tm}eV0tX z#;99*1IGOHc+9QNy)j%f^_ywA~ygjxP=v+fF zDsrE-ruh4zJ83e%w^E9TPy}Pn%92ang+qiTQY^Pph>P?`1&%Us#}WOZs9nI9 zY$1XtU&$xW6ZbJPBM^ni&Lz7|TzWtwuU+=Wp%&Bvk(5^ooL%4KEpRNaUQ%1gN+s~^ z3O{rLUULqkWLgR@fX|)ivJ;>CT{OT_Udi*@$rwD+SH-3}5zW#-)M}a%kol2v-z;Zl6z#Zwd_{e!FcP#U%Q8Q@c#_~bB z_#vGSH1)84h0C0Iy;0eVR4O3<_3yF8!4m#Ev4W%D>5nVdH=WCM_ zJaD9jDEfq^Vkh=HxXd6c4Yo4_&1foU@1*Tg#@^O^W;YC6+UY`eFMzifmN#NX^G`Ft zGk|sRL-+pso;+R-G*qqc?~6_rmOb}PMl=GSl4#%+lH&Af06)`%-nYW%E1&Bl_V3z` z#R{C?q+DC&SR63l|HvXco9l=!c<5Xi-+eKtK_9OVbXxNS?8{u(*X_#^!H!nV%nvyk zm5FhJ-{sCI{~%r6ux%f3^iGUaNgu+6l7?pHn&OiAT9Gz`Ue$03LrGyDb3ONIZt?1+ zr{)0tmo~w)M+_E9?fmAQH(|=;=ZI#w7akW}NVhY-6LviBQEq~1-N?mGm3W5`t-kIW z`6;uXX?QIxbEb&~twV;jT{>eJZQUj1Zuk)z`V~(6qT?=QNVKi=F*enicKT#&P*V?V z29Iw030Dgkmtldw5yi|m2WCgsAyzWq z9iRAQN%S%%wi~GW2An9%7Pn<7+@nI2Sm(i8ROldLqk)8udf_cfYirBd@V|U4!(JTfLZR159>q!}=R?I%q?{r;b>Oq;R zwH_lKTVSDHl>a@(WJ2{4g03J>{u_2_cCH_GDVB<4oCy{1X*X+BydsnTGWIvN*1%Su}v?*8`=>nWPbQkQ5L9Tc{TN#YJ(;QPNq z6;%F29qfNe-~6yZi&g3;DJdg276kJ*|9@m%8-iIHO06aymMwzke!1Au zNr)?NAcuX8z8MN`8D*C?g2iadoxHWZ><%H~7gv{(i+hpQA>+!<8;qf_arp72HIlG^ z_sHqxtyh>+pqi+{$_cczwm+U18dh9R40ow6;VgI=?6Mt#t8I_Ua#xhsQToFzNO=i& zizy1X9s~eFcOMD)zW?{~NMe>f6Wv0$>M?5#C^TK_JgW<1X?z8P)PkQC`A!noZo%9Q zVqu2Q0u%}Av#FE`>eExtzH*&ACu9QToD_?WdsScIRbQ*5s0az15q6P35RwH&HLO6Y z6mfoI%2P7S{)S!Bj$Lxy@}0gAUKo*_&bh`XQwaprS7T^-7t^z$gOF6=d9r0h)L+uj zlLoQ^U88hXc;|`ed}+zeIOr3U`XE6vQaJP?2sSq9Da>Y>NAF*mbciS)d@U|UWe8HE zItb!wy$U|nj^jV{@H`}}O5PkUY4Fmt+$?xfrQEj<`oK!5Mt`?n;5A&m!XGxx=Ho+? zq0Rwr;Ao%!D4tN(7)4#OsH(=kC`}Cu{Rw4LO6-6a9&yDl)hkQ4xz8+wfM$jSYpYKW zR2s#c?dn5wvX5baB>ElgQI>R!P#-B%yZ}-h z{~T?>sk(#q5g-4xD8YS8L)ER@j0Rr``r;oB?@B+3mo!n>M>jS!Jaf;Z2_`2AxTD1| z*&EoeIJ6bxd-~!V#fMx9xycPQa};g_Ffu-%L3_h)uH0%3?B??mc6Fs%FM57!qurgq za@7#Ao#S#1UR8OoJy@P~M}S2Z-XvE|;i7?a~&PYY?9_9H$YA zEG11}W?Rd?L#3z>s$nW(a;amQ#RW?P+9Rxl>5esU(f^-7R>;Ln0Je?#f+A%tY;{mh zIrP^LyvVq^r9q{Mv9ma3lsRubN9DZp7}ZgsNKZQ9OxBWOCMUbF*ZR1D9S^sRV+{n( zIktbkie)nGxy+Y!+_&-Q;OA?rhg4Ryvq+C6Z$@uL8;@*((-1t?d z&S@{W53mD3_)lP1OmC`88*=^}wpW##xWKjRV-8*N1tm3?aYteu1UEd~yspnxq^RD= zitRFM1^W72?drSHKuJSpRBM57cgoCjctRxsLcd(?#MpI&4&z_Z1U@}}l&|ZmDs@{E z4+&Ui5uo@&i6uLgM*(xfa0mAnmX3Q&{Vwt{HLQ%A4-WvM{da-oJ3g7@=2DImM0ELdyrj(X&FIwR;aJUq83*s_Q!EwlsR!1nM=A3?(RCZ# zwYLLbZO<8?zqbDyXcqK?idbt+~+@iFaD;IU#qLGCXol)(DGWCPFJ06 zL--!(WD4npi8^CHZ!=_wb#orT`RU|6={aV&E})FVO19&bVT=n=f+Vpu8lQiZrB7P(5ij+ee zwMoms(8;|tujW&24hhv?H!T!a;KITDj)Q{3@n*C~>3~#!tQVp#PQ>&LF!3YE*IgddviBn;$<~ z_C=RaW$W}_h4i_NP?G0T4)4SiR+rZpYkZHBpnWzLy@kulh z3+!F-r(nDKx8@8NE-5_7(!g?^4K^N_Y#V-$V!7Tg3_DheqBhy~Zn}*LmfbF>6rapv zkj#THH#cTq9gbdV-BV^=V{WFcenEEdnjX!#yrwOtjirN$Bn~eQFY%rF zjB*TkM@(B{e4ErY=qf|&>bh0M?A?haAx=B?TI+#+PDNu9q9J56ad~fcP9qRbw$}fc zmDD&amzo>;u;diLCq|p?s9ar&YmkErb2pbLQM%NMi1CexVXhPlj7Ekmzf z2U6r6E)+UD+yD{+6ndFo5hg%w0-JYDfCw2{az%kFT!M3J2{~xOq0y(aM&D|I>?|8Qx3ISIb9Wa7~ zk*`7rHcyQi{bsL1p=S*_u$jvMH4>&?(oi9EfDHH}{HiRV7y(rV$EcDGQF@Gt_#$LQ z1Z3$#bVsY630*wzNAJ;i{K2l-!;9__LU7ScVZkW$ot6KvG=)8bBWZssX*OX#g<0gM zBHmo*@+WnhP>3KvRnIfOBiRPRNYXF7Gl*SfyV7nvVvIpJENYtaM)clkv{L6%c`ipK z7Y#5yYM!@4-WL+*`iT6E%m#XV{6rK%i|gXKP}ptPLjix{d8J=e1w?y7!EY^+mj%!d zQ}Q`VDHW=N3Xi&J)Ptb!L^Xtp-4GDfMqaHBw2t^p@eSxbLe#(0*IIS-6{)o9#$s$3 zuEY+7W8#qL4jQ}FfdAEBfG(1(8ll@)0s&Z#Lw&O>|8?-Sb+`t1q>p0-DrqCcb!@aw z`83_S*DCwhZHb~?m;4=Uv#w&Z?vww)@>gn8x5SVtjV1lTwI6l`sLjY={mX&ed;&Vx zkUytrMy`L^w$k(-<1$2H#lou99c3%~x6~ZKm-F#iD?T&Vfn!}3&IQiez_OW=g}VPV3pEo>vFsaA1XH0?0Yj6;ndJ>jlQmxeNjmIXIyL={qoe+7 zSIA9HNr1*IHnh8Xs(zxb{!kcHrcEa;Mek=KjqeE6ko7kQ)x}-RQ{n!B2+EKj$U$m! z+rojN2v;y(?@Jh|4R`@iZw(bx?`OEsSxkPIPz3Z7yEzOpP6#TPP$a)V2xV%-?-0t> zG0=tXbTGIY=%tDk%jIMg!rn*3I$9!S!09&}G4P$>R|Fx2fX+}EhE7(}`XLBHnY^mX zPs_uWT(Fl!tT#kUSj@Y~7d`q>2{Hzqbe>sI?46$aW;d=_;vf(ND+U|Kf`ExuBSL=p*_S`F77ts{tb!eOC0}gM^}! zQV8~1+3ht4-HF0llW&XmhJ>PFfOqn@SBU>D5u%r7fR+7AZO)$L1x+0a`2~#u4X;}? zFa!Y&10bQ`7jqB2o*rf-J>Qtd6*9@4@x6Zdc~Q(TF&EH@zZZUJSb}S?2n?!$kl)Fb zM&m(={XI>8o6Fx`)Avk1kA^{(p@&H>tj3uo=~slUqa|F%ulJu8{7-{%(X0JJVZkS& zJ_>Ehrh(1K_;=OwF6eLD0C0Eyx559(ZrtM7Is$gh!@8m=X{`2MOg8cQ*VKP4b@$Yb zx>iZ}k<)g&8;7v=B|)XCh*=$niIG%;l;yu2|5wjQh?ZdQ^}pH+^#!a4r&t$#w0xS- z|5c;qRchdBc07I$1YGiSa^$4EJVy?N8NE8!br$49MPh8 z5xSO^K$&3kf69jrLT_b1#|}g>2%{K^$DosF=wp)qJ(2Apa|mctG6+-IKfPJoH)!Bq z@Yxnjl8gnK_eV1bRtW=5#54JVCHKP>59Wl%A1wf`^cu1%JDUO2%$$is~#~6>a<*0TGJg!I-miJExE7w393NKZ` zGafP?3QHo|ZWAjoJ9yWfv@o3{8l#CzXQ~5WQr^xriUw23;`4P}AsG(_@Dg0x#F5pj zP!|~uX%B8B5*j4GQkzW0TXkz*pfx72>iBsc-96B)5C#`_9lWI8^J9+9#SHSdwXJfNuc%j0 z9C?>b`43RPb~M(Me(lg3jTsK^G?bh>lzMNH64@TfyY0ku%C3lL+hHiSdb=T5eQkv3 z(+q|)zif}VQV>L|9!zMxv7Jc%5UjKZ7|Y6OYfsi7SJg5@6+kVA0=<6Hkw_)TN;0q` zTz%*9GB32)t>w3D_n8Sp=Vu+Fy(BJJ)go~6O3ixIWk#dg?w@N(ohHzfiIi893)jgb zJk}zfK0~n%Q6_N+@nnD9OqWvk(s`{s89G{qgIWNLi^R61LWp zuR~a2Gvs$i=|dQ$QG#9;bhvC1ILIkJH4-_m_~^`lFOsiOkL|pI1XnK#6``75D0Xjs zSn^XpnV43=#<#T5p#9lI&&9_!&1S`J-P0-Nh4%VZZ_qf#)N$wjOov2HAV*zB>I&! z6A2v0DLsGR$ZR~T7$5vi+0I|tZf>ARw1|OWmg~NI)ID{DlX2sqj4V!X)~FcKm~RF5p~XJLKL)#U5J32D%|MsO|SndiP7?-XS_*{Zm0$_B<|65yQq; zh%?IqI_R+yxmvyzG!WCbk_cLZOGQq3=BtIjhPtFf#nr6wMy6k?Oz!lJ*lie8{D%61 zCWxI%V;@YyS_mw9G3&#qb?EysamFvn6D(t-#A&mkWDuz70R%-R5aPA%TRv6PxzXZ< zA$y+GI;jTT@xC&Kwiv|b&iC%w~Fj!sn zC|CwPgsDv>0DZ)tWtA8++h|O+6an@G6RBa=5Vx#qMw}{C3O&{+ABB>l%j$)x3`ql| zONQNBLI&!B!>%C5F5?3sz?S+^fWP94TZ^eeQV04c2E%{%Pc%|;qU?%14^f@C^4^{1Yjfjw!=%3seNgI`?suc!lhIjsW23(I zq|uxT-_a>!`FA>VQE%AGEH;zG6JBzq= zfbAa`G7Gk`oZ=XX`eMIdJ@!B~{GWfPIcRURHWv2qIA)u^q_^=bo_T5oaImJ~P$R9J zaFnXR@%bR)65{?es+Kh8_Sxh|@R1JhI` z27Wvm4^RT>uN*Jr*L1KqbW1Fl=IyTLfI#%e!3s6RkMG@V__L)4pc^!WG6e%3=IwM_TkRqEN&0*0Cy z+21p2eIaX#o%MN4Rp-iKP2*)6h--?aEyu!Yiq&0~)b`pTl;rcd=J*=GQM_?;5!6c> z>m?KLhq?<7`{lit4we%KQrb9^284EKOC`%VaTQ(d9}BY&C{@*c^4!hH-oDuu=b2n? zKH*E6Fg^~vKL7rn7N#uJr`{|k2?SI66yz8DO1navv2XjrK6Vb8;ci(q)L%QPXoUY9 z8+Kalw$9n+dIr@(95|A3opIHaHbaCO71*f6$&^vEHIafH63dc;84_EWAI$i9SGR=l z3F+W&wP3}4+SuaAp(!Ukpt#dRsgb(Pt8mfTC;m@9nZC(myqzwzKR zK2P0WP(CnKbP%kJKZG?V3j&wGvcSt-nuFM5vXG--zTuw(ydS?GqgjC`)hqhG+fMVH zKc8MF-kx{nN)Izte&_w_r`V!=gRjaAK6Cul(D>_&5wG9E$I4{YymR9BNH8H6d9|+FrFUkpg46lunE?-KWMD%u0sfM84k+M8<|>8#POr_?d*b}G|t>J#Ab?sncl zo?(XlNB6DT6B673!!A*ibMoA{4#>KPk^-Uas z9Jl3hW%}(n62l<|)dzf*x~2Dvti%WNX}&Cm6&1BcTY*ag+HMuIVtaoLd3`6Yy+0jw zH|p;`sa){xq~_SY)OCD-YqVA^jfnpIdowM8X^VtRw$dyEXiT?^pUURUefcI&LUGK7 z6~VTGe@Y7Xi1e#*t13!b)`QL8pJx5my^d0gGjaA)B8jN2$Un{LNQv5V=-bv~C+J$T zX8SGYB*uflmbw2Zkyo^EdZ-+U#l1ad5oBB1@vc3qp(-IXUu>_8HwiNqY|kqpVToM^ zR0Nw*s)J^6j~kR4T}-RzN~;M|4!# zZCe2x(kND=pf~LAe)YWHkA#g8|HcTt-F>zC!ft~6$DqA9Iq4}${iC&6rdFh z694K=MA%ulLjP4P5tSddhL4d&DID@F=4TMy1PSR`?g!pd_eRgs{3(PmS!%n5p0z+B zY^ToUrP7*y$q_bD?H2{>oTpIjxBkmTp!c923iHZC{Yu2!z~&E`U}Z~?sQ0?xBmd^a zIQ>qEx{s*0CUB3e-#+#g97p+Tqa*F|d8ISD+lcjWZqc>l&2#SO>++TN{a3x**OPhT z&U?v)`0vp>lR)2&v)D1Mi)67^eguTfnmWfu=A8D`Dq7DsK;_p(wZ=n!lTUt_>#g4)8gR!3VEAiPwUh1brP%bdX z2(uVPluD9WQNryeY`EW^k6RK2-@23KshCypz=O z=lwtu10e~rvg1u(=zeI&V5=^r)}vcNOb&y5@zutxJacq>>DTr)oI@AD+dP<&#M`0O zTkQx!*P^Q%u~zU2JYo%8(!IFi_c#iznnRl~G2(a_XTZul^L~F4vLCeUxP!Ad{-w2@ zY*T}vqh6F@w0{@FQ1C>1b)*fcz)aMoK-kt)lU6{{7e)q2rsT*MPo~5+6eP`|CtXip zmX{P(#*1D)4+>X%gd_)G!6eV11nfZU`LvSl^w?Pc82^~=Ws>=OY~<3ISdau#AK%;- zC8kP=mI75?ObjRzo8Bs_C|Ad&B(_8!hY5@ngCdp5D}liY1lRFjak?!iN@atPc#&{a zWUTqS3)+`wWhuym0xPBO7gw4nbp17|U< z0Mg%T&TU7GcFaw3nT}BHQ`46%W0yq*FJ(~y1qH9ci6OJ%`>JqFCk2eERQTNBlj5}pAP2+Z%~Sy zGU)o?_!0w=PMwj)8T+qFObo5LI!riJEYUo&_L;PacY*WdD5tLqo$%Tp&q;%kxTx~5 z4M8E`-|)Wzc@36$SWx9<9L2x z>QpK9Pnc7_B|J#h0Nwb$rbAVQjCobglVP1Kg!iDyoc|Z3!AcwL+cf<`vh=7bRD`3v zGz>pyf9E*OE`V05@)nA0oa37#ePJ3>U5dY>zoV5&4%Be5pw_l_*hJT!Z!90^znSW(mEP*|~!Dt+c4Zt^{tEo}By&V5+dQ##dy zzqUtP3H<8@uiZ#!CeE9*>j^@C!p>TH)S;W!@7Bn@PZwahKgZ~Y1S zeza^4uWKj~LJvgI5Jcw^s>RlKq(3xOk|*?$oH_D2w~o-{F#^X(oXKfr4c-Uw+<+D} zH4jOsNqc25;%@sj!&!b*p9~MP|2K{)Gu^l&o)<9@P2$2}q!t;bPpJBHv;%3Tsr;Q0 zvK7u6rSq4u&g!z{`t_sY^N?N3!zEDV=wzj2rKy&E9HO`B(-q)kE;2evBEr))zQ*WoA3U2OU_J%*m}qVP8Ty$OphV2f6A2uf)saS{EYAsf71GQ z+W_1mA7`;hDJ5Ydb=)1`25 z|AvZ{Q(ycbT0{?z8)#Lp?60J*U!+5SJe$g*!Cts-yAyE$j^cm1c@m8*=J5&b=#O;D zu+#X#H#OI8Ay5b}dXKvl(R4$S?VI?CT2e^p!~=X8EJmw2@~1%)#LZ7OUaUnW->VFm z>WP1eT2ar+_^5cXB*=IC(fz45B)87cfVHn~Mm8V;&*NrbM%u*{tjPPf$o z?Qre|s`a||mgtbUKl%dWzT z@OINyn=FSS>8Tm8Hx1P?AA|J(1}eiv7%cq2y&;hATG+I`8RUFVu^HWGjDiW#?lJBZ za*}4xB%WSwXZSS3Mq>DZ5|YC?uMe^)dl(<4h z7X-fDZdYjI^aZ}gf=UogXlMKn8MV0aKkV*%9f#*MD}-kACR>3MN(5GCPwyB(&~uT( zQ7+`og&W!tW;u^T6TkdNvkpl$Qo2){aaG`r$Wj zY_^KFeV==h1KbeJ)n0AJQULEsNe=QVjY0ED*7_FZ?ER0?Q$dD-fD2MM?8Gxvp!P&5 zvzP}(@0>NYu4`|8IHqTBes-^6)}+6=mY~8Eog1eC7%~%4_Sy8 z3343eO;f(KqFi=wyeTJ{OWP+u>^WB!Km8irdBRi?e+ga*I79;J_K%1Ff%KCU9zpRG zL9seyp$X%?I6lJ^n1HTm2og4&J+_lE*drU+NkOroJX{>@gvlNwSELm(-4-SJ( zjMR$?M%Z{bK?wJFInQqrQ|b@*XgwNqRIv%jLRm5YQB+QhPRTsQoGlldOe}cB6(>~~ z43CNUPjrERn7^0`dx+YJx{4Zw2zfT9wDHY18LGW^w^#JBF=8cI-^IyQ`kq3FRPwh( zP!V~kX!Gd5D$!Cg){2mGxWr=9Q6c1o=f`X>O=1_DqJG)o$YD_FlV?Y*E}9|79r$8Y ze^d55L@O%@=eR!=OPS(8^Nag&+6}{eH&Wa^?MO}xPa$Xv)U<|cEKaz_?=om?8{!!M9CcXnS+f#rrr6wac7B)fshm@Ya9oQ>;i-AcKCJKt zR9eu~Jgz{VB{^6pO?ZUj@W;uPd6tC9IX1<*lDY@!;@pTDUmhoYuVydF#J{uY&@NlS zzf%J0N&?-K>i&x3fJ~)MT>{=8_pjLKxQ=4fUWv%p9`6Ehna=EUa264`m$cExt{U-48H z#!6;--)5apbvJf}MiHJQhc>RPI~e}(m9oa)#dzOkvbME7FKAcUcLR*{c@?t~4;Jli z2tbfPZ@BSQ9kpJce`hc|ey`z18a@Y^=t17qQn+n*A)FaSJqpsrQZfxkOIT<@iYmoj z%U&-M<JIV1=z|+-=93IW`@Kik!rG!Hb?yRO_z1V%Gi5HxJH7Gu4uat{_{S zmy|7Lpvg0s<&y29+*_qgw|-f#X1ONu3#MF`LoC~6jx9mzgrdCE1QB|=rD!2&HfUD8 zf2yNs)@Cl>ps}0KL8%L(_`BoU4B^=Gj}y>;1pLp2$yWk!q4}U$@p|Uvk6HeZHt%ER z#dS3A>X^e_)ESI~H&9GnV&~MeBCv@EtUB4FqCU&~3PcJHzd}{Pt8cOFvbTy4dk$K| zMac~*{I!3~yFOG`BJ|0Q_yg2&1=lAVjEw9RX6+Z5_T~29ZU?%GwDI$cf0(rMfskg( zs{Hb-*KkM!bD8i1uE~^#MfgZ_DD@JLlV?_*#C9--Ww3(LlYPxjbtSOdPDpng$+vas z3)bTq@6(ya-tPu_0o1LA5j#A;mEaYLCLf(f{h$E*S?l>=OI?x4&4#T8hIlSeoqjGq z$*QZ5J*Y~bX>_xGghcG?#Hg1!papiIxp_^&C-^i`b78%IK_pQc=AaL_Vnh-!!taqv z{`Bb?eApjFvl(Y7OTwFk3|XfiFIMLkj&9QWKp))^RrY#%9`vE2FlpXcx1scspou7; z79*kK-6MS~DB~g~(snaMW`0Znfx zZ#SKP-0$e03)RFKCTn0L-Vic@%>IZm{ERvaS9JiI=R$(^6Qz(r*&Fwnphx7v`wki#fLLXj`dwvc=Q$lZ}V1{hOvCv4!4F9Sq(_{9l!=iR_w5)0|;cInt#1N*i~zV z-K;QXNTcPJyMVS(J!{Pm3k$IMLkq-=CrSEdmqD)HSKq+euOv1S+OO369a`G9sv|d+ z%QR$B7_{2Y8xf9=26h>|MrUx-77z{-Z$hs@tW7q#@8ml}j~^+6ILVgna%}w;3}iq5 zWufg%RssK}v-^eUXPS_(?q?;owBl9KMuw1ukw%#fTf(&ZQy$4orI;!|-}QztE88S#v)U1o@5;n zBz0MNsHgixt+=~Jre8n$I)B2aE`6gR6dvz@;I0QLdqn+~GpO}QVSYORX;VrIi z-*QhHl8Eu$m*4Rkfaagd(BN%yg-+{emM@17!Ne(&pXB>* zJU{tHxiShGRX38uD~It!4FE)FxU5}2g2j0~Z%9YlcXj8MMf&ot=$`Kaqoniyt$m;g zym^k>eE9kCPxkk>F*`%Uos=u<$(D8p$pwk{Y+JqPmNV&z8YbstrepwlYWZk0D?0SFfpi!nh34( zPQea7x0XL5r#RxN1&5F^n~FWhC*95|a$9J~=+krvrT&Th@-vsTDuOkV$<74r;$eWm zqBj($WZ(YkgWT6+WeDDdkTYA0Cbay8k9Gq=N7udz!iU$6b!bG3jg$d99uKI5Z&erF zo8YK@06lZ-vS#BG&~I4(edy7tb>yuDTDc-HfS(p7mh+Q1EeV~s2g#R!`+QfN5cwzX zXNa;W8Jb9;G3}F6NaWD~VSRbe-%Rxahmk9M-0koR0|Q?IkBt-dRhHT%xIPnqPco%p~G|V{?P-bU5x!agTc+A)N zEMf6&dTD;nKKsj=f&&3%0~^cP7`<4pSM=~r<;qeE%EE*bOSd1iuVTMhgAr3G3LM{3 z#kx@kV-9bD*#3fOb~c}ct?7L-r7&<%{|6sN5vpIHt=OXA&F{;~4aP2lsVKS2=?aw_ zGdqDj?m32T9~N3r8b>4Xd3@sNoV1e!h`bqKPL22Xex(j{wFx5^;i!h$EL;n$5U{-R z8Aws}^^{f!?ppbJmmAjcslY@WeDrsZ^WL|KhTgLTHl^)t;9H2|_V%E@p~dPQ@E_s1 zA@au?&+{nWU7^ev4fbq*LNr*r9-xt*9Cwti=Rt^|AahMtSaHWtr?e+${o*iC+3&-( zlC*c@uR|xHZ>V>)^C-?s~WG&e&6C*<#ix@+srv|BxM$!DI(4W%>sQEsXL- z;A&ryIOBScmn_E7GJWfi@QpM85|89F-4D(^)yuco(b$ouGvh1*#O5BVmA*(RmMqcT z#0mG5>Tx{-;!j-A(zZte%9mvi74AW!MFL5?n(T>Nl?THIT2{2~5)vx@U-7wBp5XEZ zJIY2Fy@so6mZK~`FvV%Gm7UzT=!ER_0Spc=rSg;^Uo4m`K8?;fH}{SZpd8~s+nx2&p$C}2|?1tk>8Lu!d&nqR~uel|J3 z*TU!Bw+UG5kv>fm;2dW=9TiWJQ{L1h5{hk)BG479?sR^SpI^yxw{=H54l&ptJB8WP zp3H*!@&F%)pS#6~Y(y_Qz$i8(2f!HZNlASmjdW5`gYH4_!$=X2f`UZ;Ch7XCZy+8! zq>gogV8iqfONc#_=gK8U0+SfAn`&{_evgqW7LiJdU)!a)0NwnxUf|f<_N$5&OU8iK z9Us3~&Yjd`7!t)dO$LOUU47dCs9$39t{qRGm%e|rdY}{MZ2vvC+2@hEegeq3llR=s zi3Qtw)AuOsZ;PXN*LZh>1En3ofzsUIKxvL5C^cA6iRF(A%Q;K=D3>V-!|LY7LdCj_ z+3;1{ktBf#(Tm17vf)V^JP_NGA0|%zUtiIgCd)zBi~OSdNGzEXDs|E2xqOtlZI3vA zWEFB~eKtJb)nP^qI@c4X3gP&S1-Dek*^`jP`daFp4Ei!MhD6{Xg)VAO)zJ?thq_^!5+aN2eT-3Ko@ShtBul z5CcDn9ITKsZZO;>NP%=6R+S0E{34V`fO4kr2Vi znA;8%a6!nFXeKaUsKL_tc`+_~W&rn43^G!T236aE7ZM*SUC@VY`e+880K5^CJyVGG z7n1Y8>>B4B^Ls&zPhOdMY+ji$OO)Rva#d4CN&e!Fz(Ae@Fop*B9}bNhxT*igp|R*4 zCF%SoQTPd*`5$oRf9X1)LM}DlcJk??NbK}=KLsiAFqpOaaX(yrJ$x=vFJ{+QlN z{T~$y6s!d`Vn;SDT>z65?f@+}+&? z?yff?nbp%XUDe%FU0t<%?`MBT+NdZG6qsjxC^e~RvJOmQo+qgYpP2g+3 znz}3+>N+`?#|-0#4T)5H)e8nKId2OvF|tt8iV;)>3wkh6cvvDST?jIcIQUV;L{uRH zPH*+<0)D!fp~vtaF?nj6j|Dy5NwL)FPOKRRzsaV_B8L95&{TH}9j5USZyiDkIfD>1|v1E|G`BeY{uO7YM{tmksu1yKHQL#AY13rgG40}1xR za*#lGS#E7%f!as1%kWTS0dRRkvaqjkArvOv6EocnABtUfzac!s1GG$Yj}!Lsn4MW#slJ)=x4J-FGKM;k za;6|K1Q004>wCV9BQmGqGPQKMj6VxUreKTtO=n+H?%eHbd$#*OJKGM&Uo&OIRYORj z<9WZ>An{^-xMjh10Z1s>P{T1J5tx1d_z$i-z8GpZ`BZ1-shN7_H8aBqI6Yh* zxoZ$CmNrwf_3Y@eWuf-}!4=G5$q4~bih4mHf*Ka|83MFyFcy#f6(%WTTTmQ+R3o$2 za$``diC`5nb;@;UYDdJ(!eD{_^V%Wl0NdMTc1S3uVw=;tYp2vWfQ!tD1%A&$?2vLHIvm+WsN*55Xt&$Q=!dTU1K*t80-xsEo*#wziJ$BjRXv9jZD zg3m*`LbdXE|4(SIfEm=w;qjm5+Ql8(ul68V3y8z`a>W0L6pHx@YbDfnBskrKc;~#o z5yh{31wMHVta|*#2A#ze&oU4hoMNAC#1z-PAnisp(?Q&^bN%_~*hDhy>^c$9^0gky zJA|ej#Q(u6xqEU)8C6onZ(#Nr8`n3$SERtPin2=a;tx|y9_yc%W{D5qF*+lU()_o()6kG?ebp9zoCKD`G+$R|%keLuE*kw$g#4*$|MC& zzZBq@z;NJM9LjXP<@RQEaG5%wQfcC6T5g&kQ$LIw8QKbIsV5jG7FRE-P1j%v2wT7uj;d}FAFu^h5! z{aQxiZv0=xQaH#DrR1t#t{o7lmaL+emc->EL@{36H1q-IJ836RA-&q@mREqk3^L4$WNG( z3`;}CcXv_xO5nnToAMk!8tJM(apzObu}r%?U~%-4lVCjH|6rpAfu?w?t9i^3ucVi8eQ8RfIV zepO2Uv(RwRt_D83)I@cVgGS+hIYhi4hXVxJiLauBpTxaxU z&ptx`JoX&DVhAw@8wF#m>obmhOwu}v<$B%Z%4rW#b1b@lI@|Km+iMs4?aTUf=Fn%8 zPBIop&2B$n8;Y)wI@KB70~it$D#G2F<$+K@({we1pExaC!XnVPw*K&ae6NmJsy_#% z?QIdjx%E+=$ejG$uGunosm1cb*^%``IOP{@RB(B#bJX5PN}x{}kJ|D?0hoU(uCPMBcD;vo zY{2QfMpVelJd*lz5)YhDRbP^U z4}t}O7~1wOeQVjkUtZ1h52_2Zrk@d$$Lk^)GrG{JFc*J3I?SS>7)LZ^<5?kO=pewp zD6hJSkA4+y`JBucZ@#L=|AsPn9BV((kJXnlK-CfSt$mb2Ua znK6c?ys$P0T;Tj3u27)3h5`XohN6+?5L4Deu=2o$y_I?pSu+wQdK+z|K0@#}I)Pzu zg0zbyx@>~OC%hZ_ue32=ZNwu4a6f29aKLjV|IQx6VkUUZZcLM9{7qdG@tGr4v>lP! z7{>IzjU1?N&*?TBLdQ?Rj-044J`qbEZ-HuOfUW1?suyNDBnLAvO3}X>pyXuVP%<4k z=LeUn?%!2$nC{FFAE}GV;}_GLiut&SS?_##-Y)hczwyBxD^MdN)5&BkZJmQ&F#ogD>zYMurik0?fdzYn-pfGoRN9^6-6)!jwwk(atxGwKf+aHyM;RSxJqEZ_S_?N+ zWCBJd0tuBPQDBIvE-qT_-(OJj>d(RA5KI^qw&e?>uCP$B3M-~6O$}O(Co!|GC`P_y zjg^_Edd{cQ3tB2fmio>fP+gT4X}fmL38t8Df}RQWX+-9%9M6ux?MJe@*gwZrADo;? zX84=5r&!YwhYv;8KAP&pe)vhjnwUEWPYTchA3`~dM5m6L&iDmWSl;4dO`x55@<)`g z5AD2ojjnUD{Cya{kw%uV@3Nz6yz^kr9iiJzDQxQ-wNNg%AluT3fElM>J3q1$?@#$~ zyDmaZdgbQzX|RfMBBeKa?eajebtd!ta-#wzpC^8OH3k69h^Rx=9%=E({gq$gcib({z~7pZ+_&@|rpb`h&FV3~8IgAsf`9 z^BTgfO;#wvDb2ee6(%qJ&5DuwllcfL#7qR1Ph^9${fEwh%Wo`kUdJl0xbgHhLbQel zxqtGY@d=7tcyinH9K}zVXt#B3UHa}suNXVLGKzk zmI~~>t#wbK)exJXfK5l}qba4#6>}9kNLfq_*c}$uEpXZCMIoo*NBVKAti2K^c}07% zDKqh?lJ`i_g@?(cg~ku_<%*YN*s)fR6=ze%8t6%v&EZ$A;p1)STP(+XHta}IE{QWH z12MJH{BE%yPdEfH0Na9Hnw}<(NO33l@9@`EM_AiB7v&$e9;V_C)(({}V8%Vt%H|^8;;DD1#f{iyxlA zag16@-BIQE#u|0VW^P>Pt6wzKYn4!&oT~+$sMZWsdhCyUTJgAliGh{Zdu{WqlVg$k zwF#UUSo3qa3lU(AN=>NAQTaXlWAi(%f%lfD2n93guUDo%X4aT1y>W7QzvU_4(6d;` zp>Q18c!m%X)}OHPk*G1dePq$FL=3wVBJYhn@Z%s5pj<_MHUh}pwEwtOaE?_QeDV67 z?{5C%!BSJ#$6IEnu^92`dw=5F##qh-gN?UZ;00-HIf}Atclzlr4_{{##{ZyIkW0_meavdwA$+I64QQEh-g$>;S&1Jy1ucnNiS4UNq;)7^1;^nq0oe*Fa!u1wEjdklx{-& zmY2!`NN3#E;dLd%>4dz@8WO`;bho1uZ?X!(n=_xaGasR}Eej7LPRFE8z;pfdeh*7; zV@KGv7yo3H^4;KdN8_Vamj|l|-Fwk=TlN$}zMBA^Spj9UsTA#f=4-4K3;+!^T+Qqa~L&kTU*Pv8jy<73c z_D!&1`z3B(c=Eh1qRnVo0tJ$N6&JchDje^XK4yiNaQqybw6RXj0pGKNmc4sBYU# z?z_70dVfuQ|A&et_&ji3j1WuxuGRH+zm=ML4StJ+gkJT0RV1k2_87-5 zxTW?Y&Bu#)Nc+U}f50X{f48ea*rJ%S4)CTI3QPlIg`oIo41GXJYaAL05u7H1Nk?j4 zDltA?E00V`DRl}}sVQwr%cD!dS#b6>VH3XzDLt|vgAxRQ6I*n);+*$)JnnQ53W;!Qf zbz>Yw`P^iQRf3YY(WVK^p-B=MsGqSuV+AnyR=Rl;uU)0%)}@NIgHr-$+?(@=0$uYN z-Y+O`N3p-Sn-6b%;?skd`4BHLzdFp}e>);+G9c=+&R$?66w%fUQ=`kg3R6>|S41pR z3mY|&F3SC-Qg)I>mvU<5ma8N14J}cYSsNd$s1WN{Uh;`yTU=hU_6gOu6WxWt?<%(+ zf>cC5!^xIue`-^b)$|VnR035*Wy?f4(M93@DMG(wUZvx6*(48KGA%6h1fne5 z|4OE;k!xYDtyDz?ff<$(q@qyVUj=Hkq(y2*icw@mk*X-TlmoU@!D#9lySBl5Pvy7i=nle&t(?b z_?MMR;(fWDyCOCN1v;|g^3)*Vr^^x8jf(8vqR^4Qz9HEepI<&v z5+_b}>CSa{pipD~8G+G1=@jo1S@($gH3ZC6cW+xoB=76Gw zEz*W9Qilpjq>G?9rl3gv+;N1H(Ez*|NuJ#td04uvKwH>4xPM4AJc6&%v6U_=b^ z!_`^7&{gJufX`AxCCN=v%R_WUb48n#k*20q&1taSDgxPo=E*UWB>0$70em+M_k7EY z5-j~ccGr35rL#}eXZG+KBod0l@Le9vG(b#LB;-=S4ybEAlHeLyZ8A^&Tnm#;T)8M-)!O;kPnGx4|+}S`-&}C!pI7uV{ zC2Z19PjlO2<;nWxEcJo&`zkE@E5Qt%ylcI@tK28_4&Bf%^R=D!<>6S>+lNu4R5kgW z34?wwA(e5|kJsA{H~D^zp>A>nO(g)+gNE;bf2eY@Cp78jrfZ9ZQ?UUjE1e zi4w|(6>$HQhEhl&1feL*Vq-8nx!12v?r;kI^@=WIPHrv;W!n<=*i@b6Hh%A>Zz;b)@ljzu8(tpI>SiTGOR7KI zI$QRT8BN;%^0PuD|AzA)P~WyR6D%Beyz0NUo6M0uL5G)roDl+3mLQD;f3%dw^z>yjH_|QSV+p!|J-6)HSR4~`1vHwcdsZo+^M9TQ&x`B$wKjZG zF61yCC$33964I*)*D`hyKy#^UdY&HZe}fB|xPxFnikt`ML_*>5$(WD_QxFBCZ@IAB~-6;^Cmdw6y4jw-mas=_j`vWizUzA;h> zuCA%64rnUMt^9I8lPFoCeFD~)Dav49KFzdcm)NEP^jC}wo?f5OQQXcU($#E|Hm(h za;x583RfyP?s0Eg9KyW$>>T4pU|u zGCx9|tkr$;)o0Xln%~)hI8$u)G>;U{FA9fWAaS9B|MeyA7;(|g0kg)WM;|{#mZI7} zhQyr*>8N|Vf!Vjx+P8jzXpa7%AE3+hNt5VraA>(N&tr<~8*r6z-VtQknx-Rosd67O z_NPim4io0LAgvxoJQuh&(OX;Rs5Mg>j$(uf1D*H$kFTX_#bW&1m6>L@DjFGqrC8*G7~9&LQgkpmN6MVZw|?#k4R>7l%#pjo zJA5A=^^RGFDXdc!^qt&&ON^>y-n~p8gbAgWO+g0;S~OepqZ@ksvquqeTya3jnFA7` zJH8MH>HiEmIW?V<0ogs7-eo#*>&|9bm`tE-L53l-d( z`gG1cnmZ~yP;$>@~l?#$4{JcCDaz@WAJ4?;AIT>@qTHP!a z`se2i{D|{WXSkVl8q<*>|Ey|O6iX$=3_6y()g{{r1 z-{TkvGIsQDS5m5de1& z&R&npwkwLla(~mFOF}^I)OX$aVUohJ;Id(1K0Hb^jSg^TAK7|`EhM>kGb-7uBnMM- zuNy&}Rt(sh(ISXFvkgfu;pEqATP#RdecjpH*;A&3Cq^cIpB3! z>r~T@y0XclqucNFmwE$*LFnsMzQ4L}N?TwEua?7lO$hH5oqZ>casGQwN3)$h0ncpX zyQ~yYNB%NiLpe3+ZRZfY*``yXv%yw0Q#pkT1EC;_wocIlCUZL+3%p(^g85SGhl2~( z)}1^#-gyp_Bua>9avStN#a?TB(TG(W2sz_oeFMfCX zT#neDnl_!r#rLb%pi|en(bwv+ujfl=c11U&G^9vBJL9n>ETXh26jGKg$XLh3G!!;) z7B<)nY?kC6g*gd$oj5FbU+g+0%794}ZJI79yo3e!tz=4fGy^J?pM|8IO?ptDt&k>p z(T<*M66)c|frzL_^`!2qRlU-U%;=S4CWMCE&C96$j0&#Y;fHJWR!e{nQQB7-$YMFG zE=I1hmIe<{$2}m-{UW--+b}9HPB&YgqNZ(D*8){h-dg?3cAD>YAv3XE%fg5mN3fNsvI-(#L^VoG+#^g_^;?>xDO??+k6g5`DDy!vK-A=C3AVM8t; zK@GR0vxExlJMU+`sAl~0`6_&j9V%sw)GTo$;&T0!ijo`>(~VwLMH9m#B`(obRSkyg zOFk^I^$q81?N3bKeIe!vsV}~g75v)Qap(35Z^smWGY0g(N;y>TZgJ%hL2mMH{rI3y zOVK#;Jh%|)>)j(N%~wbm*2!E&7-r9-wd8orxbl%O&>l=gu{g4t%d6HyZmX( z9;@V?QXAkxGmDU1Yp8@oF~~wwk!XmMOv7NLlz&?qijy2oi$OqOCm0|a=>2QYm_%u} zofC328_7)pr8GqsZnRAn1wI*Z-}Xx`i4qD8JPZnr1r?fbZlwe=*r@LIwxZf4N^Tms zT1VhgT>;FfIaCl9&CKNtxEYHx3Joj(RB(w^@LAta1!p9}W<~Pmq+f0vNYsQX zd;!LUS>;l_G$&+KE?GR&GM(^<%(*%*S$uXXdi%7Ey>R}NRuY$dKne;K>5K2nH5#v~ z%LvH}#SN&avc}KC~YKd)Ff+k^yY~cGIbhq_EgZD-J6@rl;hxMJrrLP zeKcgt(v!H9WM&cFQt*ZCMvf@X*^wIqEcI*D7S%Q{x?_~r>v{L|w8U`tVs&hIEO)(U6}!GfM> zuah~tLV|HYKbCSPo@9-0)48q_PoX0n9Xpfl1v{Seu)ZWp;R{tIRoK0uYQbrr!`Icp zw^@Pzal_bz@$0(7nR*1=BH2#IDM>W)mTbm$7Q~qBj#n-Zsv*Rh+fEx3twryMC>%wb zGDYb~*WThc(6H)ws*Bb7^*iBH`vAIbOf2ddF|?9B2ZJrh*Xrh-hUe1FNtpMass^O_ zi!XJLhwV?N6?yMx9$Y8s9wy}B7f*V4Cqu{gz}vy?X|MwMmcJFKv1}1%>EA2- zDT!Bfy@^ou?`47e~szpm=PHqY!Gk=YdtDOL=ve1~OW* zQ9^>N?NP$Y-=wlA|xjTWw3jR=4rkSl24s$~65c1Bs7Y0H2eJ1yzhkxnY#Ec7=M#Z%Ww$WxyAzq16bfU%D zT`00Y+;$utcvpKT=Lt_2r1LLRfiRg1DgPi-uCh*%x`}8wkYBs8j~)T(N-;U)2$oTJ z80m_GE%gdC{Z1oFbF7I?V|h>Q&hp(UlcTL;u*q6)t&TnHN)sBBt8D}+Ml66d#JSu3 z(bbln5Rw2t7HKHO(8|%4o0F}{3l$?$FWoo?$=l~kT@I*!TSRCQYz#8M78=d>|7~A- zf+u!+>f;v2i#EBk7^1?a0P?|wo%Z-3dP6A9B`&UfifD0)@QBro)ml3#>73vTpTaG$;{K0h}u_y1tB; zzUT8t+PJcWjN~C#CW%o9GpYmDO?erwb$R7RRieH*HJzcZRso09=&1HgOCLqwM875lGD_|c2||9yxEQ{XR-x1i&{rXWQl`ajX}Q|&jZc^+Gt zSO;*}6m*kAumRVE|EsJlLWM=w2A&3(-~vz6Jt?V7#P;Pr^8Ug99K!#-iz70!v|c4g z4=J?MTn&GX1|7nGH1sh2g688%b47q>Cd*I3-_Q`j&PB&B%0j+F`u~WPq>A$2M^p>I z9>ddASh7>>|IwTq|CSL=qt#_?h*W5+@;2%&nT)6O|4-t!J5H8|kZ^H`?KGFeEUf=~ z4F8S>0gfGt==o0;p&QRFZ%O_9!`xoM4Fc8e%Zx?Hq3)t^pn16r%cA2|bc=2}qx=VlSulK^4K7#5p zveWnMKBU7}p2x2LeIdR*x{ulo>GtaMomZtgTbqjr#vst2#p|>F1#(YKYWp{jBxb(@ zjF+v%IOZX{ty4duJ0K^Os!mOL61t<_@#ec1e{h@Gn#Q|{rj~{me2~7j#>$i0@%*IX ziIKo#6fnD#55vQ!ZsJw@uvG(@i(j5WtesHj8~>|=ct2z9*>BSA4EeZLvokjh9n z)I?}}b19HNN``HWi0$yzlk-}>rR)dn2V6R~fV1xeh}PR*8;W?6c-1g^J@CL&`5)?h z>WuA8AXWgmXQ*N`O5>sC&x=t;)G$U|)}a{O)QoOmTDie!HGNwgfkeOvQnO^PU6fFZ zVl4CKdZ<=4NGQcw#=CoHZj37YF!3}i0eQM=7C7&Qb7w>TsY{wuMaLj8Sy1I(gd>{* zIf=v~nU%-j6LsTC(1V2ao+&?7qZ4_f)k^#-PNhmBuo4f_uw$+%XQ=4D=ZrakKd|=Z zxjKcCdC^(iSxb>uR;SUPia1f-S72Vi^atj8448y*TmPT#y-yptqAKd(a)a=+d!~?3 z!2IGO**^34HmNas?G?PZEq(_dI<7cvEaY!!)!&DAYl+sUwyl&0oZWKq&gk7kh`^K{ART3o3H6At&JJkw^ zjJQQqVr_oHzcH&#(bXDnGsY@U^GphkRL%>IoQa0Tbm>^YpfgAC4mU<)1kk9U(Sss- z`tSPtwVUoDwW`Xe>8S7owFkskDbx_@pfQ6YMFw(>l~`$&@s*=Lv+@q4*^8H?AwV&R zvx>9g4McM&aIhl0GG^fXNAidY(J6kUBKR_hGUM(tzt=T9VDH`DZdGw^W~-QWa#m{{ z>W)R&6y<9O4qNNxfK9@Pq(zpw9g_^MfDGXnRca;l(sUc)?a){w4EvS>}E{XOz+>oL!} zpul1S$(_$1aURo}^nY$UQ&|sjPK4tnqj^O;(Lw@(z=@`#^nNzMdB(si@czmI^jKgs z!3iZcnWoJN^WP+(kHQr}L zz~zB>mP5ThsBq?aDe}Ba?>3mq>)TywfU4isB-Ro|j*Q#q&Y971*((IJX89#B6E_#!4#68g@gw zad=KVg=EWcxz0qbYVxgxdCi_moDkhg%_=_cT#{C}xjqZp!`|V)TT{);sk`3;`Dk|S z#BDK4eEtmcb==D1@vXz+&}0yT1qs8`&g5+2<62p~)+$_PXT9aEoi6-Y`SH&d{2pg-x{6~8XZ^q9V4q4C4i z`HKqW0hp>Ps`u$bipSJ9Ng#ppBMiU0V93{<&g`Ai5IoLMD809=etByW%D!WtMELof z@iZ7)*fsA`G|J4qabNdk`9U$>H!^GiUZF{ZQ@?vj*^*`sTSvvM;}BRXBNm|UUaT4F zs?wu?vRq7EF6z{~YmdN2-YHUrut zBgs3_TV)0#8}wF~FB8*y7)hl?`TxqV4uga6Vz4k*MkMK@3z$G169&f~jK_T*`c~CF z{|&TAa{-aNqCnh^*zfH_VB#Qb=-Btp&*u@i9nG`nuc{ZhnAeE)^)s4?$>Q|5bFlj* zFVK;HmbszSA=J0|>qcL%>GP*U+f&gpGIWIN?dI{rGC(MT=*C*MbW1p|N9-y&o5v)8v4Ftn-12--jXv^ClS zUHFfi{W)6}h57w6>TN&@gJrd!0o_(tHZ$d3b;=d>6!N_>twQvSLidlHTW01@M_D|& ztPZ%XK*-8C*Bo;})sYtNK(tK}34h z5fxJ=dTQz!_VKb?hDP{^``~^nNtvU4DNAdcO7=s#zKHVd2!>oUO$2>)lHtzi!BQQb z%K@X+k9FSKIV+X7k#{>bAjI-%{$}rVDmGM6r-QpAu#R4XLX9ong*T53Q9}_Zf$d|W zPz~Pceq)hm^R?WrjO?Z8V_y0sia`ZGm+c^iQrzO{xF6mtJu7Z>__0prb4IcV9fMjB z8EiG&tW8o7p7o;b^PUxu*kNXKiZ7?KduE}jMtc6J7|^DUWcSOB>z=|Bktvw zuMTGD6KRIE8v%=-!@NwJ?ejGH!q`O8bLEw&oEor4DR^zHg4r4oi{+zUp*aiFQrM|F z{1I@_qu~Z2O`H>18}}pS7wtZXo3LRsg4RaV5t#9eIxi0D;v|{g#HRt{;0V2tMu99M zY1U}PDZd4&GC#quriu4S;U^hc_M{ogvrzpjjG~c>x`P!uLIy<>g$fouc*M+OV_2Ps zg35%PiIS%e2_-}(@n{-t}`_9_}4+Pf*K6rQ6BToHsZYm3C>uo_< zoJ<^ms!CB_z63_-e(b@T>$DFaIW)1p8>fKa`mS?OD6+%I&CcSddhNYlH)NcMUr(Ux zMnKTBr5M@3#}&ot*?LgU^_1;ug8rcOs`rbd(-A={6M#LGph30A?VP#N5=-tN*qK2(Ez!s zIbu=lC@7MN2+yI`#v!^h)%jrB&AR9lg}X1e;P;KjFMghK#mHfyI#PWOVr}{-t=9+W z;(E=gDFCyueROuUfn!M&vu1Q#Y+GzK0Om$$aPhV6$FEZz_Xlsw4#tMgv$(#uq&RNX zfiVYu{^54FkN$*PZT$Yv+Ftg4L%hp;zX?-2g?3}*nltN9TW?ZKQ$NaJ%g-)_4)Q|@ z2>rf!v0whf*Y)|etm_l^A(Osiw(ooM{^`pKYd!E~1bM!^shYu4^YIk`4f&t^ww~rQ zhHLJQbDtImLYl9L)l>JXagBY;zB?+l$d)5WE&P2klFY0zUiT#U!Vm%iFoy=QK%y}|JtgdH96OG$Ux_3X;2 zZ~|4I%x#@QZftAM97yh-K7`!gn*b^>xmH31f~Gqz|K`_+DUEC%n@nT| z3vO@=*aX>-+P94H>b4ygHge#ntS+$sV_OS7E<~Qy^xKT;gSkvI5gSyf9h1Gjqed{_ zkD>scMu@d?I?zb9a&|r>+@?E-1Ezjxx`bLerNiQj)E_A71R-{um`>#yVaiK1mWe!B z8Rm$%btHTYL+-j8rKF0co4z}7h&3m?buSb}KFMCIlg>wOyeI9H-cv#D4%6Sm><%+x zz02}lr>IGN4$2+z*R2+DeBu8sD7nM(kXo1Q*y3k+GjX@{*#E|h^Z06b4CHt#V>lXT zxhpOE`z!gLlJ&I;U4PU1_;bq5>h18GbD-D^nRKUSVvh5QPr*aWjrTK;)2~Gb=vk*< zjOk2-Z4N)As#&7Oa&-GO4#llrYZ;@YU_LcZ#L*+`RU`3wvDWe5-C?6#&_Ov}^mJVh z8k~|ekeHm@dS7ncb%Z%>vH)3G^gT+p3oi$WCHUZWjg?l9+pzV)TD_HdBMeUzVv(@5 zWK**`lv6N_REh&9 zBcwoL9d_q`+s~EUmAnO2;!{h4ohaM-uy?pD=EAmQT?=Ym zf)>G&*$NFj)!T2Bbb98eQ5;;qTbf%)#UGQHhWN~*s}G0!rdLm4^jUU#G~XT%869hP z^#S3Ud!44`W>ZEqaXu%FfZ@Mo_G+8#IQ7>%dyIb77Qr7HNglbMf_91|Kw z)fGchd;Ig5C*Gc6oz706OX>KL7xCFm^n7cPDNz=qzLP?xG905H*4Xp|tM`#&qKnZa z(d+q=a%IPNA9Q5*!oFDN?46RIx=s$P-0iVBpPAwh3b;DEg#ZnjB0F#`V|JsfP3n)k zKV*Dj$AZ4VlrTIiR2)D>>2fsj+t5mKd^Dgzhuk*Tu7~SRxvfL_%81m>$O`5;Q=;&) zP>ERinHKL&HK2N$CxR%^TlnSdG&A@8mh-ziaT0Fl-!V5iXv}?ff4pE|fb{Cn^;4PK z)dU%9>;5Ok9nkguhq>B-+6+nNjDupM-*@f$YiishBShl4L~;!>y|cZ`75Nd>8K8&&bF;?Ks!1l)3+4$vX-1EbsCc^-iQ5UF<9_7UT61yj5lY3=4%i`+|Lr+l z#wzSd!XKN#A3P-3JC`WwDWClZdaHKnQLCY^UR+V)h2mV$b@w^CcyH+Q6tPEvAqQN+ zLm4xkvLL_Y(#hJNg;e@zuKlQb5eJu@7-9>^?>`D_l{s!dtk7BO4QCVg`InD#Jf?E6 zUYWiE#;q`27K~)ri&8Zg0%3EKhR-c6Doo~Om><+hlVreA6RRT59VK`ZN#Tx9C5L|e zQE0G+I~&1lS}`6)#rokqgL|kI{ooY6#xuMbx)NVB&p#T(FyP57lCsMiXiD4rfn1Ii z8@~?2r#?Alo?&304p&BYBH@ZQ_SJ>OtNj)RDCp#h$V{iHn3vI9B&MRo@+r7gEXWr1 zoUpb2j-BW;p~gW2vOOGFOH1xy8Jcn&8nc)4U7pb*dRrYe-_qKDwmqHM+4oGd51Qqd zUpj+AOENVvM>z{tX=6TIoImv2Qn~+VlIxVz3? zgy}h`&s89vzmT2mu~%=s@49ux)=x9&L;GTG(}x?yWYSH%#avs1!Qghao5Hc$Xf_3> zt&~Rzj~70m9q`Kijo!T(;YL~#1h%wkOJS@vRMG$v%JGre^lt(9grK>CC?!kJnAju;cVP0A&k zCvH0;=$ApMJ!AU=4sBz{Oa+l6?(%J8@|lR_1wRp6$K@TZn38NWO3mEcbm!UrBTHOs zT!Hu9UM^!?<8*-BIGt`pG5^vF=o_;YTy?a;K8&>(S!e6p5De>UEdgegsp6uwT9p-T zYA}^EOBsX7Q5$jF0FT_#iFwGtCZ4i82K@c$VJej~!l^{HwaDBmCA(sJGxxl}SM5xM z;8Eq!+{4~rQ42#xCyFtAi(7+9QvR=ZU@_L8pTA1390J6-%1yb@F?GW@JS(wDXZ_OZ zSM+{=r!7~4*F?KrKiK_myn8P5&g)EGkYbh%~n&RH5 z6=%IdJju%{K2Q2YO4Mm^sZ}r5c<^>;q*f;-=ltz^BaRqJMk-LaQfOe_%RhbLcA`!y z_`}c*uysPvzfLNd85w{}NC?Iay2X#yoYo(Fv%tz0RodfHC-vD^%an0v*_@lP5~Z<02xp0pwhXRm6|CE=dq@qDGR8SGQTUMmm0hk z%CT94e+tmH&ZWwu%H!n!3^J@N#ZB$yp59IYuO+#s7Sf!1Pq!!ky0D+Ks$0vbt#SfO z`S5p^drNLFi+RyGS;)y-yKrxG@ZyCR@|q)Mt`J~3W5-SOEF6Tl$BTst=SS|!}->kKReNX>?PGn zz&AJs$X76sL^9r{*@OYjells;YX}DM?=QmJ)R*WFa4(Sl^DuvoJ$2phBKs=T5(1Ex+0g-i%$dG-xy?$1_TVsS zafc*3-CoPzcQiBZ){N@jaQn%lhge)u@czni4i+f|$~YMMX9SjL(9cVC zOgwFOs~#*x8ZirQ4&Gx#Nql79AO=^4Ib2ujo0(~0F$m{NU}kz-JzrETXyZZM(vk## z!3<)0MO^f;bPW|N2%0o(xXNW87KOz3w?Ue%(*!!+@XWm9&J&x>TP9Fvne(=>1gR{X~DAU zX=xE3^6?C@fqi-sw9OgfF-Yzd0H|E`qul?lWdp5mU{AyCh{v`3Ta!EV>c54aRsQ51 zMB9vQev%$6d9J=ZP@bnA%e}lz5iDL;_UQ>>E{F}p|1PjW9HFFj&smypm%>fTbI>X8 zO3M}e(Tr{2z$H|J{-@9?XbHXxJ7)N`(VhC8$=w7WaLefPMzqdG-l zW=|wa^td4#?=YhA&acM;IGxyWQJ8eF|EecXyl6Ba#R1-}8{e%WdyDTrC-4UVvd6u7 zuHO;Q*QFz-&jL_mZy&Ny((?ilZR>Am#|`=VIoJvCKxe8T2Id>+^p+z2k3JsIeo=$Q z`!UcxW(l2%u))DTJ>Kn=GK|Qv2inf^LDYPkU+zx6#v)Jv{d1~V0&Zm}_TN3pQ>uZQ z8~@u3%>On6b5JvwK>WM0FgwHq04kn?ox6f0IQoa&`rus}hc7~LMu!OK_QA1#Od}w^=kg`8g za`>>)%wX}qLZQIUnj1WAwvutlznnEYH=;sy%*{-hP*NPD@PEbrH#sGGk1=)j@=1QJ z4jN$|s1`=5|1BSx;>R0H0D1X5gB1d7^g7By@D%PkN@{C(Ll!7&0Pid9g72c}u9YHr z&#P5%G76{)`P^I~VF6OQn1p0Gbb=83Je#>|Ph1$i`WKi6E0<#RqvG&dUN_8B(b8%* z9j0U1Uto1n!xnE+5yP)oQWB(}L09_!it1miJdh8yA4x ztU)?_qyzuoPWW$U3>NRySxYFz7yn3=zMuAC^BT0MTt6rU{7gI!&FSIL-zCy7Ff_2# zM4*p_Jr10c8&J7skx;sGbd*p+d9M!mf9i8EzJP^!Ui#BWDX(tZb@QAOiu13I|C>UI zT^glHD=8HpJP_w>(Nl#;m*9yQoA-d#O{ZkYjAv;*?NU>jBJ=3|$vXX{m<{T7cqLq@ z(!qN&pJmTq5$!hgUdX`2N#8j zD~U^9JvctPMR0Y~s(vd}-{>4NV!{~TFvuqf+LAgTWI(e^iUQtLXjf&*rn zvGQ5_@(IzoRWZjd6Lx_uqH1gmC1QK-!~32}R=7M4tZ}+rp2+JBI-UDtHiY>tV_E}s zO;2z0W7 zwQpIy-(K#kUKuk#LT8rltp2F_^%tn}(048UsshZp0uMfy36F+!K52h^vmnY=%tSko zGlu?*yI^QhJ-8xe&7d3Tq(6Uayg0CT8}+)P_k2wwlSY8kT-;D&66fq#x|ZT%Ual(M~rDV zB_jgH3J|^?(lQb$@z|n&*oer5HM6CtVnk!&h6h5@XHY!;{3PCYRB(xljh$-w=E#g` z=t}b$6T8ilH`3`$LMVa}RI8Zy=uIk&xcH)!L_&N{o6}isN_>2LoSv9CQlg!hI4Qhs ze*T7#gv35AWywQjd`w#~vir^H+|jc4zAT{P$uQO~kEpjyaNDt;wzF}a@Aa^Td-sT^ zs*z(;dhN#EHRF$x{^#LnjD+poqWk9yUXfNR+@xUmN0^vYD`5}@Xch9Ubob=PqG%t; zR>4luXhYAT`eByc=jwfxX4S~!%vkk z3UQl|X!KK-3EIAIQ^gAzb{IAu9rHu@ zKH%PUFKBt>-TJQLk~d?1N&)4? z!hudop~oc{#*C+*~v<|CGV5#jd?JGcC^?dF`5^(4zbpS9i_fzy9gQ_C$# zpH~n{7(83c)MMmiQd#p+MH*rHUCTllZ~A<=07j?45G__95-3lbNWm z8<-nJRjwC`J(a`@=6;orrVxuKmT%tSy2MX+`>$15UgCx=4gr&vnDIPJr~#2oKCDBQ z1uGR8#gizzg9-K*?8@1Yv!fU@3PFVZa{xMGL+j%Tb&s8*40Zpg9Kbd&!{{+62Td4+ z7=$Ryi}oTXEnl3-{UR4;5zvDeDv_CTG5OIrw%}haY-o7!AEAO7Dd>p>#l=;!<>V+R z(9q!Fp@OC`(4}oCn$(4af*9ebDA0g^e)Sh%M-Myyi7On}f+2Ect#}{Vz(r}Ip zvH?)sALo-Y(KDZXl2QK-E~4UIic^odgx&b1SGPH2h3QVZs<^2O(8}$2)AUV=tBq~k z*EA^uXgOS*XI+8WmS6W=Thrxzt9KK8v6@s~2pa(V1Won*OJydYA9GK@{SSnd7c@Qe z*f-O))ulvtaa4sx>V%1aN4PGXzM^jv(#aE?Yx?S3UH3SL=&?`9L^|hBV){qzfDz#d z*bmHwLtU{3p@&H!N>yT9q713@+Haede!KOx*qer^Ax1CZ#zRwc6`Y&r`N=c}tQdQi0YZyM)yBW!a2p(jPtx$MFWnupGpb0b~E z3skKg5ZXY8!t}!Q!~7+QOy@N({A;;3Cpf9c*p=CTOxWQ60w~l!VbJA4;QGz~aDWfQ z1gQ(U5O51(w}GV#Y}y$khou9j!*9RP<^bHx&Gf_|kdTOi;Q!KkC7CzDunOY18MjE^ zX#ZFABXNHrtOuQcSwTEpN8kOP({}81-+GSpl4kC7PKv6T(x+*-zVui}ojQa|Lg&z7 z-kwxunZGo}_$v?dbiy-x?_7AXaRPs&D^6XtQrcBpxMaAoc{5$HFzJB?NZk7vQOdJ` zjx)P*2bjgPbs|MLP<%{E&lc**(ZiW#Ocr6FnVH)ZuclB#8{j7t>B^-zP8s!^%$1T* zwVKJ*lZW9j#-@>Ibn(Lo!YCj&#p-yN-BafllZPgR3K0nP7qVx3Kxj%FIS8v|hgTd& z1uZGN1MnEas`2tU*pw0ytqwxmQI!-&?xSLuQ=Ty~xzV{4``8BI6!Heo zWF+t?P$B+8{JCD~V^gxk{O?XlF+%2_*7_Ax34&^igayR56hCm}#FcA};1iXSB zMH`!vBt>v6BQ`vI5TbMOCG`8S!x(P{Kg-DXLnBZ_eW@>ufkKIbB3_+1S1u=8j&>NB zEtaeN3Khf%MJhxAw)X>8Ifb9pad^BvCP|KQDd*@=uB1p@G(Kq3JzL@fk}|%_JkG&X zv2>w9UiyRZb_0bdQ{1EqWa&52-M^b$oXa(MLgvB#A{~0{$T++H)4?Jk{s=h6s1X(+ zh4Komc~~~tbRw%#qIvWR=Wow~EC;hdp+bphC^hMf`loDTL1tDymIG|l8@Ni?5Qw7R15SEsFNp6h>S^(WIV(u|p67`NiUP1sd8iu#$G977uo$11+&| z)-sVcErP24-#S)|$eX7SI5C|_In*Z;!eM*tNLiavYEf#Zz>25#d=H&tLRz+fTP(#C za>@JHiJj!GFd{vVmKy$)AKD8#fBsrDcFbezO7E;C&GGNJIA7Ba$TYK7^bZcw6vYHM zl8d#x1O&o^vnsMCGlHHvqU}Wf1h^Hm-QeL%*cC_{@TLgAw7|4xYaLF##>|nLMNim8 zrABG8mxFC02d18@liDe^0fsn0n^k9=Oaiq4n_n7zd6NPJaW5#*Hs!9{^<)Fw($4$- znK=ec->(C2M|9BV<-}s0$&b=hG~A-wTFh`1G2&@frXb(jQ_xApa8qQQ$o|X@tRc({ zOW{Hsh3T#Y9GANTYkD*Hd1H?ElB`Eg+nPd`x}P{(A9U>>HW^w|0GcPy_9LqXvt1oS zvbN_w^&L-C-g{PSUG@!q9LYmS8$+B=)5!# z%SogC#LZ=DcG_njA*IR$p}?WR0(|*@f7NRvsRmI~tUh-KiCCl2!(u^(9oEE-G)|&Z02R$1f zLk~IvTp`{2-bi4cAggL?k@2x2XFq_>BfbZ~oxON8dPlW!YI`vQoP?y|Vgh89;X(ezw`HTEI55HsSdC@)E9&x-RN7i~#@G`$Ra;>V zm$ViL$vsu*1wm;^REJtsg(FlQLv z%lsDuVTeH3wk3K?4a9oJeD&N=X9ksdVY{kw18E_{!Ug>p_WZ5qE*dy|4SFSd69ACD%1r3) z=%xb3CD6s4WQSZ6x-+^n>kW_8tH{NjEa;l@z@d-cc^doO-~mhk9>q!1z!v+T3u)CTgsEDx5{4R*;Drm zimE2)uXSksIAMKsu}G>Mq5K_Sp%qO*=q8YhM=nnjARZrIQ&{O(49~f^2^!d0>Uwgl z>`tWy>oK^UDB`l;C#k9Hh!G!2CoG#La>|b~0tD5=zA(n~i}8a-b2$o@Sr*|Ojk_B` zY_5hViOlV|N3&o?SgQX_N8gK^QL_FsDb;WLcS;I?=A`}t42)gr&EcTK+#Iest#|xs zmXR{0!aD3Kiv&|VO#=j#yV6ztQLP9vOLfafNjgx4gaV_wBd)JIkC*OvP93jSWc%%( zw>ho`Ug>=vH!n;$aDpcDUk8h)=}!mzV<(~dWIXGSVUFGW zgNMZ{Q;QU`N@P^12_eHmyQ}go#(GL79ueW$FCd% zaD2<^5g9QnZQ;a@9f;Now*_hMu%g}B`-zXFs7F*MH64*v2#uV92Njgz&&HqrRfa-_ z;P4}+Y$Nvw3Fq=x;`=3Im=m7_u1uMVF~OYprM*eOj!U? z3A_~LSjjA_=k=>pLzA{(a-h2fY#hYrqzJ*>%{&}X&oo{Yz!Sf2NM4ZQ=zdPt+La8y zV?yD+Q%^H8yCD6m;Ar?VkrddcenWag`gba);*-00XlEcTe^R#ONg1%V{>$R?i)8qv zAy$M@>rMYg2fvDQYFE;`I@8fNsJ)5bNk&TBSZn0TbTvshtwQ&)T|$`_cusJwMzF^P z?&1z({;ed?R5PSAqzADj>1fU&pv<8|4N%lvezC5^+Wwo8M=-(1JH~vvry<5%+2TA? zp)4pq=blYFm8B9uu>!YLG}@+ugIO zyL&;l)JA%41(C(GOhyLHa&ME*d_}X8HJ&4@XANff%rTmPShHCe3PeJnz&Z!v((#0y zn&JzOgIXNDDUziF(Mj#C46~P$D0X0cLw?Edj-424eu#@hK3T9h>U2+p(D{!`8E9;r ze7LEZgI@4>GW{Hk0=NRWDJM5hA+y*mhD|9uGPby`y880uP|Ccbp}mfCw0+P6I01S9 zqsc(Z;D9MebAM(ADJ>RrgJib!kVvw;aj0Cj;EBKqBbi4@!MFxSLXJ3bxg4e(rmhr3 zlR~t8im|Q~Jh}=ZCeWiAPw7KGO^m0k3Kh_I&xFtPG|8y0Ra|AtRS3m*D>6PBg~p5A zpZ5z>H~CP*d0$^Ala;sW#>UzBLo6?>1O!iI(DAwc%?miu&cekP0X9x44gR<)ct474|)pqaF;w-MH>U2@tm`jtk1C3VcAn zVS#3Mw^3-lD!f9Tm8@zDKs4Wd9Uu0bP>f}Oi?7@4CR@KIxtVEp`r}5tzL8a<2~y-( zcy%4Rt&TyBHCCe&DbJ6Uu*`-QwEIZ`*C40L|Fe-&XuRCsHuMn;_yOc z&8}hxnAs&~ha>NnZ(4sCn4|;ODF4Q@qx1fa-{gVhA?;i4DY6nMCFGe!`CYW*B+FkE zT@-GU?Jt9UCYY_r0(A(zOX*PzSxx!gq?isxrKfB~TB?-^O4Vr4Ign^u@%DE?Y_oW2 zsRUDhnD_ggC?h)>Ss5LH%sdcDc$3m>gb&5CMUnohzW(lGQ%g5yz&JS%#LYHHL&puAApdja!o%VQl)KlbD z6N?7IW0MP*g15+F?IE2*D6#8|@Y-3n=sdEKdM2vC lZ@wImV8=hf)@WIXNo{ja$Qj<@*-v==Pk9)`{jbkm-< zYM26@^B`DwuBJ2aFl{tSP05~8HCQrI_N(J$)>^lNtmjBw>Kyda6Y=BXu|Sc`aEtZS-!%lk*#PQ>3Qr z3gwK`G0lUGcML5o)Pzq}Wm}!+9hLVNcMyPy$ri1r(H0o{lJwTjd& zIQQVZg2WwNhm#Ht0i%<-2m$l_Wd9Sa`=wWB=+_07um5?NEX3TB>z8M7)97}^jKMeO zQk~tu<9Gmpwetl<6^rNf5^k8w_e-O^ElDKNl(0KDL@lK3O z=Q?tlgl9jw9(KO7>K`VLHFI4o%a(4am)R`**nK-G9yrS(?6ZPA-u#<3`NU z$WNx$Bo+AIQgz_JDt1*=vw=WTpYVaF$9HA|@DDZN2haad6Uv+R{|6=|`wKTs(Chr1 z@#6I*3vhqo*u?!Y5oj^$GXZG^&a4l3fAx>`IPTSR@Cae!h?zz$m*1HG=4a+j#%zsJ zE(~p{;DKQHow9>RvKf!UJs|v-i%8ZzUddEj`O|(oddq{?(CrN1GPG}9*~cC;emr*& zGBe6N^SLC*1B$4D`%9+L8a$TxUPSD34y+txQCj^y)n5e3y^_&sTU%doj+hbDV&ppZ zNUcmh>1?uuqS>__Hfil&M1sxO?vu$!UV>bN_vQ+D1g$!Gy+T1w+*Eq@1SC%#tzvhhEv8hhG&)XS=LD`BG>=3PU`Q;GWOq1?>^CyV# z4QVXdmS+3Q;57O19veGMy5`CD548Ed87K4BAmzzI95oFWP@1p4{{HH94OIZLxD*cH(pz)ZAcs6 zL-JG#MiNF!INt#Km=KjpZDmc0Ntf4u0ts^WSh1H?NR@@(GpA=+{arQua{}^zB#OK3 zM=+JrFW&5{$zjt#8ltNq86>k^!|fpPTvSqZ{xOJJ5%ENCOb4sa5y&7J{~AHZGTMd= zWc>Akpu77bD2shieK=WUu+MzQX!o{ zA?C~qRUrx%Dzb3>+-yb9K9|GIjd21l{@=SaI?tze^k|H4l4fdN94{CL+;Q+5DU<>X0; zE$R5jO)u6bVL#rpx?b5oHnrqY$uw%Wq$Zs6Df1_jx`lmKR4-2zH%VMQmTxew%ESnd z=#YcpMt(oeUy%QPO50f0x+m|%49IJE;3j;k_Bg|1rIdlCN`b zMY;~>`&WwyRsF9P(5)YTrh0FF$Tj(9F#rmeUXj6EXSt`u&17m4{~8pq&Gd(xpyLr6 zhn-G)4?2CzRq#;URg>OozBcD&N;#7>drZl z_X{ebf!s3wb3ody_k#5Juza!0>*R(5fwo~zi$(MwC0~YhxQNa33O@9kDP#*Q3NGdu zpI^BAtS0BA%r=gyKo>ESLenc~`Dlg{C%>pp*z<7`xSasW$MWO8J-2uB&30FolSh}^ z%zY+j-apKqiviIZ1ho_E*9)vZO&8O!%K5qSt+yZ44H{nPch92)_1?RQKN7yBTLWCD zrYBbaaDTqsr94oF?cGFt$r|9FKc*}Dm5_CRdzYXv&g~jBu@A@*aj^DkaDS+i+yNrC z#~(5BsVLeU6}?OlvnInGb{Q=3&DA&judT}MYQo5p8nG|a?5+o=Uqw#4$~KhGT0XiZ zd=u*`JK0jEscDxObK){IQ{J_A`^Lotv$6a24eLACQzc8r^p^mbjDRuz{pcYnBw9N0 z{bVy!t~5bX$B;4pvSJL>WfzM>i>c#@$4G($(eqtknz zVT25h{Mq=pSoN>jwtQ_Rp#`|eGxLy=%~H%De%ObME|MJQMCUMncNZ=Zl@#@hzzY~6 zKRZ1fY&;P#4_+icIWnua_BH#(n&4|@0sRb!T$7Yk9L6M%MoA7 zDXVNHV>$Kjf;`f_wuCj?iO_FaPVDV|{WISVnFA`y0fZfgLsPG?jf3~LgEtKPTQt=B z@Br^OqUA@OMa1j3T%))rLJnhiwu*OB!5FS{BZ^%9^OR`l{H*<_p|C41ix%Z}% z+cl#=kEtpqnYg?T>s=j83eOPP(Yg;sV%vQs!H(iMNt9hik4SHCmB27^(zfvYNvYT6 zpon;9t?(HD`Mt~uloKe9Agni*gH2FiZ8G|569HSQSwrTJ!XJ|DJTQfu7P!O}orxC@ zD*=g~&qB1_O1+K3-zO}mAg3_FU6h>^AdeLjq!N*H92I3zd_dm{W~?pF>Rgka?lizr zYG<5RTBpp0=T<=i3v*TqVJq&kF?Sdm`T64cN53u5b@8{jxae}jb=uMVLhDXst>UJ|PamiUtHX6FV)j2)+it+s;qx}sf!e|_ zLs;e0X)wthi+lpn-EhuzuMX~gc$wCj>A(5cwtrz6qB;h#N zBG`W7Xx=SG^-cEaEQXF$Ff+4``Fd1r^*m&w-$FbqHw#!j(M*sSF8kKr*$*nU8aE&Z z4tlk(xKt&N#cK$mEoWA9qlo<9)6k|O*+j91bzu`_hCiW)ZG9^Kfd&T~kFJ9cZfsco zgKv>9TVo3r4WeA)vPe1L`63J6A*fIMCc3)t@A5n=|J$)O+bK_J)6G99&Y#5~6lVwj z|DZTMu2vUh`|e+Dew}y$NSFWPj|TEfdfV)>fgH21#~t1JcRvqnbmHP;1%4NjPUbyuhM=C>qKrpQO zsRSCeLYxXKtMIv0NYc}>&7KTU*iEvBDuw8Ns4H_0UUCM0V)lkne7JNVZWL@UC()rn z_=(BMs$;M(LRJW+$yU4W*Kxk8;{XXA6UVWUw394FAq)9DcTxu4;k7|8rGIF0-K^M4Wv(j4;YCG$X&Sf?C zImLIwc!dsJKT0})Z#ObdN2pBUlr7SuY1SZSv=(~qFqgjg;P!#*!Ut|tDVab01YgHT%i!cMr68$@=Wn+E~H7O@c#>FzykPB9b%duI_)><+oqY-Yj| zW-ugrI<0K6Y_Wry4`?BU9`t91Of=K}mn=GJWe~(I;7C}bEP7VlN{@6_WbAMYPv)I! zolfEf#K+`lhn8~b^#SFpo-x0SY=%ey%Ix7JcE+t|1Xi6-ulEyx_+QuJm)HwB^fh3w z2aq)STeP`lyc0n~kMKm(ICoaIn)?yVyzmb=n4fR-Nc#sc^Ti_G<_R;u=dTD#syi^b zoi)q6F$B>BKVJ)B;6cFN;3TU`J6Z3+qjIb#2-_Phk%HE5HW*=+&T732}V$0vbOt(--d8Q^H9>r$~B}8ybJKk4oYQs+zol_WoG`QZ- zmU#^teq?(Usnx;jyy38ci0mYtx>PJ*we_g;rK@913vlXDUhFrJ<{rJZ#zJZzGVu_o zmFM2G;+2X0h+sJG?eCEBo5>T9t=*D3!o3Qi+R+>Ncx)7`PRj_>cq05&Ohk=|m_&kA z9hp?3ZDK|`zVVwxQ?HQu)IE36xhB0y;U#7HsniA?%+cnFAHhHV_fm2|?3Z{_BVKhB z4}_9#Go)h^)?i!h=D>Qb3xu2>E(;$^q?jrp>?#MO!P*>2eRC0K6ai@1w?JT*%pMd@ zy&DkR>?EasCT2fTbr|erRCFB_!M_9pN!Q}1+4R2?wbEYI?r$th0bG3AM~X!^e1|z~ zfhQla&5(tFT;8bwbT03xE`q}x`78TfocUkKy+5)@AT86g&L2b@M{y<_ zPRbUC$7Rfwg`<82#qj(=%*U1^d<^w75gp8b>Cgu?*&0joq*aE{*7PO*rXc4)Xv@G| zYe{rC7d=c&5pi;oT2c`fEbs%112Zk&?K(nz1M6n*pz(}2V|B=p;-x#nQuYY=k zpzW;|S1wJjQ(~E)Q@~MMvq;86&qNpJm`gu+2mIn+&$bPRPmowYxOa@~m^>HlBBa0`@Q$fIR%SM_v;tdMlf@Eid`<2po!GY6N23(b z4If$!9y4&fbi-No)b5~5eWv0p?VL$w@8;h80*DGUldsIf-_yiw>I|pXGTw{|%@RTUIUzJw&*l~J zOqNxNvzkelf?o8s;$zYAx2ivx!mwHk{aODNS&lUyDwjI}vNZ-u3FYVAorq_Akl=Pm z?bjg7KYMu-)f0L>-CHqJWnY=^^HsYhb%IiM6U`E6Y?PBrO=A)Rx85zJ00y%SzDv<` zVUl%rfssoA{%pY?VcM-EL+YQrNVf@mgE;43gQBrdWWO3=K*PbNXsdk}8PqULWGaYU%Yi7qBT*yK+6zV8Kti*w%4B7Q4n ztOhKVmlUFsm_xrts<{)QIPg(?>~|MWym3$+6vyT2imPZ^I<^|&P|7i{^tP{eF|GKQDp`-L5n zy|IF5u*SOK!l*-@{_3e~;{0#t!|Gx0)6_j@-t6bZG+^LZdmK}jdfq18CB?H}=g2h4 zUJuLTrO{yhb%CJ&l{=gj*>NhIU6ImfkfqAhXuMrQ1UOK?$p_wILk5`$x^&f$FiCA+6| zjLfONXS9r1(Ka?s{xmn&y&y+Q6M2{;5had(b$_hPg0}kl+}*&mPyc7$chCZC0hU9^?OQEQ7MNYf^OY```2WZ?t6cNX73;tf zj^U=*W5-;;Kl$il`U@$S;=iKMmzX)x&AyplPl03W4;u;_T2E067K9=EV~OvK0&_aY zOx`Cb^Cw8m@-mwld}0Cx#jywC2WMWzAn#H_o9pjBZ^q%?*n$mVTgjvsq8k8 zSxn7!ysH_j z!M~fV+xB;JzK0i95;wp`SpBaINoi3OYY5}u9O+vQ9qZS*TYaIi+WQdnn~ZK%Krb&J zZhQFW&i<=nHX;eJZ_%&M!?yZb^t4z>W(b0M|4N)V-=~FaPgtv9)6dM+?7eqpdV;!! zBOgqIYJ}0eBSOgn%YONHP|z)t>k(HGf+U5w3LtgiQ7IgQZ8Vu_*o82LOk*B9Fxn_qNX;FQ}MU$Ht?lbbMso@;#nUb*BAYRL09pJdlV^-4~H~W9xOz(z|54R|4g6r`(NRIvpDz=j>ZuD+Hi8< zU*}$rD{a@m5eQB${VL*@2OA0w1I47~7vP`rX(>l97X+bb zfWof+cZd;C|C{i44T2vAn@bLW^KH53cd=hB93kVx(SdIsMC8Y2%p>2h(KC?uzqJPr zc_fY@?Sa?dxZFQ#Y}Kp}UoNm#$1qo@J9VM1BVIZ~@2TfWUb~`DM1Rw_P_v}k$NN43aiI6h9uoY-gt-uHX98NWohohNFY zTd%rkxt83I>r^WkY#m_$e>9`qZF%^9HW|(18!lp<>a?l-S{_q_+?`wR!fYFn3!*gl zPuwjZTuuL3t)VzURNjiAqRH4(>fG{4ewMe3V)@zQw13zZv@Kw!YP&l=l#6njFw}j& zRy}XpF3O!?eJVa>PpM_2*;6|-H&QW@NMVWo>c5likJfbKobVanq%pFc_rdA)65NS; zcE?2C_02n_ce}7ur`M3ZKFiI@k=W+cZH1Bg%k(HEHJ+*sa6p2G8W~}E8-pIH*;p_z zCthweu$R3pOe=??F698Jj3Lo>^Yjs~sa z+{5SZ#%VZlcj^r!D9p*JpW%9s%ss;(X*h}foUaafPY@tIq)WHoQA-)}J5jR@aRG|~ ze)k);-%Hj2l95W)GTJy{DCyGmcKQ2BgdYrviXXd*3;$a42x%yi67018u2t!?wvTCl z)VRARfi~FZ+kf0ALk(zfqnD$Ldi=(9JJz`v3Z{CjyX*G4Oo2s#i%p^9fdAv=@jC0> zZ=}yO2!-6UY0J&o-l1o^zFO@!Z2MM7S+L@LH!lEGY-YQy-h*}nD)J&3aj{vyhMqp1 zKJ)02z6Sn?5Njzi<3fJQu+^bo4DG+xqUK2;rNbIn??A%*#vYb45>~zYVMvABng!zD1GfN_^?*Oi~+tEn7s>XOcusZKW|QX_WvTpz&TV z-L9<{a#cgO$da9CU-$2}rbl=8W$|z08r~kA9MI3fB+CUV-i&V%0Q=Ryn4RroZs&}1 z9g*6Y8wt?oCOfX@@uokK8t|N0=P^w)+QI;r=Pn#OnhW!_W*@ISYc1Yiliw=|K=D67 ziJq3nhB;1>e`Tb-UsRzz{vqysOrt%10&^vCxFj-{_BKbUsn$kba1;;CvwRxHt6D6^ zD=f_nr0jh2(WJlyWx#j?!D?_!DUkX;IkSIv|O? zXy#lsR&_ZFk4V#yC{~DUf*l|!m}2N;Pe7>lJu#}J5k%SVd%Nz6N|aC%zjM2O-FeQ< zcpl)qed~NVoL;ODI4)F-l!%P;boE~x<-8wh!^AQ=v!(wttd~?X4qohtcq@&Lh}pVZ z`=s{(lM!yPdcF>2IPQ4M z*q%^up1b8Dka`NX>vm6GXMsDP;waZ$_n|9{bKXWw?0YW^@8PYrF2h~xL^X`it;M57 zqx&Gtpo?5td3N`A&52;Cji_JLEIQA&fBltpnj7dQz(tt(>6{|XlB%}}fc){dFH-kO zu7SJTG6I^Y8+9|};_2rF4Q8y{@t#0*&-?#_H-k4UXPu4?FVH9^1ys$=RViaR_l}3*1)^Fs9%051S1H$5%FR)*#eq`!{a&Dl^C6^dMUl! zz<0CI^v%DuLF!&UiU7CjUoTh2wpyM}g!2|MjOMxZS-=gQPl5U?O*J`Q z60|6H_Hc}+x@@c;ZY}pqsxb5Be$v~-UjyTGuT5mVC-hGl(&83mL6Viq(EWdcekUR6 z;;j@feagX=nf^JUvS%P<21D#5sTHVWG|FN|+z4~P%0YRvEB7MV;d4=Sn-fM(tYCKf zA>*0^!oh6u)e8u+Ts=}h!&M+jIePvXAO48_<*kp()Xl2~ubLrhy>@zAk+d#&>&^N| z_GQ$CZf|D(`nm0kIm5oH-n=4g?6PS~A&q8~Wy?Yf1h_ujUDHc3V& zU+`toGDNcjexGjNRX9BHA_aI;KE5wmrxPn=Pwj47WP#7$b#s$kBcWfnfj8IdKODD+ zTTRb4_H(OlJAF~tx2{KdJK*}wwaxzw5%Z3?|THRaeiDKcAvBX2X z^giKS-k&JU1F9u9!=H7*CA1iCcg*Qh-TYVaD2Rl#Cc>m`5^mM;$Y#@yDmW;HMmV@hZT3eL+ZH(lqwd=y~nzn4y88@=j&-v+r z1EHi`Fq>bZr*^D+(veIz3jZ1R5N z^4z>Is;xBA$$~tIyVV52Fcgt}$vWE;{qu~6m^b83{{=+Y(l*U3EB0}?Ys#Wc7sy*6Pz_6j?nI~=u1avyYGGg!#v$?O|Q-OnwtPiHq%t_ObA z`Ovq9D9&fuwo0U9^Tbzo)I}xD!>7kFL8pAXHHas>d zBtATFh?krz5qalc1-(%k#*92UK@UY-(b#*EViY47z)ef?7h5`H=UZFEJa$E}V%@&1 z?SjHJNG@tT#a%_PlB>=W(2a2>sgj@54y$Q;m4Vt{CG%;WdVOumvWCr?8jwuZf{tYu zafMVu61dIx+72j%ypOjj-w1KuR!A(e3t_O(P5(B_*4QZYomStg4%a2O4U?&46EzBe=wl{Nbo zD!*+0qoc2bW9`bsoh7*e1Av%;VG0Q(fBB7@G(FE4lOZfZI+?x_AG=)pJ8cr{w(CT8 zvdjCps2%#dZa@ZY%OAHW0jk-D+Pr?5KY`7GroeYlE-q!lf6Buv-y_xMBOuI*5~;O9qf zN!61?^|x2@a#kpPmsXN;=wTi5?xRIbNd<#biJKA1ppedu^#!y(z6mNls_Ozt2S+~? zqRR|ZhN=vx7N_Dvr<>q`e#O8b?cF6}zPQ-ty`GF56>8|F(HdU8L5Lth65S)kNa?|tqJv$Pg zvYBf6bG6w5h-F`tiT^SHSS*4LP2o5nquzQWnLkX|5Cc%E#+=}ZS1wLBl^IF*}<4j7*tU~x`;kQ#}Mv|RXH9sgsuxnSUU z#si;IVZ?PgMk5g4{6nF>D1(;rDXbdv*5oBF_o`+EC;$X2sgrF3?0eCHNHnd4_uP|% z16jc1y=EFtjz>i}P=fmZX}G=Qcx0rehKth*mA>cz&3mIjHQ6aQ66;OY5Oa6PRLs}q zp?GBcTd%R`>@5cp# z#TXsk=zlUE{r|mLG@PYtn2^+raY30Q~=-dT?Cw*=faWHRMwC`4I~y z!6bVEEu`SVQIVu>wkD7@^bdkjER7dG*{s*?HW#x!T@6HBM1fe|f0j4A@!AI9nPGJE1vejs88X zmc%%qm4CYz4WV!NNrhfsyNufW=Rzii-RauzvJW~>&qqS*RU$_w#xLgW7}O0lGj~~V zvA54;a^_Ex*2xxxpg#1wcBH4K8Ll$Cx!x@TYPX(SAH2eBRp)5P!nza*WUa%}a@5C} z{8g~$|FRt1FZ;M|ArU+pf8_J=e7H0$^0s&JygFPRK-vGYUUux7+lO>TZS9CoRtT{q zv%TamHD1am@{P$8*Bu!GU{g;Q^v2B$dZDK>R6C7xRmIG*Q4N+~_fdI!+TM48BTicf zoSh+WNtE6+SJ~z_900#d^+Eb^H@Dq%(gVqs(sNSotqWqw}Q%S!)(@b*)h7M zjOn<$_3;^?iEf;k+9`dd<=WW!ID;(p6^=y%eg8@&)z3kg393`W1qYE}X|1;tO9sZc z^fT^<{-VHv;45cZo);(OT&xFd zzc*u#DitlL&W8?MTl%9UDr~CfN?IAf<4MJRp={)>h3$MLT}vCFR-|j!U9D&OdA@`_ zZlkG}y~z8U3pCjEb2v`SHcCgA^*Vwa5^Ln;p9Q{Yd2V0sFu)ffN0C}xul51^Wns%| zcbN>?$8l+C%lD__yd9pM%NzuItUA$|lSgyzcj_0Y)b&(joYwWQ#@yeaI*)>$U0>{h zAKKVG&u-WDVDmPDN~)QfN|l=xiF#%QeoNNsmh|QtD8BKH=_8wYwe=zEZ3xe{dGx6( zP63zA@lzfThcCiUj65YTXIH@1{_(hVf=Igd+Dg2ZFSQ1uo-aYXCZC>k`lI|O%k zcXxMp3GOr++&#Ek@BqP`puyeUA-Dy2lbrM4dta}rsj1$zr)SU1p8j+#yz;8gg}FO` z4S;7O>T&nPIdpovt3*MtiN~2E;_~wsw)+^Gat#yA0({+tTda5fNvjM=6+$MKGS3#l zE?)SCxvo{X=qj+M-jd%tG5wwCrg3BSb< z(~I)tptYu9i|cW0RQr;1h^*N4+YKxLTh{MLkWtfbTwd1-XPb5Ut-*CawmU#mK|y8e z276tBV%%MG?N~o&&F^TSTH$=`CR!tTR?#;{W0x1w{YH_y`=x<_VbT}@2p!b?;#)R| z6;l1v1FSx6f)Q%c5#ZHiPOYCS8TY=wD$82hy=eZmY{2`r!`X_}+KECp2lW|fIWO6o z{mw-)(^M~x-A+I~`N)Y#RU{3)#_GYDJj_^Yn)i5rbGUkXUt-G99_ye9j=b~Yeu2$3 z-t=R9KEnW7-ZRUPv(N_vv!@ceEtA{d9i)blY^+_{ZC{{bh}b^J7xBwS2>O?D|qNG z_z{+tz!-Y3>I!R3H}{lfJ5!*03O-H-T-x$p0dyw%jW&G5jBhpCf9921u-_Y3+mg0< zb84>)ctajJy$@1#Bm9Bm?UvcDnWN*1B$8q&ghij&B!YW`Z1JDn3XHpVLhBY=->2Q# zkzy3!iN)H`1Sy&$~qrn`6MMeV~_PWKM&_OHN@4I zvDGIoe6RzK$|(~)?4DI>X-T74yDiVvF8KqK^}XJfc8Qz2_cve{xpwk-!>i-R@#21- zGb{X1?fdDbEAhEIkn!N$8I4dD!X@g9{rd2)t`^s z9GmCg?*sV#C%mHI-p1tY`EUNW!B-jkwf}S!`Pt`1wgM)%UGykK2%)T!u{w8NVU27l z=e^8_%<5!XzGE9CHk4<;!P4CnJuWDK0Kj}2{Nm$O^ckgA@y+>U#_46dWf?M0zHlpA zm-XEeZmn<0mV^`F6YOxZDoA}|kWQ75?JQh$eyN5ZapsEgq41I6AUjRnV4eW%jZQ$H zWq(cZ-pge-aF>4N#{9eR@V)D!k^hy^UEc+}qwJmU=Ij2;pw{x6z^Vq-@~?) zm(075&yh4`^a>B*j3-1ia*(|wDlmL z#B}@!X6H6@#x9?V$q$`gKOOF~G=y>j{<7j)Y&_4!J?cM_Bg`B*mS?Oezj6vn6vbKb zthOnShU_t*JpVz)M>GZWs7%KE6s|jg)_oEk&QE%zxa3T7i$V{ShSfc}cAhx;kRMtC zk8fUImukx_@A}Ds^9fW!r(j@OMF+X+xcpGTmZrbVWJySHl)d!a>9;rL=#O1ptP~~Z z(Ln}NO$A7NDTCkW<3v9VEKt{_j=mhj_HxQ|P(H}gN^?kaB&>Hzb1?W8MG>uFna{|!ujD}hq$Y3Y*r(KzUr1~!P%}2f z+|L~%gHJ|>oKWs<@9g({PUzgXvlRyLx<#HnqCOv|4eiACgSdR+vTkg27f7_nU|eSe2Hj+9?rpjrSe8|hs}-SgRoi|HSby!-up@u7BE7AT21?G;F@Xd)MAH$g90x0FryN-RhIdAI$@ zL`1ke)|FSce^7_aaCjB5&I96tBlC3L361`Ca8L$4bE!P7h?--_jFmpvZ zU(BkSK$gmaK?cKBTSbL&`+D;@A`wvg=27{NSP)60`!6qkQisJ2oJ(lo8Z0k}eoqL% zSx|MT1+|vy2oHIRI&9VHO(x$ns0$ZuIoB1DUUz2C@R_I!#T*DJh*s(w34GmdOTS6h zOkbFabO{hASg3W0SNt!1IM(;Zzx3hizW3O*FYeiJmfNgbRS-ssM}@?L=1%yt*yY%B zRU*)kCl+R35$}>1f`mIk0vaIx;Su^gCfWl|>!dW0*s%}lIKqKM5X6Cn>s1BZ!F&>( z5ANE&2kg!u(YFvW_?uvFjgTDaCkp&!W~ia)$y%6@%%2(RQj3 zI|FM7YuF5L=y3Vu;gL01-1Q;uldBVn78s3@gKj`oyPCw$6vlHm&pXAmx3K7gbQ7WPD)5619*&KQaCG?8vjtgPynvkhE_`Fe zh|#bS{l~#QCdNX^H!?`7YwS-G@qY%Z!InT8jVH&Psvl&Mx|9P7{xlq5{dz4E#{IG? zOLiO`U7pxA+!J{_D1E~x{oJ>vIkJo}k3ECk_EY@oM9D2)M=A7}C^-V}I2y!KWEA7} zwU{YJx%knvc|>Q0Z)gL%0UL;7GG}5;A0IZfA2ZZ#KKEzwvgWQflZ-6JFbXYSE@mob z!Z5le^Q;t$*hLs?8=CsJ&qRmmXX7B=2!68x5c9S)BbMbd))FDyg_Ub z(^F^05!*3AV`<#b5H=})*aB#L=~47N>}>GkV8WS%prSbwr7rO@0s(fbM#+%g*rm=4(+$8NnHofVRF|9P9e#zj8=)Z$yAyvjpw z!pH+v;T7}i{}Qyak<#mb@Uti*Y4!XHo|ritLrlero{6hujab{j&TJPO<#njU8u|3M z(v>R#VCVDHw7r6)@J`FJP2^uq1%GF8YyX@ld)TIz8(L)$=M_^AhxYg?YW*zcw}F*=m-8c&CKpK zz9b=|`V(k<`Fguc^s(E>)OsbO^COVz64o%ER&c2rLq@DL1=M4wdMfPi8GS+UTreY+ zo))MNUNqqy#N1s>yNCOr>QJ|T)uG~dI^1;;jyk##yOEx3 zm#=`+SsBQ<2(jkR6!?KBY~f@O38EY{y^&RjATo8sYRn287N;|PPhU2Sdo?YK*Z8&1zBY!qxpS|A_!N`GhKOe~s_S1!!)OrDk=+~h82IVw9_c@t& zUHMg{Ki8*1%OY3F^KhiWGg`wcT7u5OwTRgb;5^Ey?6x57s2RDlub(UT-V+)McKJ!r zGke_G=0}M88$S0 znDw*#PTZ>n{Sv+Tr{-D8e4741)jFZH;}F)aVLTINH+Af{uRHau4bFXhe1n(j3I4DO z0PT{}FxciQ!OE1;`O*48l_Zt7I-8oI*gcl|+grVnY zUnI=?v+jjB21}q4BmIYIZcB7rGrbaUjF*TZmS&BapOf2nDYP^iGehz0L#49A z89WAm{`T|&VUsU-y!RL%I^F2TK|Q@^W%PbY zi*O52c3+54sw^DhfkP$L@JW4;a+vD(m&J<0+pEn9o>pF5k5(z!N(OE^yFW4Ww=V_G zxq6Yr$-Y|FmczFpsVquH3^(d~I~H3vk@(pWar%3p- z7;Hw&#q`?#zdP6QKRfs4|JHSL{olH7f&X7!H^GiCkRJ2^Vz(JPU4-Lc2~{D%BxuG# zE~+D4m@~&<;3|g5qH4>>i0GY$D+&Ce2v8K&l7(G80 zpIK>7`7>K({bf)+=gmC*tIH-%?gTFJ3x55brP4F#y;`&XeMMr1@D0}}SX}}r##_p+ zch0o`u4)vbrPCpg4$W$MlB<|ZbnEzMMCVAt?0pD7=K1ZgJpG4NaE;{DgwGc!gE9Rl zuP}$5pLU5Q)#(&ns?FuyzBG=8#A6q3{BSUKO78cx^MP)ahUe@7|C&Y$UDnajny)J7 zvojkimiOiGjE79I6__`_6a$y}q5heFX8O9s+Ypx0RW#j{=}nA08f()C&&IZhD2KIP ziwe<~Dbs#PnXv27W$OF-1FQwVizoZ8i78DpELgTd2AW*Qv;v~Uu?-T+N!my=yX?!D z?zLvzi-L0%;b}HTQ!~Q{1_WMrY83=tiXkWAGJRnwkyhdmi0&Nww8(4G$g+B-t&*f-tgJ2{qAynRdZ*h#oin{WD|+%SEww3$YQ9S z&Byq)eq3buJ7vxtY-`KLQLJ$tNu2l`9;*8lO60e+r*ozz&xCy^LbFM2$baG%-G&u4 z#7M-~R)}j*@7II?6Y<<&d6_=N?VNe&(8-NqbtkbsMqt)OY!+iSO#8zL+T5N@pDF`F zU7dPAcyP&AC-L=1$2+Po374H1vUxJEFr7k_#od^iZWcTdS_ik=x?hYc!wQA4@q64w2Fba!& zQ8c@#SP6H4(eAu^wuDRjw}Z%YrhMO~HJ=zWIMnKlbhV<|~8*!|nA6YW#jrA9R1Zaock^dT?Q9 z<@vGQkviqnAm;Nl+m>Bn!E43poy3S1A#qKDf&u# zs5Pv;l0ttdQ)s!&IcgT>lv9^@)n@J~bfJ4>N@fTQOmE5Mzl~28>AJ{#V7D5h1H3jF z;jA{CzKPzK^O#R8szn9g3#MWgdaFqtp-!wv08rwt;f3B~L)HNidwIq+_~T73Z;nDZ z?n9qyPd&RTR$>;lY8NaUfKtu10fd0AOu!&xp9v|{KyM=7NkFvj6?Wv*;Y?L0U%oq} zfZ92!21*al!FNoTRj%|@L8ZP=LsN#PhNv)0Ci* z!02ErQ=&l0^{wYC?Wtzhj(wt!7%wD98hA3Noa;BIdsXyPRF%01-}jIrNjpu9aldFrrd(lW(IjW70E@84Or~3Ixj08 zXb3T$62D!EsysnUW_QiWkVxHUL#Z-(of3hG{-*Ro@4!dgV8}|c4GCLLk6hoIV+u(* z=ixAULaWBFe)+7+WwKmaCojuDORkrvdbrrp4c)(6R9N^hITCE3acMs9>jZ$>z2;SI zH!$rs?BWxnTJ*7)8>^og;2P7(x>-o?1P1N=>xj@@38-M@~M-Na+(n-y5HeiHL_6c423m?47IK>Oq>mI^gbo-eD} z9647i%g|q*lyc*A{*BRwl>+E=CNtr_E+Rkk{E++H@~4?Y-u&)${_NDx{p7#YKJ-S4 zuh+a$pnT1VN`bCMzG(@uQ_xqAl^>FXRJZSq4^0!1pGFpdlKwnPGD@FbkM{L;Pe-Vs zh6#t8hCl(fhx;$0A8qyQg!v)X&T}%}-^^topnR%QdNd<%EJ}e`S&jT6HE&irx~j%? zwc-6Z2XJJ*kmcXo{)yZ!6wA{?iF7agzD{OIV*zgt@U3F{$(`FM6(Es>6A02i>q~~X z2A=5t@=LFmlH1)d6{Z3v*djyPB14sp@~WL9?BP-?L1WL@gLb1$h4D+FyQ5>|fkq6o zE+z5zL%@&cS`{$g&{g`JtW!XBuloz!N7O`VpW{v(^_PW#Zq{`{C{B=W29~r^Pic`j zy1kE0VSL@Og$NueL?|o@*^*KONxC$-W`4p2_ zS|1}MN+dFl93BNf&EO#SqKe)aQ6G#gh+b`A{;UIR!WFpabk00;+JYm+a7QJv02{fU ztR04%ZOFpOZ)Sp|6;zML6&P8QUXL_f>$I-7mf!?8#g$KaN4z1`^prQth0t-sHy-+F ze~kH!%hB}RI#PUueFAkXTPE`&aKI5$u^U=m)7_n%W%RdfYYMF38P5xNZ#d+Q1F9c2 zw=k?Abq_!WMVylP8^urgmpJKTK7l2yV2Uos0i2+^EUKTf#iA6?7@v8x0CN>Te-=`w za+?_vHetb&IT0YqBiaX+8Ntm3jy)+bj30SYdN*93`oP808mP zr}CF}0do>_g#;79sRLN!!ByqYpo*F z@e%FEp#D9*W5I7-Z9FLsel#R}us@U^jhz5nqzjtTlYIi2-o;aE_gBNyC}fDO$f8Q{ z=?fl@v>-Dpzqp(cmor2HGl=1XB^|{$a55tCc|?zIqb+6{I((X8gu4*K`#8Pn(Pn|t z@P$Kr%S1m&Z%SEwlgx1`bX!iFx_T;fPW{t%Gn?>ah-Z~$euAbt zgQhZHWPs1Hsy2+q=*AjmMM?MPU8#Nkd@4Ujj@IH-DoA9g9An*BzbNwNz%tp)fk@@& z;IA9^XYuIp2V$}WaR6_f4TTG92k`kO=Q?Na`?AWwh{E(o4F7wlHcRu!oP>w8Cjrk9 z&hF$RT?akvAa%)N$5`yFjmZw}>b6KpIyYReksXb42U?aP_jEn=KL&LycqHaST&Xg_ zxSRH{=(&TTP6A>Xmkk-0WQwe-bDOJzKP)P}f3G{@2?aFfl);dK`7QwC2EYWifon64 z#LCE2>dan>jKJnztND>fqEv~O5!p#^cn$UQ)~5QM8kg8CD%c@-#p(Ubl~1Ix^ngZS zD(M7}~K;u^9nFr&YX^(c;76M#_DcZ{$!Jd5|7PtyXU5bnYN}b zkBY_B3Cn8t`26fSNC7)^4o?F@Vkh2d%3G3>Vm!EVIEubwTh zUl6pVPJM>wpI;q;-JP1+5!kUS7dL-fUZVDxdF+UN(;b5?3yUdabdkS1FfpSXBHU0K50B$J7_;(^SPFBgu$oh^g(hjNPen+ z827mDIr1c{W05SX9onK{-Q{n^-5LWk>LEH046T@h+?Gu^zPEK`VpqH1MV^wkZIzpn zw}{mjWg|=jEGsb#*-Tsm;gjG@O0^hcp+}0-D#FZz&6C*L!jRZf9dlq*N=-j$Zcw9> zgOCPAl8MAD6h~|kY)(t=1IvmT@2D)Voi3JeOu{zpiDq6|o;Rj`Kn<;$neqj>LLOQi zF$wN}ATwgYGf#*Om5Bj~7zGz)6D$vuie*=!nu{jDRk@rXP}--5n2M4m!(U*#bQfgQ z(LWsYVSCHdwll!8(0srVmB%M7Efvs@5yvzppv+QW^hQRx%YavW(ORZH>_kArl^^+7 zpB(~KiYDoWUNSR^v|nlje=OY8uPKvR$t*&#k4P&*LBk>;Mv=NUPBzhgOIrb`TBnA# z$(1mWfh9sEss~yqM39Fj)g5{K;KN0gp~cYLk0lo&@09RCBa@MppN=4}U~)^$RM)*l zk)}mcpOS_p7x{$AAY}M4R$YaUs$x75mcE(hBQb58X z##XcLZ^+rBMwG|P&0n@}qpOw1P{rT{1m>hwxnph>Dj#dlNS!LA+Iv$c2tgfpi9S(B zB++L*<9*{;(nCGtw55ET9^N0RCa?)QuXUGgDe2m)SQ)~Bqfs(q(I+_HZ+?Av_HC}la633lqIj=6 zN%5zC73^)`qZRWK;m_Q!zt#%rc;aN1Eic;^GrYc>ee6+RHm|G;TaVB3`-t8VV(m7d z77F(T1jabH8fvFtXT|UoXhXijWMGy~SbHuTX7M7bN=m@)cCH0GL@MbX`QQa18Kr>J zDA;M{f6T8)p*b=B?vV<6ub(Z{<9GDiL!z!vW))>9U zXvc)DudQcl-{UQoCDXxGAu9pP<7}I>UnS!+Jd{FM*7U5X=F7`a=Gw!b&u4gMnRDcH zN?pf;=%>8gM$NJV5fL(#^m+YFXO5FGas)+=orQO&kJX5H!EupT^*LEa$OkEuBf)Xv zWxOMxw2Mu6EE(AeZx%A+EYdRL>PH8_WBNY@)3L>aA;6@Wm39>2d&$G_rX_mL!6&D) zs6jFS>pjKE@(@r>5INlWS4SzIz#)cz9}Vc+6yj&NCF$4{YUZQEuoLCDd}9a4CCbUr z%R2f%nPc9}sX{ju35gf4$kWXEZ@`!3-@v`8^8XvSHwD8*%2BM8KNaVyI}$&qI1;ZG zrb4nN;DsAzorU{*neU2#8)UK~>q4Y%kRrj~6`SM)BE~C@(+ji($xvm|3)n*Q{#`MR zR2osj_H<;XmN*ylF?q7ie_o28cVC(jf|Z|_rIGC4koW2MRnbWnxANKiR8 z6Rr0YC98K4{aa!EQ3{m>^509#v;JElAjA4UOC-nrw-Oo2fA2{~at_{YCvd1pEsp#X zNq-SK+en0?@r(@RNW}kpvx(+V=3Z_)4UsaGG>k#Ah&^8NqhjPeWXK4Mv@EeRk%;le zN!)?;UMW9Gz_C8ik3a8@U+=2U|5Vxe3XKyj#UmRJ34qR*jh}U>8MALHA%*v}ay-_IeViii9=i}e~zj+cHhMCNiDXOytf*TCtxGi#+} z4!0dSBvR0|J09~277np0T!RF}D8DI+*M5H$OXirvBy9e? z^<9aFHB?>w05fZ`D}JyO{~vAro2fBHHWKnd=1cjj`^ICOqC^1_`LmI*Cu@Ga<`mQ0 zNh~LH$)?p+kIn^b_4X-8+lScZn5f&h;6>m()+ryj>lUTQPIiK1yV=V9HH$HqS%{&1 zz{mI9=9M|T>1hpzKW<{A!z!lilPl%m#?a+TiQ(yk-Cb5GrJ`aD2VaY>(w7!f<#p}Y z%E=CsU0i%u$RA%n8o{Lv6^!juC5#P^r#)@$xHx5QmNm0=vs8ym(Qq}C7|a&?)E)y5 zAJ1D9+gBHzz7O5S#!&HG!OZ8qs@zF=E@@j1t%F%w_H*TA)*rEE!tFJ%Hkv6+ByzBv z-h0``%9lAR9mEMF6DAcxO7ok85*5(zAd^+uNbtZB2sauIY#%I zKH*Gb$?t_^D)v!RXWl|;;zk@opD~JS3(HnKU$r5i!X_k^1^8W5@d?vUaOwsb6HLui zG{NB}s|!;?=A1N}c@X&8^16Z?U5h_2B=f5V3YTuHgw?A~373q?ua{!%`69sGvCkZP zgF_30XmkH_&rY>dG~AJ}gtD?@0Pc1973A+7Tf9c950OA^Ta%q=M z8q)^TF&^=qo#&JDuOSt%jCEyB%1wJDK0Pgm5BL=~>h~)6bqYlEfOjxlIV&1`hBSKl zr8auMw~cOc{Z&YBaX`y-r3#u^Fd_8h(63;Xt6x*^2$gT#Fv{ub=fIEQ^T1 zc6I8zp2Ui44e@WJbORe=GK*KpnK}Wf$`G^y#{pgSqJ?DjudYtwuf2q-@3Ll;mE#%r zTc%jnvm-b#^vQAcK>6!wdeQT6#zb0?V0D+2gY87z+uPxFG$P?HpUzCdentq-;0$(h z>yMMo#e8Bf83w$7kT&1f^rEUkbCL#(^0Ie5j+)w)uPIUO{&I`OPQ0iosIN@5s>Ce^ zjXZ^MwA}>r1V6o6zYlF(-U{CE0nOEziLuWf-VD|->KnwOwk5R15R{UF$m)Bd~SolDvm~D_Xzu`7ueea0 z*EJ0z{P;Z8&7mQ4ulh$xNad>W__nV3=>@iKAj&TPX!l`5*+;dL2b|^id-0)2#plLW zmP}uvwbOYEz&s!QQZ13cB_pe!?k7?7!bN;hO|9g;=cV)HhO5a4x_2wyTYx9%Q4{t5gP%K+Pvvvpgzv6(my|rix!o+hIXgraGKZ z5-=wCn&^!*8L%^(Y$o6ZeI0~66C+3re*^9n)lZrPG!gzRPALxJ$yzp*8l1ZBEJ;Az zn7V#nxj0ELlJga2em{2td>@P&p+_7K_q$*2+iMTn3k0+ynj~Ex-@4zLJ1}-BC3(Cr zAiYYFLX)2#%<#NPx@zv`@pNvmAFTXK_11v3$?iCP&wU)nPyPo~qFj!PP2(Cv4qeqU46$JP-8$)ob=nKI2$OtE`PU2Aa(LAuus0F zHy*|IzeX}1ISqL{{6X$RqUW#$>>Xqf~COY3kk-B~I6eUFUiA@%67A{=WWF0cRFtn$)z{}UKE+)tVu_T=ZB8%tCf;}&*;caC5q%c6> zcxl~ri|6%%;&|jT{wpq*r@IMeC_)s+Y>WXs>f=O1J8yF?;k`SxeZJLZtj%j8pvmV- zk)uWhIX!Zi4?l0XbbqwR-5_{(j~Q5E&(7Ruec@5N zZ`40L?#q6itGLoiDaiTHhWE|?eO|438QlmfR^`yy zICMH9{PrP+f0n$NLy>(1!uC3n@+yHfF8qUOtMw0`Y$~g=1`K`lILD;oyw)?lwPfke z*z^JeNP2)&WsUu3^GzSAUW-Qie3owG`fG>?7fYI;2aFtrem(>BPZ+gaHxX)Fm_6_+ zLgRV1pF_9P9`c+IKDvzyt*BO(Y{y)BNHjltG+Yyy(d*=iYD^}?Bm##_i+lq+spIGL zxHqYXDC8s`9-kG9#EjS7Yi-?i7fQnR{83aEM4Jypk|dPwruKd@ zly#zb=%P{8uV)!U4WF;tnl|B1wy%^>q5^WOBDkY=X-MUdD|GHz1~NhV;Y&JN&6%U1v8R-5 zJJ$p0GrQ0Wxxef}A6INxOe2^qKC%yBgP`R-s3jqD)wC93_yN28&q}lg6Wj{I3PLZc zH4{{qDx?vnJEV~uWKH>m)hECf3@dsMhHK=1l+5T`hCJSp=;2au+Fh6^1roZ5@=j=0t^(9@6K0frEST@CQ zCi?~2)lr3dekk{SQJ?w@VNmWx8?;EL#pV!Hn8;VM5)8GS)jf6K>Eg7VLvLwGSWs_8 zr>gu!YUNxxJnAiRX>McEgC*Q>&r^nTE=l{&8*xDl8NaEY?=g^xo7r27cZu) zS+ML=7nXgIOmY-W*i-ggtLw1Oxb771HyIrxkPo8~qE|DdiKUThHKdX25~R1icIpeS zE9XJ3dBxI-_gOfqaGE6pSUQ{jkAFS)fBb7Gj)9Czwa$aQ_pAM*;Z*WbXlNgkOZO)( zm1P#|Qek_N#{2}IHdxehhlG5((E>Wr@wNF1YkWf4^5~TN2vlPVqO{jo^h4uiWaCKe zv{z#W-xB$>PB)FqQLI0crw#4l0sUs1K)eC6fIj!xU>=+Cf?Vyd($#_S(^{#!bmO`G zul;&L>P5eFr^8hM11mzwPV)t@uIB>0J6Z1-UIOpOKa{63-k)lFg;+$sUwqU1YxQ7NZ-T7w#ox~6v(^0s&@q?S%9L>2v+uZoO$eUdgw14)DO2NbeX5?TJ8KS?u% z;nJFk`LqBz0@>+=Qn(no+;Rm$B0wKOpRKMcZb_C1E&556HJuobU z7{D<%PJllvr6+$?ucziy#d+1Prs+^8Vj&gnIjw|IFWl5LQu9#$Z3E3P?&BpV6lsE0 zk(-}#llAlp?InXTR7mHkJwA@TMi~sw8Ke$X-w-CpXI?Ph35D3O&M%!qF7KyQ!?fqd zX2b}zB0YxvhIAQhAKu&e9kI_i&H#=RQH=2T&$V3Zr$b)0e81~F?dp?>Xf^9GxmMt| z4h*Ihk9n_*4Gwa&7t=l_6W_bgob?m&^Dc#>@wvC2iItq)7r2=$&t$?>#H@64&YB#v zOi@j|Opd9qEUOdLKRpyZ?69>UtQvO1ub8vk0}bhZXP|(YQ9#!X8p~zvIFOIu;7BQr(XW&AHw9FE#L`Kq^=t#d;`R{<~)>ECyWKRT~zq&*(LkdhEFduLS5c zH=kt+-td+cU;f5#nLm&o4+WEh|F$tlur{kt0-K4XQCl>B=UYuT1rO#9A%BftZiA?e zVY_fbj}|NOUctU%4NV3(3(J+wP@2oL{*7y#p$haLQqj;hIYkQGBEw-ltq-9OJAqvc zlacpkQ3$f6R1}-m&$-hXnRBQ*(7H|Mp{joR@yV{=a>${-lCPA7t75$-(fQYTEt zl40hrSt#zF^inpJ>Hg^Mu{ENmtPVPfel$TUE6d zI^})4MeK#@bu(t;fKuc69BRz_xmTU0&RA5ZXy=q-fm8g50xAP(wlU0*7ACHJN)B}E zlrNFv7xk;i2b5Dex}Z8kp?N~n3(}FqA4Hi_u>?ZX;X^U@(E8+tjd+&^B6C91X-^KB zQh5Y}ZYfH(#hz6Y^Meil7pfi{ite@0+Y}lJ!TNu}yA+AHO%a-&&{5o>+jqb{OhL|s zxx6pR0X|IeZ3t8Rj?7cWA`iNkLIX(P-P%g>f>qf+Zyu&$qB=Zvt%Au)|uZX-3CDkw6!jy%K2cUaHAE0(G|*yu)HSq$oN!=_!`AB=%BMUEx?mX1dj-h zNo!4p2tvvL{SV}jgk;(c%20F=W`mqE1Hy8=M)!CMme7Ays_Af>@DZh;W1U7BLPL{M zQBzTuiAEZm^U$34lk644tHSb-?m=y<+xzQE4a1RA(a#h5^q`=Yk%>TWL;XW&QyV06 z=diOXu7G_N9f~RpP@VO5w`i2rlykH=OZ9I5+C>k;k=52z5cl6e^ZDMtKy!(}S0@

zli)zkZjdXNihss`t> zF1J%R@NuvrmmPWfYKpw8_X@=5avrgG*qu7?-eT^PH+SCsvr}gn=yDjKe1K&^bslaq zR(|E0v+!v!y!83Ck5t9<$hcicic=H*?_CjM)Dy!L zI1d4iy<0p62TjmssbTrRh&jR7qr-F_3+3lsE41Lv%)#7Ksx|eqvd^&KNfpiwY)c0+ z4#YK=|AFnmV`!iv#sGJsf8`}KA#0aQ{0_CBzEz)^==mg+^stj54e!0a1|-@rk0S-x zBIfCi!IPGLZ_#jOT34^I3S1o5xG(SdI5`4&-;isQ=f~$LWH8wn;$)qL;=-vTR+nlN zUyr48Ch>O$T zn}L&!&O3kmteQ(QIc$y&+u58#%()MSLos>|XPhdYc{m=rP=#xT3%;a8I%%>*@pzE` z#SoJyYm7DWJJDBd$P}tSR%1}B*7!|I=cDH4=xA(jx4!m6$l`fIOK>E|T!dO#n*D6> z_2T!O9#l;g99jmo3K>zpcq17JjfsiPo~DX;y_9r#DR!N!9ij+fC>qyia?LKMp>EL0 zNKJAYiN}{?CmJ**=n86xKjf91+3+p-0Q|Q(eUiFVp}mVG8DJR?(XrJ|5O7Fww(OR` z|Jax@%Fyjw+9C&IYWlb=JnfkvdA4cfb(WwgJ0lnfGvfxqJWl)J420$-Qh;^L;tuEUsH*~}-Feut zd=zFvms{h+wJ4ICH0L?qxi@efOg<(kX$Z;Rtx4o~J3ycZ9vUpboh(yp=9o}viN-&_ zk{?+W`#PGPr;C`2SKx0nXnQ6KiaTx9#PXr7&>Ai`pn7Wm1)We2YIxuZ0>-ceT#$TW z0zR{-rxfqprp6xDtOx@({>1@k@$T61)OXM+3TC_ympUYUqJ7Z8fZn+0_ijS*wdk}K zPCnOpRy{+uX3L449?u~U=*;r={&GmlHuTnt=(NE(FTD4(aJ$WAdY ziFGz2Cp0@E-|0ydZN$}%o$fzhf8Dd~cL{{K9*3~R%mwU(If)D`9}M6gZac;V-d?W1 zVs8nD{w9Gi+{vwI;x1wT^aoiq!#jZ2f%aVJU4=I)0;b@u!UqIF)I*Z?FbpaeL;v8x z0kiL?q3zMLv&1y%)x#a&w|o3huH0eX4c$3Dzle6jLl%|$75O+QiIMtink~<$OYV}I z&>hZw2nD!|`%hIT|0hV5Jdar`G`dt=4eEj`|x4|K@<0fR|z|ZmB+8qXz3ja0d+X; zy!>F;pWkhZCIXEba9aAfD}O=o1M^NLNHt!TRdTQPtV$W_?XVHqn5!T0kI<6OO&e{Or%U)vK21Mh&!KoTH{Le8euT zR2SSg9{z#rm9tpm?EKY=S>R>5iO_tOj}Fh{mkqiTYw%WgE$3!XMuV$_-887HnSNwE zQ-$+I>*8XhUyEuGZ`a$uk~~^Jd^N;QVnJBJK{aAE$g6+544Z2zi#JcH4#s;w9Uw*v zK5VpQj*NYzbYC=#IS+lb{6MG5{=-z->!k+kE##J_hq zAMaPBjD>$E q*)W`?4fuaHoS&?6`fzc^R;nX7ttR){L4X4aK{)o#yj%B_j_>g+! zO?@hQLwm=!R&6^?ME72AmoaQ`{}TdtIymp32I)h41@g4#XoyT}!^$V=U=nK!M-m({ zTGdo@0aYk9aWLWLTpZ<`OtpC;2^hN1KPMbxJ$*42bfpID?0|jEf_!e?+-W^f?E>RI zt$U_M$*Gt}7Wjvz&qPj4^CwRh>c#T=@d(^K-%PT5+wN+Y@CU#yLdkRxy#&i``^*<=`ypC~LNW%9&mCK<0>eSB*KxD}`QX+P>F7G&r* z#Ml%(gYkgMA4DpU4=jA9PxRqQ5~+zoE;Ye`+w0bOdJb8xr(dLdpX4nsTCd_<2ZX4< z5pK#NF>?IhxqH%K1Xi9F94cEIN&{j|>I0Lr;9c22RRVfsmBS(Swz&k)CE?V5v3mWH>{YQ|Am%V%OZW^R8w(wwsBjt=-_P6KL4B=Oy+aWI zbr(qCes_2M;q5_*Po*^_f&$mDbFrl>hnG#J!^?&{ zrlKUkIiB3X8aJ@|=?qv?69gAW7ipEQk#NcX*%4Lwfl0D2S<$QLaY@b4tA3H|jp}-& z$uL1eA$*_y_=Jd3KdCt#OL^vLT#nwyT50uQRwwq1L28(?dxlM zk5mbw`$Ctkl81<0V=7wkm%a-=NSA^Ae8K1+;#%~bX% z_}_iJ-(FyH2#kf7Nr*R1Sww$Dq@!rbBK2btk<{i{eSM@4L~8aLV#(%73^j~is>vU&A}hJ^xY#dt~Q+gsV!su{CBv`7$2 ziW`AD4d#3`?1R`Yk;nf(Uog4P3v@7PJ@&CPGIw>r^zC3~CT(QsZ0~M>X=bEjq^+uj z#Gq>2upIbwfGmeB|DTdqk-et#qpyBnbsQO#fQV$|m_d}dQdd^^NF0xetaa zWBAx-MqDZ_v`P)BpvHMf@&t_ZEQU-Cw9k8ApbyTu`_@GAJA`JJfG5GE+nsK2b z?2l34EwHoo#_`uv`NYpO-==6OR>3=L7yHp*?g(SZbHQ~OC2)X=>A`a}n0k*B>@k?T zj8XctFSZb0z_SDoyGNTQc@p-kCs{hU00=&%?w#b@e7nZ6xHo68MaT5uO6iK_UE8<- zcY)F+*Bs|t(eaK(u?1uZG3|WsSG7x|J*9SNg0HTi$9IDlPLg0r%i?1plo!tbNb5O2 zbd5+xtToUk`wf7cT{?v{eW9w-R%VxU`#*VG`meW)0{Xsy$B#|IJEnmCNCEMJ_=mSw z91bpx!(Ukw@tIV6suErZNp1gOvZ&#@CiiJ+kSUL- z;xQ7zsLt1yxtnAtyjQ>27Hd(yHrza!OiZI;slOltTnY~dE{!tAT_$O#jm0ot(OKjYkn#P;ZW`^~AvcK7tu{>H@Qp*mVz$K;yDpuRz0GXo~5X?|dMHVx$p`1Pt;0xCvfWFhe%Ujo3OkjTi~V(1 z&&8Mnz$UjW^LzSyMHRJ1qyhiZ&P6XDfw`ow|B15*I-yd`N(os}?N{ZC{9ov`P!>ws ztd89&`Vi3BRj(A|3Vqd^En~EN5o&XVJo4Y)8Eymj?0W}>PaSLNKRS%&W_QJw^AAm9 ze)g)r{M=B$$(Mj$i%>dW9yU;ZJdUw-au(a_1x9|iY3tm*oXnY&h{Pm4#H8o%Ir-$g z(}c6nAW1D~Sp88UNnu6PvvXlZQ3FU|ueb;#P`4@8&tXVAE`v*w-WxDlr!zvF80GP-_OV#0SpKHFf8gTkN zaC_1I0Jg9UtVW4_2d?K$k&0kiu|c*lUi>?CPo1H8#@XPWX1R}QfjJVRVI|oX9@^k+ ztXBvOfCdUwP~F+x*-stMyRxpFZ!Pg|B8PKeEpDEt)HB3phICUk?{AO~GO;dsOy%A; z2>u*{$R&U1V?$yWOM{EScqe^6wV{f-5XNg9W1`0Hv2(jK&aLqMjfBiFwi@)Gv zF-oCjQq^yJmf!_N`tV+uRrYhZ<5%@LOtU#^3a)_C?X?oFIsYLk4JibD2CaKRPMymH$t^`{ z0I6!!-tRB34m4yzm9tzm|zKWws;W3@WWxd#We@m zF?#u-eIfYW9JP=QzwnEWgOoJ#w7N7MpOL*VsTg8S`aEc3zAG^1@@(-?J+5_BOMFiz>w$ z83<2w;qb1RkPo^UkF#!p!PkpoG#C)Uw41pOMJAeZI(in{$C-bZ&#vUdDLz_eJW!J? zm*_oZr1R)finNoKj+y@L^IftP9%$xm61k2-QML4 ztg1Jr2Yt)5dNml)GiMJ%;~fxBr>Kp?A7#g@Q{C1ed9rE_f4XGtX;c_Qywe#m3DzWw z5Q2q*g)YH_dW6hm$CRLh${Npr?~2vmyE10b=`QjuJkS`9-5hf-racX#P;E;)J-bWY zPrHRCEBwFNiPjh)Tw?1w`+Z)_h7@yn&xFzw+{DnJbu_Lxw8~X^d_q(}I4xw=S|TaA zg`wr?t;hPap1(FH5a@*FgGm8mK)>tsFT+`;k@CS2hECjYzM>s=vEj`y!cAs&Bge zg^qaiNh}B@*oX~qeRbYjYy9_io@M?&e*F+*Zby)!EN5GCp`kd11G#qY3A-?YcDo*;%(Hnw-3=CNHTqKh}ijwP2d&b^}jF=>>w}UPXn96?D{X ztIHD8dWkbNU*qTblynp|Iiu(qi@cApFpp+h#%UYnjM~Xu1vyQ$V)AOWvGrb+KHrBv9#hu$RWY*e1yEnHw57k{n+7oI6+O zwf(*6PVVz^rh^#~AFB>ijHskukhQR@+o#rsVKX5KE?rE4c>gI;UVrU?aS#>B#>tcoJ+E1^2>!nrA0oS{#9jh2* zAniHDHR?GwIiyp8?_*#)P#DTE!q*s|19onjDm_XvE%%4N+p0Hs%9SqZY3FSWC6LVp z5NDVC%K?z#wKASNP(c2sBf~rFE0V@WLn6ZyXEzwARFGus@a7m%8^3_Gj#xZym6z0}3?iYAn3+QxAt zQ+su_h)0K`{uJS?Qh~2vmFq@yLDO;|$s71XIBzLc^Uk+Af$Z~8K!o}rQKZZ+hOq7GwA?%#TOFtcX0MT3;EdGIL%b_?_nob zU-PlE;?&2xJNA`FDO(X^TX(;&L{*Y-oBGhL;ApA;MLLqj+B*QSlbfbBu;Y~J7(M@XZ#Sj&x z;i%I?-Q@T`34}{O5~@w@q4H08T-QO%8QP#rl#O&UanMgqVj%x?Fd1|gudj;hEKE+q zTV4L?3V%|`S-7Zc&9K47t%56mqIC!!x6W|;wkid7b+X|Gp*PJcy;%o*X5h_on#%w% z<4B-5ouHWU>E2|-E|S-Ie;PjW^2wp+cUr8qgCS5;JxN^1Q8p8Yw(#X7!R+OH679v= ztT%E zM4p5QzulZrN6mDctd?pYXW|))uu#4tP2BwWCOxh)D==p9RhG7sr<0PHv~-_$cd#g- z|K6Kn%vzZ1yVp;ia81jQZ6;yG)oRkUkXx6efOmvR0KMThFMjk+RJ!CfFK&QejC%Fecs{&MCNjr3^YJo%e9qmEXC>S~gnw z_g*9Sm$30kWUjhg55l+L1o2n=NlZ;=b7rvX|1IyhB#D1;Wz&rx4hx6bytGdueRDP? z0a)t24G)9pnpwyQ?~Bj*W@8{ah^u*sZi=zRd(XK&&1aoDr|7EVz$!vE4-?zc1i3u} zb2UK&gePbaOaFJ-4!X^Gsdi$Z%kdUI)jwCW5(l)r!}0Gi%@#)c{wX?wsUFa<*9#gR z`#=N2z!Y80593TjfYdivv)vjz%AkvL^AM9CCd$Ci95mrBA{~X0sz9v(%}ulk+C(!! zSNG1h#jg{?!9N!8uirs!25%5FJf2>6)-Jb7wuF3lG>M2i@ctOW$U}XU%0ulSCZT_; zd@Z$8r{{G18w_F6(9-h7Yhoa1$k7J*qkZ`&902}40#I{sbpoNh&?rGL1XWaRzq~dt zv@6r4YFY)0l%Mu>RN6nAD%G-pyH9q)?=BG755H?C5~@|6?D;lD{;pU%wtY^d5bLxK z@M|AC{6W<3-v{adXSr$5_CDv|?&ChVbhyVP4FRNGRcNw*Oi-KUBKeXaBUMU4*(wC0D`jO z4p@WmL!S7yvlJ=MCrubz9Q=0Jldn zmijR?FmAe>jvi!E)(3bs@xH(Ao$grtZo?Ot})jZnjD!=^!(vFvX+ z`gR&+ZqBx+SgV5Uf#sAg0L*@~3Y}kx0s5kZ527EqR{D8eumkucX;`}n(`nr3Hi8^r zwxasjA-0fB%mVoA&m~aL-HFcW>*;u6_RtR92@aj>zyhJD={xtdTXY64etE@756-xQfD2w+0wxhU=vVZQ6@RN&Ob)%{>geJDt$AL>{tUZs^NFmd* zGq{P}vTxJY7zF6Z07@sz+hZ7(W=dmYO7R-efLekAhYi1jHvL#sePe-@IKWL4ospox zS4sRlpQ6i!qVs|)7Hchk4|0j*+-7{;5cYy^SyJ_xq`DY~!M#^BU%pUV{4mhdG_%xu zD|w=pm~^g5>3=5)hYID;dfQ0t_3uf|f!nN%`mxBuI4TPOiH^UI!^i*jY$t@rd6Lv^ z*J;Laz0fKYx!p&HTEip@X&Jq!tKMO8Jl6!fyHvKeNGBG+j`8X_^ z^^-Gb5(z-D0?A*=ztsG*aXMZ{^&k%o6iWOc{ z49ZujVfaiRz<*6wd!nM4NReqBei}9j^Ns+rk&xch+(hb2!=D?(m2-eTUpruUvW-gJ6fFgkbknVi z$3!n%=MMJkEnF%*4kZw)tAeYmVeRZM=hn8B1t2K2#o3j5f*xa%rAB3?j@4aEMdEW}Xnf?2y0{1-h!T#y7dm6%Rt@lS1I1&NU+$+%bx1eLZ zh;7Xq-}Wr@oJJRN#3R*KJ(k+lUlrcVO*W3mmYmRuLj%n6j7X2AXsZvZz=L*18i z);3s3!JuOKu!l2M=ToYO-P_O}?yE^Y;wLdU^U2fotCWD{tb~#$vzyY11_x_ zaQhFb?23+2Djw?|&Y}tb>07vipzhV7Kw7K;Pu{X`xx^vux?d=8wHw~X6GN9N8=l(O zFpMjc2*`q!>W4d=lewdrdpM@-N+`LakKJaII5fby)zj~u=?f~wb^RsR zU$912H=PNE?Rkdv1gAUn{q~v7))cc3{=@d%Wjl_htNp()&DllAG3R zjAE|o;vPC?N7sSt=GlO)cw9uXl9j7Nh zg|lyxArOuH;1gRELL35f30JBZ;cB7CBA9ZCw7+BGOqRGKzd!R7AupW?Id1H~5MlYI z?Lxw629TCP@`3_R!t;Ff17D4z@~cv&mT}A10cT$#tuh#O|8|9G;NA*2A5FWY?!(WC!Ka2SFbyVLMPJ zQ$AzLK2A%zX$un8oSz)pd~#5R57CW!Y*7wz%kyn)3n89sF?LFv^TlCqz`il;H)ae4 z`|*?I!ZaxJnx%8U2%eLhyZ!XmWdS~mLIUq}K^v6GkzoQGQ| zChVQSfi=c&dt%#-~CF6IK5Ci8bS`!UaAATx*XKBW6GOA~u;4Q)d8NXJhCwBP)IEw-|# zLc`UmRx0PgfBPjOXsBDP%B`hf;G~ErYl$=ayp$n(Odf^kkr+;2csECpn zGJR@KR|u>oUiFvSs0QdAvuUc-1h(f38OG*rBVT+`KTui@E17r5>~vwCm`ySxmCZ<5+$DB z;J8(<2ThVT2yZ*=jh{Y(_S`Tf|fXL2ejWi9=<30m67EkORpq@)U?5R%FZ zq_>L7uYL3^@y*U|-BMT`JKSS&xNv)bZcJ~HlFztkV9YK+K73JEO@@jFwWfEow!>ej z5BwPZd$(A3ayoNfUar28X1f$xawcxeqfoJ4M+YTWIR-CLEi+tIWA*lc(ke~n2N&aH zhM#;@$w*519nI8eof(Y2FFHjHif#{>ff_-cFHFvS_2AIb)!XwZH&Ausqd%(LTE=n}ns6R^Gj26%m3Hm)+M@iN?$*dv=T(Z2~N#cVsR(NQKLK4@!Q{X{_F|i>#^9gJrV* zooh$9@1*keKlPa@>zWcV$NrMBO3RIi@^reWSfU3@2`u7=W zGY!e^idd-U@f^c9w}e&wYNuLw<~xU}d|RRYFWL;@2YcqV_P%n~n0Fhr47uNMs#ynz zN$6?}bLTT`DODwhyAlD%!Nim@aRw#TEpb%e#VIxg0s@B+2;%88@GYFrUrhJ(-OL;2 zzD~GVKjArq&7kZO+#e$Kzb{4b#6_|C4^w;FFj;}o~R5y-jOKb z32`Er3**?(DvU_wXPYpk3x`|!J?4oUX7f`asXfq1FT-cBbC=!@bIWqcfu$Nl-_>?8 z{=XA)2M8+o)afBoa1cQ7C6&cPFniN*Zm@JwyR!#*k|S^vz4Tkw`-hN}HkeSt3~pUH z9az>hM3z(Q!C^8GqGeLn89f8T$hOPTMIfc!X6ErH5%Sd!qfuY4WAR`2=(c&u1&0y^nd<)tPysFPKld;6Dw&#*~ zObaNHC{EpvJW`6O3^2Yl`@3Ue4{t!!PX;De@Pwe>k}G%`;+#B7gRNj zRkW|NNE-dwMC1#tX zM<1b3DJf-vL`Ix<`+(oM&Oi6<0-fd!@JyH@R?WIRnpxU~vHqMYqpJ%cBSfEybwyQ# zmuykQ;3(gjys#t3=pGaAWvSDN4cv}Awcn03X>_EwWE)oY(*I0ADkYwVYU=V9X#jL| z$wDVJB5~`{AN=|XmVT~TyRtMADz_Abk@tFABLtyhhyNVcC?ho!2|;LIO!+Jlg0BFN zM9L_tx11{;a`KZU_JZ_0ZtY5@onQWjf{tlg!WmzEz<;fPTsAC-m;4pUEl^VtDLv>0 zRO_f084ROx>X^DZW!>KKc0841zX9+MseaXWoPl#@Jv)2k2D>@U+*5X<5)9@K^|iZ) zy?Teacj1|;ojYukq{>EiG%P5B(z{ZvkJzSSF?fyTH{G?*jj5CSzVBrb@?G)8A)d+y zNBm13P|Y{`{ZwfWf+!-4{`ne~vKyK5%e_`!W2N?Z_~Rc^oIO=q1|se3u?FBy(f3?v zZFD!X7CmI%Gk1;$zDO-ss!`>*=}X-YHxdGW^;b*URYM?p^%TAK#Qx;h3P9V{V&@FA zsVHH7YwD``U4&ACAH4Zp5cfd+!kBn}-M10q&T(9u$Cra)2W|00@nmIdy+?5I4b74K z9A8yJ##Q9@8>Tke8|m|n^&J2^MVuo9q{E2=XgNaSfWm~aI1uvAAM$Q;1*1r}zfo!j zbumDc!83_{Wwdye?WeAVD{fB8>GtuMUa+6S-$x!Fp~`WI7s$$KY8sGd2cMT%shOiUQMyFfT z$8vL|x#(nw%Y)^CnGmi{Nhq7#erCiubgh_f|5?EZOo0_-%Hl1&1m}T}&}M6p7^3)X zM+&qvHmiO&KS!LwtUQ`lfgr^ar4P`0L8#gdEzqGW>m@3~fVVJs*V{44l+sSwmm+hD zisQq4R$TH=e7)3Yt&NLKsdRtGU%mTQ&-Kbbk{jF7Q|JdMip4@0AhqJ97c~>hxpfh# zOYn!c({+tFDNQcNt2;(9`aP>Xel>SNeCt|6`+4Dznw0^)+U^k4Yi^SmD4W>i(^;XM*ZmPgivn6WN|` z&BqrujZ=Iey3#CCAYoCgsbUv!%lsP(RL>=g*@=!V&2kNvN$noM zC6-Nvc2>AzAN?}Un;XV4+a(ZxPBzZtBNJX;*TZyFU?bh2>Tt=ddMp<4UmVxek3zzRheVmc;VcF ziD)WEt3La8QqHZ=vZ2HmMw*vHl)Leu%hOi`8Fs(*)7K51JV+vRt{}eBn|gGiU?WuV z>i{8ujnPTPbZWjHwBTrB9Ql>|6dl7K6Q}ru5wz$4D3_hKMClYu#TZdM zX&Wb4XRe2koQ;D)at3)NdcD@rm+H7iXTazAwoe2P7rl%de(Yxx_ur_Vv-+W;nKUohxZHHl8x?)_6t-iVc)O9GH{}I4E=>}lD zxe`r4mLe4Y29z)cTY_63Ilw1&oKx~c`>XI#A&(jV_)r`(cn~bOJl~})78u2?hVsxO zz3TS?!^2N)76(b77ibB4a!gI|zzc_ZiQ?fZ{y4aW7V_E}fc@CiUh6`Az*SiZ{D$7U zivQ}6POND;w0#iUvx+(Dkcdl#0?-@Geb{qVm^Kn~ZwXSl&SH}D`eQOyZ4)X=M88_P zPGIR_L|06N=Z7%UBb@5@`YbXc%7D9JI}-nSfsycQZ5h-Y@()?pVI_f`)fe}+ap3;n zTTqz8T3HN-Uw8N1pbW)ghEUEbsU}H;yGEgchf^!HrpGj|tdAIP zca9@u33ke4{u<_44B%OCbzzGn^5DlL$5b!$o&PTFj{U#?hPyWwvG4c+zV&S14aJw@ z%q2^cq0varkf%=_<7(`?w?ji)iarYKKV}uoatWB-P;Zt;rX)N)aiyx-BUL2{**i%5ge}hV?u@LvBkr!EKe=C^a^q zx-2?;2hoYkJegaN;Lf-($UaWX7Eme1ST8`)-3|w*EakwLS^qX%3eX;UpCkh2evo>x z4@-)ENe%?)w|g=g;oT}k6H#_kJ1TX_(B4KN6BU5w!GDE4!F;GtbRYn|71It*-#X>>vq$BtcUE6FQ0zYQePZpXw|~T zxMCbV@He*<&NdrBYw?BM@%+qT0yV_t4s%iER*N3A96cVPPB3d0=_hYn_q*qg1R<~& z;^5Kk1_td|i+UgZ@XMV{yKAm}zHr@EZw5tsnrgsbQ4|vz>FgLM`I%w``Q9B!L2QHIq^q@ea0tPi)>9j~C*v*Sw=j!&?g6)nIN>=M()GGM$nkwG>E;hpfSz9~0cmr}SsKd^@R!Rl70yP*KK$uGEbG6x z=G5nT(c9E%;&c5<&-7Z&Ys!0sMX`cdADkv%>mf`Fne8U5%J)l{n|{SaqrpI=8~c8; z&qR0<((vjl?8Z4z#{E0U1l?OIK|saZx*LkjK~d7?v1^QsyJl4w50lgSMR`1M3@AcS zmdWXLF3AuVDOzYC!6ziiahd82Fn6D}0+)qmZrP-^v8V*wALGA=+Gmb;Wn*c+sRmCU z94L{GqTCbhOQJwXVoE)IZaU`;G7%nC9{nXyxo1kLQeG+$dcZxF2_1DLJuuAYr2sQn z3H`wO#u+*M^ybcc_|q5l+%g!&5^zdi*NodUPGS5TuKxMgU?wT{&X*J4yM>02Rz~~n z{g2Sfn-EOvD#eoTQ?2zXUrru(-~Wc})7$yz?KSIFi$=)bw$)n}wh|3&?@rJ?rB!sC z&pzx{+0=erdE>^s4A~&M(xNx~06uO~^CQgLQ#FOkd?4xyWyv>Vhtle@=79%mPn3o} z@@WUu)wAfM55kd%0Ufsg$J9RtNA`E!93qv2EM7)3I&awr$(CZRg+L z>;64ePwf}o=Tv>VPF0`USbMF#)e}bDMF+9v&1YQ(8ycFn3RT$r?>kPeA*+1%`>lZb~{9Vy|RA$M09q{cls`UROlG?Htm z^DF)y|G6N1 z)FA!CvGH&1hZ!g`!*#X2-h$EGZO#tvIJVA$saB0RE2)yw6|F`kgJDHOr*45Cv%EVg zL2+aTi}UJ*9>kF1352$^EB$nSh2*F|-Xp`3@>c!}KZL6T)|wu6vysw*`@22h-$Ws^ z%UaOK*VmmJtk^sP50oe33-J?MVOCW=MB63~? zEFos*@8~nOYtzP-{X=OmnW88Foy2Y$Ng67-gP)pvsFXE<)n$^j)f?chRO-9s>vMc? zH(Q5BnubUF>wNq@zW?+Bj}v=;VI}l&r0bZh!-yGZMu`fHb$0mKCa3EQZn8>*ITeT>bjClRt=gqJJbY-ieQz0 z%T~s6{w^37D+xWayDJeif*1bvrW4$T%@J05NGDdBh3&wSp6#vDp7qtTMv!**NU!M_ z#tUa6igLNnyYQrAP>29*o#5gIUAIBHlv-?;`1i^=41`5epy$8$B&i9RtuU-GOgG8) zCiNy^SgG0Zwwpj_Rim}?Xu_>C)WKP*^)y8oBk(g`K+@Qf-os5FQYw2|9VK(+N;HBU zyKTLE^Mv3M(*@Ize5VW{4#`(Aqt(M;`h zz&DElfHM*|)d&EeX$9qg+POfSN)%w7LqkVyM0I=lNqYtT zFp|sNCQW7lpmx}SHgz1Tq1BE1xmC3qGBl^7vdT)o%VcW-487^5GWVt!NySqW2Y_4bKo@6J*ZajqG2*#HN7J_;uKhb6$E5 zwhy}R56XRc%VYZ|UZpj*ac%KP&=jONFXwM&{gaN!DnTizr0mLV^aNfws*4?_KN_bh zD@~{Uncv)=#*Km$4a3VRvu=NMcuUuQ=?NL?@aZNmsD96e&_s0r>Y?3+=9cNuCjOaX zUH&-$FM^#c@CuZ6{x5(3ctG;$Dm%pu!>*A#I(N@F46Q!Q!g$45{J^*6x4g^vOLjia zbnkKxT4UIg&0ct#=-o{S7rFB8PVSYNSYxW$d;`2vu$evj@M2H_6GFU_TJ_k_NSn#> z&^Cd9vu~$g=a~bfg<}bPul0zRQV7gdMsF1W1269!Hpb*}>y#Z$O!&)`KLgdVipSJ~ z+gYtQ)}t4$Hf+WQiM1cD7Sv0z>@EH|5O42U%=$(^+!^T}iuTAYA<;}ba=ne`;O*w) z&2WVb;}-md4CI}R)Vt;-_bXjAy+@00c9aLTEOfPqMlL--Q*2LW6~~4r|83cgLkABK z+SuOcdWrc=s=qxIkRpQFE; z4$RSt@;&^${JR-j+^fZIOk&AY;>aEaOgkGqCJfz?YsC1MJYZQgyQ?b#=1EUjK4lUm zRogN@iL)2tjiHqis&$cx*Yp^pKYv;ycG*z9NmRwsnpUW zK21^)Mws5RZK)q^De{rUEocUiCP54S#XZJ+#?xri62XsUl;e@CU~DOgYPYu2ofK~DlMC`%X<^iRz@>&^3gEWaY@X-K0@ZE^lpD+T z8OQtC+D(SdGLA&(Wl)PPwToKgRMVs5g>TCQVA$MpqTJ9FjsjsFhcf`)W`fg67f~w3 zB-zT$@rNYU-@-}vb=s3jxlzJl{-9U(x=++^U))EaGvmN`DKr2_iWjd#`pDbps=)AX zouJ`-k`PS8n7-Oe9r3DA4$_q~(52H{XS1>Yu0%9m?N9kx9xVizZ@WOtGHqtj?YtIB zm3+8?IMIz0TTm&BEyO?1^yM{ z-lJ0WMvVq7T_1t4BkfNf%DFOJh2Cza(H~YKvsK?cLTx*w zElLFcRoQL>aqTJD3`*t6idZvFkee2Aro(uw;jxotLkIxzctD`)P}D-|CtaIA=iu{P z+(%SmIB2Kbg&xZ8cEbwjvB!$QFPU-fvUz;}_GKz@Oit${!}2?FM1!Oa=A{!lZ3B|y zc$d@t39%tTWd@Lv`CNrOD&Y&+8J1`pPWq+GYT zfzgK6ksQ;B7Kmi4yrtgXt9Co4rZ!F2M@J!bm69_{Myla1Y9FGc5v)f1x27yNM$W)| z9G9|2HuAZyMLK|Vw-tO1Y!%WmGqrJWc$`$Zm2E<@zJ^C|U8i5;6kyzp8X= z5q20r%(D26zq(*ywz?42*?&>Ww8P77KQRn|KbbGCABBrEa!}K9y4A#48I?1Y*+H^$ zPxEz|xyw*#-PT`uBDcp?%bsk0w2gk3VOBPoU*@|o!59zs{?hXS3&O>{^?e!hu2NgB z+J(I3S&vtS*soWHa4xJgmLJm5Ymn|C``LZ=TP&IpwN*^Xty%oXX{ktwM;n#?ND>@C zm2&$sVT<1=-zr{1*-SCFgZR(7A&Qw^y6*q1qgJZW*7#-5k9PjUOpA!APt>ffS3S_O z(ovINF|g$KdgwDEy;Ctd0!!>9EJ~&m;9Hv6bS&vZUOcL(&*1X?DGYU`RzX;h28wEjXlTb1ZkbDsJ=#$qN^W41z2 zQEi`u+-%mxb?9l=f24CBFLMW>ElL%GA$zqkE7xp<^>K04GUBz{rYiKs>Zrvr;d6ht z^aMK<-aIAYv^<}1e6D{D!YfSnCwT}uxyZq5p}sR6;o5d+Rt@DDNgFV6Pfj`S*_<8} zp|yJyaDH?W;(IT)y+-$TdKloUJ_zPMuNaurG3AoZmC*x=w7Gbu0h_B=nfJ4J|(*e-EJ<2OFARx#o5~IUE zw?^(z$ep)!5$sc@=xmM*kh?L2Lz2BYkm`-!%bUu(J|kxReOY?}b!bJay+z7&PLf@H zmhMK%MR^_ileH73#u@5->Hu|!McwwN#ebLJ=ddA(Z~*k`$13gEdHerTpwNRka>lA_ z5L`Cnc{1SsH6<6xY!bLr&3`GRkyK_I!9bv|U0pZgY8ePK4I6*Hmuwt7lSg(lNw7EQ z8D;)iD}Z#Nz)W%{s5V7O+$OIkr-u^i6D8CCCY}pjp>9t{Vn~q?B%Hk^`ALk}zxs{q zNk}h!E)KId5x%5?2fXDy2sEkCLD_M z?ZVmY#h6drst9910Nm=L)fb+F#iLY>60(6ffB~(s`Eu+LhEsj>_vw&0HaTA+-!F~% z%>Fma(W@2&bKn4e&VUDq+h{9q9bxud4FHZKtxFrj)C?R=kO?^o7mipF*5$;_lQ-}{Vi$F#q{lzs)u~k6p6ff)+|^=k{1!bvlY#$p&&_sYA(&dP zwd*C{8Y%i9^BteZe2cPZ^U0IPEH<70>-5cWp?v9++Nx$8oz}%w@m}#_YT0KLz4F6I zjnWFCG@nUCAX>LJ1oa?d0&?d(dLk;Ui)M+UEkq}b1L7PXETicx#H-YBYtvPo_l#EX zzy~zNZknBFi{+?-P6)-zIGtH<$6DZ3w=w8#cj#+;RZw5Wl$14;9Oe|F6*G!ozvwQN zT!JR^j6HT4B#=PlH9RYj`J%3U`G1L|$|fgT>UQd?32TPha<=)S0k$SiGP-JcJu%Bg z;j+Pb{&-@(Fx{ASJX`lanSC*LrydhFYHjM0Y_)IY(a+`2J_qq4wecG0qQ)_a&f$yI zSC{>AE1H!MQ>WmCSqeFa8t(XE3=On#o?sjcXj~y3y;SPkZ&h#P;`{333koeOSad8V zm7pj(g89CLQr;99VS8vs#aZ_*gOV;f}fX_|tRE_qouz|bzjw{g$^~J@; zbzsk=ug9a{`)jlDQmL_pDk3Ml)}5-OD=rOce(g1o=88Ad9TErq#Fq9Wj*V@H0m7So zB@`6X&bG%0_T%YX8ha+hA9Tv@--pW-nt|uPeBzjA5VuM=Hhky@uYcPG@4 zLlD@g00;=pqaJiTTU8+MAqwfkNAQVCHy9Bw39ZJ+?iRv162CYs%Ks}}$1h8Kg!cuk>} zbB+Bbh-&ZJ`}=7NR3^H|VZsmPq7%)VC)N!Yko8>i>`lmPyw$(uL4UnySZ}T1%!5p&YINn+rLaD?!>@58cT>1!Kd#$m{}< z!cQ^OAxbn~?T@I!&!|>hv#DaYwA+pdS36r*dW=&~+0PyCfGcm&3e~0aRMp1bvPo|h zEApnyp^GZhhZzpYEz_FVyDg!)MYMCk(mr(OfHGyu@a1Zd)C%!xjnv%hI9oX-ecNBM zvf^%RPl`{$Z`qDFU+83fB+w6v&@o|A{U3}HjZ`NQ37kUU{wJh<&#KiV%0{6u#i*zyrC1#8cF#r39(X(up&~_{8t~Sw(6Zqz; zR?>Nq4PPUOhDl9lNZjwOe$@)m-xqU&;I5@8KgOErXwb{5Zd8bLzqc)JmV|gk3>`qO|zV-9T|h=w-qSUXF7##z(M7 z*b_xD+fBWfG?4wVt{!xgF?bL&U+cO73O{K-{s{JquDzlD>EC`CJTK@-{u1``fV1QJ zIC&$xhu(4fb>(Jy>g!GhIM}bX{P@Yr42#EBg(iSHKvHe!@tK8i4?+*|nK;ixU9Smq zx|ZhIvem1W>(Q@J8@^$)Uuv2X7>GeNp{sW^Y~lon8lC6N)4*YrL z*SvOl13?$t0i&poH`QJ)qx)*lTkLd(CSKJ&XbI z7!ffpAhp@10pXjI6aRqx8#n0>A3cn9JSw|Xl5T9S`8*isU$hy=gIB0VIaqAFTx8xo zc@dXzKwVPYwzpT2(El9|-=rS<|D6{4f2V)WF506&6UVo!J-VEIKW{L99(VqMxr^s( z$0|7PfWEkm=jPRI^FArui3fNB-e%kU@H{Bd4_Wh{jE-efcQ*NWr*-GIE^*7y=Vo3X zFV=!gx?oYK6<{yN7jiiWC2<;D_JhR3Y%AC5&ndHBIaHZt*c)iegMLTSIn8WUVwSP@ zHJVRX-MSu~>n?H~&U95^mI?MP@OdM2CK+)E!_Kb!K`Z> zBl<>{=@i&r-F1x3n>x%)Fs!nh>Sx^g8@OlfT;_=%1MU3m=4yT)K^>WOADJy`a@W9y zamWDJU*zAg1tyd3+oTKtscBJhYG)DS^^qx?srul^?$V(G327*y`yhUZ4fea34w}39)Xe~fIl^r^wQ_%}oxwlvR50ESn|Lq#)6X<7nfAm+o0>5qcEK28NxSnMA|0?JJTg4wpD*94FBIUsud>yeNsZ zfE<4<+C7AW$LCR>YInHz_;yzOtAAc3Uyk<0%bWJ~BJeg{mDSzvG9-VxtQ{#xu@$~e zPJk;R{w@(RBrK>V2B) z93z|Q`S18#$3gg;z~Uac)V*?gdHw-7s5(n?Fw}{fZqj`$6kecO@w<;XqF9Q)qSUK_S% zbCKb=0`mMzXqTZH?jF2@ z^9IO$lf{k;H!LxzwevuBC`d=eUzrohaT=UVb{yx#?K*ZmudirA*m@LO#YF;8>qq}g z_td{@X@-$?1m-58%7ADp<##W0;zhtlX~bnja3Sh3Me6pk8KPIU1s9xitJl&BN)oxI zL;(?a1!4ta*~>FaVWC;kgtb;XB}Lbpa5fNGMvruV_jv4gCSSw5g2h6qh-8QZb+W5b zs8R6XRE$qCzoVj+VxUyy$t!n*!8jp|6d^T;Bk@FYF!tmRsLQdGkIquQlOimdtNS+DTk zvPc;*#Z83f{593fC1~KnPUQ$WEDr0Aq&3&ml2XhAbH>1tPDS$rTW6;aZ~In_GMfob zc+S9#>v#-#K*IfVIJOwC#>tMEnNEs!opTpLDlfki0HJN2TY~f^IzM3gCC=#CY-+j9 zXvPzRqt7_dqF&OoFIS#UkxtQrPVtUd0VYAY$E}?yZ^R~twgL%g@k-eLfE+(`lpH5a zfI>(srDeR5qWAm=luNK`-%pv!c;njoHQTrKYFvQLjuPn_bGV8p;%1djj`b$aW?{Wq zGmgM9%!ng)x- zpk=dqd0A*?pOz5~)`A!XXJ!-EYFClPw>I?C0~;CtVTj&T;JJoktxE&{$5aiMZ6yQX z8JpnodcNAa+T9sBKP`u%`*UQRb#%P`xl|hrpXbt2wlRa?|CoKseEb$oBRu7?KoR1c zOAay-txGCp`sm3_WuPvKP#@E&Xj1wMkw=4=UHgyn@=gXkb zd(N!iw;y6Bno~*Q9S+52&P5~Q#;4Y)U%6Yhf)#}K=^TWrpf$meS#1D9->sw^N#@8} z^(c6!2V;Kx?Vi<)pY*@o)E1Nu1h}P-_`^$&P}k_^VDa!kQDzoTfCzCd*UW>h5?Ab4*itO=;&f3Uv(HucH6RV82GQ-*o|#i(gKL~ODRE;fT?Z&aAiZBifU zCKNj6cL*&f9#_Tk>;XgV65#>1#O0@Tk3LEtZoW{%I~^VvO}CHL?>L{4V2S)V5*N9m z!}CU6W1<|3`(OS09_YDJ?{l%rjC5LUzyU+Wpl@@k1BnL>|v<_8b3exbiq{}mDA+eSCaFpAz^*UP+4j>n6y<{MaZN+p1W-H$}nU!+tTaUV1nL}f5llu8($XPCfo^>zLlOuHxN*!U^x<|kr4Zk$vuU?BEl$+KLlOhYK;fHim?_ZQ5`KSHEN#v{9wSo~z^ z&&M75C%~{;pf0St?%+6Eiw8VaMOd108$PB{D_#YpFDN;{W{5oR@+d* zR*D!a{>wP&=N=7#_Pf?%qhflNx$`3NzT~1@yJS6e4_^Dk^0{vy59%AgPBx$FnZV+# zH$cVGChIIuTK{{9mwT-X=&Y6pKK^r7+1=7x)r+^+Iy_z+>7J>XpH75bZ)t;+TW(tS zDuEdAP`X`glk-N4)t`>HCTqCHoiGL~pKq7j#?w|^$dZAPFJ4Ec1`{{@tryZWEWm@NQ zr?E&p7Qq!%R;Be-S#_$=_9A?&xr5^u3k9~`CCoZ939uX2U|g_=D8ec0HF zexp}zI|ujZ|N5nzd(RgHWpIPCru4)o2ojFjYdUvKzpYk)jZvfn$OpPqDfaos7a5}b zED{5F`-MapoXf{oXZ@X*d?-8h8My_}YLnNPEM;^vX!QeUkx9=S2ams7qvQYAEH72x ztYI1j4jcup0^N{9Y6FbAH>$z$g4mo*2e@QSrH|RK0y|+k8;n@8$waayl^iWnds%G z{E>mv*XlCY!#j*4#Rq)Ho@I(&j;kOPd?2j;R`u`Dl;(}=?@!17b)_=Y?GqH*n~Ar8NDyQc!} zSeQC=W049aNC8epKag$PO2yJ$ji@VyTh@xkC*q@j9JLeZ&|zxuK>0PYKZJ%S6N&Tg zhci{1AGwh|2#ETB7n$EUw!8&m@3sj?=*vhGwow?9>RWkT^ZI1^7jp<5w$W&t4PVv+ zD}`h!yMGz8a_OB3ZsX4u3qFdx1!itW%!|SJ0F_28D%^gVeKMlDFJhrEa$rYABw!uRLL|3Cq*LN~5wO zrtryb1lqE~R8iSc0S`58{~?hy4!T|_vrWERe$5uVHGKrinqeZdb^b<~xQXn5nDj!Q z77xx!nS9lU){r<7j|Iy*QlbCI*3)Veclm6Y0B#eR(ibs?Idzbo3-~FgCAuRaJN3u* zQUQL9vk_v@1|0tO<|!shwL0BbzpU+YguI@uPNmDIjLkQ?GB6#c?sVX2kFcK}$u-BR zCvv}8fxQ}&pHptgtPW~}-T?se8W+g-XEV94+P&5nD=?LX58%R{037}o@n0)Ih6098 z-31SdP2xYA#-BZ_1Q}R573^|1wzVU`fm_xvK*hLKMYNi7=U1FbZJJ3t1|=M7%cS3% z?ZeS1B&_V5u8#nWsdSW8lw6l68dnk@U^*_BN&7;Fa-PunBwu&kQ-0> z)-BJznXc}8pq8qbadVY3zU*pVNq;0*Dk(4TD5@02HWwrN10{TN8$yWET4@vwzy~79 zSXX?P%c>j9KskJCh!4EV;_^ShjRho9G8eVpXb2{*yht#+bK6!1X(?8nlGQgo+g>l5 zKVSreGjClrRl|J%RH{@{4)%hN8^e^Y-R0Lk|3cezS?6t4;d5_K zoKCr_`c=MOrKcCyc}S?dJ9Y_5(L*QtMbrbP<|c&BP+X=Q7A z|NmumJ{G9euE&#;aPURiFX^6kX~pAbD3|0P0FgYYPq;X?&ZH!c%NTzq>A0hd{?p;k zm?L1=V_qv-*C#QXP!^2PQIb>AGIgK4FH5Z>6Q+o!f_}~9UO09Sjcg>?-us2cA(9gw zO@7aWDoW+5oT#qkFCuH;i5Bh3uq&n%w4!}N?N!~dX((%te^*B4@7x zC>)kT9t%G3B$Ayetl7)-yhWQ<*j4k?9aW@Cx&QFRsxCxdhdNd1evy?4)Owvc{l)V# z7z{+9!0|XTdmxTqW?b{~D+1JzSKfU(rwCJkh&9~Gc|$kw24~o(S;yb2>bbG9XxVpg zGrArm@RY=EK1`SwT3&Qr7LfmL0ocJE=Yx|;x|vsfvMv^(sC<%7&L4OKc^bNHPR<>H zUzoaiPXOC|_upWX*CcQIOaOo2Et`|*`450w-m8kfn~HR4x}w40()6(sYCe?!NTN(=0o49D5j_IEz>W^@c$HWdmv4#TL+K zL=zFw6f(ydK7Z+kmQ%Skk*>CKvh87u3~4D@E!phznjg6mw9hO7ukgj!^56u!2t3pa!UcKtyU{^cormjw6!Z?19ulr$^u7 z$!A>ICF5N4R|bR--*NV!=(I4T{BRRCsp*$-=8}m|*#@a{1@tHSBClR~_5QJGp^rgd z@1$+ng=Q5l=+9c*lnYV}&3N%u!D5gG>YQX3N5Cm+|z5&E_I=X0qJ zntdV&^4-{UyKBOGk_Zz;A@b}?ByAS6S6`o}2r6mEav*!P3M5O{tVHD^DVp9HKf0Rv z3js5}54OsI^zeb{f%R)w?~EZrotjVAMg5Bzqx`=ifZ2xEq`s-kHXw!gGBz1y4#&HBIIl)1^146Y`!nVMoprK_Fcs~g;xhTgY^eN}s%O@`

>+VQI;k_xe4-19JVfEM(jaG;d#cqYAo-{yeQwG8po=R3qBD{niyz^hNa^+?hIq0@>op!w+T`oZ;QY>PaDiFzCgl6s z8tY7dfX3b%34i>-EQ4z1%_0}2ACt|=u`Mvrpf)B?uQf7VIk<2^y~UN7G4zlPz~y_h ziFHCCpIiroP4lAe%hnZW%4}|Td%iicyfSdUp9^|Ad3_ihJ5B0T!a}0NP)XlAsy$lp ze)2Z(Rb+Cl;$1>{=AF*NbU0a?IUViFQ7NwO?)iqwsVNGqiK)$kS+_qnjhH1WxShGB zVuCcAjA<0`K(zWYur5I6Ojy|f>N&Dy9J-L>8OQcQD22;r8Vy)e1=>916ND4c+MHG7 zs$fQjA+m<4EHa=T1!XHkL|EG2V;PQE71vR1j9jUn_*l{07Q6b$hZRosW1BIKZi|>{ z$e@rqh)e%6w^pP|uXac}R4U7-ecrJ))!W|Z){W<)oSqj;5#_k_Lt*#%E|jKLfcdjuq1n0EW^a*iGuZ5%nI%%IE3`$H&eq=3bEQxl5mcJpUTIz!a3u zBg`F?Dwm%uJVGl!m0j#I`(YqV7G+R3JG)@_ zUWnXd9uI)Ds8N#J9ODGB2nkGBKWr{iiXvd1j7n09QuD^vYk$n-(jRhsPYeT_E@AN} zNCv+kQ+ct+Dvpqax-+OQvjrrU+om^1Rds%5e{U*pE$viqE60QbM$Ik8^B?gwQWHxY zDBF=&<8WePAsefdi$KNAw%68P-QZX?)wi|Q=p6pcSE5?U|1JwJOOC07RlZ_D^HxH3 zs1=R}D!*)~2X_Yt4$RO!dN(2GHfQYg)zFeP3dU-{_X4ML^|Uj4ZIELL1{oFxiLivd zD%xUfVh9jv+IH&!(_P#*8JoA^j5x74um$hG5 z;p>$bm>Id59HuEj(3#bxTLjLU7164nXRZ=xVaMDDVBRd0&_>7?OU)LdGLg8T7-RGE zoRvr{P6*>($@N6S#rY){&1c9Y5SVs6Vh8@{XR1l>#MvSO%rxsYT^d)WB(3k?X&ep(Bi~wIxT~m9(zxfWw|HE^>Qz0jTdTzJ{IXxR^;s=3eR9yT=`Xd zR6syH6|-TKkfF<;LMg>;uhKz&%3Kr(#K{*6edw>SC;9v&8#%-58)?%IGkE9|%pd-o zU$K?}M9V8P)0(Z~kz^sba-#+N^U!5C)d@t3ol{(!vl4O7`6+kEr!LU|6Ai-y<|JHw zpG-1~PI2p7{n8WEkr1}d;KxMzkqO$cPDqD0Pa4{SV#A{2D>SD|S6kx$ET|hUW`9v{ zw$YmE{Pn^^aY&-287wd!)zYjiiQ=(wQ`8{_+zUt^!O?*_x!Y*fpqNVQOiL)DjwFKZ zgO5XLk7UbRoh&G3!GyaXRLJ9%8^%jAV9f!Cazgn9xRS=eV5p^2G0e>`{AN2da_&xvU^;bL9(tX!A|c^{EQur%Fe$jQRHe%8ZPODB9^FmH!ar{~iDtuCWn7K3E7TrJ27KepxNN zAW4PL0^sZpymjD6dnAk=v6~3%(EE576MH*hDz0SaytQ{m_fUuy4q8=d>dUWft$KCOTU~-e^RM$>UM!A*=6F zc{(;a=_-dp<$-pEz>^~cg|q7T(7PEAwji=hK70JAvyU~vZLebSd=$ds5!vETJR2Km z?a99W4{N1J8Irr`@8{_6O7I^>;P2d#RaKZLc*4tW4}M_aEV|MKs8goQlYej(r!>4#oiv94_ZWGC*=-!m zif@IjyXJ}(q}EUnWgv*XYN6L;{Oi5UWzkWA|B1d2SB?9W5k)G;Z0qFLylty^)a(GH z4>CA^1fjo_ARVR0-Y_)YnXqd0he6Tk_2tZP`C~8u)GfEn?fitf^!s)DGHk)QCjqgO zeb$gLo$IOT5JqM(o2vES(8cb`m2K^|d)vyc{`kSaT=3t_+I@j#kC8_?s(F*e8ME$l z2#>zaitEOCE<<2jvF8~+E)8(krZeBZ!AK3kpm;;z6`9=8U}U|kj))u3LMtYrqRb&W z{mHC=+xZiuD+qUjEZDiVlvG2xBgAn&O@A_ZOP^f6Xq~8^ri~VT&LV*hG_(MOQs<_TIm??#nhJ;#WB?j}11HFK&G9Vexc)=9UXVa#unz?o zKAx4L8DXr$S0al1!8q_kVfW{l)V8|At6CXC9%EgWRsuAlf>jj+ zg}xV7@ndWe;=-Llv~5?&n%Mdtxqrt(V>4uR@DQRaz&k0{rt1c%cm4e3w)Xzd>{8q+ zuEBZnC;|_ysEG%dx;ZD}7Q=CwxMVCXPmmv!48dYvM~7mVH*S8}uVziFQD*>dKXSiL zP;^mv*u*{USwTAGbW+5fgmAm7zSxR!;B&L25C7a@d*LS=L{=d&Zsmb$y0CP z>vx(tuO#Zw-v{b#pYOllX&gxb~6C-x&3=T#Z=8fJ?e@B2tNFedofo5wGs;8&1r>&VSHp+%F}Ss4qY2{BBTssW^-Rol0XejM)c zOfs{5e`x$*lTo91BLUAb3Wc4!gjB;xm%M)<`273(sLDNTnKREHB)5v6-zj%xg$S| zM}YS?=zA{YY{MTu_ekk~UR2)vj~GGzJ28+P@CXT@6n?%u*rU8lIJ=L3VTo!8w# z!(LqfBo3*9fG7drf*8!R;N-obtcrO&cKP?H+Q&1Dr-p04U2~ct(X1pWQTALZ@ zITCgmLuNF>DZuGfsw2?LN2C}QwJg~r9>9QQ{;Gu>J_4Y|&E-zqvF=jp^tJkDsiCUC z%I09LoRYIV-pG)0;9jXL`V-rAJ>t0nnL&;#z?B}qNn}EYN`1m!J7in#duu*pQ;GL1 z46U%i|E#}}B4Fc?B!tpGg3@I#RY)6Fdg6JnW14Q<_i!j;T}2aivL{gUQwmiuRS zv@|D=wJZI)PPLIAvBI}A?QS)%oEFas&xW~|y(|E`?}JdQ!kkvqzj^KoVJ6+?oS^f9 zH!)}Hq4t-71OLZSDRE8acKwEoVDaPkU$MZee$;7m7;k&9A+@1ngz$BSIad;DYjm-@uTV)r;D5?1CC)9ylz2RI?Y`(jXN~N6a z(R%~=5zQl};l=h5;ZgxK?r>vjW`P7M$sfb~Xn4HupXgOT{w%|O)Qyyi)W)H) zNQm(K<;Nm8k2Q+#s?h;RHCie9>SbUzS`Arca(05EPW_GR@9XVz!%gf3el#wfsv%(I zF^%IiE;s9iOj!2umRRoPMDgp5)8rq}Apt(7C}q^xyLqMK8D#d~;7ZoF9uc386Vlrm zrsFJ?r1OGHMDMkn|3m_J=yLw!HA=x!{qnTfM2+j;Yfd#cUY8>t`rB%8jOF%sx<4l; zU*z8LLF)UQ^nc^>I>qV>O`of9=}pAtM4ap=^m(yQ0a-7dzGY?VlS2CdqM3>>V0z z!;LLmCUCA>RAr?@Iy`sCL2=suS= z${wTfeTnQj_7GdQfi}oCtM0Z7@-UTrlC4*#t(U-q-9f2v8`}mj9tAr9C<5S4Bz6u_ zqi?dte9EiBwe|D&(h=%brAns?5yp{{6Gv5nEB|0vjV35}ihf-bMeL;rVZvF5p;?RP zG=qu8OF3xysEy6O|KxX+Y(B?dxMNy9DIr?ZdrBDWpkh9K0$~Rx2xZx2ZKb5Cm9b<% zx7_UHNZr%~syP>-r~$;O_3JVscI z6d!L&s z7is&F?UX1JC+9hJZm6&qchC;$_EwLaPQemhlJ7zjt}JDOi~m*KtuLVIYb^LwNit@R%h?fY75(ogUR-@T94DoebCyqgQpxJVmJbwp*;27+b`Qf%HH z_Z3Kudn}f5_3?JA-m(VF{iwB%@kTbSY_9BM&^PW5P=ZH1>P@*5xruLMnPs)SMBLN} zdS$=IW4b`=)ySrdO?0^r!(HPPyOz~GLD}5eQZ?M%PIRP}boV^H$7}{;BoRGT_yHLI z28HCWwD*HNp$~8NE%UNK{_K|p`-eXJ@XRdJM~TroFS!sA)06XS^~kV#>_SW>PJc%( z(Fxz;iBgd+Vx#o2m;Uv2kDL$DE%hPp3y1qz!G5XQw#VCr0=7kY;d*o2UcZ^*{Lldw|6m~b3;CVQ*sKGAqLypOcIQEQN$CRvlPbW`rC zhnPPjr!#_4J3r1;(g-1wmgBdz2erQ!#p7-53(!upuaE3c+_;lV)Hyof&9J!dbZ?+8 z-T6>)K)aXT&oA=c@lzxewy2?ev>CouGG{so-A=7 zY4|riyk0*vY=ta{y-I6p-hclwsd}gB2;DmQ5VW81eUN}UgJ060Q~tY1<5whFq7`t6 zWV+Hke~TMFnZCCkr1AjrAQPnNjtNa-WN==DpH9R5<|6%Hm1{rFTQtc*XgN%0{>s4H zO>rRt^Y)$wAmY{!{a|boJ9feFGGcBdkw0tq(1`Q?2(q#w_LeKgX-%TIG98NL&(jjW zOElRn7NE1#JFoteP8a>uqYeH|)c0F&ZXl{_Nu{v_s)hEoU}dmt8s{v9tb6qGPb~ z#%V+#ta|(`N5g&ic-1TIQ&9gOb8j2^N|b1$U==UCMQE&`E&~uwkgSkw4qXPoGKQlP zcZFkiZOJN76^QIZLk>*HHI;Jv^tnwdG{zO(qF_63~umZ$UR}yqe?qj(E zWeFPOmh0k6P&)87Z=V;-YKCWd&|LeOcKUzWGxPi^$>y^O?Xe3LsT#_8LU12xw+Z4p zy*UpEhg^>i6N=%>H)oT-+KZl4p5H9ye+8{X;>X4@m(Mfo*D1L4CNgx#b;iz!pHi`z zmzZeq+aqXkj0bgkJ?8?JO*=RGkH3ck3ti(5cC0P$5na7Tjyz#Ud+H3-l(w4albFk5 zFN@3a)3x@nT}9ZqTKKfg6FQ`(({|V>j-9sNFHf?9nf^J0iR<|A3_y9#|KO9Yw~?ZO zhuQ^+#su_}6(9HiG=0N~Mn5Z5+ji1Br`~>S(-=Su{YRiwuFt(D047@q2AU@=SRN;M z&Df|Mfm@cxO>Z9utL|;G@K0CaiCW%Q(1ooCEi3q$vddYm(oFjm!4Ox^pI5}Hm(|;J zDGt>0L9`l-{z=L+krg7`RzD%d?Qdqo+^0to7e%qeH$4iaD5i(+7*UlA!oTeMtk6?x zhGIG!Masd!+rVNi1*V7iMr-wh_$1H>s;>QY!F}kVL=0s*?$ti!q53S>K3Y@6y)0Bv zZ>tm}(5NLz>j`3wqq5ZBUJcNEbu)GTYio_tiDzO^9=8XoU8XZ-{hVCra5QjqEhnoeO88Cl^Sp;nimlV(>LGsOq@^A9CkI zetxTLHC=GUuR8Nc=~U#Dp5*e!=U}*&;IDPGHsG*>@8WU*-NfE=g=W$)q}F+B`E(r_ zApHj;MI@SJDaWf5bqWX0PIB(@UT{Je==mD?>7*Lh3YM5W+a&n4^@5W~LXqDvrEwAM6% zOD<1{vi0CO8hzjof)WAoZPgjDNyqc9B_LK9Vk|jrN0=F8!-S4H`EkfVVK!349rD6X zm_Fe3kj%jcKS6P=c~6z*27Ip|z#{LdzRUh3i~}fgJ~@ z25~bVvyyX*Sa5-K$2qnj|3XjwGZ&Wf2C${Oo*A93IPzbBZo$pp{HCY}zMmzYCH{~r zE_3;`BWh7BRiF}P(^uIx?rIBsV~Kn=h!53HCA;MF{Ojx~nEchZ3?QP9Ryd5OY5u-i z*)hON%VDlzaAzlJADDc;wA2e66ZSLG^A>808^0{o&Z#V99aii6vxfb$bE=0;mgR{K zr$^72dkU9aN&FH1Ed;ct{v-8x`+~)mugjd<>XCM3a!OFfFO*>Q@ZI1Abvel71oC`= zvnH|a_b!ZQG~HdJq8QV?^&|4*L|{or-bx*<4>`=x*EgYseOe2(_>5EFO7^mcSDMn5 z<`nPD?dsGPk6~ye7VG+VCj9Xikj27Y`MnUQD45X}{!*1v?~|}gkudVdre~Uir0yr9 z_j5xbN*2Lj+WsPqR`eo7R5^b4+AE)FYwS!7cs zLlZ$6xGJN4YGgN?|Gh0R$(B|onT}X#U5nz&4@#r&=ABoZTk{6$4x)4zE_INuiQ;rU z-1(haLdl~|9!*5Dz(TvR60wp*fNfmxlFB5g@%S`&pE4Z&0n#SQsB!&lB;J9l>9*QE z*0x_-Xzm*$>*UFzW5ki%S`rq^^E}m&f`K>%1h(FS0B4j^6I%sdsKjJ8 zn?a(^67hi&s|Jwe#Bk3vg{yCEL7-^tEhI*0V~~^8zf&Q#1vo497*~ZDP;aG==z^&v zi;n+=2i^rUVinH?^NIoYkwIjiCaUEd4C4%AZ-;Hn)RRB0sh>L0n){WWC!O;&9x_xSw{8`>@^P4=E};$iuOtki)SjT&7c zHTSmdeZpJJD((jM-t;wFc&VttV%@>efuWxEi)&Bq$fNjy^xm14Ns4CX)@dcvgtg#M z;c@$OS5VTnK`z(uqL6{R&ykKsKoPP~2nFy8RdyULG!ETPcnFD5)DJh>96>~7KF>gD zSH~gds7s#QzEd>^vM&bR7tbmsDDBXQF_Y{$0~wIC&X$YoQZU5RPf3|+^u%WmNIGB> z@<==2j08{_RP)(O+cTu9j!l~q?3`>U_@{9>NYWGQT6)mA=!`ZK1&38B{so9&VgYpx z{GyRWM3z{kA+i4JBT&={fG&Xg9_i~tu*Ae+VO5VJxc?1|!B$=#Whk72?SruW4au7z zkIf&-o$ZPtESO|wHssvpJ&S2GjGG~?z34{M`g0401w1)Dd`_AZk~L2*TdDaf8rird zJi*sLtN*0f=aIZLK&I|O+rfNzXMa<;nY!>T)IT^A(|uO21X`q}#tR}z8$7x(wsj97 z3JfBVMh=LPX{p6`@qG>7(z_nut#_N2vC0vXGQCqOWZSowRQeq_*n*bZd4KZs3F>pO z*;s5X4MmLmPbp6Ost95wW@h(qw?G}Ym^A6j$^?>rX`+s30a9n9(gz%cNZoUp5B(!`k>!hL4k5fu;wf^(goJa97$SrfA1gSh0^aY zY`|6}oPF-Sv_W-1)F5gRnGZX-{=4rXBM>&|{2h|5>^&gp9BK8H*%@gSCQjp#r{ONK?P$X+uYy9gw@uxdWpwJqPDF+~b5ElF#P*@bR-w4fvLQ6J_TssIokL3 z+uaB(Cl(GlB8h&y{m6ZOpIl@I3A8EOPMJrDQ`(J(i4s8d3iTuk4}uN%IK}N{$(+*$ zK$ECp0@)6RW))3nOsjY6xf2k4XMJmDJ^D`I=i5TU%%p%y0q#B=mH|%<=&(g0EvtE@ zCi$UniNpIQ#3ct2WF6{z<4ZEZt{Qk5t?7$qrFq#6_Xn{j?Wu?79o`oXQ+6J313_kq;I zu6ZquTw&kRnJtQn@`C1|8q!hFafxP)&W{^YbmvZKA9d4cN5{%qpu`jb9eVQ<66DgX z9KQGFbC)#JTbNnw*C_%*hAzV|8aS9$mXMHd^Wd4^;h)Y>AbY57&=X#GG;slCKgZhE zcJzkrlQ>sT?zz zUZhz#IP5fNzc9|01G7iM@hOil4rO7TvE3vJPszx^5T^6R{dR>(hFhdH=la0~hw&*X zKudAI8hL&|>wrS7Xx9UORp7<<={d%VbrI1l1V*rzI1 z&ri+U(xM1H4h3Pv)X;l4_Am}T5^VFYdM8xLr-Qm^wWn3`tL-pG=?mUG)npKpdOHs; z0(x4nu1+LCUAvS?UXfc&ns?@pC&tzThjG#M^sp;b-COXCx0^z4+W>uM&-Yt{kg#w~ zoxCz4hA`AHAS&o3ZdK$&`!=;1b~P3zLs=?xfvMPzBVZRTENpbp=64(xQdX*4*X!5G zS4Jk-UtB&8dp_%<(4D_l@)wBXKhYj}Ff|_x1=ey&#vUXL-!kXWmuu(YW9|Ez48D30 zhKmicBbRkblm6=TC+Sw}`+8*SDVKCej< z30L3SzXrdU*!rMHxsc}D!9RE=|E_c=i)CLjK0V9SLqmf;y_lBCV`R$`IU>P_;VXA2 z88mi&4l8>K7gqoE=MCM7ZF@kG%B2`ju59<8cIV8FV3Y~K2V#Tx0(t0&>R$aV9IpcUHkq*C_c*Gi{SW?}#A z{5*f%9x*+JKMa31FbnX)W)KZ;Q>_1bDi9RjUvza0&N=(?+=Q?3lo)2%XN)O5)22Ej zq`mI;WPz8@$S?f|Nok|QgIzmoKF3XFqD-{?KBV?&4_ z6-zqA^?b`O>O2em%^4?|GAxuA$xc9CsOlD}UYAe!JdEho2^c1NKOpbOT-;pnb-wK< zX^}id^lr6&j0SCNZVIE+G%lG6zIi|CdkGB85{eND;}QaJS)|L@4V#L(6J>IxyXuMY z-NJrFhB#gfb8BVL0q;&-u^Cm8e$f5__=rjRyn>#jCCs^mv*w086zt>g;h75n97c3; zUo%4uTOz97Xt*FY{x(&dk_~ch1e`UPm$}UYQsRb9O8Ffv%VitAHJjz5prElydYJJ_ zy#45?8yiUoM@a*=F414_r=fG5J)+)`5Co($1pAc~7!twiKxX@wY6)C?o)M)))mR`>=W=OK9sn@9*-NIWuh3}L9bhf;J5 z4+9@r<`s!S6(vq(NkJn$0~aVC2oX;eAb4R&9*(F(Qf&wkgzLM8RMhgXCf8t zYj+Rm44>8vV9$vWRy;8ev=~B$U{pp=0yM>d0OOZ5XwwFXkH~h@u_N0?jN4N zt%v#Jlxl!~L7n|3XBb@iDD#c7?3*<=wlK{ofCv@Yn#<_+HKLyX`F7+CAK}ig7qh6h z2zUtCEmp~E*%EZy78DONzl+?F!OrKYk(_ZxF8mcWp1Ld@5vy5n8iR36m3b=--MSly zfs&q0v`51vLC7WLLznrjqp4%mE?<};d!>x_3bFy)!uX5Dt7X?hva5RsMagf+k=t8` ziJeK)kNRnG_^r1~FGi%zvYw?Gu(IB;&$(Mq6@uxHUcz577Y1gHrA)mxGVs|?ty5-q0{l~L0*_>OYv>|-m!7Yfn|UY z9x3@40f@ ztKQWTnEzRD*!9K*AZtXxD7b@btff+j?7{ns|IPg8Aro+Eh=mIR;|OGS=9egwg{1+R{T^PZ^>MR7o{)_&gc$7m_LbX60U!|2dRbFSvhq796~Nq zDk^fZWd7+vw6JJLg>InfKz0EIRv^Mx_r7S#_jV-5h3+f^`ro85(={bIY4im|8|a<7 z4I|deX#}-l^FW!u=nd0pha4`NCo( zc@Tu+Vnkn0QAXjjVP)e#xZ5nxxQo_vHJ5J=O2bgj9RGFIkT5}Qsqm;v-`oLYF*Z~| z!`*x4#}ZH_Cwr`E5tRl=2!{~F7HLy~p2{n{479DsE!5fMNl z#OnzH4I^L{`lgr7dTSnhZ7W$;#iE@mb)BrGoSr(Wt^_)AET?yT4%SL9QXs zO~nhrQe<&ZfoD$T=JMC~`+o-_DZ&KP2S_vHi^D$)L7PHh8#>iR`Kml%>HIIq_m<0UfxxAeizT;pSm=ex5B*a}Z+4I`!u~ zv5bV?@MuQy1xpR6nFnyV{ID^T_={m-#tm!>y|$?mi=uS+KYCOK6u1)fSl8)HD{RHp3JI%LxS<4gkcLXc~L}MuyJf0hwfLnNpc0aya zqTp8D-hdLBdQF|-vKVSO{8d2_ZrCnee zN}B!72`72)E1t#r$q$PaSC3oh_JOL6Mz4G5L+=75_|n&uzbY((&)g%M?ekLPi+FzUsG#Yr6)ywYDw!VH0J!4jEV`ViHq@vYb8a@;y`fElabpg1lZ7@mCI2+0^%Bmy|H)k7o!2k<_A)WSRK zr#!3WUVc>jC-$;z{U1~*ch(eggFoL21e!b`)Q=$iltXA~bm7)h{6QUs$}3^d0V~)} z>K~q)+I>`gdto|p zWP|T^ACvLWlvIDDQug?ZGMF1ZDQow8PY44mEmetSMLyf?}(!Q9vJ9+s8n*2@BjaexW& zx~%$uo-f^Gn zGM&l?Ru(8)dA?dvW|bgY%vn~rY82fsAn>{aZW)ONtB%w_g!0jwY=a)p++ncXK9#no zs=j%LT!G(I|AEaU`isSF?^@E`t5nq7G^J6^ef=Sp+C(}R7&a)|1Nb$o8Oxik!!G_D z@R>((dYPxx#Z=xE0C}RKD*T1U33+r$B7r7CsnLfpFC_Dn6j$-O-FjgzFA9QB@_vK8 zq(p0Wtz34wK|eq}%;CLZ>1+Uv3`^A5bt)nas)ehw9>U$}K#S%vw|Q5_N)&-&2zRRc z^6}m*8SnxNRK9kT?U=GDL$JX9p1XpcE?k5LcjLn0Z66h1x&9`VFA`|)SrT`8v9l0# zbnqCJ*ND}9A`esJU7#8!u<}6GN?F*YO zj3%?Oh~ii1ik_tvbQ2Xf6@ZsE z{8Z2qXp5>mr#i~4s;s9uzOPwQ+6{)`*jzl+k#f(+l=Zy3B8l!$tNqaWEHYk4j?G^5 z2m@o&%GiHz6UupkwYK{E7kBSH5&pQ{J@J05=J3Hpg1c(hO3}5B@REy;@>-C`Q)OIy zoQh98{T^vFrN9?hte=`JLGUuaxzD4)zrB}10}Z^Qzy-eyo%#_l2@HX?TYfoWMe*7T zXW zqKqv8ATi$~d`e`|vZvJJg;Tv*AH@L@VgWMJ+-!Xv#A-O{iH@#pm)=<9EXO#^!N(ej zZ}a8gT4Im@UQ;oWjR8o=cGedN1XZKDhGb{#`3WKQbVLxel6K=sw)5bMYAve_68jy% zvi~5bcsgv`a&_*By%1#kc~CU?L(hOikx+TuOH8C^r3b}{8;g3@X*VNEvRT6Pvn-{0 z4%Ve_Mwv?N?6!|++%MP3g9{dE^oL477ZX$hp^rUV={nt=>yq#m$-{r&{AmLF$x53-`pIy;y!*+{T)Q(cDtUgKxqcnp@6(F~Cg~BN$c3s{ zd}9ms>L>dHq+!#o{u(N&0`%?ELqSg+fc{vTMNLY@T+owuj&Gwaz^r``cJ7r^n39mi zrc+fg@K2Y~I`cCdc8sQrlTTykl87k=wkAH5WH_c*l2*89ud>@`;!`nnvy$B@()ard z(rGm z^9GGL({uX?I=V^6^sCyXnrW_Da^o&t;VvO?(}ZkBXLvA5-vi>qDE%&i1?K;?w&9Y7 z(-NbB1l6(0S*dN6(l?Y-l zejP96-@d{VsRMz^>_!cgrS1(uF|GF%)w^l6G0L6)S1ZnKoONlEh&3SBUz<{8wpQ;S zo9dSaMaKLoS+YOpL}7eAVX1kLQY5_6<*VD!ftiG{WcKU<)ChQM4mSNADelxeH&)IY zhvvS$=R}4aV?i8$c96;*7br7n&b=G);}^E)1BQ0EyP3b8sz1MT5b8IXgHVV_*$;fiaXe`D=(E;lg_rALF0NFAAC zAJpf3ndmUF_&(uKT6@cBkg9xXKYlh5qsBPTjAO(x~d zPN_tQ&Aux)@oq$%a%$0&XEPu9wQnmR3WT^3Cr4>pdS| zZm1i<+-ugxU|@2XTjtM_N103DZu_AB|3+c%`HCKYwIiN*$Xud`w@;25;7j{6cZ=(P z7nSbI`AggY*Ew^tm;zR`+C{Ypr-Z@A!mMl|!-Nmr*j_oOVEQ}U&O^l6udI%>w_t!v zq87`}KLPZc4DwW6O0zdbR)YQScUh!vRmms{*KY*iT>LH{P~y*l^q_w&zYtKzVwTa2 zx9fq$Bz%U^vHCY$_ofFeP+168!L|F-1L;vv*{q}mM<@nAnS4iG6cvaR5o|Sf)~J!0 zyO-!|oJ3ztV3DNQ=ShvzU;1k-Cxey%$0zo?-TPjOtrR!X(0E z1zsw896Nr%^HUY}bz2mACT4?Qi!F=%)Jv}>&I)x0n7J)5vi>L$(vke=TWhJBl_kgm zU7lC{i@9sdL!r|>w%ZpYEK$^$XVbqxI=vB|{GkceeFOtCm?=8&Hcsm$FJwkPt}ipA z?t#S|BUd_NWB@5KElgsv)Jq}A%OT1uPSZR-u-^*LEE==${HnIL+}&IEkPRx=BBo&kant+DZ%Q%SWRaQZ1csl zeL%b`1%v~Jd|9MD@Iu=y_vc@^+kN2TM)-5NT~syD^PSbCb0lYdya%u7cv7FY7&Asl zZH%)`qd?K|p{7JRPBV{nns+qRq(Upl@Da^Ce$n{*LkFwGQj3fTqvB_sUwd3x;0zKv ztxx!7(KWoksQD9|Ju!qmyRaJD^%n|QPx_WbxsZE;|IbbKNF%| zp1Tr|CJ5U}uInVz5&sW)_G8_X@+Z%l$s2bwU**xr@&j*+gT~oRu?kx5+;{A_7P7=F z)OOVi`Ov?Zi@hpP2dySs{$`q`FYoXDORcmP3GQeKkw2>Zb!AWfKHy(Yx)W5C?8qKt zzzWlS$$7KGMBMe)Cx<}tMu^AXA90xEE8@`yuDqay>LoOsaV{$JG)hO=5|+AQKnB9t zxCrbsxurzBP1^@9>>t)ZE;!??#LA_`uH<6W3>m=KpPF;uPhRGfaBdn9S(O2*yLoy@OT!1S{v&)f;E0rh0?&Y!Y#@HuE}?x*fdvQGU9iub~U_X z+wz;w4qy8`s418)LDe$9&Q`7-PluT9``i{~sMjdnui*HPtV za|VS`R_shyUl<^8)KNuU1V?!GR+6cI-H;U0!2K8_?qhTjB2gDlUDZbHmHt{Br;&@( zbA71c7|Hux1@VLBskc$lu^AhtwhL~uJ$X@?pE=S==Ef!X)y)XrJJH^V3EvHJ%_nz( z*L+l)Ac5~f5F1CfzrV7C;8znN$WXeInK+uC$u)bNpcoIt6G7N9K&a7zA|W6lPzYIJ z+~|)s>Gg>>UCnq;|AM2gTyjw8uU(&%V&SQZpX!iHJEG8H2$#P!UgeQTW<5TcW7FSr zVdQgVBc%H;W>1L7mG+0 zlWKt&vWWnm*K1H!Hi;-r;JsjebHwLsS8-$qUDJb+#$#-DZ z_%gG)HYkXsnU+u(%I!~%zI^=BXsFIvlUb2FiS71q3KCAhdK@C2Wvcr9*ze^TFh z!D$z%o=t=&f^rDN*Qi@+Adz8=NZ-rSTSB(qdU?2pZR+qy>bW0O+BQX8)OJhNB;`N1 z@qKC!4K7> zUPQ~k%r6H|*DOtICnR;Bhw35Q(rLaOroj)aE&FRE{4?X@731?R(w_bq!$DtL(VrF8 zSh?3~v)V+lh~Ny7sgu1^_{%ye=gniT?L5;o0_eKM$IzRb%N*}$h2Pj+ z5TqxsYJ7&?sE!0i@9ku{8hVQC3Uo{+50XSbpkJ4_j6j6>{9>)?uiqSR^RVFf+ZB+? zS%z^c$8l=>ZEVMLEoM-4cTzfD7ROe8r*v-89EjR4jfN~@1%Kjif6{;ZO`wURLEBEO zsVdcs<_{Gk9jm72wNgsV;6O~6ncw95pw1S(XKjRf98V*HHSZWeJ3SQ<3G-CCUF$Px z|M+@Auyiw@afWxayDbe%fQ`Ul{X6h0T##cTaUJv(;m~I?`}IuckEdC?7j0Ys#FiRF zlqzH%SRPnlsX@8Y%IpJ#(!5M)6X3!bJw%B#(jJX^-QXAdpMiHSO!7D#^w*6e2hYNe z+N~(^?Gfce)u9P(FOQWfTx6-{LA@zNj5bs`d@gtUiqIb^#_0ZjbNSA`arr=6&tvK8 zLJ=2R2;T~gX2&ZxJc}{h(k_R{DliHC*JhY3>WP8M_Dj+ubo?N|qS*ZAYX^Sw-Nl(r~93=7Ff%6fOV3J!=DVmt}3qoygHe9Kn@pIAs0G2#0>Gw zu6OED;;7}|!}HBFopm8aDh@E0Xr?){?)CHSz#6z-W_8pEXN@CmVMogrU-o4Jo=6~? zqCSD5a9TYU$&eo-<&7?c+3i{Fc8p9g+QLEmt?%3VONHCqim&xpJnY({K{k#k3cu8j zh$(cgLlU4gn;)kFc#6TlVA+?d1V0>->Hn2E&OSrh3I&UP*vvUQ%^$eUAmxm8c%bKH zBglc+KzaqUpJH!rZHYL1LLE@P-l-!Cc3PsH{+Yad&Y2IHAf-E6ht+6#^}Ol&&ap)5 zSssYgxE8KHO!QL=Z&kG!t#U49l~mj?P!&BDoxkEoG#fu%xR6;?_q4IypgHy27%XR{w_$-n}n0kG8rl_8ADXU(PUZZtQX`HT31rHB|l$5@(tuS(dE>hTn(Op1nOq->mLVvj%L`g#If< zXe!oXp1pp*=6CA4s2N*y=zKpBtB=0F;i|U`qKt60B*p;LrE4JfC1ncz1g#bnsYmYV z#b&KZzJaG%H^79zNL{CKG9^3A$W`lH^~}9C-M>DDzT0likh7l@e3P?5-u`ML^!AYN z+<|ljui;^%SeB8OC=bnzGF0%S!DvKSvV30BvC9V=cBV?k@(yZu5k02sI=X zWPJ9QxfpP5`El^%og> ztc^kAEu_V7#UYr#V?m=mkN*CgQ$c|2!2a7B|KvowTLf$!$yqI-ZS`0slAfY{n@J9FdAE$g zjHMM1PzR#-s_`uA+4sP!QKLq1Ece96RN|1UzcsxMqc3OwkPZwcCs$AMZlV4+wmXde z^6y3}Ni_^j#AMqRPdq~zY7;3nq zHtuJcs}W95Xl4^R@h8%ncSZL%SUDMRwis z$__vD8LnQt2|D(tPS$U+x0o=}lYsjB*90iWrp~xzq6wGYC`nCWHz>H*m^L@61)y1T^D;hFJUt zMOy0Z8xlFLMMH;fval9=K(t$KCGkj_2=`UJ;P(zhGq&_W?Wv-xLF2vbJzi*n=!5aW zqF5GCtwG1Zp3JtL!r(!hAzr)2q<_!T*mGEzG;(wy%xOiKCI!xzT79wGrPz*i<#7J# zrJ)L51Wl+2-v0v8x$(U6TYuZe7PYVamM{s*{E0_7Ol6B2>8l!dmnSS zX{pE)A59Il;keLCpW9T*cpLHyr{z#DrArNAp|Dlwod>qeaQXi9aN8}76|zeOc7Whe z3z>9wseo3=gBtHAivBzFA2&5EuCbi0^QnHN$(?Q~40T0#?aw90QDA|f&^sI?KQ7s4 z7>35=^N55lY2x=P)9;-I`5~d@@PZpNg7XTQfR!|1I^46VPpzum9$(U&g6jwm1bfh zPOgj@{nCb_(q;s3mIKaHIF;a9MG|5tC@Oxik!J1ORc<7;j ze^#f*D$Hn0Pl+q9Pj;}+rJq-w+NA2u4$#lx+gAWJs7x%w*nuYH0$gzGD2*@rB-Z{> zf8;)Jvqm=PQP}V3k|wzJmxbF5lZtD)5H>n;h&n72g^n>SZtnciawJ5lVB*i6hNLnv zJ1=#pTE1SMuDAJFVQTe!rN4H=pub+RquPap;dWD9?5n`rT)SEB zT8ie(iW>(voWD!66CyUcdmue#Ju$^IRy^ph%EUrPTPd)-Z`D@*zxgOc!lwu@=N3%d zKZDjdX{%?bT}9!^$|+96&r4JUf7rg{ydmM}8m0;C@7Ls6Z9pSecQrewW^2-{d?D*g zcd;0D&aTZkb!cc}(y6afqq3t_b$Fidlpno#A1|`-_*~^lPQU+qKie8ib=N?;&n_3 zmjMqsZn0E1iP0a$)wo~&Ivy4&@2tlAU23UImKaW3-q){pSVof{p?jJ|cO^tnQ1>d1 z<#hKwjQ(u<^U>YPw7la|RN6YnT8sT-CGvdXY_G)1DoS0jcGqe}QzW$|*azg;wn&_< z@QTs2S04mD!LA61H6DeQo|0AD3-y-ID`-`@FuJeh9_BmGE@g6^j1`!Afi*GQbXKWx za!hMEiqqpXaOv(8crpW2Y~>|yoy-=rX*PD#!%5(yIxYnM?!z8>kGgZ(ScFSyU{q=BT3^cL)Jl2!wXYh4~mQST*D?zL9 zyfg#8%u{_yRvU#r#jE05hdw?0r9%sMx;WW;&td+>tC}M0^>)>HBlhHaj#%R_e23uG zJI7jDJH(I)R$C4hK5rvC{Vo;)`NL8W` z2rDP=0aG|my9Jku{jv$?q~TIkXE^I3T3!mg_SBG`tU)ta-FL~?t~$$WdYh!dMJXhR z;&#n8Sb@LD7PCs9$V97_XO`^8$fmxSL3^+9YQkOZUtZSQ-I|D{AJ*J)B_UuY7*P<% z?W?KmwKD@xD3nF*@W?G?!^lv9GDd!lbJYrKU#_k+1&Zu9Q((1go6O z$yu$xNfaWh5`Gnt=~EX8CC{YeDpcv$x`J*W_k-@TZ4=k;TV)_H2Snx%e5xM$==9H^KAk&llie{(VvS^%s=ob$b5^1pmGk3B6|2l^=7o`Bna} zRGw?sawhK_p?V6`iGs$)!&6OpyQTBnVvpZ*;#y^?8u6#pVU67>)p;l8 zG0_GHx#!dP!gtIM-YZ4+$~SFOmP8ztW0C?Vhx%*LBMf}5?#KU_F*saG=a5)C09vZFqVTXA<0F4L)=Lc!dsN(_@ma7QP` zT=wYlEOP#_H54$+V!G3B(4Pisk66=s)}4*){7Dsj0hW=MUYc{9RrJ#8Rjv2iQP?D` z4W@|r_dtD>);YWAsb~uIG^?F|e7C+eaB^aQ1I;`pk`5T5IZ2fk^&acEx*udhnpPhu zspI^>hY_XI$`2pOfld`<|M{p_mBnn8G$Ju^K)JZY^WrphnA*bNJTGZNnSH4OV%|2y#|icGlstFC&G6PUdpThc!)g!j0I0OoNxYSrOPvh~Lt*TQryq9gZ^2A!#vVd|r z^eH1TG$HZF2@7~O7JBgy)6b`7a%33h854N0`%Y4}>$gA{e0|1vzfgmpIS!g63s(!$%DL7;@GvGs(b6DX@g>MP5^(*6lco`T{L3ZrBdItdfBMDQNB}<}QboW0Lj!8& zmH~V7)Qj(tK#^+=@#9Jp{Iz#|o#k9>4Z_uG4f|;<47`KpN^!XTF#PiU{0c+ln-*9o zFC`ETEB8=3*Olk06xMBDCNxcmAAir&j1ZBYAUgkYg))|yzJeU2kt;GYRe-NE(REO~ zefSHi_SS#?b6==Nf|%b>&&~}awiRAw{;&g06f^Z`8~jAM040e!WM=tavez4r=(aJ& zAFA+`_M3AtiAkWmf=z8vls5bvMuenh8L*Pxf~FZy;`{t&RZ#m}8Q0OF=v7P8Mmv1| zv(n9OnI=*5CTJl>8revbx-%E7!b@kwK_2OOw*LCf7wVMfBLftqlE=~i79z@O_*|WK zE{E7GK6ZG9)NoL%e-AmAQHQbG>PVxvVMl*-Fc#X0i~maX+gLWc%2AmQB9D~F19%ac z8-1gosB${+8?f5#@=h9LTvBQv8!uiWrM!CzF$gTfozuJH3;V{ZfQQljYC8i93;Gt1RZ{{ znGgD53^-zk1yW(YZh|VCQ@PUA`CDI`yMHt`zi8b=rgcn52cPJoGlp7SC!#Bagbxt&q{wKeXL*Q+z zzAE_ds=~}YY_(frZ7|SBynU9=YhMWKK4kMK7eA9nbH|5EJ=??t{M{ovaZ#udcK>!- zpn#Qge z$k3{Hg8q1HxuqUcr;eP4tJP?2DHDg!mw`VM|Th1IU56m(Ih!E21) z%z040QLw|*|81o?(w==ZJJE}C?zy-znxk-C8sX2ymkSj%A+;}e2j`t1T>A|S!C>YQ zTE2gaZtNXAw|RWqt(>kKL3=%k4h?2B|9jvnpC08T{lJ&r(goZV){;MZ|)|Tk=;VlK`0`7wp*nxm~PFRmz5eOO5*eQ>m*Pny}9wRRfE%awJ0oapE0P!GUwy(0GjW=0Nc$*&+aMVqrEoLyWBEj>eY*Ylw=JA= zx|^YXamt@}-C8Iig1nN%@~Plm4ys|PMX2q;BYfNp{Tu88bi^Wvf+b(B2R=ObF=XO-@!)Ye)pz?O1-*xdk z`g;{H6x+O(F!8I)5{Q;@KaT^DtRe)KlysoEJS|Lk-+$YUjgm_DDYkyyRf^SZET(V$IR@j)Nn zWp6n|h^B!Y#t3G5K>zEr+@vgLZZf!`XU-R31^Vkmuhn27vPMZo^hn(q9-7{FK9>AN z8Ou`%@_OB*CN#bK%E_>oS^C&&Hs=+t|uW#>IFs*TfQv$jq3NDf~Fkzns)r zQ4)Jl<{XnE29=A14fWgG#=6t?#S$K%`DcaC!HO^^ncHFbyW7Fm;6{w>WQ<5~0IgpB zqgAh#gCAuX9@?=wZ5<@@s?TxX9*_Lq=SH6!5CqZ(r+Yp5uM^Dp82o7kb;Y~*$P%1i z|Gc&p$Gr&?WB*)xv4h$*hmP6`c4obvemx{brf#4;d(J3~XtFR3WM&gPrO$7NfwJSV z-c3y_8P^f{Q6TCfoNd#2!TNkC4G^fgi%U8|;6%2t_S{E88ETKJt& zeG~ap#f&bn!Vj^}h0){Gyosr+KLMo9@qcUjXyuw5Q#)#~4_LtMdIuUkG{+HXR{*yQ zBONMI@3s$a{fzn$>yw+Q3;K~NoWE*dUOPImocMb*zBKy5Sr0EaLM!tCfT=s0HL;C$ z?=>ykxap;ea!ldE*BU=tjNROqbN{r*WWBZVoSI(1|C1(EYu*+mz;j z{HNAUkv3E4>zZ^&n{#Xp&}SE=e<;mLz|Bv*x+!L72WNzunZWnc1ijUdw(*mQ{`Fhr za^;>aA+*K&HE(O=_KXcKQn&HTlMRlt#+?*y^jws510%L~fLJ;)3=io%>>m!$TJIPJ zz&sv)oDPm)ol5@%ZY?G|>ia7tWQ9HX!Of{-b+6~@t147zS)e-}pxV#Z{O&AwMEgYE z{91+BZvF|<1mnuj$%i9sXlF3fu4*H@3NYJ90A=dl$hzjB7-}5|53_Tlq4u5Q}T6E))2I~m;CiqWPU555&S!HV0y>YdC^JB3uu z<8-J~2uqct&eE;Kz-L69ms3XgLR|y92|dXB0j)g?jB(4o@lS8;k1CU{ zCOMtQCU%O>p@&rswVP5BAHNljK3i92{_!B0a-7=8HuP}Z06cs6)@uZ^r%vwT&{ee5|Yw@7AN7QFJf-;C1R}(o{-il>Rj6=XZ5H z`6%^X>9O$Y3fyk_`Dgb$UOHCZtR&_VuH__Dj*Y&%xVbxDYn=D*JNVyicAH(Tru%mF z&rAVRj{#zS=NJ{s$|#@9^xwNGSa7;BEACTCoPa2c9(VciElmq!N{91VH-37aFjf42fYfbg_RmZ6lEi z>Qgxv&dTZRIJ~PCzNr>|ZDtLT!ZNR7iG!b)GI#cw0}0d8QzqVT2X8|+9C<`cvRt1h zynMcN$5k`zzsxzVM^5sEUM}TapY_ji;(Bh8Kd)>*bcnn!_V8;cTcrnXy&1T^lkC5( z_1s8{0S`%#+qzoroUFbtpiDaAhj&Xl=l%*1&gZYA9g6Y0Tv7>(AAZiMGC}hZ!z0_{ z_7&5g(sj%x<{=`cl6d3jh;&V(4>2z(PqjooH9-9nCG)&>o8Lr4wx*=-b zKwDf_RdSD@q*=Pl_4qW&29~_mnAt@CmBW};=yChF-|I%A+!e=La;NTs*)08!<4m4W zn(;av6HG0wbD!)+al5<4YMHF)kkamq%^VT!uO$_4itLU16>zvqL%;SKblJm%{THS; zpP1wv9NtfoTL zkiC8Ku`;?~&j<>ZVJKj;`ho6zE*cb&lZrqlL0}S7eH>Q%LK`o&Vp*?X8UKb3c$%wv zFE!&#qj@HM*+NP05~o@no)_6xi&jP+dWhv2RAK`BZ(~gb72jhmuOsvg-tKRDs!N16 z3H)(GRX+Dfqf*0Se1q%bW-G@Ia*{De1!W=Zr+!s|Y>>HN-Cg6f$cI?aR zRcrSW)*CkSmjTl@;VjNHRDh8JNjSD^bFTNzY4BKQsZkwgqmbEwA!fg^oTqO1o-cUvYOzq0eiVe7awyXzrb#=~OOrvNoPl62`&IpmFV zhS`~`!#x6=fvv}*AWp4Zl*9`#!M$H`piENZjKQ2W4$n0X;G^dw=YVN3i{zJ)^NG@e zT@Umk#w!7}F^b3R4{;;sh~I|uU(U=0Egh{+cdJ=_EZy%c-78*U;dfJ-A%%O&?O4Q} zAy>hOtb+zV_v}hTb~axaSyp+S#&FiyuWvwv;_q)fZ(5B*^^?*2w4bc4i8Y*l`IXg0 z)?t#(DF^L>Tr4NK_5{eGqb)sQhKC)C4p0pWaXSSolmnT3Pf-}{0b+4SE?Ba)>iBUFM|nHb$5}_tEfMDfK7CT?}iaF#~XsI`uGlzB)ak-(IHU zgtTn@KGuXWy=DDf0k+wo)Myd7;0~j2K(t5TaeP`!@eAz))}1nPt1m{9hPJA{^vfdswLgqIUlcG{p8xLegV2r}&h4x|&-s6b6Y{@ZQ&@VPa9cNcP57FG95y)gG> z`S3+qX>mI&D{+feo5kM$=Zs*~(ET5oOTl-dju=3IK3jQ8FoBMOOXyU#0e_4cXH{6U zEZRwOy%*W6*Kenri03Wjtb=0H&tOULi16`^^|E{NmBTTC)YTeUSO;O-5$LKrubi=; zgM;B&g!$219BNk4=_!O9gEJhNNyw~pzpZ*{0dc^IWm4p@^hO(z>-2}I?TUyROaH8d zvm3CtNrGeY@mH~Sh^!HzG#g$b5%uj|Qn-VGp*rvL6N2vmWuLg0+1M3(4WGAs;cY^4 zxca{Hd%Of4nq{^^MaPNz^5mE+|I223=*1=erN>8`rbMRW&tGrCh}liZ!yWIlbf`% z>x^efjBI^g2-6lqM(T(;tP~;gGbYml=0VV(RUXSMd)zs5tq<{X+Pe|7aqZ1c8oxh} zSZk)`hH|{-ueH&*Uu0|}irYzsjE{nkmb|haC&zgiwUty8QO|Q8xc91MHsCwY#|QvN zF@`cq6%nez7dR}Q)ksaX&vSgjMroo4jfyPUAC~dcL3#MvLKhLyZ82nomh4LM!sc00 zw9OmfNj<3O$Z65$%{Vp%0^Kd8Rgc*T!OPS>xDhIdC7QhbA>lD$_I|BEId?SP>{R~b z@wimoU1n17HgddFlM~JONOz1@dUOsjPW9;8&B;|OP`RzMxGhYQEmw^E@~OyE1Sf0q zN>t0pVm8a*=3nEoYA%+6(2o7WmdNxgTmmNXBzYd)IFq6On~udv&INt1K#!*9sVs60 z^f4;4%u-iG^&vlz*ZnvJ^@!0i)Y2MeLVLu`N>Q~#aW#Rq0ha!FXnbosmi|4UYzS8s zeXT8C0rxHAr~FF0%8IR>HI+?rZevb#$bPTu_9Qe)=|*F4l?O5rwQ81tUp;>qW<7&m zd3cyxijP_^N>(x=D*xs%QUm;~>xTbFoyJ4dS7^x+i5nGCcFclj$ebIM?Zb&-SRE^2 z=?DG>Ru?I1EjT&A&n=MWRh}DYG2u?l6`bYsnQhymuFaD8ge*D5yZ`I{)7w7-FH7vf zTpEen&D@t6O3nAoXyoT{$5ra2MYQ-F@A?nTkI7C?!SP-ldkJ|$-NBXZ@67|Fa=6kE zDoRcmPN^(vB)MK@p2tYt%5K)$C?K92&knhWgatjCxE3@hoD%cH8oiZ zw7E&(UK=-lIC8FuQ9T>{$feDhM&{GB<_3L>e!QM<%zik0OkY zi;q^Emv^IyyxBVm$Z}%{GCT0?OV(t(-WJb|dKoi&EFGsxxrHtfZ*H;D;&(FIbypS{ zO5v>5yPY{C>J}J0X-5}oEsrWzB!29T%VAzcWLt zWz@wsPYGk4gfj}U60z1>97)i&(F2t(4&{T73R#RSTkB12d`BLy$L`vUtKTJs8!cc# zpc_9_eF2}m5Pz=c^@wD^wkOqV{McI$%3Fg$L5oWc`qNY|%YmNb84w$*r;3#t69>Vb zK0*GG?4ueeP^si7`mq_AUL2z=Hf5wY*{%3l2{#=(h2?U>VEcI8)axN*Ob$KruhU2P z2Io`hq+wcI>`Wz>+?Bc(r)NVK?Ua$6N;AHKDwCMj>Ey60ri0ceN*=PYLfz`DYDrUS z)}3Cs3CO*6#LsxZdLp(v3!-CJ?^1b;p%zNv%=%laA&r^vd|l{S@p#stg^u>EvgbyaIR^^|B z4cU^P+Anu4(S2>Y3H+)nD@H~VRW`fZmVLqDmJHqvtmJrsMV22=0?@keM}|1hw5?i0 zCM-7|BsnF$KM-(2?MjX2oVz7WDjJ&xgHF3D?!qm4B_Ua-eLTAbvG>wVDQX`1eZnS2i++ihBrcC?8O}uAY&> zu5**Sm;D6R(Qw;8ep-@rNchJNIZt5uzz?M1i5TjP31f7NmOb(0R7Xpz^wY=B5>4}O$?1bh~1;6|Blv(OTX`JKht$=bAE`x@gq>5W%^ zR3hWXFV&sfzP!`5Vqw!<`r(HrmexFpJ=|(=k_eXNx}U#09WhAGr@hajwTry=0Qk>6 z?*=B5FQnU9z0bhw`MdWm{VQD2K62JDIF3^ig6oO=w0*Zk#)%ttuGIWXJ)M&S2Z~a!wQ|n@x}ZH?7vX2N1y@?Iq#vM(9+v#iItH_rw(rW_%y9A* zS8jpVb@a!($LvCUz3IOd+a1cBGjuIlgpB}U`caeHb>r_7qOU{PF=ieI;rBh$`0aEhT!|D9x8H!+200&t3Sg02m+TpuEp6do5CB7{zZwF=I|9MaUHpd|C%O$;4!m zBGfWvrm6q{Kz_7f&bUmyi+jNEJGg*dmoJO}=ae33@)yd~Ac0Z+Q_mUdnN}z;`=oKw z&>fcQ%W;7KZF)K}xcsL|G&!u3Jj*^>Ja3{X#4hA6WS2A%Hw|Ho7E^?*31orHmVUJf zE=;Z){$*sGt{8NBZ=)1XvC%wBRd(9+uUq(CF>n09)A2zKLy|q+onEOxx7k6RZo-U!tPm>9I81j}>DV%iR8gKHvVIMZWl%+?#u4${A>~ zyX^AU=|B)c6ZvvqN64ft-r1gSlxe|XUvDATif7cfD?B3gHS}P}nb2(@}9PRDGb$+_Co3T%^TD6j&;hw)wrGg?$7kLD-FLB0zN(hX7m zSK~17{=)(BunCS0;lN~RpSOeR($z`HhrQV{qqKdZx zypG0#q8fkkWUF>g*QExc;ZM2gF=>*8p#;*UBW}!AKtaK~3Ul(F;RjEk1q-c5qJ1zU zY8a~wlTe^EVFtdr^JBtZz#K?Y{xDG818vr=R{R6b!w@fAsXG;|#E~b)hQ6)oZu!Bf zBGN+p5EVdZM8){w2O==R$->r)Hpz>Vb`x}@qrvqC5+*(<`vNjzah7$|=k`uIVh7I@ zj#qhatl6-q^@y(nv(ctBbGn6oX))hkjy*In$GWA_I=)us@th2;!#ypfV6%P?g{Xx< zmk=<5M-6}&MMV9eFt&{P!Ag0A9}(;zjQWEsTW1t>K3JoA=+7vb$lnjrWnqJt<@WTm zbvltw`TbyY;>^GgZ8@}g@+jeMJi5RKl@}Z=VpVcg@|Xprt!i}V!_qU;r;yJS85c2= zHbpzV%*kfK_C89;nH3)+)A9)9t5&~4Ht1Cmv~0-phZ}gTS9wUbyV0kGP7-Ke*d%^K zFDj;n{ilxfLJk*i2rEceMu)B-A2)(`POPohrEI5F2Ry}@RcUVaqiW?om2w=Q|GEhh zjkAlveMyiKH?O^|5*sk>Fn5wsM5MkIb~?%qQp*g)sm0FlHHn_D5fO#nxGud`%{0Z# z(H#Smw@R^GqbFxw{?NXjJ=TVEPWq(nD^ZqA)IulwxnJo6vl~2=X-f>GYQ1-$KyMd6 z`EOR(GXV0wInYPO)JcY!x6&|gP`v{0Kuv~M6htj&hn))V!7pmUU!Cc=>!QSY+PCf+ zn0d6SXr#?BkggEs0(C^oKj5()w%HD2#-RT#uB`7I%ST0dvTtyHQDN+|In?xuws<#R z^nI^Ujdv$)uxtK|d%tNLi+8pO@4r&;d=BVty_M?`b3cysxArsdfM1DYpsL5Fn4`#r zPO9yr9u67DhhX-j1}o@Cd<`1zZD=C19q;uR;P*@j>!(KZDMq=%2>q{PRgv$Eb{Ji@ zhApmpF@{uLF7|sM^yr}Bq%7M6Wp20M7mHr#ogj)kcaZ`7y};sTo{s&eo_nhUcL5{ZIZ3c=`)2ZP-j`4IgC_JqNbLwxdL znK~H2#G&9AVC1@uDno+NRAX2c zJB_A7k#SG`FzbC{mTy^V>cvI2r9~2QSTo2j?!E$&4HEz00P1TcOS8=aM)HD*G6hcU zx;^5g1vE^>8xnW*W=?3!#HU)>&|RSUg0l2-Df5^A3zrtqDoZ$tJb6~kDX?-9Wfk1G zOtxGH6PT#L+ctn)9^g%XtJ%6dGl@Eg45C_T@Jxd+Drqvh^Rkveii~FQbVf!eOW-vf zaP3c)))pvb(OLdAxB?zTU@2M|t?tf*nKvuqekoc};<+BY@!I%W0nUy}HRRX!B4FCY zqFqhMd*{V|^M7k3Kj2P*)#qV1mO9^Cly{vX%OO{xuR_*CXzg1g9@1F1Y=6iN1Z=&M zssZj^2ocD0cPkr9HzfvY5g31682jS5$3`VEGwnnK4SJHS6Eu5C1#r&bf62X?0 zswGXGYxQ-Wk5R?@vVt~Igf@!ml>tKf2_>q_)QkMcw{l+ie1n8pnU(APXQgFC_sh=S zxKs^Dvi&-FoT&`ne>A_uazs-ha>f5x%uvbk#R)xRMzmN}A^qCbA1F0V=k6&k+gI7o z=O$wjtP2WAR;GkcR@CVMZ#=w}NQa8|vC#u%#j92I;X8YTfoiaWnXbYOG=Ou^gLnqs zrcJ*rVn_DRCbHgtr$);SpPuq|-EL5_ZpO|P7#g;s<4I2H-*fQXsL)BcQ1ql0XPmj+@#}bM<}cWnAq|TxYibIGw&Os~x%8WIH{upW@vgHtlkwy4}FhwC}gw@Ytbt zS|QYdkt3HIyWFni$-U0eS=-7)?bqCPr}*#8R`sA$djqsv=@*Juimuq%f+l}WFwA?t zoECWreVxx(U#!PLFf&Lov6(?fdzC zIggH%56<^BC*d086DFn*o1z63tbgmztJW_Lo;Bh-iKk3i$B9UTZnW$ekKu;6FL|}f z%2+Hp0!R+iZit3Y@O+_-x8qq4QJjxwz*t^`43f9R)mJ6g1W7n(P}TVo2{iL1n>ENK z$#K!hOJRq z9$7mvmyf>eZZ~HWU9m$AlbcL{gvS_AClzcD6+hj6kmX8%nXh31Px5`bn~a8{fJCpb8R28Y;9B6f!|8YR&w`(r5*&B&G|u#tI4hTt(Tz zyCxFXuT_jaA%73u>bpN*CN8rsQy-MBYZ2+mrj?z_G12-^?F*ZS<`Lcj6Gs4qb)@Xc zKM$_QthIhNY9KLN^8Cp^>`wJAe{Y zm-`|6ErEKbrNT>(>`ohr+-rrT_oq+9Ue%8~huaeM33!SRmD2X4VWk{@^7YOM(zfGp)U(B3+olNEq8Ab zAS0gjI0-M8HokBBJjmXiDr3=|D#*lHn&6sJK8HX^);n6&Z^mn_@bF^*`Ss`4_Fu<@ zM}_@f+=+il)H}AFm&BUz22wuveV|z8AtX(BRgGYZKS?~v)M0JTU{(KBTI+a_^Xlqk zu$0B`&hBXT^sCA-c5bhLsvj((wQ1OsLY;W_JtriQ8pqqNv&geNbT9uWY(JP(=tg}j zzX3!^gUH-+nt*kTYe#7sU`7&XPpF{jMv4a346PWG4RU63Jke3lDC_q%M|KSE)TcO&JF$9k}#_=susKn zsunM*BvyeuH<%h$;zbvy+9@pQcj|L5*VNKQn`v=X`(Js%dA8NZfV3(WstKAV(FYqI zu_lZ5JX^MNF_q+C96>B0teglC^xweM9&kRO3of{B1ZBZ1acL@RZT8@M-JiVu(ve+vxm*5b=EFf^r~Lh4S->{@@d9@+MyufN04zC6-ZbM8*A)UG!H{ z8ZXxK{aEfyydygxooEcNUPygD&x}#8hhN}=VuYy5_qi-LXA>&_X`d@xBejAD^9Q}4 zGg`Sf^`F@gHT0_tKPAdtY&}7^Hr@bP;sH@LNLn$>bx!Kq*NBZQNloF+P&cC-NS zCwIQ)cGtO%TMUZgC^3GfKyLD!KT@Hdv!+Z)w7~_Aphh?q?`ACV>&@xYLwNBeOU$4o zqdB5uP89nOB0>torK^lx(2>xQ2>w8$BOTA=7ny0v6;jj`nXw{}PuB`ds?Css@QnEY z65}VCSQZwD74%Memkj8lBbjA|N%o5lSZCLZ%;e>XiS>UA9BLCu7rI%DA=%SlTXO0bhdvm~JL8OQg9U81VtvNaFSEE|678<}~k9g!N5YIa;_SpOa> zs=#cXp0}aSJR5I}YsN8xjmXDz|EnB!7%+&BjEfv$h)9goU5ybnlH}x{mm2sj#Y{d# zr;g1=Og=`QBsGvKRWLdSTH03m-12yLvo|_}-WYXEhnXD1-Kak5F*bs_JNm2Gi;lEm z4Z$?xOxtC+NTnRC?1Y8CdUTGX2*?zNtY;O(Y>U!a5ZT~D|C}-3&r7AIHo%1H18#R4 z+#hIy6IVXIIH^Cg1t!Ks55p?kBG8=5ZWTe_OSUP<9gi2~k}J>K6r~8OkQS8lReuOP zf)q1KH*SzPu|5@H6m^{stD{4QPnA5I=dWmhUq{__NOg&Pa^Y!{>Q_c|K_KvAK*HOz zkaQq}By~Yx^N(HYD>e@{YlHfT04R)MCo$NTU?$O3DpJM$p!xu*gk_;oX4+e{87^UR=E#nb4-XJX&ts{X~aq^^oaJY>`#I2C_H620tA_-5xkUF^SS5@rIl4A0{36_Y@Vkf%H0s`>mwdAjdu2&IpXCsI z#XYgrnIK#dbq58B*s!}05005!RXg>(p|22gF2qeo0}44I)u94)m(bebV*qZJChm7_hGOCiL(qk|^>Rr-kAE36~~ zduKx`h)kD{v$J(%iI4niCCJNRf*_+*s4`KaNs=ts)&i5?VQ@0126}jXw}>oo-?(1M z|0*nRmZD4{<$ax`45-Y=kLMvafA*1Y9z5)SDmHj;0Q?ZKYndGsiq34WOyZ>Wwq6VF*mCo*%#ptTRy?HLay<1se@OKZUh7{3_15$|2Q3iZ>8SEIrr{d zzkf>}Cq-;y=~gbAoFKHR;u8+&fH^^_SrZ}!FFD+Pf_5Ng#m>*?xu&hehl-K-lYIYn zuLm;t1@bG~d0r=!iC*T29XP_~Mf|gjw{!)Zn01DhuPflci#?*^1bZ9aV(Y9UQTyXY zy=t(;1aa;c2fLzp7-b0?HcNRa3#tNl8$EX=CYi0L3-od(+TQUxe`vEjn7F_mcJ()Z z=29Ys?DWo!;o1`X_S(|Qh@=}2G4+17;JK1f16~@VB5qLA?LH+QD^=p(qJG>c;;0AR zcShQV^j($B9*=?5C)|FHl?&{TLw6G@*TUIo+9+RUF&XSiyTzajDcyb$7hg<{YJt^C z@9FwxPvJAj@YzKDao&oO=Yc{yMn8bbq3?<(jj z2q?Em4S&(&7aeZ+Fqpb@$*=AvnAmbcwzKf7B{V8D%F5nTdgu$ju%+Pg1=&vcATpi` zqUMO_U)U`>W7gaS6O$n{1rxe-TzAsVqW+eLVo@CoeNlih*Qv68h`Y4x4~?S17O)g# zQzhH^FLmXMe+on-#v-+taj4Zzy@YK z9UQTKTMKH$72(Bx63n<%WRuRgv>qzNi_JW+8M08|ob((<85!|B+bbLKG|v+sk{Du$ z|F}N}g|+Z&cdo_J;Zsa*X-Je6Lc)kAcb+Uq4%PybrXUF5??zDJ7nXtTdPpo&lX;!Q zAO-{$Ju!$JSghEfOVmr$1tql0))H*2bJ3-FmmVmX9ndn~NeqoP)rB>upB;5+J|YAK zONG(B?C+@uCI0cn89qK26#9Gf0CzObNlD9vy07JCaWDAmnjdj@fPItOeVzRo(N~GL ztJI#CLlGUfH73n0lD8cT1GMEUx9C!XNQMxJW3=K{qG){I_rOe0FEG z^lx2h8VYZDtrJ@&c)YWK`AIpPY))53Y_e@-TfLam+0&Kses;Czw=<*~KUf02_PrWV^(byk-; zruDsUHIbI$xpW@!W#xdjxX_m3O{szT=MA+T#qD zP=5HP6dtZo2h_aa@qHV`Rr02jot&=JznYw-)$%9TOni=iKJBWAUYpj1 z5k1?76}`}8i;I7T1B1;(2Mv+_&Aa|Ya&5VzG)R1zPp7M_YxjUvX}$=t%Xhg+4JB6$ zS+JkP!+x1CEzPbTIMO*K^-1r)=*!P)PQTu){5eBhbM5ahb((Wm5PNPtj2U%!!mY$- zS;tQozNcvjo%^xl`s0=8W^YX_zpCBD^y~3atdVz+-u!`+3{KlkWFeM!AslHslDbF~ zweX!~mQY)ACNnwElCenES;~B_H%UA(oTJMRKcweGCI}t4>jy*0!8BS$JJu$2`^`xC zw2lSg&pdJB%+@@yP0Al_N0@tZZ>oPN7QellwOxd+@U!& zrUXmIxo366>y+eox{?8%Vmq12DUp&~FWQE!#=_ENU4&T8Vnd|y2NS&`bt|KNmAO{Y zs0JJZ4$5Qz*dnotQUDg5L8n>FH=Qr2F6^Ce=rA1YzohX__At?n;c9kkWRPll9MdSa zk}tfoE}p0^fLuworG#@5ZJv@CCtJPqP3Y!_PZ(<6hTxL-xueaTddq5scRffJjF?)S z(}s*Cm?ypYeY}JB=m4(*~p+pBc>OZ2MXOZV?5IYg0l( zQVJ4K4=Y2UJr$L#;AmIL?w|dceDP?`$oUvVE_cww9#`}}@k=8yPSA&oB(}58;~d4L z7!XUddy2$ijH%muixO(H{j?XS$Rq%k)y$AcmQjgR(>&3@-_etox<|rGcWY^9y7_%) z2rlGO^!4$1sN+L>?|@1SnlfmNd=vdci(>}Zk&!?Ow_QZPs9}m^dpi?8WRcr)YW^Dx zp_(T$T^;J}0wRgkLGl5J4SRi*=?PZFS?hiSSJp-=|BU-&9%a)Af)ZUbfmr8 zFa-m8`|`%(*_5L?KPJL7N9Y06q*VK!jdBXgDo&1CI3G(@po8; z_Hd|@6_bOAh*Rfd#G*>}`K_p?ZlciTF=ojf^nca5Yoz752y%5I%A%|y&+Q7OYZ%IA zIEl+dYCI!AuX9SVLud>U#3BEudSHBwt?aYBCf}Hp{D4`xa{sVdIcO05&q>|xE0NB! z1D!wt67ia4HRzSfIg4kLGynV00q ziz2>87?i52tEqpaEnl#A%D6w2{dCKUQ_(G34w?Yye8*xfCSImH(f{i@a z`q)o(DFL}gO*Ym1f4lzf{|(E#`;7Qm0p^pN&SOOKwmbwysga~P1-iM{Iad6MM}I@P1j`*o3*JK^Co_vzF38WnsVOZ6{hkI_RrNHgt;^?nKV)?ITJ% zsI_8-OEfdo zPp1XdKo900fco;LqlDn+8U}~sPttd6!lhA#?j9IAWny+T+_PuA^b2uOAE-b*T>|vY3?+idE?|nD#&~@^YJ)sIS%X=B>B!d^p)BQrxK(U@biY}ydi%`81&0gB6&xVT9+36@7bsLTR80Vz}RujQS+VXx_nV85L1--!-k@=y;H~i^g z0-@i)@j`1{y&@FM1nB{AmqYMiYj@Fr$giqq+d{7;`Gs-JFNh1O);zaW8f5G=> zj6eP9hbRiW4)Y&mbZ?55m)*~TP9SdiI!~@a1F==9Poe+*A553U*t+hALGPTz;#!4s zl|x?S=zQo;TV@8ymez+N2CQASLH!eJ2|>2GKCm>ljBvf-iXNj*n^LCZ&<;e@1OKcj}BjW>-3lZT`VL=P_p*{C(D zQK0vRwen0bO3%lyDGca|8SGy|D421*oY1g&(LYTP?VTC2Edev+sKsicy&XtDpJEDS|ou&bJyA}d92 zTQlgY!~Sj%-i)+sNPhRb!<|`eF}~R>$bb>W=ZgZ{cV|&F$nwVx4%h_Lb40Ov!9Ew+ zcml|B3r?}^MskTqH1Jt9dD{yLvN|k(NRbs{<5WsO!OwRuc&m!%fqx-*`N-^qN>Zd= z?4m(lB#@*xmUik#Y>a1XD(ow)za^#jh|G{4!A;m3#V!TM)MOGF3CM1mWVv%D{3yfv z!5S1%ll1}Z1s2rw-@1^ROGQ?+BQo_Dfy835c``A)R=c2z5udl0(K46vWH?FE(~M_; zEF@6)`%kt3#rGo@FOZkA+QQ+UNmI%^X%A+s+KJbHEl9+;s@MHyK$?E1lEgxg3wojK zWB4v6WjgyTdLIW!vU?I)W)HW%76}in#w}WAM2OYY+y3?Qr3b-pZk=n@Zw!w&r$Us~ovQ*CDDHmPt+Jx@EPc72hVr zga0o89=r^4V*bxPsgP~SVPYywt?)|xK>e^}5cV?-(ro(qM1w%=8-&8{$JN6kW& z@Em0a;dh^14_t+cjjb5$@6ay)zv+Ic*+0{LlitE+%cxZ))ZMjqx#}S%q}megyR*KG zUCWkQYB;F&A%3XJQM|=@G~h=@5h3|Gp^dmL|6+Vp95o*`icS5X*O!Q;uOmu zRf?mQ#V86Fc1kY_kD=zpAX1{v-B6NAyhu=H807m_vI8M!uUwB;0C31jA!oy7+aO!9 zhb8u<(@yoK6S7p1bEG2>CfP`(KfRq~-(%8^@8*@1=+EsLy67j?4ZRnv|32ob`|P7} zi^Ka6N=<`soi0z_bf~@BI6`!adi*6)nTx*@j(@@U5SgE<&qJb=Fmm`NszbDtzu*9~ zlz-XtI|e8c`bX^+Jird#Ibw+RPNhIe&bdt6Mx&NaVr6WmL=snICCLvlo%_q@8Ho&b zLZK1NSxn2ZiRd`?5zXQ1Zn{i@wDRllkl1Frxve0j-V#$#&0m;y5#vFz#4+(Dl%?!( zbR(FS@a$0Ofr_Wp+|0L3|L0&q!={ZQp(~kQuL2x}DvFhmYW(M5w-f6qR;bj3wSYI= zvgD~tbvK`>)VWd-HQTETP9$jKR$}dr`;tsRgA9Y2sJC2F#!f_~_SYh%7C-c^byU4- z&o39&eRrL<$eH9!eCWNDKF#A1T3xlmY|mQq@+mxRN-VyW!Szp4L=bvtG$MHN5kOpo z@tY^OY`o?sB3(iR;XWGgWVmX?fm9$SUL6Fnx@CG4%HQ%L+4^-dOg!W`tp$#6BvsTS9TjQyX$f zF`uaW9+uj#h$|M>a8brKb&aJKgr{3cWDPLA~OC z1xc+xy(??tf1WYo2^A5`q7=!9L%^%YPW*lZC)kW;bXs0RRq#{b^liK)Bp@y#ZcjH8 za^>jvh74BHjXkXltp-)OWhx?Wb|Skay;a>nXPM8x0Ueq2zlfP7<`9p|p@^eo?K_DB z(;wU8-e11&GaTbB8HWe~{3uPUum~!4M~5JZfYohlr;QNkj)jE&NPNo(f}QOzapTxB zXq)_mtz!#vsWwnoiEi-D6Z%P9(NEJTL+$XBxYR~vn0KXLPbj3GcmRYXgl;U7T{3(s z==c2hnkyQKbx|r|7CEGjzur0lT;L; zz4^Ha0Xp!9_pfGT(C5zyMv5iTBQ`vuBLllF@uU1yyz*hj9z_ilB_V1zc7vuKh}pl5 z>Dv9CZ;|YSJ_LoSgcYJL+!5TD+k12OFQtyg@Hql`Qtick@yXiw0lal$H@iOC;mIca zKgPZ?Dz2bu6L-Sk?i$?P-Q6Kra19cI5AN>n?(Po3-95N#g6mH5e!K7Pzdg^H!yWom zpL=ijR8@CZJvClO@y?Hg!@)b4Wb}FpKrv2EA41SB z63Z)zPBHaSXGzTuvUmHkK?FV&#A4-EOZg!_rbI@XCsNl1d$w6pLh(CUJD}@}-vg?F zs{c(!U=_b(o)Q%ntnUS`kHCL`5)c*eCsO&cuH=>b0Cy8w zWphhJ*%X*#;_w@QRJ>`l8`7t3whr`J{G)LxR9*Eqqyh-?ET0(=lx*W;UD!r>q*;Rs zDFZFGw)1A~68@T0tiLAJ_@7DTZh!1R{+3bUPScKUx>NeE6bV zQ5B;$mA71*I=f^Htnm*|DK)@R3f8BO^@aS;sefbq##k3+a{p^hOF-6?|0hiYIZ(-w z?z$ze3i0Pa%5Dy0>@&=x{Tzm8E5Iro$J#TIJ;;Y?R0m=4U*lfI zxr=uip?g{J3N5s%0?5WKViZh7vj>sC&=jZIIbo=+WQZo47?4RP@9HP;>xAQTUt|}l z%U$~47vp&0a4;C!yDNu(2Eu?zq>D~t|HN44DpiqpMCE8M2HhL`Pl^h11xLEeI<|vH z?zp1ZfA}_&lEsotF9EW!pQ&^R2@RJPewG%&g}Io1{x1lmemuQG`VWW$Zr@4#8-VP8#Z+z5s3Y(S4!$Oe9X0h zhB1>0^`M{1fRx^J-Ok@1nvp;)k#v}5XVQv14hILboKh&q6b@hpj*;ma9mpvsLVt^Ea!qcv_Ep%WwfyvR)|_UklsR! z@armo`UOWeI5s$X5f%!UbrWAKm_&@QZJ2kx(-XyP1dv#%3i?MZ=_!3I=@9~hi?p01 zitz|i?6#=-C?Ghx=Rq-;c_D6{&9tFjI8L733r;LJ7Yf%ON#vgtux}QF)szP}|0^7$ zc-%zkS^No3d<8uT5)Tv7EHgzSLR}IPBNVnjV$nN@tO+Uc*Q~lef|4bUKcWgnMIPe} zza2fcD3&Oe2e=N+moqEoiznJV;$?%lzlzkN{TnD+DT(%$-|rbcc#XH${OL#YZN7RG z8t+A-p>NGQsn0aNa=|WV^`0x0gH4>J62c<8rs2;Pm?|JS7;{GJ`k5o%ixD~u|nXgC@UwcH?DyX%$i%HmyVsq3qZ$Zzy&pGO^&`? z!sw#u?w;qNuh}!-3>cmNWh&=fSemr{(@%#JnC&`rie2fY=)A>2d{l!xbvXZN9$O1*sXmq+f{58 zZ5KEfr%PodXOd5E3*RgrGhSB(u#+(jH%V%S((`9f>Gxy6oe5zO)ypSek-m*hMrz_2 zLGzZAmOHd{jVERJzW>0m+W8U8n+aNf=&@pQuAqUs`77C%40XYglHEYUAR~@k52fQz z&$C|~mmHf+GoaI-v;u(D$+sHaD2xDNIgFrvZ!K^(@JObxpofz~QxVhFt$qBlrB-M; zoMU+B1-;Pf+9NrgGc}N=Sk1^^7e`-J5;vb5$?=4}0cg?w)X~JC5s7L2nG6n{3pWk^ z|9HLw&Ji3O+)nUIP&Q5!Oa1A#B4|sdOkOXw#nE6(gQIfyS(MkG%7E}?@NFB`!m_DKc#RFdb!6@cC}jQ=mrH=o z3`+)ix}piQ7gg;3Vj#zts@9M|SpDk@r1~na!UOLIch@Q^|a;Y=n zr=TqS*;Fzc=z*tmP>i?&&uJ6TQ{TsK|0gSxC%epC!`>N&CvEhA4Q7chuidZA1LufE zC8R-ly^2CQgR!ygPGgNA`4Ee;+z|{tvDB&nEm1m9DHu(MK#eDV4qA4BB^k}JJw7iI zF76nvYMq%36%|twiu`n>OKACUh@71)A-7(Z+#iVA7fRF78=6_sF{4R=D?mXO5bF<^ zl?oIeq-x?+6k~0V88MIYOHTtGC5FoTBY?W_2ZGZhf@3@}Cb7pyX0V*H#0(;?({;1$FHWY*>YvVwY4D6-E$ z_kuIbhJR<)g%Uf{H6Gm%R{DHDPyeMfOI-A$XJF({U^wB$jpI*dr-**XpG|fYtqQ2e zydV-i$6#_5dEK+f1H&Jrax*YT;Iq@@7SnB za0%tHM0~vTE!i!ZTO52QdRM3@UgyXxD~(f}j!~Op#PgOV+B0zUq?W))U5d^lTS$?~ z$vx)XiBP=-Qv*4lE@<-!>yRwT^mx^sv#A5YW?*Q8OoStv&L4_{E>*-I%FRSNwn!zB zZ~B~CgpgbYK#h(&<_GXM=(K|SL_reW@3(O%tnX}2;c+Z%o|+0OT|of%X^_*9JCLZE(Bl&AkQf%;juOoj~pKA(i-RQh{3QzQgHv3fP(dhgh$H%M)JY~ z*c4VKp*5x=CS9=5OMTMqN6f5f)rTDshEXL+_uFSB;S3V-%N1766>cL?Fh1Cr7BK$7 zfe|W;gE5l20f{>D`a1K(n=1613I#Fy=ZSEWX>JrQaNmohq$Q|IvmfhosS^%;vVW?x z1(aRu%;A!jm9uubUSjE#jEHi6aS{tn98?YxWj%NC9Qi&3)rwq?B-LB4j?5%$@x?EftsAWIO*Y&2dTKE=MY^Sa$e?j2n4dGt`b93fdxl&DcseY z(Kk5I1Nk&rFALGh7q1hJlJO(<7weclz^3I_4`>Wo7Es)l*1O~S$q7sRu+|qI*^q0Q zN0&7|bU|d;&<-kjE~bini?{tha@!w@5V~C8U#5s;O1Ej+2WySV+P&mtSkpaaMP)^; zNxwGH7A`4C!PXB@!B(Cw1DxUssksXsflzvzR_88k0j~zUrds?4Ed=ES7G~ZTWr|Owf2NL` zchi;MPYnO`x#Xl-Vk}Mm{h5lW`r8JV7btG>R?QqR>8mXSKiOHF8g5OT5E~DIZfY!= zR>t`c@@n00z-mNC4J?DgiekNtKPRVuBfLd*$#bizqA@fIZ9XMmFDfc(Jz~$zy+Wd? z{>2NLDw)Nkdg6!`KLeGMtVBrSyvsV-fjk`RGAS2a_C_$hpf4k-ZL$xeVZM@xGm4DZ zUoa?$g%yj>yLeN`9S(Rk-xzA`MSVQp0_1@V9cTWQw9ubb)#fiE7ud6;nj@FSeyTxAm zHjnQt6_F2B;&Z%+8u1G^_;6iZVEr?JlHi;9ixB{Mn1CvliizNu=ObV(Xl4-TVTli?4DnjFBHfc0E-oa`|+svQU zztq!*uq0!L_MSuFx zZQ4()*5$?cnd4z+AQFDyjsNOmZB%B{5fGGjbFVz#kFMu$V-F#t3(aGtMRWVpt+d#D zKPu!e?W+aO^Hy+mnrK%Uic^90%iL=YUF$+UxTpZ#Jy7^Xi-_jl{GCj{N97Au)F)898Yl+GtF=GbJ1PWxh^!c{J98om!KTtk65=A zc6Y2IxV|F+GEIlR+)~|A0o~Apc-<1%&^S6}`1!A?;Au#?aBWOS6h;)JZ0#iN{W%xs zS)AozWUe!P?IMBT&SHBq{qG|p3P*@EQif!87VW<3_MovAR)jbKm;X~Zip^^afa&+PV5rI*G zZdZYiv{@h)zMk&RBRarvQ=1QH^(8hbQT2}j0V}Gaq^Z!L^J~wGjdM)`%PP;eoJbDl z*&};KAI0Hqk40k>W|mZ(jeD!OMRu!dFVi?G%7599;4Dd~0ai&=Q24X73UE|Vd+R*4 ztH3t633~@oX3`ai{unen4UeB$@My|p@SIB{nM-*x{)Az@`nskbV3NU{LJ$d1=>G71 z6n%k41@&~I*Ru^Y@!M*n-scp3>i#nRF)M&BCw!P^7=-UYu^bo$m$6NK7SUv`8gR)DYC@)D`Gso~6+#{Q07>NYnF-nc17wiCtR zXkQg$ibc}D^jC9AC*Wix;y8a}cduJ{OHmJ7t)#GQLyL&nB^uoSIcT!?l_kUiH9TsK zYvL`qDr6^%Ni+Z5GHHJlT3}zxoIo~GZMY0SXL9V@>4s0ZIgCom=PROs(t#GlRb7?axyFj^imBZ$>aF|8T z*d)r4+#>w`#f0y{CmC#zR`L_zZo>(TLv;`9bdA4BiRr}nWCms6WI%Rxv)&TcDQ-Z< z6u0b^EIwvK)BW=Xgr=3S^HR(S{8a50s7)f7St~WMTfFhDVFO?*|7Ol#z1>tOS(bB z9;3#Kk;rD4UkQh9wVO;$QQjOW@%MQtTDmz46fADn z0vg-hx@p#$&yUt`U-OoXAPf*Y#Jres%VqkcmXe8C9m<(&`@ygkRAIp)0u!nOkR zM?MXNAbNj8WonHz(=R0lMj)oqBeW?7-6scuXiffyJd^FdaTz@XAt98Tg0=V4GB@X9 zNVb-Enz%Y||4)o&f$c=_e6%#A#lmfRn+owXE{%0TZcHD&# zq(32e@OSIVK04?t z8gtPJj!H%wCBJ4!8$BS_6g5acTUV}IYxJ*aVCZdXq}>|>udXt531{rduro>?rWz7H&nyIoJXnOj`+ z=K1?w#i@?^XCg_z0K&A15|=+&iEY$joo=;EFiZ`rrDs$TbQNK>oDd(!qSF z9@a^60MrbXJhIXBd@<~=j2J`g&248B@*cE^{Fl{BWfpEy@P9-)jtGltcI_FYimgHSH#b$B9)1j zv+e?2K1nCVy@RWQ+6BqVPH{*ys{H9Q5sJnr8Uoct%1JcV7-bZN1JrS|(ZoRC;53SL zC^O4Hm!$t1dS_1`hWz+@Jp3~x0MUjRFL7uRYup1fpf`#UNaHpGPWSzqMCKBYhys()Eq0T?lsp(##>&bh zg3xIuf`eWpfFezReZ&WEA&v%C=f@Xf>sY9b$~AN;jdM5e^_jntcpyp3*wGPEm@v~C z`-WVXPq02(Zz~|iIeVWhs|Wj6N`zp#*9ctAhu?3Ld&}`G_ke=k!BhMof8ar{q}9bA zzVH*++g&}6p7!jq>Ag5E&C?g=tZ~!1OEslbB#%Xu{u)rh+{at7-3K4- z!V)3V?wf&*%Oj-};MMf57H~|XW52QkMQPq>J1AmuB*h0o1Cc9OkXELkl^LXO$-gB| zKcDbL*&k;A(!!ZL+@M3MRE3XHLy`nV(m&b5Pwss%R}r20(kn0j^mzHS#BB7 z)Ic}cA*(ze4KBn=yL%-UZZ>E*F2S~2^W~<6oZ>zHT{rE$xWjgB+RyXdg~*!6XD6&E zuGQ8=CIo)CaDWLr+9Cog*!-nE#T)R9yxA5a`nIaVGcOO_)Oc4+Dqpdj2$lpyQhyQS z$SF^=ja)d|XGqEW0jx1=JP;GElpJc!954^f`dQxI49)t6!`!hU6h>bVGZ|g6Ntw05 z3E;l_Hb*I@Dx)g%l>)B@@(Dqv2rO2bwrB-iridLyTJ=Oybrm&5UA45aUb(GRHeGPj zwLBqxwUF6LBb;?scw>%=Z!)9he4_Lb#)-^{toj2QU+vplGq6I-f$}8e zvSsfN=`)t+ibmoqCp4L_dV&Gj<3QH-A*@w4!<3C zxgdD4M*%%mNU(zr#=dbr2|gX_AD2p0Wx}v6^PzHM{^S_sc9I6_TX0N%H;;h4a9PkOLH?=TJpT>* ztM075WtkYdF#7hK8#_23KYzL}BuO4T9CUPoY7uEL6$uP2J9r1XU$muyu;Q@qKs=Zo zL?gT{kNwvdQv7I}@J4v;PXIdz2w_n)fb|z?h&g~5TCFOY5n}F5IM^2mX%Nl{jE;Oa zae>r)ut>0QGQz%?r0}<9?LrjbR-vTup?(N5y%>p>Xt^@IV^n^BPi|L){=lHTw{iVR z&%vGfOMBuBwVF~BM17x0keep?1`j@ch0- zA*bA7chB7va(f(FkF*6+^^KA!s^gr1gjQi_wghFHkr!AQA$XCV&J>oweoObe*#kemGDoC;!k)~fSW*PAlVhPWqMcEVc zQ+UHs{7?Fz=A(*!8P()Jd##Lk92&ECGhJ;Pyd&1-!N?oC|4?TWY{|VZdQjGg?7N!v zligL=MV=+SY4(i=#=GI8poX>F0OH&-qEMpNVXZc(PF%%X$xf2}abHNoS3!$^=-Wq% z`>q@lC4~xXYP0*HCdZ5i2JDJmvjk}?{X(f2HSUg4UfbNFd(L0^R;aW5nAU*dq8goq z3hz15wJ3H_%}+?VKS-qntzOo@2C(3Yq10a4`WF0*)>znqsj_Vgvu)b#T0QrRkF$u7 zlzC6fTc*1xHE$|~>7P1pygk6-qt;)FO7)5p*fk0phy)6x&p;G23QqT$d{PYBHH_Vw z$WAOai>opm$u(J%#$g>*vIB!(&94R#ZOhX=b!Afr14Q`2PhGPPnHK>G3w@vEL&!->ncCw3a2)n%5OGFv08suWyx$32 z9AG6LK=2|eoR2aGaf8sC;)@m15-iL zYR<5Kp;RSKulM03aYQdz%nt4J!xy^i+~>P?>|-M=76lfwcB}$@DR~5R+6Ln(GyIwy z!t>us8D-A~AnLC9{hC^QCm{&+Opz|ATL#?aYxav<=yvi(HWW*+)n5|7Xu)cRexN$} z&-&d0UEtNwId)bxQyge<)KB2B87hqMUV`VM%1xh#U>L8Rp8O$9o?sav4)iB&n3`bo z=haXAjz^lDLZg$!OUR>+Q|WPgows?C;dtMkE@-4%c}*0NqZ_gX0twt-&C~ruBEPaq zCIkg>oWkpL=0~nr=Csow?4N^Q49Ta?*l)7~Lr!P>=0_Usxud)@i^+rLQ|T9kttgn4 zj%X&|StpsY>yM13mlYIL8(4tS9NMiq&_~%qcN$w&@3(GlATE1EJONh+wq?cqttHqt zl_nkS_i4;f?Nu=ByP^VO^;mH7FN{wGW4EnVA^y3L{8i1^SCT5BC=UArDQY8B?r~GV zzuV7c;|ATu6ADK}d+9OQ`sg&S2vtRpA~C(?@SvKFE&$jB9Sn3mn?={#25C1;T!RpI z0(=6a9M6P9xR-cTH|qe!_3?ah)9+1*NZ(49#8(e zX7g>ZP;!|yLr=vWDmnL0B+LLR1@yNT9(!fIx3;!82MU8NP6s*C&|s%qE$uQeg@E<+1&dIw|T*H z&iGK+L73*Uyk87+w0dc-2<@o-GWZ2{a5GxnQA@H>Vm;_Q|DxYj;qo8|^v4*~ zy25CS-7H6mWTjcIV1@Ne(D(Km7=sTztibwu_*?Aid0$QFX?xfE<8_hkMBa6P~F4D4-$JgnymwOe!6$}oxMd$I_Kt0S+Uq`#7e-d@ zxA#q~fHk&mU{>(E+oSRBFhZ227pvFpLhlY^vg`BZ?%UI3$fd;9zM6>v^^u|CR?e5q zDJ+Q!6 z)Ju#HMWNd%CJ!zP;w|sv&0ApG^O4Z63p7ZFc_CLep!ECNq|43GSd|JJj@$tx-3*5FoS($@%}Nr&p&&2)!1bQkU{_vC8$$my!FQzX!-f2Tu#Z^UO|Nojuh{)>#+h-=me$8U4~ zAq_bQiFL`&4@ahT{bA_+p+pv~CO%iSzqs6``+TcTmR47a`j4rmW-?n-fMvfvmU%P` zVuY_pYVc|-nibq&_-w3AvZa=hjd`82e5ik%De%dHYe9#bw7*AM<$aqi&6Qn4 z@JUsykDoRgqEfCvT0N(?4DMIFKhijd_U)8?w!$Fyk9pfamR(yc$XMMik@u5LfD6q( zY41+`0u$pn$iFecH3EHgVpTVZ0Cb1<=6)AK5~Vow4HK8|7Ksw*`@6Yj8+H4uU&h(B z4S*S>4-ec)RN^Cx6U99|cY>OS8xYo5FuI{R?#u~* z>z_HnttHj$C>MY8q!A&q#@Atx7{kQ7pO4?g^@dM%6npoix-finFbuYupZ&gHJ70=o zVn8jAdYYfKx_#7-w)+Ip2IosyyojaG;|26U)Q*OZFrF3=!Z?bXJ$;DGV~%+}zJYba zK!J#X^9}n=<3~5mwCFot7wUq~TRp=nf;4eayNRkp5QV8@hO=m#H2KI z6~#!DY=+;i!}UlPvJuyqS!4imSlKd6U(_L7St0#**u?y_Dv{OR%DCCG{TcWsb`?@aHw= zfeB1|5Dol(IJ5JrH0zofee3;_Ei#^DhmdJm38!B1lbG#+-DcyQOZ@2lHx>>o_QHVA zqJ8X%rjziM2!I&u!|xYmM?z}xq$)sTgO@aiy+Kc$2Q&Jn=+Gm$Nq*I|eZ6 zroX|fAkHInwfHwsu-*eW&>~*fBtcOo?d-5ELmF9qRKgvmSZtvsqa_6ncR`oItf+1=-iPM8x`)h6@N$8<>KSYsr1{C>x4S{hD!rGe5w2K zB0M{6CVQTj^do-+&|ojMcA5GYZdsVso_~ZgGo?pqU~I6BT2AW3)pPtB=!%>*A|_Nt zeKrG67wg@)-`+^LL4$fUmG31kr-xEI$%-x+W>r$5>|U z^|Io*iDIn#M^7ax#5+qqh>MK@p=7-EHScl*_5tw(jn6GBA5q=vlPPcN8dNW zm9>N?nwlfPa!FtDFcOv;(a$qAp=}0D27V(tR1aPe%Zwr}cKa);KH~fhjVYA5XzI<6 zr$cXr)Bx1g73BPdz3KhE2R3^igj^M2bcz)ORugmd5e)Ie0a&suL9g7|lL1&%UhhXR zUKL^T*)S2!Ohw^f;gUZ<=lmZgT(QT4Lx?kBQ4m=)xhltlq;&GsBw_{g&`FBe;=Etr zW=|ko@_i)><|S}>!Eqs2uLMy~ZZFZJ6t4usW==M#XTl)x!W5C}cU>S@F?hSEhZN6Y z@Upfd1{G~Fj>W;F#HnF)96^!@S%Te^b0>Rxc%Tc+y!qjlTp&6$J6aZw>CY1=Q)!p{ z@U9r~x(5~MbML?vazDueHQYK_Q|S@qRdI?0K+1L+obPO^da$&w1Ws}U*Y0-(RMvAC zw1gEmaN0T*uqX(;AbEoNep}F8w7A>^r;=K50Zu65Ni7P5sSzyMd6PzBA#u^Nw$PRx zR*~6xyD)WnfM);ND0o>$!sp>fVvof!JsrYKuBu{JJQ3@pAfhBoSWQqylw;i=qNPiI zTv@t!JSYY#UTyX9{a-IqoZ2Kfb5po5K{`0|-%Ff5Rwont^!JG_Cycmejwu@10{%6` z9jlvLz{KXwhT-x3eNn)xAd`}Z&@Aa(kO-A41S^GUY1r?FLGdTgJkWXG5;{fDXyv2VCI06YKJ(y1gGRYvwoLppPb}%| z3Ax6(HwEa;ike)J4-&!u_kE85egMsD@k3qER@3?<|2`2&XmAP%H1_Cq$^Yq%Uhx)7M-|Y1`q7-TBi*!t>PEeLvwXa`2;cm^1QGYZz91cr^k1_ZhA zpAbaO(8~ztQucS#4V#I9^qB>PXh(%>2yx(QYnLq-)bTw)V3Xix_-M}78E`BCcFtVW zygjxv4-GVOq++Afe>}IF2+xjoJJ3rg6F|&({qrfOV@aPzyMy&~d2?xU#@2}nxhHMY z!|=FuF2q#OnLx=>aW(P@V;m2;8WT*z*BNBqyKn(~Xvl~SwK%Xc7*LR6tl7};sbW3O zxr+~(U-|m_3OJhIIDwUCQQZkN+>iPWtfO;>u)yjc9#KpfL@=|R#SNK{%(y?Uz{n9z zn&yr zuoT3~rba(ZV6|a~(*aWhXEi5F7aME=J5M$Ey>@rW&~n9>Jxvh>_fgH)C6`QahJTUW z2MwGwK2*r(nQ&*7VFW2pKRfnoAHx+NQYc`L9WL}Y_K#ik@O<1Dm||#V0b7v;q<(3%n$ z6~^C${S^wQIf5w3SU7Z~_I@FKMFHq>@T5j}?(y}gug)8_xT)jrEP0i^{ZM22cnKI{ z-m+|K*rfCOk@cHTVki?iJ6eWR$*eJgm%Jra@t@A|!FqNu~ zdQ>#q(MgEp(5j1CRM3-t2!^-}DI!Sbn_s!^8*>Z+j+*whq3$gKrN^uSPV}OBjcam= z`0!e<$84)UNi{B7>r>7k(klI-zmj=^QeBo`E)KE~c<@EOlo<|yjBVn(`TfPj&f0}) z<7uJyywxw}Nc%N?U}}m#G_@joT3e_E+ttHTx+yZu-mzPFEhD4?>mOgNFJi7Zn!%X0 z##2JL%vWk^^PGH#rja4}dG4Q4DnZy>@5RD1wtEZ?3m9iChNATLne z>$|URuT-Xf-T@k|q}yku5M{>xit>$sCNjMOVOj)Bvc$E(NO>9(u^Z4Pyi0obomi+` zOO|m)mBms|I3P?Yt%^%e=(kQI9s~kBBxP?7hrIf4Fo5yl?P`7D_p3F9mr>kRLWjn4 zc=G;2LB0G+LsxA_;j`+=NP_W$>UH1%!Qm2r+B$($LPKuKWVU6Pe)B~K{3{*OgR$Tx zbjFCXuXZs`p^y_JwutBbHhf&;tU34}UxrToJ8@|qC+**4MmF>)27>ThFn%t(Zt%6X z=nN*_n98Je$2UCRQr{vJNGl@H$>xt70ytYd!%+7%93e7gi*=vrHM>)ls&0YW%#o2r zV6z}v3lA1yjb3*i=ZqRkPA@*)4qNR4sg9jV(O=F%I4hSe`HK_5v*FmR_;*7V_c>h| zd9!DswJcB2hcr*{hoK)Z&KMt|UgnoQDD(`FU0}v2U`pqiuuZR}6LW)$GYy zRhob58P!*kBri$R(uFq<7>rWP+#pbaR?`E+!4IY{^zYbYG{1Zo|2oNO-e%l4x-Q`6 zzwNZX3Sv8l-XrW>U}U zPd4eeAa!_TKfm+L+PdS?930MN*9|b<1e9r|F#-K>sf7G6Z&>D@Zem6(4&Q+qNH zh=6;rYxUm{lkvREKe8)l>=Eu|jITErL+EozmZ;5$gf=(Usm(yDS_(`))Xt{$cmaYQ zipX7Q>xTuWv2WnL5)0$qrHA1f*D^t(@fixKAZ0_U(k#0tcas31lMI5Uzl!j2+X~8k4M!Tz>4HdYy_vgj#tl7+9vEyQjt9!U-u^Vgk;171rgjcBf-X_kY zOPk9$9@5zC4gW;DJbTy#q^?9_K1*B6*223RG1m&fdd^7SaOsIb#s)c#3fYH!eELBK zGVzrPxdT#!i_ABqE!jV2giTodaHTvbcxF}r|BX%j)49$M_EDi?i?2W=90^}JUxf@K zl{6^zK^gYiVrQ=M_dP^j(P(Sst9w4jSz^OcR7Z6Yb~*K2T!n=3(oMfyOw`_i1=&8S zLTnORm^k7bsFm;LYH~COsE}s#DA4E44(;FLI;D_ed-zKn@f6&A9r+4GIv`TRRUNQZ zOsuHE=rH1twH0y?q_Tikyh{x&09|+d+VbA^IG5s+g`PWm3C(qX%koy|*b~WwgLx(a ztbOvYpM|@SD9WNylreL&1T6MMJ$tu~MjRa=`^pnUDh#tSsfN29FePpc&waoY$w5WbMEZ8`N;Myo%Wo+$E0(3x(u?&jgkHwHK`wnA+ z?;dw~$`F)17t`UzY{dCbzpYYPa3~5PX@&dbxyz8C^oO?%Rh}`)h=V+HiEzhFCg`U5 zgehS(=CeIW=>}eGJDhz!U8=>ikbkRPJ-ttL#l4@Hu2K}@MSEZz%@0#^B6$0xsbnQ6 z*)!;(DRcl3d)NSm*W_+!kxXoP{}N_lgMZcFjaYBEe$#^}+1q*!Q?UPq z^s5K6#A!oIh-K(g&LbcoYk`o&o+UI0J_Gz4OEyGD{;j+dR8@|%lI?&P#3rlE%yYpn z^tHoSk|z0smD#`$?lu8DFM8iHkVywHNQ#4Lh6YBwgk1p{4pWlPJSecX3=HtQ*1O$x zu3S7Y@Tl0*A7&F_-CG3+#OeJjxY2(oGe}DqX$D99pvU^$KgdVqKjZ#5Sd4B?N{sYr z?xv89S+s%T!#A1x<&xk9R*PYlRK@m9``mUMs;R^E%%EuR}vhXIErdqL4`xBZ$hhhc4|3476_rYlkLa=fsJZjmbMEpU*gm~&-NZQ4Af_+* znrQL|+N;~^lQ|L$G$P60q2za_dBk$N6G+~$0GbS>O^n@Z;;#wWJviO;1}}WM?<^BQ zAKOCG12*y=9$YM98aiJ#);P3R;m4gTj8L;*72qn^@R%_oHiQI(NPH8JA0$u@YsW~% zJS4Ml9>|#T=G$g!A_^>+{+b6CFT&Ny(dv70AGJiXYvj#ro0^kBhH8p4J?XV+?KE%F z0L+Nldj&ZCQpmM5ZVhrvN8!w>0;_BNxaD6?QxMnNNAc|XNSen?Uq z4VDTv&AF5R8=+R&ZC|g!wz{vE;WnJ%V@^_7CtOAb}qhrV)ONRYhZF~h&SW1E3ChjI2g(wdT8P}Gv89~;p%f5 zHSz`UuaG4bnpue6aa1_?$NUrtVX<~RSY8DIGWi<_V+2cGkeW>XNj3^2m1hezWr=(9 za5qsXP^+O}bE#N;Qu=+6;-=9OlR9U{$9xYFGv-$2bVhMafaP7rs=J*TOT(@DXCMWP zfp;&t9r&EYeEO1;K{qWxA#=LBlTUcS9|v)U1$&3UUJu`5p9(JvVb8+qN2UzQqs&iKR$t5NeJwgEoGElxtM}>d5f1 zW2jNvvrEijo{b#dpWGXx;z;mN#dv48k|^rL*VfjBWqdWIe%F2UjA+)wuBwy)GL&;JR zHX#+fD`ZB>JXBhiL$YrG2@oJu9Wf5Ju)>41VKW1tk~6VPR`w(sgICO+^YF7E68vU= zCjtrr~sa=`4Wa_h?ZArWxZ+x zxpfWoF3zS0H0LYX22wH^NR=;RAvZtXJ(j*zk!UNvc;AVgI#Y84Ut)j^RW%&XHam~D zsGB+ULASm#Qx-lPZ8ej{mBZxe?~Q5tA9v^0sMy4{)NehD+m(L7lh$bFuSvg4nk~L^ zlC(E`636vwUTIuUQV5&RfL$@$*s{ksUj&V5b*V6lFzq5G2 zjtkjuj{~_pB`&ssztc!FjmAGZTHv_eD+JabV|K`aj-x=Lx@VKUGq>k#kB}R!T95uE z#2g_(*r^exjQfOv?58uGorjHI-m0hGN72f+U0j_%BNd)%*t+{qBjZ0z9SZvl6f7tE z9}S6wILLN}#CCgrN2OLqns^;}stNKw57$W@`J|5Yn z&ttHUieWOj893?IHE^;5+YJTrb>zo75emiQOmZxLwH$SG)kA7_4GMB;8kLJin=0KTjyWYlE@EP1-p*&yLfp2#1pNAnW+-Hu} zyiHKHji-UY%!V|n*CXDC=(E7-S)sECHhig%J;u%-1;IwMz$VCn=Ao{%m(JaR)A`P3 zG45rwsqbfReRZdnojck^Kh5_i%_kx}d^!?ubxf^^-?c(>mQjTqNPG-J6!f`-Uxi-@ zC>y|T3cU9bZpaxp0YV7ZQg;(d$4refvnSQwTLg;0*XxwH$~pd8U@mT?*Lrr^{d8Oh zT&m44osu?_uQ0Q*OV)$$N$HV%kF;3HcHxZc`<*l1WyOvsO&PBo_?3$UeRP#;9w~j6 ziwC^JZ2S7d<-YY55UW@(2TRao$|VO!wBNl~}k z6B=}+{%kd>lUSMV5?SsFkQULERkGdsBn}b11lj9Q>q!>j-t=j}l&N}RpPH2)T2@jqi!R^!-(Vc}(&R`Y z>^v#s+5zI_>gi^CJnlO6ov0f04kLxqiw(5rK;dwiSZzNHwYg&9aI0e)lAkW3r_!pG z#l9G7McmM`NHQ!k1kj1vL7ANKCV2iHgN51({)H=ZA!o1{PA0#1U?^cIslpyY&;rna z1HTK$J`u^vqvpn52wDp|60PviMLGA`$0*qj^;DN&C0Nd;~X*TH@IunT~NWZ(#e>+o}4mivZVz z0fP@C@_6(tl+1<>0W??^EMC1IdzAS>h0!H7(>b8*m<%)fB7+9Sn}hxY^U>vy3~ZtB z&pzT?b#gjdeu?!&eDh)5@{l5}E98Uv-|E&@Zd4hYT|Kb%Ce4AA*R`yqMO`69*~v!Q z4Rw7uqg%MUD`=EHCl8^@nkqKY%9=7#XD=*o(KP{)fh(a#<4FV6gz`57WO25oGo-OK zskXityleKb(xi3}>v;9g^`elU3%fANW$1&{c?7^@;big>E?xrB=7uB_RYhNrd9Vyg z0$r+wJ~IWzqWc5U`hTbLQrantVsacQi%P@ib)$bKJ&4M@kND~!t!E)Q4y-yzKWB(u z6>{NRUFB==AWycb4BkJ_wvr!C;Y4TSc}U!l`m@io=c4FxRO2CC;mzb^2tGIR_1BWE zSDTv=TcV5syDL$mtoRYK^6gs=r|y(LPk)d6Yvzmc)|e3RJ(N`$vl~`8!WB1R>ZfVO zTgvBN(1HL2H;xqL`B_TK@3gm+H$yV12GkO_}vv9BS-bKK2M?Z+40TcyGFm)nrB4&00h6 zJr~*kBI_)m>gd^ajazYdEAGXucwwUjio3g8@xk3)i@SSqFBEqz?(Sab*?r&t|IYc= zS@&95vu9^!o@6qaOp@n{_rMu!l-Rzk#AbDBG`Ir2Xf3v&b7kX_ z3i*=Y^Df)qdo2UE<@aaHR17em8ocu@C%sZ%VA`>K#!kzqXS~ktIFzM<&M0e*YfRpNz=*p>^QHV^zpx0Kz*7HuTXHpZxRsesK5n`iw zh@Xaaa2WyBs^0Jf=Q=-5duUY?wzbIq6uGsCtv*g$bbe1wUbHnhCj7dBnW{yhDVD@a z*0KP#smNM5z__$3qwOcae1-&yUsXnx&~?^U1WQ9EXhrOSwv@S)xv-fWEKXh%j56jb zOmZn{+j*DD)fqmXfO_VlE%D_PLShN4cc$QjjxDtR9#C3^bd9O1eQb z_npMhp>EdG;OIn1S;?VRdq;hT-+0|+asxQy88`-KdLn|svxbfDLNMfey~*fX5pSx1 zLf9TYw%YaMNPFUKt#!BA7{}ntlu0LbHY`$~R^Hk>y6tH1HZmJOZ*B;w28Q>Y7~cJU zWL(c7kW!DGC50CKIT!S_Bly8IpOfo13NO73?CE~2zX~s{$hyFW)+)=pPh|e0?HRgH z{9*^K;QSPX99ioO`_2HCllRY`ApuWU;8hjD^zKMLEdzQ>Ex)D%hJtzX>h=> zbd$kyPkgNd?a}o;hkxt7+RoZ3NYFF*nQ^y6oKt-&zZFW{si(_5C-KyR8J8O%_1x1+ z6e(Tpn~+ac`0kvO?~(wy{TNM*rT<2S+04fSF-JLmkZ{wOsb)b!+ongBPsY%q-Snb>KoGj8H&t+wJ`e(&sinF`8Q`q8n3$nzmwJI|^x}@_v8l5@Fq0Q)!#2 zoO#z14b7h_y4>v?LJ_D{SQy;q`yv+ua=QR6tH$!qOmvLlEB1>p5$u%| ze}qCPatbIV2r3D326`si{yX%qY5h@YGNB$;sLpXLQv>Tesm?iO8%}+23?W>Uk~Iro`JgGRIEATUQdHNmuRvb=L|R0+jD4Z zCJ9*bAG91{hI~O@+_D1xNOaO8MO8P8*c*>Z1XTva%OL(G__vp7EqwE^M)=a;DqOdccdH6iM?C>%}M<^!2GNUv%Y;qyj0Z< z&*|YVvrPP43@n+#Jo2v;U=<~{gU-dyy4qIu^l#Si5+_Y=mWS?_h=nIB%Q)E6-y;>o zay{|c7XQ%xnQJB(($3mdTALJ`1($iWEqgC;p3m$l-QydhW$>&dv1*T=4D{6R$v8k+ z!H%dqK$UZ&JSyHZO3CufJz6aWpdEbr8K^dg4ec&H&T^!t?v&qyx5^rUaD^W_PbpR@ za`xNQ#;R6UML7B8=e^aTq!V#Ww@Az%k|RruPy|vXml%W_}>%UU9!L2qmB* z2BHpJxJ6VTs9?evq%~l|fQVpX-a%Q4+S&j*;nqfNQ3=1t6@kXufKuSpA4dXKM9i-g z0)&8Gv?zgqKChby{)w)kA(He>I}EK39^;Av7afDFoNVB|P~#pv;#Hp86@}HNiT^uo zbX7_`Ty*_jeF~8QsO<_|ej`W>oMPTm<&h<5NJ^-IMJqiP=O!2cN}?%a{JlseO>3b-~x5;G@TGAYYI=zolPM87MVnM*Z-R6>G{gq1kk7I(=^hGVKE z8~Oa-(XJ@A#j(>Uh2{XySM;kqP6NXyMNc~luz_Kh=vx$h;z3~h{;~K$IlG{r$BXBl zMaQ1|=gQ)0V@_85c#i(nxsHZVC9dAT*PdIi+;NXY@(bEw#)hzrxmNy3jiJz@DAP+R zq=ExZzYH4Q|DMz634DPR@X7yfIyid1(o4-fT6Z$yJn%#zE2Z^1(X?^VFc=UBoVkutm zs_hQCJx$>y*Ilf}e^eN^B6Y9*m?`cCYvwYVWL%`RIKxzKj1MS^9U}LiR_DBU@u&Emy<2F1~Zy zhe_|)+S4}8dq-5=h_5quf)Cq*H*^zgjBKZDrxN`W!Y-pNUe3ceMz}tAP=+H-oO_ut z06ms=6=?#FdJ#)sLVp4lGv9zmxZLOjQ4sUuOp17%Y$P^2b2!HHu|Qrll`Mfk*A}#Mm9%*vDH)cz z9YWxQ(tsg1dPxd7ZLT!84XQ|`*8BabQ2dHi-jZ!mYTchgIXC+U63Y82`2jcrPSL%3 zIgQ@5)vavfKWSdRVcTKbKLqbk0mCs@j{VPw19Y)*1Vv8?;YG*qQ_z0OkeKRJ812&y z!edKME!u2)j;c%d+{xH8ZhETL9@gx6S~GmtOOK@9^f;Qw{EgN1VsssnVf^Cz;X?^{ zZI^pKxSt2}cCW~pzm<8q>O;ILo>-jui3(V3?|Th7Ajd5)x`YQtR$2qV3ohD$hxU>Y z`?-aZ?x1&SsCT~m2O3x47l)IViD11jXTBO$#TqV+ellh|$OHro+kT5B{_&X(;8bH3rIE@ja<{hdL;xf)r#ULgZjxl05hc^N>cEk(1j0z-m5GH0{ z!6!P=^|S7zfoT%%`xiVE`h-C93!BEmxpU9EwXc`roA#q1E}4-#xxQQj)pW6O~w#o zqJy2T-7id+5MwIkmkEP)4TrU69}2+46SJ6+L>>*Or=~+kI!?zEqtgghtSx@4&mB;} zi#G_4qEv%b6+w*8ox3zpRYXOiz#b?k7ZXiFAjekGOQpn4qG%JL3sa2y=BH`GVsY7> z--eQxyZ(gD1R%*kPG^p=AlbPH6MIx2WD0xJHp+XMt+n4P;0?f$T_)?>52oH^QlOqz zPV;Id)%K-bA=N!7^1Rpw=W%)Nazmi}GWlWIB|DfqW)~wn>C8IOpoafNz5IK@`#_wL z_6y{LXQNfYO>f!Mhn^<}1KLgR`Pze;GjHp90sZs}4`9R zsZZ$rlLGOYj3n2NXrTMpx~ zo%$FaN6Ah;r#zFF><+#q+mDsK8TjWBn89av8LISw*20w}ny1D>SS94wGDoQ@aAfPNI#feZ*qW;^#P9oY6;pX@gs2q2_>-21rW$XCKgOsqL5*GjWC zqs;xAI&qurn)(YkAk+xnA$-a>mIV8!bm;Bbc8DO^zn8vX&#T#!upr;S094TU3+ z)^#y%E9{cb#K{dCq2*Jj-uC%qvc-!r1M}?eObD-2Q{7$)CpX*VUqNbVK8} zv8N>8rwe_v`&fXeHdT1LCgJlRZSHg7e&Elf@Z>~3FcOZ{-Prbx_8zSk$e4(NZ0>}$ zGjF|QAza$u;ePQs*XREA9Y73+b>jEfIWz18f0p22T_h+iq|0Zxv0Z2L{ZTh;NrXDk zDKcbC7F{CueExaB2NmS>1;-f)o!#02gTZ#@u7zzsfMSQroPtV~`hA^$pnD=8>pI#6L?lUNDl^XRZqnF-h-yoJ5?T<3*dQmm~aJ_dN zLc;Wmt)2E{0!Lm2@Lg~JrQUHa(LvvG*V*YS2`;lbUv6!478VCKQ*5o0uN*7MvJ&g5 ze?glZHI3c05!tfy&zZRh*ZvfD*EI`JG7|`V?T65ZeB>rx_+Uw|AgOpckVzWr1~Xcm z;F&jLJk0#Bs)9Lp)&8eH4i^illv#_9ehzmIzy$}mb82NAE`n zMQsh~F=WF>G+mjfDO+HhsL5F4SCoZXk?VrzaF3f6TU<@*RA=k#WDkBJj5H^Opp`LG z(;+m${zt)-9_b&sl(j*&h9nr;n03@j1u|BJ&2cMY(yfL{#Unw=zusDuMDobQJ!Vb>nz8%M-y-lZ{wm&x6tjpvQYTl zrdFbI3Av3oj{0xS(8xOW5PF%oM9PD;KY?4=TW-XUo)z$OE zQ*ML*j_;qdVy@p+TTl1)j?vfl+FyS!9BrW12%(Doi5ff#n^QWDQT|#M1tGJh%C!+T z$92^oHs_B<={o-i1cG#PKqQe(*Ko&6A%4j&m4&i}T6H+Oe>Nesr&T|pG9G0pqB9;j z?F1&fv|fpNv$O|`d;5BND;~1c@QdULaOb}l99lu|bN0bxM3`)X!VEqKC;CzcoM^$n zi53+8C{*e!l?`5IyP)W$-mrIsS0LWU(5z5G_lwtS6rcheMOo9;5Au7?j}%PL=wgv$ zl!7w>$`zamBApEW{M;YA$BNBWI%MBt*A~W5yE2s-OOwbRhs`-YW|;8f#y=myVp6)g za_EN5nMxtVxBWW%Ikl^cD-bF|;?ED|3UiDwhf(@oF;(sdrJ``Bh*)ln2uVpHct7cw5)w`#qMzwRy&V2X=Je4 z0AC~L-F#zMNtS_U6&bCbBv5j8AKaWobq+(NX*J?n-&P1KA zQ_dGg21%y;*cVSmhDRc=kfFNJ3X`$Slu{Nx-;%iy6ifyN6@mql76loOOXFTdMPUbl zwQyhCT%w^79EHuUOt&5%8VdrI8S%x(iHVi(@HmPy`1h1rVUvj7SL~Y2U}iiWTv> z%+>$=G!R0^E6a>xs?!gr$8>6Fh{iADMH1|SJ)=~U8PnF>|F+}28O79MDa==(Dp1yH z4{uXn+PiG<;d7f|vJJEAk;nOSM(abHE0ZFs-J1RA)O{w_J{-u@8bl>e)P_m_g-CYmHI3w z2ISpq5|jei=qB`ew+Uwyd4(}w8lb6*^0z_~%99u+3v7$F`mGWrK;ZmGY77mE3yABZ zgi!|H1m1+x+jRm0dQ(bV1bT$B)TK`$QArU`?@S8g;>El`9*aGrNV!j?gH+~C=Oh^!?$PRg zWeKV1`pTCg&QE|`av7A1x}GqnePs|sUy-PfGxZ01+Zf`3Ub<1yb{NiYls9aK^Qn`P zxL52o0hS{pHMW|!3A!cZ*)g@fXfx8SI`D;9{PKA*GDr-RjztmEbLxCJ796m9Fnd8? zSmIpzBFGp@RB#lA`9#6`>Fa>wq~Pf?AUT1^M?04_+9OezrBas;;-lDu*`jI@QWfW& zzb$nZiw5{SNlTfs;+z7U#6}S5OQ7GrlPp&ZrxpIP|G_oKF9tqY@HhP*PcmzJB6s+3 z^t7sRf8)^>W--`R$NxR%ERTwul3ihBNe+SbUscWu z5UkTea<&OxP+%?f^)CBab7~9Q^Z{_#^rUDL#bILI@Q8gO6pKEiE%{}n4<4zR(-J>M zO2Jc5)9$*FCaz4tBu0~%MwjV_xz>A1zE>VHD#FL>6_LNz)J`~}evuGWCox|obxGDT zBW^2Kj?t_gRQ&YpSpoG7A{A8f2$Sp5at5#G6spZuol}YZF zC)JfIs{X5CRYODo{op}*Di z%@5Ooq-}liMmEMIW!4tdbZ#p|ZCc1tL)pxXv|w({?IsKKHaT=IQ$^1O_zYicWC)%> zCdG-DJD}1l!34M1`x|H!@=3-Z5H?+IBXgE>@8c7y^3~=l?MWh@WZ_JeV#4`b&{S&^ zx;pG~mK(yq;~A5AUsQcaq0*vHo=}FgYJ#A;*At+aOhk>KIv;$j@hQ99qr9EJbuOCY zTMpBr;iS1S8kf|<;fH5Jo(YdGZCyJF^@neFS)|Cz+J%k_6J9~jsuM}XuayVcpSKN! zm3yxoP!F?;^6WR-Nj{tv#SF@PUxm)XV%4NBvuq=WKic`}-lbDft9>^t>W&|;MKm<1`XT*ZE%IuW# zDs%rwagAaXfaNcCCpASi4OEGt4>o8j>!^T;rYKm_;!=f`Dm zb-Y^))z59`m(>%>ES^lms5wyPN?pn~?|BV*4bvQWx61hqv*1z4ypK_&7VqtdEQqa? zZ*M!J@WSsWkX9Xo`bWHsCVIgmU&_p?X1_OsUG6CjVh0V8p&)cSc3b=TX?0|k0P~Yo z^|!_-^%0N=3W=p7gcXQC5Q3|)O*)it1|m1X$^w|M(D2e^ZnTlQwCdQxDlZFqYYLXW z74V7dg!MhM`H-o_VQmyUnNL8KCQ&H7ZE=c29|~3&k%qog3Rs&-eSy1@fXFmH486)EM)B2 zx;E)edLmWwDXeWFfv0fWDn-=YjNP`Ip01>3ms$>g|F^4gjx;&BArOY<+}>exfiac# z%n2s5m^@97qaUWXP}>tKKw9&VJk14DZo~}^%tpXDq*e|H2d2P7p}@CcLV@02P2a}j zdEWU~u;@q)Jzyp92u6#P2b}|D`BJ}t}3DdeeGQZXmMy|d$cZ)g3e(!bnX&0uA zZxMq^H~xySib>tE@vn_kr%C$W z_C082mDNrNw{Sbn8Vfi?!XtbFDhsN+K5(%2Ue}^f#=0;AhOkVA8TBq61bW~3EJ*~S zx|4&TN&v3ae&b^znuD7-r1hW@8ayh@dQco_X)7X`8&v317A9f-DOz0TVV%$itsWEW zCDgD2I{`EjOr{9>S5itKE>-LJ#?|O3Wh&iGam=H+OA$)Z|EMfOe8w{wI~g3kR6=>l zI~P;h1KOuUhKeel%B7ADkVwb^hAE^`(40WS6rvPAD@F6-YRBM$Rpvh_7siptQOQya zHssMO|0JIIVJ)Ff^;4d6B6{WsJ#vS$cEw}iO`K_}56RVdKAbN8CXtXd+u3(eOG9*q z)Kn8YL5+k6MY;l7Ij*rhH>?UhIi>NC7w%IeRaIkTrDEf;IZ3Vs;3|R?p@xI4lv-Bb zBoU)#uoqq}ufomQuGHunkjrgeoIzq8=B|jAVj5q){K&`)XiH=`!NaFn`?OtqK z`89s6?60_6R2tx^A1{Mn`UA03hq7F-A9%8l#=(4z1DDm^LF z1;pSR6L_djzZ(iY5DHw_a8zVcb?D zaJ3v^_p1cXl(GpK>0&vJma{D)tT_D(MBYmgO{pc*DQhZ-O{UtW+USgyO0jDmwHO-h zs0{)Zl2Mc_beoW=XWBp~TDQ%e$aG-9;~>Yi(Jg-LoSy5} z!PELLY0t(jd}?ATWGQ!@4uQl$w&?e3JV%*nizsnbs;tlgAfcbl$SWc%tD#H_4|$7U zXL$Kz=pnHf@Tqo43R$dNrvtX;Xt3_ywKL;C$4>h9&$)IaTB-uzo?vdY(#-WaCwKP{ zyLOW^##^h0`;Bb-k9l%h#xE@<$)x)+Jt@rr*Nku)xf~b%zv1|ANMCZN<#J`X>~)1{ zO6qy+MR1mZH@Y<-BpPj)zTL&sz;6pExNw#5Wl#8ard3g zw%HP(_9-=J66M>%iUzKRtftV|2U%zr2$KG47UHE?N_ofOepU}Z&Hu&PDAO3Q5^{f= zLmDsRaU&&O-QbIA9v|X*JyPW?ZzoOyh;8ptd^R$HRo_E4J;SCBKUCgZHAjW2K1k1j zL3SmNTUV1k^RKKbjvt#EQCI7AgBN=S@w1|HFKv6&mvOGWLw_4p>^jV|V$}DmTAw0s zmNz-fb5-dyG05)HR*UKnH8lXWlm3QE547>XzWO9w%!|(US{=N6TPsSIoDe@^!bc^AcpQak7Q|6$9j;>a=;=F1}-Z|SGFm_i7pLFJ5RfX_#QJ53_N%Lm> z`-#t}maeWupdzwv;!rQQr49%U-mv}R!1iO%K2AO;)-S_i5quow-1mpC8P3NL{N6>{ zQCtWw)jKtci)`wbu1S}K_&m)RBy$3LY~6Tg|aq ztV_NH4y%|eDBo?5tPez&-ye2ZFxDc;JmJcJ-2hy?C8Gwp}9c2 zi0^GjFV3LwmPjEk`&o2Hv_a~5F-M~aXnZFK4O#o!!r~MTw$O*e-fS{mQ;aYm>+OP4 zAnFye?T1uv>$s@}IxA&Bw%nWV+iXPY&&X>OdTMo7k+>xZxEoj-`g%X_VGrHE8*mB; zvGk`Nl-Y$zn0#-3BC@ag>BtePu<#v8!|Bb3#Yi3<$cq4jx2D=x^Vt??uNDr$jrY$2 z-BuEK&e;&{_$VhF9~9RS4}THynZEJplRS4a+U);XAs5;D3;>Cr=mm0Im6Qmxu*=|w zK96Pm_IPGUl#VY-k`blK){vo3!&8=VR--XkYnO}v^lrEKBwB5}&`srwFaaTJ(bvbG z?|YKp{0Nr}1-VHV9!Mq+x^ZM=bfot>#6b+fog#hJ?EW`DXyXa^&Gkct=@egUo3(~kAt+400&Xkj|SV{NdiSz1|LGUu|)zHncGct<(gT>VG%i&%Ogzu-z zL< zSMZ&@3SwFi)+erH%uiY`D!buxKhQD|BF%@fM6vSnF)|P`4ka=WEGa?xUkbzD9{#-9 zw|9jdiQeOp;!@*C_h#j=-jbPj59VQd1szoFWG>izkcZ0qj;DD|rZkmw>aRDl^w=Gv z&D9N%l+(8xcQEWST!$c6+nEQ0%!>7vHvi@?>b1BQ#v@fZs9y z4&NWB0mb9y%vZe^v+sdZMC2}V3|wahy8<`B)Q$bYnAwVWrqAK;KMkvkiyCHvM2%+F zQ*0}*hLddeFXPX(rl{I$zO>I|8_!kaCxHu!aW*^i9s88eN@i)l8K!K7(}bXh?0HUR z9qsKV;nw@emic-J&e~H9n={QiS2?|W%n;!_wF{exzj>vjIkV5si~Q}@@C%~3b|F<0 zDJ$pAaCanG>(C`TJB_`?HB5U4uLuLRD}}R*_wo%7uC>sM0zIxO-+5z^t$({9;0wSU=p4ajfnd!svt*llpY{5WH7E6^2Rl>Z^TG3-+}FY;G~= zNMNbq1~VU06?hGvYuOWYLZZG?)O@#2;N(x*A znW2BaJkUgS&@PCpF7V?{TPdXU0{+}&q6J>|yH?4m0?#l!rr zh{47sOm>_(<`Sa_LRO!Nq>9&f=#XDhB%CBrzizYmA5f09nUo2o7#;)n8XDd#Jr!Q} zkA;XU9xP?t@cv3L1E{l>M6CH%Ff3Fw%%n^6-!II31n)IPtI!MVYN|EP%a+@$Ih@t) zxuX{h$oncS+DuzS8NadR7-<&tHpRu1K^(AS6gi>!;Y>%M*uVWUpw};khN1{vIK1nw z`!jpSzV!j!$?`on?29n)lejf%l@zW#K2AWcUiVknEfl|m-V-+?2lpvKMNGQ3KY2?O zE~`7Y7Eh&Eu|65XHDkue?V|IZGZPoK;QROVJx$2OW!})rCi)AFLla?!T-EIz>71Xn z!fUISt(u9DS=GWt{k3pQzIZ8-JCG!MHWRUBQ$;{&;o;}wYDTCPt1V3)SdQd#y z;eIW9OC|g;jt+*!%FU%?&-&r8BZ|P~FEGW!->gFT_ZY5&7EiQW=+AV~8fV&iUbg+& zI@e|kAzyr~90xRjfeP!WO9qDS^!^v=Sf7xn(F~>VrMeDXD_d!D*c% zuAw>0h)D!g_x9t}sq5SlWyEW6|1h18kL|79izA!}XG~NIK8<%5@972^$Sf+P0qoR@ zK+=Ft&4J;U{GKA+n{xtD2?hB*gro^B9}*1MPn!=Ci)<1QBep_ITX>`q%X!Ru8Vj!p zfmrwcp{Z>OU z2JB`J9Dx1o;Z*&~ML;-b*Jm|^RpE6kD~F>z56w}A?bMBwEvxmWXggCcRa9Y=E~~+D za@@HRpN>4tAk5oQsfwRvT4R(C-cZ5n+T?qepTz`O7X;9WG+_s+ zltWT8%&XO0jc0zQ?kIGhr! zxV)*O*}rrmA26M0_Aj02`M>By60}xk7g!$}9;E3S9uU(%V*Vxg{5<^&Ai|rI;A{7n zpyk%{10#kyz?c`LY+jS#e;7jiv}X59V7d>G9cgmEMEBpR&{aHg5iOhzM$cvup~VCz zKsPB5YzX;HOxm(BnA3BsK-Dnx4+-Z#kR*wcSQUOBs+pq#^lYI3u=y4)&l(|MdXgWq z>st7lNC6mxgY~}*nz1&lI0}!F*ny0XfE#qY0wtH%zX&AB5=<^Hkq}8R1&5{GA4D5( zs>6-+4^-((_+JoC{_Ovk+W+Kk97Re`{a;ECy}xO}zg!)ad>Gte#lzcs6s6NTB5;Q8 zz#a}r{>@xEm+d&5Vz3p!bai1 zXyl1DqYd#Q;PKBkH0(fR8W(G))Al#A#ExW3mQzp?3JBo540F_nB4fUk<)y)VstSRU zVgO=XptUF;p%q}GsY!~Q(EX)2y$>-Aps@I04uYIN`sdLrmX{69AB z$9~iIUbCM%UU<=f&*m0kU-YLHMXf)woTZjHV z^eOEf^E4||%XVQDUODnhP4Ld@FCagnfnBqTU8{SeIU1Lza=TFux9s=0$HO)I2^@L@ zevi@ESV#*57o@JJ-91?jw7E&^Kl~Kf-)4VqT14A>l_AC#bTjAi@Gf(1c6riv4y6!Y zrawOTH=EYty}!`g4UfQcNLlRq>+fl6&xvDpwYl)U{KAeCXU`t}bB8KGP@B`5{?)Gm zRus3u8g&3Ri+PGsV)`$U$I+^02PO}JYjy3})jECoq!C^mQj*_0!<2N=6l;(D0~aPT zm63azhb2sS5Hx5oY=1?xhu!_li|52S{wSwduY+?v(4j?OkKg8ZnRn=82!r@q(9 zRT7kaF#0ggmmUaz3H%Ct%h znY|{JWLo2$a$$=duHhSwikHQ z+CU7sk5E7*k_F&MstiH%N=VPPyjmP3>%RFIM!FIj-*HVVQ{usb3q_D;^!VaU8gLcv z)S5(ysGuY&C|AW9BoP5gT@M@!IIp^z$*nIJe6m<;CmOU9YqWmQ&b~)k^s4%CR_nXG zT<(UoX>biK=XLjvyBy~RvGswwwgLGZN^UKdKe@T*8lcl~%ktX5yiJjX5IB=9U;!`a zM%Q}98CsT(3_}nOf%(`HR71A|5l=THC>%8^lLH_5(u2#ebodZusG~T7-quN6tNaD> zTa~#{8Jdu)&@7mU$;BQAWh2`U+9UGI_iFl{Qp`N(ZKWwbi+jYItiqkH;G0=?ht4L0 zPX|d;1sLYDBlsz%-^@D=bf`d$EP84W3sZxB8^j6^lL;XpQ$o;8O$gowjqJX(1WuYYa9QA=z17kxlM9XDdA5x%ix_A&7B+6M#hxjPbypB<`Pd)3NWoU`L689E)w}%XiTn)(S2vv%6=xR zD)v}D;_6Dver{Q>0>$kOC8j@kbI(Q>kDBZMFsO}#YpDL_Jv%t~VA=H>{wZ6gR z0XA-kSYB%K770HG32x@DpMBL*8qe%a@+s(lTP409Q@ha`z=FG)>%fg4w~cw+H9Jh_ z&J;>be6fS#iOly&%k!$6Fg%83>(CmL+=?`Kv~>}_CR#tG4~gzu1j7*E0&Bk}ib!rA zbL7kuR~3I8o?RpAnKpWi;NT3l`$jfi0f@u71eaM(E`Oi0`?vXeI_zkSNTqVaWpQ_+ zbg}-o32TFjPfv8FKp84w)fHgkn=)l0+=INWA4j+NJEP{c#lMc)05A8XA#tH%!PF^Z zER(7HmnR&ist~ICI#xe5;Y0gtQslVpd8$3` zf1D*FLzL(^zCG^exoCxY0_Z0CLfu)a(S%9!H}^FzW21`Lo|@yBeh7-F#S&=M7~>@kLuS6QEpG?=Y!Ih-z|H@RJ#S!Ms1+PO@t3EBt8$)sD3$dfir-#xzk?9i{s&SWAj(81^Sx zSj@Lz{(NHB58XzJ2s~ z50`5os)x)tI`Vaurvt9g$9d6uE;NA4%L4Fm)6uXp7%?l{<-t&=Jl(65ck4f*%`;0q>rmB8Z)f;VB+a?vgvF{ z^#tYe`(3j_g)of6ge_Z@sRLeZ^@~!;in@WO9dzuWC^I~OYRLz{TWev4lP!4PTJRaA zPyGw)VNQC`5#rq-XOZf;M=Y3&ZlBk`Dxel4G+8VB;^Q(Lq?o?or0kqQ`~f}NqOJtQ zcmTJljjRuOlNQP{p99%if1e1YhRRQ7Rhv}wVkbB$8QaC<{6q{Qo)R(UsBZf|c_IX$4Ux;xk=Phv$>-l7sVFByCOFTRhstpeV!yE_F%vYmOOFbv z)i3?|#UX)7YsmgZMT1a2d9>+Pu{Iic*RajB2Xu;uoO}36v=ox1^+LiT}@`N zz~e$2eGkt)hs0AeAGUYFHr+@IGj@1%$lw1l(j^Ph5L!eSC^hn37`9sc!trU|J+yP3 z{B3xjvs)h^T^%;x6iqCwXn|Yc%H}ghWaey>#%b*;Sy9@ zU`r2uPb%(C>#=e3`mU{CwL?v-5K`HHfRTUZZjNt*zRg3GQ3G%E1J(EAgRM_RchNW! z^_U3@WR$tx=|2f(clQ1blgqEBA}vuBh!=;}M=0$X*rNr%5Af?EU~6 zZy~0qrnKGLQ_uH#M51HLm+#o_&>vL*1QFTeDPhS6n1e^DorFz7Am$v6|3~x(gB)Is z(6VMkoM~z(EF^!O(1BcqObLqn+kWB|d>Bk{Rc$a$qoYFjx2k@#d(rdS4~p62|I_$| ze}}E%ZJpiI?4|gl&7#0rcT0Wa4}hZiHSra0R`WG1sbko5GmofuMER0z|48&Qybsea z1v5pdSGV7F-`SkIwUMlfcIf7$di2knxre2IL7ce=f$Ca%v_kua{f16vYSrXjyW1q& zNw&hRdc$PGToq)fH}pV9mByFI)YoyQ`*(H8B@hNJkiu~`;Trb)LbHnPB!Gl@QkCJ! znoHN2L8_F90j(T&KdRuv&;5!rp7pVbAHxy@hvcXjXr)=WS?QbHsi&O z-xL>co!{ln{@CsM*leDMweMj0GIr!%=e4tIx$`_@qDsrtfA5eg-AbhFX!jT|8ujL; zCs2bE!1l(`?E^28MJlxI1p=?9((};7Lw#xd^`a+L-3#ii6TzFzDo3Vg=zQIuwMH53 z61=0R!{GM;v2a?uJ+W^sQ(OpF=F*vilS>o*MnZ&!oH9|Us_~<7I-+kD77^g+dld9^RCa1CyUH`JmP2;v(y!*G@iaxv zC^kI&c~5el_v`%<*x$p!5W*usLlF+@yD@ZXjw`kZ%X_?Zq6kQSb{BC01e?X^HfOGn z-&8N2CI-@7JIIHxAno6V4_-v7hcTL;zgY-^yw39iB2-912X3GVLh?l8E!OK^7& z!QF!s+$A^xg6rG-&N=toTkrkx>Z{$=HPdT#_tc)AUaMDso%ic#fT1n3lkrdRBHPO1 z>6@#UK2A~g!Y`Ea=SATYHvy*b1>5f2nAD|$We{c3r{)3u$s1n|Z{JC%t8OJk$%oCv znX`$UDD#t+!Sg4eQs`zzAAY#S{xsLnr2zrYeCd>6@}6!N**G;+H_q;KN&frzdCiNL z8gS=((mE=tb^Wy4UA-vs$!;VEy_;`b_vL;*#ky;#1Je3o_>idMc^BI6*}U;?28l5j zC$MrWkKkHk|M0PUrBNN0jPn9`?0SMT&QnKT@>(~38a0f2ys5f4v1QDS_v$RCi|pD6 zZAq`Ed2{82U5+B8cpKgL;Oy5yrH1_$1?-lJ`>c3KJ}-uHWittT|CbNxZ~w<#Ed0DW8c$rq7}BL?p}!E#V38Ue@AfvR;6p*yThU?cqe` zI@d7UbulE0|E*7*93(eF+pcVl)2%p`UpjsN|y=K{FVI zW@+UT}z4u_bGpa}Ns#jeX|{Xyo_47$bLa>xO&n_+}c`FOrZx z4xK3CKk#kMWG*dl92|#@PWvO=x2heUs@>oQjvJ9>(@Z5reALmgxP+Vp`l~^Q21&NQ z(Y{gA_>j1io?%X(Rk*XXvvF_=;Jj^P1dhLZKGW+N<@O+SzwK_}&^taOc!>|;0@L4q z4lm_^_`5z~zg3QPMl3Nyl?ZLh#Jvb@c?wmi%544>wh~QQn@VD*@}LvHEKJ)`d2+mp z*RK^=YKmq_^BBY{w*it;R#+13gu9*Tz#K}y1MAEl*gaCNCE=(~kz03jNZV)BHE zV1>YcP_RhzOQlwMmWL{Ul>!v_A}uA*lb8HoBx`vq^H)dFQZ!%uOQ0e>K|neMO-UNf zTML6mN>0cm8KW@+Mfx2guoSQqgY;a%iDUI}Xwp{OP}wdE|InPoEy)~>Iu9M;12>cU zH%ph_pRT4Qr1l%1u9s4EviFFj6XxecQmlI*-r(Ngyb<3jYJtJujz1QYTy0yw_x}?{ zB`L&aiCTw)yRa5Xcv2UKI}uQ>c-HG4$*gYL=oilvvYHm@!%-fd?u6dAN4w7=<@gD| z_i`@F0aEK=YK%KDlQZ^%Eq(~_+;iM$IrZ8r02L~>o-4YLtIvMA0MylPxAE7qO7I>gG~+K~$BH z{XE{bfh{C$xtV+^hgw8^niU8#@#q{c$*vZ*8)`^9sPjlup-;mV$pByvw1H|MMR=0n z1I8t(&sAkge-G6OK2smn$zGB*?!8Iyc|)l~xuMg)HfrGkvZG-pbxezyvN{8!gFaUQ zX>CjjIri&XLj^W(;q>r{eBiW%lUn+k90xMdrSzzxOiOfywRCwajom5%aHY{Of-<(D@6vCJmK@uheSz+T|}uO9F5^5QH~?>1l|;J z1yM<~Y=<+1NJ&ED4`PsF!CIsQkf=_g3ZfdE$|SiT#mJpKAVJq5#fpMRg(G2U3e;=J z9(@g&Qf&bbhtD51;cUCQe49mpOGncYBH82=qK!_4L5jb#m5d()&z6JKDb3bBWaP}- z)=>QsOF3f=3-pP#LLzEXBWlXc3ev{wB6%0MR553sG1q)q9w2wiWQ%wry5nyy$@K|e zV)UBKtu2@qa1o5h zA2|JGHYi#O4ykFCW0iQRI`>8NOVlawZ66%qV%0bTkR&Rl;Qms_e#%bWGKas{oGn0m zrhleaOOJ$V;<$m(Iz!70H#hBSYIsY|ir+3vXQFO& zfB_LLiNg2HF7x8NsZ=lbigXp#;hQ|Hn`Q{C|ukesU8ErtbsEOhdW% zA|9Cv%~=lX28}Rg$htDhuI3OTMXqRU_h?5XaiM>_25ueMQ0#MpBBO!^{oWeb7gUZu zhVH8wUx#t&TE-p*^+AS3c877;EzFU9rJ()y4J%b+X-W2@21Kq*j?LBr3t9{%DKui@6qS60BD5m3L}^J{DZR>pke7Gn z6_%D4n5kT?pV1irgH3LX=AV?utHZm+MIer`wt8PJMAoT7XY-D52{}`icjFK?yN`~l zp+S%A7Oea<89BG{NB17-NfftF$z{NHWa2&~45PFHJAgp4Dfayh8a>BeGl$o8tW z8(WBA0!=I6I%Q@D_JmEY=eThpLxIGkfwQ&e$OC>l-9tMxOH+^x(`X4pwwW=kbz1hr z?z1K~u(Rgv?*`UHmn9l-=r_2=Bif=S0A0{d`bEfPJP=K^<>zO<^1~V$y0%|cV~mL3 z@3L%*jpw&2`tVdKR``XC;YCVi9f6VVm$ndbF8l$RiO0a2--?Pa>rN&h)W*!b(fKXs#(x$zULe@Y<=iY-m-uUr8(?!5<83CRVx+MX7g37bt zU$<3QKkWH^I}ozq8wCX~#N|5cxN4S!2>{G@&aWB%_Tg{uhP%MQrtuZt3TV*(>Qh*tT29OdyrJx1O<=H^amGhker4AeO5VtBfh$eWnQRq{BDym zpjBmQ9A6_h`HE8mv0DLa5J@$kC(Rqzxi6_-QUSg3X+w>P?Ss8GRI+HNt*og%-Q^hh zH`{=Djq3@y>WG+;?=mLs4{)eUv^E2%OKNm=>%`{*@>zlih75gL9xIFEB>i*Jq%GT) zsPjsJT9*6_fUp(;=#0q04JvaRZy$b7!#`Cw8<%v7rT)HOJ7>zk-bgm+U(xC}v`5rS z^~sHlL-=p!pud?aeap%fo1~0>CQ*%UiT$|NwgzQ=$7;;kJq|uWv-nKv_4^TiNusMm zQFU(<44kIBteYlX&rX)8;aHLeWrVi83c@6%z>J`w0`N-5OjhMkHBI?B%1~C3_>_q| zcUe5qm3%mE0!AimihYAci{`Hwrbu<g=EEWTAy|iDX6AZg9`gPa|N0JTo)pM z&=qr&{;F?-p-of1Q}lFIX*rnaKw)j-&-NA#FF+bZ@)Q1gp|-t-t3h~*3BvRWB{t^Y zRsht_tD%4G2OqwiBWjZY!m(rg$ZNQ94Fv@W*y#McCb+=-yyQMKIO!vw`2>t)(3IZ6 zq3IbMj;5?pU4Ri9T$-m65v+JBw9Oc{EVGS<`b;e_K0pbAN0&_j1q2OlfByuD=TfDivBf^G!zD!0_&HE8@`l?@aLq85t6syXY}i&Z{V1ZAK^WwvK?b^(4iz$SFP$^r772L-Y5m|scVMOL(0pXyOqRY)nKr9czFDLO9eZ=sQ< zptw@eI7mY8(m{4JsYrx{(^At6OF1QnB7i1PlNCfHDBtB- ziA&Vw?i!&cAZhMt1tq5fW*PayC>?Ak!;ugYENIM79qibY)OGFdUP>vO#Q7%PZcCVa z;1B+f{Sw5RXp(Ei`-?&BG9`rVg&uJk^dTB?aj>~gspG}-R?IYmqxB&aa>F!*-F zFm0T$c6}-euM?nE zOAw@v)XF~7xIIn;gHWleD-Tz(-Jnklg_Nc{Axf+B{gtu3Bz=6ylS7!$`-TQ+GJiAh zXQMxUCBK?`K3?u|>_+Y!JWTM-Mt^Ggnnlt#^xXQg|9rLC{qvOQjnm+d&wx~q`3nQ$ zP2t<0w}*pe%_1%gO~No4f0-{PZ^x|pC3+^c&gu$~x6%e>)&|INzQ-$^khid>+x7bm zx8Wx#@)ezV{o*?M#5LVl&*hjvL!F`BlSZ>(fzpz1y+-RIXIEUlfX|naSBkAQdyAS8!N^`{s{8dW{nE5m|W<#m@w0&1#OPyP+UQ!n9bkIKXgH{^fG}j%?2uw zT*A8-o#2^{Z+z>Ez4khfKRcfrZykm<5|En&7g%n=!xjr4fJMivy4E65K7ofux2F!3 z)-Io)X2bHB))!6=KMJ(*Pe?}|E#)?mz-gF<%?i;$$IQXteTw!7~@;{*C))(}o$giI*;#yQtm5Yl0M#8<^ z%it?(n8Vs80h~*#oreP}3VMW6MrC=)&*OiH?8pg3c<>Qv=Xc_KvfYzVw3AQ`d(xw# zJ!3}=)kffvo>)JZXlQw4w0FQ9_mLhSO0P4O=a~#Of3ZQU@N5CopP>xLq@N8W60}N% z@zYTbLKf7s71WzsjI&-G*FffCM2Y>I<^bB`qpWdC1Js-~s-I5$G|*%k*nDbWj!1#| z#RXk$6*;+JV6V!m%ZTs(%@YRPr;T~(FDL3I-RYO1XT>i5^9gjF@iVVAPmS13Ze}Df zA_9r9R&6n9hl)(6?Z`5fa@mrH7=*vgXZ1kiTZcp?W@~FCvpq}s01d|9!*$#R8zcA+ zfF8>IFW~QJ*}>Y!5ml@c9_dHZS$mY_;h$YXCgVrw#0@tWXQqz9BdG)=;WiZE9=HiF z;_e9yj+7l3J1dqpO69ohob2CUJ+UlowqRqbqlRi!$r7q7w}c6`#jxOF5Mvky0|-Wp z$1RET>hnQRHFy``oL#!|RFFLFLu+Rt=msn(pWa74pI(q3XnOHUf4|G?G+}sw!|e1N zhEpN~L(cd>sGJ?dgDQslWgQGfcs<})R8*Ed zLM4n4_%e(T1CdBX8cv(DgwH6$iPU3Aif-Wuc#!`Kw-MiTQjO^VPB&;nx?4px(KIoY zGE+V+hSjT-f)d#l7bLHvkysS3qeK0zrVuw9D-aJoTf@mN3tM-9Zbk8A-;G()DRd8> zvq}f|{n9RjK=3|<{1u_?M=WS`RWVXrB8J4p9D_s{rXJxy-r zLCK;LtS4~>>J=aBV-1LZ=p zwg}~d7{r|BUs^IGkON1LV}KV2qCLcmBgF?q{*eULC;B)EKcSrd{ydl&PfmRzwQ0!A)qXfzPH$4f~Up~D57eI^qyP5iA0>!TY@a-?VVw0kI}BjV$8EjYaM3;l!={m&$x$K1i;&Ff*z z6TxVfSv40&0IGwVon-mgNkBizuz2@U@0LoiQTf>;2UE$_vt2!5jXcdEsDR|Kf}8p z!c38aaZrFo!AP^_6`pX*u-18)kBNqyZYJVu;1ODVMS?}!nPtO@AdW_*713c_?o+k!i;Vvevbc)LWrbpK>1n0B2|_U0T!7Y zxr72)5N2au*0+*!F+k8Qs2t1oxByCuR2ajnj2yKD#Knob6Gf=z>n?`7E|h9ltjgMp zKS+$a0$Q77%O*-&BkpI>AjP&D|xvnPE-U>Gy64$e*pfSk_ro`C! zg*0M{xcN>jnUa})@(~(SnFaL;Dcf6Ozl0SHoH!}lQ%PG~$|6p<%48GHcX)9tu;Pi4 zG;~-rcE{}4y0hXHg-^8Tqitd*PA4zZZN!ECR^L{eTwJPK-ie*gx-TwASAlz6b_C0vOnNV+D54t7%nGjejf3u#44bKF}vW8=V3$&jn`4k zSxc$5XpAnklmFCFJ_5YE4C zq)E|cwvPMPBKY9UL>(zut?t!7?4$8GLNThD=R-1<*fxbm^$u0KzSjwpPdH@o_(`{ zmp$(n6UzFVavayu4w%u;EHUs&vHYKUbv-dIAWLGNum`gb=`#tI*GR_Oj%E&i4u&` zB# zCb$lgdpY>$nS(FD+Y>X;yBmcS%z{w*#I{7Ok=C#ftq&$%s zBje(@?jNZ(^kjDOt@EN0-(ZeUV5{p!A<^%mt)A(A=PTy^NJxrH*y>f3ZK5dqX%F z^|I9^;0i@*G*Mg0b@FRdKW42K(CEY4xO7F`A_@|Gy;&r?B&|$D&zmKxd5HP;#hW)k z+MZTXw3v#Dx^R|jUhSy)8=w;|Y3~{{M4Lb;j6@s zl`kVRha`I_PHx||-m|JQ!_$YBtM#Vg^thcf(u{L#n4p^fd#@%Ss z4BH8`K#e0fB$4?exzD#8oVG((JA2`L^I1gQYc1QVm^;Iq>!*Mp5;qCgjRAsQlGX(4 zU2z0~FGJm#A8&Z++PxJcI5&`&hfW9t7v>wd6=f1yM?|4XAp{CjN2cq@SS>OdwOr?m zY{r;@gxQUH;6gJ}{&&k3Jzcp;{-HC4=`;`X8k{+C-ulPx4IyYx>@B_q zohYRqfkwm!&nW5Dw#4zWa1k$0sGuYiR%*cSB)QM2zS~ge^gsitT3FDs8<#^^xSJ#) zKWBQAnd^*84vzAKD}GBe{s#T=<4a|FVtU)uXFp*;Fh92_w`lWx*>7<9K zy>}k{?Z=qv>vz5kM5Rgi_Ls!_q3ELSY3JgxTF16OMU{2ixp{wS2*v5xkDxWZ!Su!R z^JQ}FrS@+!H_hxW@WHfu3E%475+L&|^^MZ5+?L%-s8rg%`(2JO{uvdqEr zX!T}+Jyg3C(v`g2HNs*M8vQ`+B>g=Pm{~Je1#d(&VT$E6< zaG5UY*3)FxB0_9F4lP9O+v|^@t)hoFZ99f{gMYF4gOTiB7n=kGpv^Du&h{7S!rCsI zGW%c4>F^&O`y%o9WY14GS7tLjygXOAyt_OA@t3*f&L1`@Rx-{f!axL?%mTP9(W4>6 zJ=$tTV-^=B+0=hP^u-&i)81ckC3Zdg z%!j3>744r)At}`qGFdE5o-8!H=xy;TyZhzVhocQ^ANjFqP3t{%DRcq+`qD%CjJt6; zMCXGFnb-w*0lNGr`hcF*Bp=%kqXkx{H?+nKzQ*>;g}?MMMq|xrD8H+~1Z^Muqz`>R zUWSh7$VO4ITGN4}WFS(P&tqrc@rs)TbEiNwR-s84)Kp8#87wT6E@GwQJ(m0&;&Ed& z>%3&6HKt@Hs`8HMsj60{Vn$DwN{<*n9@sa1g5q^c`HgARkO8oGGD^aIv!<1)sY#~r zqf}Q&ZekrwWRTt&t0dR>;q+py+1z>+YFD$yT|Z}~m*<9BF_5-o-*rvEdi$iMiAD zv=?EmIz2S`NnP^u<^Wfwz-E8NG|RV}=qE(|uwOT^fA3gIm>~Pnw(m@sFT5w`kt@D% zcZc8qI6{DSm-{nLelsw)X4<0;-jyOdZyfmG2BXDC@EfRKZVS;tBpQP>4P+I{Xe#Vf zpsa38)uL7wF&t}JvNsTpwB$BUJZbS~=}k9~VWyWvMbxA1k3+voJ};`f_N7K=#GF8V)e(5)=G)Su@( zw`8?N4tn?FiI(T;(&S^w{GyX8Qn%CyPMaKo{D-VWYQ%kp0_LJW8eOt5oh@ue7u%-h zbG!YBj9ilU7oj-bk5X{3GcTetohUh?{Jh#4{`kT!Ciy|ko1vk?V4UB}i_I1{^F=+sJ{dMs8^}Dy^uyPx*T?t$X^xwdb zdAl~iU3F&{xqe>UOnWI?_^xK(2T@@GjwR7)n;stVp1b(Zyj`lE&$rDDYmc$6b?!@i zjK07CL7E+>d7ASPVzw?Xxvp_y7bpAg(UW$+mOr=8U8^s)zbDtKds$kx0~-&Y08xGO zsn`g0F+r5dm72OO#iP5o(Ywb{P!N=|F=_uwVbC!i7S=`xprIPuZ5F;=%-RPCozu!r zg!Dp``+3=Wt6lEiJ8J6+5%_iFR}zKISDp^-hx-aTbh&jtjMH3&x2{*QJh9aqUEU6b zCX1ZyHlK5~bibf`bRkSldBn#1%>@qXs&H1bo7p&q?Ag?x*%RMheR#OLLwDDL%3JOs z;xF2E{w?6i-?IBc=;h8#YcC2YE@^e0X(V1z>l&(zNtEROWhf$ne^uLfiMaT7?YCWO zAJ=}eiITl1lo>wtWO)C9(A7q=mB!6dYU33|pX8IUCok|ocEYAkN`9h@Pu$Rza3wCf zP#RQ8b}~oHns8(J0ZlVE@IoW)hGGR`aBkcd`7;rwC33X-453B=zrz_Yqe#QfV2(e0 zxG+ofqfJFmUuuCiSj+bAt%&=$^J4($pY#&I?G!ZF-4_dbCS;{T3Z{aLi^SZXgg1l` zz}^cZ{UDJo5%&7>D{t14zPGXaR?M0*73^oZsw5=1)hXmidmR&Q=iwUWam7Eav=f^h zO5zS9+K{7*se4p9w;KSp0AuHhpPWwHWmbTRj+cmh8q&J@VqseP;J(~cKb>Z*6-nvu$l#Ef=+BpLhmQ|aQBSBAAh&>xRaPvQMBS&F1`4F{DGeAC$~uvHiP*^ zv-943I4Y^$;+Fo&hr;M|rI0LvgLRCRPsB8QsQyxQ)Cl#)`C_>VY&ktsDuNcQ#0GI) zhnPX_oRwue8E5_;uUq`JTj)p#9K*TtcZle>{&=6b_<&45 zT9P{=Yb+`9NK5@h@>EecBS;n{f9y{8(wSD~35k|FQ+z8X^U3)Dg3-FdXmbzGEShr$ z=rHxmxf!TgpX(v4`vbJ%CRt*58_J)XPXj`0n3hwkI|iz~G!uSFR-Tijcrgs)T34uu z{a9m=U_XGI1sm`>!%lig0}%)Zk*p6LhjWy#(rVCZr5G`<3_Vzf-yo3{`H7!z%XSgF z*6tfOjM@9|Zp!JH(X9Q}{o?dqUVe?dJch;gd9>UXmS9z7l$=G4KE_S^@$0U!N)Vzq36jI{lGpEo`$e zcjLM~=GL!1lQRpNX916}{~3OJ630|~6W8~BjKvQPtW3(vwh{?VTeH}(@{*$OrC1ZD z+_a_+wSl3Xy1VsGpiK{I+>5LG3wZ4rlTC000WvEGG%RxPuu@XkMY@CsZW}6L%0Wl3 z`%hQE5Bltaep(q-AYwIc{X$@Od9QxeovO13PyU72=Qv6{IWDfZ`To}CW*=@B@u7g{ z)SmJ5hoN}Sku(~f7&>x%b-_@`=>yAYX`f6XAVq*Kzrd90dEvc6>SX8%2{YL!SPAuA zK8nuNC{+W@fPyuH8ii!J;t)x_hzvK;zpDmtIptjytxTLI)HTdvpu{&kr^U-QOdYfk zjCJILSzcwvYeF{ulOcjS zZrFDVZ>wVDEE_Kyw_-MKMcVDb#F|1)z`3Fujddon(2H~2^u4N(?fR^(LsE?HdV+`B zF!rqm-4Jh5uyU3;?Z(bVr_+JS@woPjy5ITf{rkj7PG^n|@%))|XSak6dkx^}WJ+RZ z|C!vC! z%dt}K8Llr9Bc>y!>}fQXnPsMCZ94O;|AGaM6%PN~N{Iac>j3N50anGtT!@%?W86 ztO?md#digUeT@C>Lkuevhefi`(8#FUH=EKJ6U?sJccX>i55xh<^GREhMCqRx!Zslf zHbc?B-4y_6w&ua5KNpeKv@2+C*n&6Q$Pwn7U|IU+FObwX*VUL~lymy)?_edzaqi^# z;C?0f{zNrA1?y!M6uBqG&JddEpF3&g5HfdGeu1wL^!t2uiGL699F&5uryw(AoQ@0zVuYSpv1xVmRXV9?^3MWK+ z>s|v0Z-H>8AnS}&YOhazlh7TpE~k_1Rt>FQTI?)4HJ2pq>+7U=mGi{cCzcc@&A*ga z=noOkqJG(hy@&f`K!4pxH+5MVQgdbi@C#SqvBg7vAlC`)v*@O9*jn~+Z9AWZjbyH)dl*!B9Q_JDikEve6M1CbJ@^xOdV58caXR z*??q40ft8iS%%{}i4S@nNgwYsqyE4!(PA2Qnf0x@KnG2e1l8A5KL0wACmKz`D3*+? zxw|M6x>;Yr888N-C0JZgaNprD2a6aAWfTnE81YFssPiHf6BpOavKLyOTEv{2o%awy z8V{K_NbeB4gl$CburNO$6nf797nlC4iiHI;-Xce<{$|-=oOr4 z5PnK3P2)sQ3R(W^q6z3Ss4SZo38Cd%K)IlDPwIZ0CH7v=FSvj<^EyJ9 zc$gh@aSSNwoX*b*u!C;HIW)`rS0)~ZJM0TojyM~Hgsg*Efl>sTgcfb~uv1a-*kK;) zzo4Ryv(#Rzg#WwfW0ZtFb5^f~N5+If$H%z|P;;kok~s-oK$?Zjzx*3@2Rd$YP3(M9 zLgoN7-bMp2gmfJv3K<(dE`bSj@e3I%=qVGk{TF+`sY&RNz=xA-ybAv+n6ahPqs@Z! zL;Xi01|~y@$t51=9aZB>S8MF;l!sBWWEJ826WA;o!*a4qC9E25^mt>Aotred7YOyDXH&N|+o#1xSjUrAQ%m4dfEi3gKV5N-OWTB;8ev%O`rnMqh`MN4d+;L6Z%Yfm)1ly}Y=}&|Q8o6m+uphE;E5Mj;0c(S0EEk_R{RH!3`?zuNvE#~b3}vni*MrlzWv`Cak0whlSdwI)(> z(+mNX0y-eS&Fe56u<1;NE{NiO=DjUQe^zd5^671*Yd$x2@;T=|tLy2!T^-2!84B7< zcV+iKtGMBVxi^pYn`f@K9rr{nbL{~h%WL+a6XYpv7mxH~pr^*o<&>nAtRjMlX`mz$ zm2|7)id2xlNlIfP0_4SRiW$6#v!Ml2z>!f}@iBKolHEbkPBl4Iv4V7d@;40I0O9gS z_Q-G77ocQbLF$&6$5LcdxV(4Hv@EH@%6Vu}YE;T{qu4Wzx7={Ag4MdjQ(a`fEa^A^ z-Bn3!osx%!hsIQ?SvEE~c|rF!X=QFz{)CY`G4a^Sx2UM3xCrs@Z4#}HR-rSn$Ve%Y zp#qjSB1MzLx*Luou~%dPpDfk9r?^-2xGO4GVMZt-CoLzPq2icTC?lPb%nDLGbe>6t z2BJB@wMv${>4`{Ik*$^5tzp5muPDl7##BnhfwC@J|#m~*cx9z^)ihhKMrDJf^DgU{<52>7u zvpgol@vYWQw)lDjo^tNK*Kw>k6NNwc&;g}fkSp+AONlTzqYD}^ zIGg+OHzXFnFxD^OH$4cg z7o$ZDs6y8R+?T0nwgR`RIrdZh4?<74Q~jlmPxW{k<2W}EGfMN>KLfp~d_u<;TR{_i z?uhQQpWQm!9Wxl{xw5Gm+6ku3>!UWzvit;q?Gqjwwc3jDPh(X*6O@@k#+P{QN^5dL z=P~z80Snd81eImyrU$*#&q8%eP8al!duyWxTX)~eiBtmFy8i9mCXL7}>Pv4&xR>r} zfm0~%U3Hk0GD^K=P_Xo-?B^6)kuSzagNg_g6)N~iG8j)iE~O%3h}OLHWD=MUWcz6G6zDEbImy z5-2Q`pQqreSQg6jqCk0q-6R4s;aHQU6?*gErT$ST_O(?w00&1p%>)V#>faIy)Nr21 z1Ewm})EJ2SGMs=xLx5Z{5v`}n)nSOz05)pAi(^)5l!7%x$>Vkq{F>k0Os-7(>k?vt zE_qV5l(P9>Q=);2%3lR*5z0}U^owjR6?@a=14$;CrIQ`esrc1oo|*b|{FT)GP0D6i z2Q|ii3Eu+**ueid$D`J_)&#^4n60mvMoj!Z$4ZKxK%4-K*o+<7;U_45@1kTv2(txc zF2mcnnowGc6H>9`c}Ih5HpXbO8S~1(PLNMv)clglL}&W*hFX&>-RPnt=Nmhp!4W&w zm2tjSwr!4!?|#>JGs@=9iuioMUzR6dkWKq=Z0Bng$tDkk-#ec@gT3n519F>b3zn?g z=?*g7YRSM2O6-kUwN|jPsC7X-t!{mr7Z42&Z3)(OF_)3nr!o)#*=Jd z`Dl5OYt1|9vd42{LtpTX9T4&DIPCiqw)+7Vq8PwMR-a;?dWs{;rP7 z+fthh+YYkQ5W8Vw;NbsO%wD1BlUB}$!LA) zb{19)`*_az`R7DDm};eD`!EY8^Tx5ZtwG01yFGU8N6B6f*9IOr)uxO~PIiM1nIOfi zi&OyT6?{A7g7i|@qdB4xMUReMIMdWs963atr$a`?gQO!2rzE(q()U7an*)pnLoeF~ zsjsqeSajLN|Ma?uuC~4Xo~jI?JW&9k*y?^0QYw z8>oXk39E1UiYpJc7Rh3c=>(j==gLC+*ds0TOOWIP#d-_4k>FV1K8a~geLxHOBqoLY zsrZ>C&O%Y#63ar-Y{yCPS12q{2W^ zQqd*Nno6t}C{P)VKZ;~kmlS=MDWV32)gJsJ*FDsG3jh_BQZykdGG7v~O4PC=0aZHhhcktr73K6KlMI(Uv4ogy7G{AQl==Tm zICS5jgQUZbY{AlZmXuwwwKHKR`SQ4|t79Z78HNOqC^)F$kW{k}pu!rcS^M){gy4`& zKZRLYjODvzAV7sAu4Tf2hMnbfYoUA_A?Z+I4vhHxPx%XMp~3@i6n;DHAP^OBhu1K=naYNsw)6Kb0;G!i+YC^ zMa@W3vG?de+0P5Bry=NKTsJ#!mfgzbTRl@Bjs$Oges)niZLU9Pt!G(kg(iCor3pdK zRFbX8=(MnFGV2Co-;Ay!qqUJMWVXcV1XW@swkRFYf5;-Nk*^Kd-mHMl-RQ(lY>14M zG*q)5Nf0fPaw*eKG13At&iHK0u4gwk1?-BMsPiiI46(C_69w$eCr#$xeUJ~3?f-V( z&&_0PqI3I#0{m)UOD-mP1FxgXH;ZQ54lKS!l|V?F%+jvnxLO4^^-+M5vB@Cfm^E2a z*=RMg1SFaR&?>3NLj)T>@><^0TKfsqx}HZA@iV-z1lJp#7C=N4B-e48=Ai1_Y_YE= zLfQT-#^#V+p7oIRoeuw^tZ8x{G|v_q`%=Bi^zMg$@Qh=#-*f|5d`dcsTKK!nD0Wzu zN@5#BNKLd0y}PA7*ez<`PMr>MGiFzMc+h4`=;~+feu-ydF_DnLNf$#o%IT~^N z8MGP=fOnZpS1j{Jt&%I8Hx2AUCig+Zu`~VRYfLdy3 zz|4%D4uw#aPXaMl%rhAOSFIAAxf}@-78~*uEFbbC!bkctwDy$Lo=+q?b7e8$&|pFS zia|xtmOtc#5oc9QPRfLYdqA%(m<$=8=m(JxKp{-DS`zlIRZUHBFI*l;LM4w3vkN_ENU{^o0Wgy->^+kH#qaaT$L36?AOZ`^)#0P!cJ3s!cuHkhchfyH2 z^O{WiJ8}f6D0+e8X|RPb`|5W1^fCF2^=|9ITz7j??c|TULyuMG)`L<(msI@&`8_`u z@Rshbbj7t|aYuWB;Ri4`gzW`ZSM5wS5VHW!y-d-U(P+Ns>odni|N85SpEPAIsn@es z>WkytrA`OZc!n~W@O*phAq`GIh!y4sYnBmRv+&DN++1kcWvRgS#ehSUEw9OffDb48 z!z4W`{g7a4eJjL0Lwl@D;{JG%=mxstGyOp2WMSA_A0V4lwAHQF1NqjR`o@~C2J$ez z!oRHtffD{T&Ar3!-zapr#7+MXUtbv&$I^8j2<}d>kPtism*4~^xO;%$9^7f%-Q5Ov zC%C)2ySux6!@bXIf4;TXnwd4#Q&nBvQ@!idIs16PzZCh@v;%l&Ax}lV`-#gh@1A{M z8UX1udZb29j7)G13MntFwx_R(cQQx~#KjlMeXZ1=VP1V-KRV(dUzFv6h(%teKa$^- zA@sa`OY(Z4k^`^pbQ0-3D{XcT*N7j(m|&IK^}t!%(G|Q;@t>oD1 zvcSH(_GvQ5P2V1@FCpbo-4oh+*$8mihIicX~e-!KuiF-ErQ#FEE%}o$UYH z;R3nm?GE=#{q|nrz5?oSgngbM?TwVG2dw6bJ`(aH1{UT3@Yopor9IGr6HwBkG25ht zne>4Z`o#sugoRyF_FxtnG<@`j5>tZ{lQC2X^*@|6|A9>aBw)N(GoDFVo1jFDXLs=EUDs=TLVg~K*Y$H_ ze@8M3-%}bpZhvvJ6oS3~ zhi6jywx+&)Hzjs@nRhq)`X@a*g*bdxK?QPZ%vf-`^zCKY`b=#F1Lx3>KUA%8s@O0T zICU{>?ldddhmyZ0c4!nTRotK@wimlSD9+xs)ztmI4Ff?217bONL`E4H{6)PIxcRmb zf~-d4zw+n=Qca95JvjDv$}*+mx_*U~j^XpDabfWfXzVB$>@W_&?+6YPkM~>e2wE0L z?J;Z#lL>gUx2Kq_sQK(KokyKYNHu`G+?#vr}0F zP)aTQr$Q(zukV@P$BEqcj6&9+EGJCVHLdw|9p!V$PYq41d#dyeDm}fhnWAH12C~kX zOhKBmJtxkTs{ zL-*-}Fo;QW!1D9b9+jku=0P1ZLPtDh?{vQFC%VM3n+r%Aqcw47h0PBuc??=6ltb}2 z^#SlN7*6m`#t53f&4_Kqbm^onqbl|?X~8_r7QO*W(~I^;dPLW=mxEE}botOBxiWZfTl@rC`eabpjw@P8n-0OUh8Vgm3uX+Gos8mTTf`R9m%X0IRWX>G)Uh z%n!_ZPoLmgO7o0~%&|JDfEx~G!Wl3XCMp(VGDJ45Bsr?QmNLED3j^O8x?=K){p%6r zqL@{kkx4YIIRa(q#Wb%m z=@eLy;C#i*Ad*s_z+nTB?*s@W<&P8)ji4uel8hj?o1-I=RHLASlWYJB`uL1N8OkLj zk}!W}9v{=Imk1ci#!&b}{v9&~enik}$_DBWG%e}- z3H#x3{ToTbCOx|N?-YP1jaSigCQHVT-`9N;OBL-t8XOkC)aTRzMPJ`Xym-^!^2Wd? zU3m#~Ws1!xTqclMAV``JrjgHcu@J^(C+vUdh*}XHMwBMTZqb#vOXN(1d9g8P>PUau zJIef~RRwm0UNXKMXTaBZq;ISoohW?S0{{h)D7^ z5*v`zV_~Xf+>dAj)U>qSMP69m>nQuhYZ9E;eG3azO=ZC6Zu)6r%WS|~!4+q9Kd zwwn>1=%|VbK8nr%u)xaE^5;Cws5!oadwc<9KibILqT0gfLkX@OfO$01rL8G$@;rj- zHxg6a(DI!d$ReFeYCzzx7W>Rm+jF;qeX*}<0@8e&+D?E6Hod`%68mJ8=}ea{<$+xp zV^cFhx=w|oP5GJt;cufC^$0I1DroGDm@Iq0 z?}`-3NvHr(^Vy@Bc%f{j8c=L2OSLDorZ{s}$fBO@|I=8l20P@ZgG`Ag1!yI{zN3eb zXO^2ozQNJuE=Ejrx+@PK|BTA5AumI|PyQ#H%#S>*+s|WE(O$Np z7g*d1_~lenRC_UCnIeV940%@SrT=sV3JchXvA*&Bu1K7mL_9IXyt`ma71qqk#%PlU zBIjf1lm~r#FAHV;sCbnxze?Q1Emd?t*7Df_tTBYOpOM2!iGd}SDu?F$$5GDe?$$Zj4L@JpGP7Ckkb^ z*5B_cB&_-C>Nuy&qH%)-FLv}d%*))8k^jB@T;a>pYq961FRc!(dzBhy1(Y z+k;BZ#!cmYlcOhAo8*!2KIW?_+%()z_b!;MI(m`U)xGeB%1dl*^LD7CJ1)1@DMY7X z4$53ng(u6IC;l*FuDi72%bQQ99Yhc9OtdZJxUGko{F~-+D-O*>s$QX6r_7T6fe>_3 zXMqqdXjTCbNsoceQEtP!?+{vm7vnay#}RMNV-%1>A;I6);jSXWm&EAJ5|oeY(;IAM z%@sziH)N#;nB$_#*L>jpWE}Kh~5xxo}8cCkEWs3fb&22)io!H3aJ8U1(%$Nkv z4E0>D%P>^d{a~ByqADnn!D-a)V;0N!g4(N8H7oqE8puwd2(0Zf$PctT$F79Ed|Sg& zd2@6MKxySZaP+2Qdnvx9Tp5FX^K?Q(H+7eEartjgC&!ECF~Sa)R;l*KaNzlRk8*<` zXw1iY*nJGj2$ER`aQlQ$cHI-$zIDa1VI(9aT`ugYRR)!HT`*QHRzAb15FuUo3Y9MX<2oWey*gqa|t~wzetwOR*z#S#6zbJqL7=Nlo83Enfi)W zFnoSSdMVr{%2*b&g(~DhqOzRbtlX|urI)tA^?ZYnkd0l><@rFLyxF%65B5@!b5c82 z44a(V7H9MsnS&=+*frgNPc6<93w76X3FSFl?gOMxf?tB1-2$okdOE-TN!urY9$~7v z_PL;m&i7Jr9VWEm)JgRPbiVX(N+SNq)36aHZ`a;Iw;e{?h0tVTqExV0@F<-Zn8k+~ zW6|u<%O9NiIq0lPr+Gja`s5(+7>SS8yKv~a=Suy+5b&j|!eC=ghHqDW4DND{hcSHx zFBNF$La*&HvYAVo7=Et=0OI2aAnF)e4AOZwImFyQ|m^rmTc3t&?dQxliCn#_@q zq^}e}l(?ET$%xrzkrqW>0v^S(QTnUCJhcHm{$S)q^x!7#ye*kqGcldRBfo^)oA15H zkrV;1lY_6zlqvvF29@*d$dVY{S&uyL-rq@Su#Z==y}@P$u@9&9Lg^nd(8RP4kp=Cy)wH@@q1M1+h1GhDpT}?Bu_sj1Tf1a%k504qX0%c+Jx!js^RQS>uAZbze|v` z;VtCVROG`HaGP`R=p-GD-#Tn~gYCq|So?(gh@P{Kp#fTvUqwhG>bSSq35Hxft?H5< zDy^ajPbjH45Fe^7Whz?%wJHS9D?Hq)@6$Q@&AybMfeT9pF?(-7qyj_8HHA-Gf z*0`l;orMw6y>#Kf(YalUTs1vfhM)H_n{Z(IeBA|()0S4Y#1MOSZnjNsyAJW?T{ddccsw1=)6(-SETKY3Z%A(*49L)+ ztGosfW8PJZ9~I0`MwfXQ<0sF8Ix$Px-D3Yp{v|JA^AnApDeA)H(4|O_sVQTsA9c>2 zI>EjLB&Hx~ilFsWOrDe#_9hbo^P*zR{&B>?%O0&y#^0MwX)I6z!3dVzP$LOS{+NZ3 zWuhbGo01R;Wn!!On4WoZzqdU))+eJS$F|lL%w)2+aN6z3$dAXeALqqbNhg9m0KVfF z)zRQCk*rWd7_>r$!_SRV?R3I(M^n6XK(d~`8jV@cQg)eI#)JJcQLDSr@0pNHkjh-WReBcqn+aAzW z;+SCUg*Kd5Ir&W>No&lsVA(NDBK=5E16$^$Jip7ardaz4x{NVcnWcJL@j;?j-cKp^ zqkmlolij;tFc;xJhO17gC)xKI9LL!A2yIakC8pOdfGFFrK>L9zb_K@dJ;LgsgD=w} z3XFx}W7IIvU!p#PK_o@m`0@Lfx_vM`^s0_lG@}sbk>VJTz|x*sw+KCX#>aTtuCZ4z zshpXgdy;d?SZXMk@zn{s-~F9f^-cHm?{yy(*oCqM_j_fCls_%#W}99@7fYD z{9F`iAmn_bM5FgXR)NFwq=%UinatQuLYX4sBA$VS-u)Ce$NQpnM;gZd^Atx1`8DPq zMlEcy9!3_{T6p6ch+rL_6~C-;jd&gi7jg@LG-I|^>m3e6u(riF-H%Ay&Z3YF83ky; zpAwktK8m&FmKY3~O+b)gL4e`eNeP*vRuvuv*$g4$&u_Pz7%(g*$?>n9NjFX60GU!l zbd4En;`P}93avhH$p`A;U2)hF@-YcpeT#K{3$!oL2dM{9$>-Zwo z>|OdHw8q@HAK!F=>GO<@sEzv_iTzwtYtB(vn<>weQ zlizUWlvw)KLRrZ#|m}#VjK;l`Fh_x=Si?{$;tkVBe)P5}g?(>0sUwb>Qx{PTnkzz0 zrMOA@>yT}IWKN0WvY!P^QC`KFWRqTDILDgQkAJ;ll@N0YjTY&5p8nB$R~$d)QvOS# z@|Rl^b7uUQ_=NZtx5AdDDfg$-k^Ro+L7O?f5wSrURiQvjnc7&x!fi9 zaXxB^Ynsu0Y}JYDWs`bf9$Jq#Lm_Gq;B_4N=-`Czmd<%<-Qwd8j4>W8ZQM`5a#Xr) z=s!^(C9y^|A~cLPp}YOAl!7i(Oj%Norm(8!j}87_7&wk85;~BTz+wGI1_>2Zsrki6 zwuACHaoVBqYf2b?o)F{n#aTX@Fg(caS|cjdWFzR7_gyr7q2335D011W?WpmW9;=0r zVJadS<AEhdmKi_n=C|^d%*+DoO<$GNgr~xR*>9H_AhPFa9 zK#ip@{N>vx+&5~8Zi?`~spZ6fs3q{mExrE_x0Ln;+lIC5YyIwY&w5*5oNcip+q`Y+ zOw^GsU}SnyCCq7RwE#d&i}Gcl@m8K$7t z@EZl-+8+KwLY61`VhYQCMGCt=uhU?Iho?V}hrDgcl{E!o-z7Jpd&wsRw03DdD>7eb zJzr+y5{gMaO;f&DV_@!|LQHDeD^3vx?4vM~kWLaA(H1&G>n%1wRe8yGyN3|sre=y_ z-$BzasyXCq-1=6zZkd%*v|Gg+aD zJ@3ITbetM)B^&lOC>_HJ?}X`*tS+)Z>UW9WnO*TTJh9~aD;P-ID<0RwzMGVIX=^>> zRm4CtDcrT1JOhR50o(R|4T8Se?b5?9m+Rdypxc@xf|FF>B{H+YEl#xkH^8hDT?2|1 z5|^D6*Ek_xETPF1R*YX=qa>0v10sf;QgTlr$pa=ImsW;UhIC8iU67zA_lMieL>%LG zM_k(CDNl4wPnZyA0{YsI)X%u&(J638&(&JRS`8T!kvEt@SJ;$N6F-zrnniyxR&7Or z?LRWt@$7ONPl#;4&|YrG0I|Ee{O72%vae0o{;z&<>*;>M@sVt`Z9~U(b83xc_QBLp z*=dZ3P*9Nkw3m=j**a-2+5#Zx3-4bU3naW~&#}udflnS!d{@fcG8sG>JWYBwzHSEs zYKGliL>!wUyp&U#A@sxa(XYo;iMf8RCI1_WIw%s8fvduLTLBsb5rYq<4}E;%kO|d1w#l+w`amb`#OP3QT3myT8mtc@zFqLB~MsuTrqBM87EU| z`#D>+?Gu*iZSo4uns~{O!6!`{K(V$~MPAazZ5LL+upu!m!Yn47eK9;byR&W1hB#A$ z?5yilOf5ysRe(pR@v>WPgR=~WcvF_uuS zLSmX|LRQ3;4~%kF!D$K}W(iDUiIvvSn+)O%*6RX!=ZvceVt#vnq-xkK-f`mncDS_C zjbCQj{?#45zMNOyh5#$=)YMUgW6BkK0ws%Cr-l|tAc^}#JIskUlTpfEt%Om^Bfo|q z?46D;&Ntjo_`*s6s!3s1alCpv#Of-_8 zq0k`b`eY5^jEo2%MFnq?14MH^^-vJMCe$Wt%a{MK3@ZkM#i5u3r34Px~i8 z+9&Xc*J0ICO+wIy;>S;^xk?Um=h@J)3ai23u_h3r}GyoRRx@G{0oCL0;<(~N^z)TD`IhdkqZDqfH zIgQCaOR{skcH>pmJoV-7Lz6>Zs-von?lg6uV_eZkx&;p^o znB9SDK1|g;!u_OP=u%n^z}(&r88CR^lYh@?)~X$Jue1=Dw2vG$DQ-^-EmI*GQQzn=C-i)x9j8tJxSi0Ui&h791}AY z6)rhvZ02F^eZ}%><^EhmKOn}pLUujQ80_sp{fR^kR8jbF)UFZ)`4L+&HO$j{ zAEF4OQoOv~Cq&t7)#4%QIlX&R(e#NVlYMMC;wIEHhynEDqq*7~@< zqa(EtZQ1wr&X&SS;OIe?O)FN?$%$=U9%{@MSw6bVTQ~mOAu;9VU>$|Ju9XQp)8TQ+5~6vst)B06 z2mvQ{T3|2r+f}I!bMvI3eOlI0sjZ84&tL+FWZ9Xi++#{}gJ|AWIkzZ9_T)tf&V(^> z+T-Wcp~cBy8xksNo$`SwsX0yA)tP_X8qfjWH+dYRp9~RL!}{+PLWVmq?emBYD1-h* z_oeZ73e6yq1?!lF?}nWrv_jE&P;%W$n9Nv0cGoyqLI>THK}SDiN9)^8v>nPhug%ef z(Eo!->e>_dZz-4~V!>G#c zAok?c_|`+LQv0TZ>( z6$nzs>g$$g5v+H_PorJM=r4xEX*K7(Fm+VYuMulB+ki}YN_E~_G^(+hbM&3CJQW`N zNPdJQ-V_a2rnXv}52XJ;fPF5?cuy}UNc1pE4?-N-8n<9>r}D-`NU^wJLm(8A!TL^_ z(1AdRCE+`U0?p|PHVlIR*szb^o!2PaDp3`$ze7C>c!Hp%#BW3p2_Xp^(TqHGaSJOe zxsgKfDU;C@syR5;_B=rEPkcGn_^TShwi$;ODIsqu+u1-)+n#XuJpv_lXI>r{woB;L z?b{;lmWo&9v$XA`KHk4Sw%|UHD;wYn9e_fT(^zXaX@~*9$_xj1wlT5pjrCM)Gg?N# zOtm)FGHEE;E2jb0>wX4v|D!O&&x|R(J-X_EJa<#$;L1E#k$}N*%Ssv2r?&VaNKzE` z;?ZX!u4kT)t7?~sD5M>m+=kW8tdciuuAIS2{cNvRw+bA>M`auwrRdTZg?-m*K_ZAB zlv0w9H#Q-H1&ksuQ01it%Mu+*6K}X8{Yya-vF=XS4HAtL(*X)^dq?3L|w&v4^Js{&^Ms) zCxo7(LhNCbZTIqfow_1UyVFPY(5T%@7IDL~Qmt&o3xKHJGKV(I!OdDL)w{awLbJ7Y z%fYE8M8~TUCrUT=gDxg}!^B)*9b4ekj(Q zD|&#Xs2^THS~yd^?V&dvl)o^>smh|FMy{;C+Rh}a*vSf+RXDRGH+kTzlc&n|jtL+*B`9Uqr=n6S{2s!1r1->RKkO z&4mtTNn9Sr5`6u~K+x#?6$rz@HYy9jasMOy46(^wSYT!<9Tg@%yj{yeb7G%6Q!9r@d!)o78s)J!&rCy1+xx=cn`fBcbVC<0!k!^8b7<@16DLfhHOs_5`_%ms* zpe}aSxsvJod#g}xkuE)f-`1?9EOqfXg9-ZXf|B#uJ=tzb-vXgnat#C_&9AGQg}ea2 z#K^Yq_fu_rpJuZ;oWO2Pt3UKIUyTj85B%Of+_$Yxu3^Lc>R`?uIEHn2hk6XDBDRp+AV(Xk5wtIWgkDszrc zqx7qqyy#N*K~us#$N~J1?rg27D#ieRr*QU?Jad}=^NDhAvW3v56D>~K zKooXJ=jqCQaBNDq%t2fB^n21zrblaHtydkUC--WxewJ1*YdoJfJVeRNMFIA#>L0%k z$bP;q>+x(5)A1NKIV=h*5ia8N9ao4b6%9!k3zy?zvKQ*L=k!z%mTwi0dE&xG`rli$M8e~ zE?lPa!^@k-qMPo1{mZ7u@X_64Ed;!IN4v5U%k^Pvq;C~*qU5Ls=-%S|i8{7A#Gh5B z`ssv_J38o__CMNstjb`+Ht48nGmtjs2>IL{UIZMC-c|EeVfY`Bp3}G3 zqti|$*4;CuWvPT~=VDFw^ITF7nsfCGT81dYMa&r#pq9C#O>M|)wNO)e7-8dap7v(| zMHl7<{CQkueFML%Kqp%3+_~w;!dwx@f^j}UM-nb{cVhGw9RUo>C5-^y$WF}lz_Y%q zzAG3C`?pf6rj{FVgjQjNz^}9-6RabXSZsj{y7skdco>rZpQ8uZx zn!j@Ke-xCZEzlgF%fCenF9t~g=QNoQFb&USf3G8-uf=h!o}CUqKiNCKn)nc(Y7uYu zJ`zYg1iQTYiLDSHSkhmgO1z)N%etJ!em4W8Q&4$${>ZSe0X9RaKET*N`w4modZ?Ur zxReG$*IqkJ|AHQ)!im61h{kDJT`L#&27Q#->1(d0=x;-A=6+5Rnp)qDe;qsfEtKMV zf~x&Uh8CJfIvw31G)oPsd%(XY?oWqgp}8M+`ZqHSS}+k2^q-UuNSBo z!277Bj-ry>YniZrUJ#WiaQ@0*V|ZfFh--6D5hQ2$aysCO(zbYH2Gh))ocjTFIpqg_JJUM!%WrQ*agb?TcRk>S~2LO(1|8e;s z`Z*q+^Xz%9SKAdHcxmw?dy9qiWVZCh-Q{Gh($U5|Wi~ct+-2$Ax(&%7_f!YRjcs#f zuGbUhKh7(Ao|m+P>vo&rgPwLacBy^}3!le6k?E*P0#7MHGrp@1$zYk9T>j~%h8Hr# zvf!esON-0N>1}qE=1)o_NdRZFu~>B}ZK-q;n`67$x%276Z=o|nT3)M@6Y_$!Cf?SD z@2$qK7?1VQ(UX%X-;a>}liO^BQQz0W;jkUg^lv{(@2WeZ*-&p-IdSs--Z8Yqk{E63 zcUNb^}d;f_zpIEDcVxr)O0&_TngZHG+0I5vFL=fMR^v{ zGS1wxzeXj6ISyKa7P=n^#0gV~pXrRza{fcX>ye)g=gghmDxU!M;(qoY11glg*9 z__*{fcYe#-R=p=OON@&za`C!e`hUJ@`|jrt2=mf^)eSbZSUqIV8eRvhZ*;$+q1Jei zrKP6VBvG(+7^eZQ54L14$^i>fOhC6 zJdd%Ip-Jl#xR!nmIw)(1AAQ$%jA2sr5|WV85=`| z5|W^_Igd>-OOcWXj0BRG2jp2PS+tH zi9*ujabo<5t^J}MS@DIvS*kd`3Iyq#s^UW=_KsX%Wc!)}TmT{_y#x_&U4V##wnTU% zi2L7>>xw{@0uyh2Du1HPa|yl%kAyD7vN{dPNAM5dO5X~>LpG~LF*7(X>-oa*Z)XR> z25x5|f@6rDKN*Ygg1dt%bhHQi))6YshfFUb2yrVF_Xk<<@IS~7fL|&+h@P*$*pose zgb>01{ke!<-ZvMi$J;4w{R|-SV(%N?1-irFfv;UYKkxf;EdT9C-FipTnZdb8m6pY@ zE|QJ^JMdc@kt*P84h??$uT$JaFBhGU)X<9fr{KY>i{#(lP_N?ta|ZLcq%-34vXL#H z{%g3Yub|(~0O-GF3b?kmSI9{J@$ZGI1YJBMwUOwHSU-cWVG0rUUKwU^`9HT-zAHfV z|7i!qo|K(d)Iv=rQs)O!P9%hQhYz&`0wgB9#MZ_bs+`WAKcws)tXBk-3L}gH50t0a zX9+JLlIiasfA_N`+n$kBwzJ${nM|qz5exAY=?%EMxXQ;`4a3og(UUWIGm=Gp1;r;% zGs`-*rxupSJ5D!o*94;4#>I$t#UnXPwQ4kgm*4ab)|!*7ov=n?J~ z+}Tr@U;;hWg&k@M37G2Co*L-H6h+Sv1%n&fKOg;0j2gcCKlE5Wyyv9^OASTe;_d?R zY(<^#qMBo139AA<so3av+_~W#`NKu2z=(CHnUe1AekzQ3(|8f8UXJUw`7oG;{~+uR7_DJSlpuZ& z+?=Vjv96|TX{N0DR5}cKluC1?CZiq~jh^xz)sFbzhvH@%HZ|DAx$QhbA$|+Klmbu7 zsv|$!%UnOdK5H`uRDAuNkj{~g^XHgV&}zG0NFRU21l~{SL;iAH4NP=48HA|LpmFF& z-yF&1my%s~qQ~~?$xHHRfd8lI;YFuYBX-)9`y$8d{X^lmi2#G5Nvf=B=io*A^qt#d zsSN@{Rn;3h`i7_vr_AkyKHD@HXFvUG5gjg6zE^9eIPhShmf%sI;DIf?mO0b%C@;-hQU#v|upAt4BRR&|5 zQ?Mx^`=n|t5rVk`;a^Ny<-m6;Q%)93{nY{9T&))A4uVd*Te)^FEz~zlDGnA0j{TwP zWe8mIR+kdWiI)UVfWC3D1A*?x3A`C6B%dl-IwXnN7B-AI+opjXd}Vvul>Ydy<5O6U zZVuzi3T+yj8&bC$*_RarwX8MjhPy@Nd8s$}%9{-WR+pu`t&f%8z71;I06yJuelB_4 zJKo=V?cY^I4bwu6u4uEO(_>dmzrk0v6H6k&B2G{9^AM7JotV zh`GEcQ6&hrt(cK<>~Uz}C4wbc!>OoJAu-kT;W=NPo*uSqBvTo-&<*~&_RF#L!zQv@th(cHvq)I&>Ztx^7Sm>JmT3F~|5C{KS==RFya8mNHl23P@Ftxwj zg{^fQrBhu!5EvKxtunPXgC2uq@1Za;X5fID+|QOht}7+zO_KbI(^sZ)HoI` zf8%~n<)vDjvDoTwXH*6n<6WuYCsm8B36jf}&>>&bYA?^9aN9TNcve$hZR+fVI_(;? zIvQ>L*8%g&p|2Hak5QeLd2VFm(eh+JM8j}OuknT0j~?j*Q2+wX9z2be+_ma)J1mNE zD;T%S!E2}6=lh)ebaxD+lQdHaZv*{|Qn2pDjUi+a>I(BiHI%{Zana8G{4QE8YDw}v z8^JpRmclU|b?mm}wqRi`N$NF+NeiLNat_tAW58mZ>*2KZ#deDDdvyOsu2vk-(?6F? z_&f^i@GR^*Q^p0(<3oxbGxmv2*AM3%#L2YC}vc$(kPX^fuNrY^O?c0^qfy{iDa zTdB?^uljI95ra`dyXAL(hCzNny`w})|9%ypbC}iLs&du-0#GAt`f7Fgfv4%AF?D7o zJdch_nxO-53Jf*mad%B~1cq4kWv@ zjBEQAQUdw=vTk$J-yUDB0PGhho89%*nW%O(D1y+wGe9|uSncl3@7Yj5hYQoBc<+Dl-ZNUdnFza%xJ9uW+m7N&n3K8_q-Du= zSG}n;oqbY8WOjS;M~2C4Er}}6X(69qX`QoiMYy&&)H35m(P>a9Tb`ll{>o~OpfJ6$$ zA<1L#-6Rllgmpb+Os-hzWAKO14>PBXJkfrJ7WU}r%L9_&gdLOe@&eM5JKotj!kt$i z3r#J=u@saopZwfgAA#kq%GuL%_2Ip0T>qd^ zcS2T{H^Mq#Ned%8gu^{HTAjdHTr1f)Yii+t-$K4VHs6yZS4n;;*D=NSB4>mxQ+w%X z@o@9L*#jic!xun)E>oyXO`wN_>y-9S5~F`24fy=ir?9@K$Ty$bKA(xxf$wx*pXeI}|vsh2MFSg_1S(SCj`-oGB z2Z|ssh-*d$Nk8ZPZ=QV3NPwSon)ALYkCwuaqM@S9 zvb~%?@r$1Wa9zq#P^g9wcNA@AQIg_IUxZ75#;;MjD0thQ>_oU-WeNN5l%qlcK-=1@P}12iY96Q{q>ZEJtHFsvz9| z!SZ#XurU-J6rDVDS?#4O=BfchL7CrX-w{DT;x$d;X3ne8Q0}Blu|Chv27jUeV;!!M z386ptnd3ZE@BE)6TWKW@G}?VzhifUE7vIpG_}{$MvL-?L+e-$i7;&sJxq!f|rLEsV z519dabZbQG2mGLZEi=K;Cn407KCKvL-V5ADNNu9~;KIDcJx0-}E8h#m?Rb{Dx7ogf z{zwT!?Ct0)@X?~+qg%bR>4waw*6djmvVqX^yus<{q*R->Pk0RK-P6+b3}9bsgQZJ?yC5l zJ@Z>=-Hc8ocDS33d{i-;g7}zGG~rr>coU z7g*@!=MXOdc5BV>%bstjlDj0P?5}Dm!0E3t?zaKw&msaVdm{81k*D!Zv`TjAH^Mm9 zbp{cyI+8x#(CZq6-Em_=6^ekJ1a&^&s`6B<-hHETqt)0Q-*5a8qtM04Xkx@%ZWS)Rf|=9H_qx8M z2syBE)Xf|$dM^dYCx54uxcx<+*n?UMDYLJx{1*IB<&;ALmNwxCo|ojy&cd#E6*s5r zeWAMns3xWaVSd1Xb1Zp(0>hE&K>#Mx^`jI_CM%Cwn4V4c1`*nNu`)SZaSzIT9inth2p$po)k#J2=Zn($vZLgQz>=I#^#xXadLclOjztX3BR~ zITBfTlIaHNs>E@3C@u7((bjtI^Kem+>QGL^CrQ;&^clSbrd#r_@#{B5GP(Z-6K;wH z0+ydd$ogbEaEeB-#hSGrSiy-;JQZe*w*`$Q)n)@GW>`@$a*)B29M7O?t3_*MqzSo2 z4k3iU54X{h${~~N;ZZ(n0>FP57M?f(ocW7&2jJ! zy(-+T)7(6{AIow;d?TBBmo+^n?hs}*fHin$q@uyTVdu+r(e2TE9Py$x6KZDijqF*|H=P!qkAcAhGV!E_ zhG%#pq81*{%vemgRfv~?Et1ob$FtcOgE=>k?aKW6 z1BOW5=Jgy78G&SsA+~OxuQx+C0E}`5=U%klsa2&S|L-&OH4a01cD^$VCF>wN33-qp zA;>O7jcj;jjA8GCtpun|a`!{3ZVWa1T-*pl*FV7Tl_1eID^l?I4GPWtZ;bbZGxy~F z>`UO+d@=-1^ziRSAMrWf^r!W{4uN+)j`D`wqJ{`2@95tJ+m9_y!ikn89Go$bBxy^Q z_mp9R!=sS6KPes7aKC`_84>c>tfM^hjh(C-cun{NY`a?ndUM?$sS0X)R8@}+i^*3} z122~lo)VTC1(^g2iD|&fGbROjB)fF)MS>S`vw>WG%sJEe5%{B?!4fEY0l{mv_bviO zZ6l8B{8n!F9M!_FIDZgnq`dqoll)gd+BLPu696+VSeARP~QH!YtR3>Zp&f{{lBKZ0w}Ivi5B;S;O-XO9TME#-QC^c;skg1;4Z;} zyE_Dj;KAMXZ}Q&z|8LjsR^8d@nV#A^cc#1N9BgQ%9>d5>CImDiSy8c>T45R{&+mv* z0UTUf`RKr>#qi@*WykbXX&tI+GIU~eiBQ+zK%rpLLJbgXa$vU%D0;x@br5<|bo?R2 z2Nkt7WW~vIHN49{?3%p5Ufr{M@Y?R=!n<$iYm+E z{z3?<2)Q-5=p^d;J4tzS&U2$u-}{Pa0>K-#ejuPCS!lJCRp*%Q(txTTq^{Vmf(ET* zbd)2PNO;G4)^Nz%(|`Ime$avN6z@%WAO*GFU@kGuKAtSEwj}1)j;guhrP)hc6#3Ma zy1l z3ZFkpEv1e!(w|66yMsR~jYfQopg0+`x%Lj6lU~yN{8yCNpR3+3-uiX0Qt}f-j)E$z7 zpu~t^7hN*J&fJY-5yp1+5JOZCdu2qMgbiN(?iS0FMR!IXZ~aOb+zkcRkMFr3n7)5y zaxlVud5L4*ZS1}>ITaCFi~#y;?!?(%jouOpi%D{eZXKzVWSxHNGR1Tj=s{^ z(x$K}Y-c!Jk8Q(TN&BWwobwM#tHo_a;BJpD<{)!0zDOKN4mQQP|^wSV}K}DGNue{C*Zd!4+Sya;IwFWGTlYAUg4#a^7UmWIgix#KWJ$R#CZ@r{p zdXiQ}oQ;oEw(j-YQS=7kAB+xA($-12mw3gOzw2M($`qw*2F+_d? zZ~74@gTejx=rwyiUQy%pLgf$!nR2WgTNg%uSyqY#I{RxMSA{qY6QiUohg}UBYPVtGq z5IzxTD=*fwN@wF3CQB3`e29%d5aQLlR4e#D>!*I)b7bi}Ufa84yZ0_cymgDsNw375 zL6J~coXd)nl%BgjQwXl_13Gbeb}9v#;(9VaNalXz7+e(S8ki$ygwrKN%=?23aiM z)19b98bwRc*w`X;B~W#0Z&PWe4sD_3crI%)a{Yl1K6thhst}df^ZJ^WrnjL*21a33 zAMzKkWvLn3B{?nGEqA+A0~S46)jS0;W$e=H3yzv_B~Htv3#`eZHRy5vLsYGHrDfzz zF-T&>LmePhYfW@=he-IT>Txe$Yoc30_LHU$@m7iS%gN77)XSdwHOxyvNB>VmY_+8Q zu(tSw+d*z52$zDq`gE_01sg?5JC9is`TJ5D3Gt12NL{mi7$WCUQQ}MAw)jx_WeoBozjl%j2c-A zpD$g!jx9iZe4{bSiZ$!=v6rd5tY@ zJr5#h)(m2{p+vJY)2v?u8(I2pfR=iy?qz1~h*3=#(~K8u;ClOQ-7yvg~KvG*J3~p4yi?`0c}pDg&?xRX>Q_t}f+DFD>Qn*`7>^ zg5FDMf9cYh){U__igbx@-WZ43|9af&P5X* zLs%b`rbk5zZdI>$DfYn>_D=ut3bkM;|ZW*+UmzBDqPe)bmKqHS$hnP*Mub)OJ&fk>jiYW_^n-HY?qk z21IFyQvFGk*2b#|J`M2UeZ;NjSlfIyOJbojeZLlD|3B%^ zrlPqBWyop)0e|&xya(!z4_2KFhYIn?in|5lK1;~$2%q~aS$y{7g zIek5GPw{$ys;VLNB3{V<@Hg@9A*kNZF&&f|2&N8RMxeXL(A$;fa}Q*xq5kF=g(a~iPe{)*G-Jbt{o%MDNY zbHVzQeZO?>^LQhxGTq-cjT@S{>xMB0O}IX{uqXMPYInT-RPOtuAcn9S**ytnN|&)! z&7XlEq`lHMt3@E)6l6tz6v&+Uq#Vh8v&BfsMJC?=SzldvoLWcj zJqCPv7!4E@ze?Uqu9ZAvuYaB^N2O(^mqc>UR7VvI|0p9sgHg*M0=Rq!Ps)mk60Bn@HVM4Ko1u#) zv3tMd*5_?@_!_h>@{y*yaf*xu=KGjcyhe)mLSRE)SqF_s&$b5fiw>Z#5Q%Jm@TU)p zLPyq+bumObdeR1_`cr%64`_!5hOy_%D)BV&0ZRonzXsP}GuMR<4?MNSv75EFlwP1W zvh{);UmhmN;XIv4CBV@y{u7=#Q;V~gz7p@`e`tXgwiQ2!wancxaY6E|>(QNtu&U-< zgPG6L>ISl=m+SPVpKQx~*yBdagmlT18J1z>!$lk|R4)wy@hL_?>lT?(?i}%z%2<(^ zRsUmIR7CY>(Oe>;ssWWJ0V2rplKjp=%!;YPCiV4b9hmWD`2b_$2n}@AU(Q6@#K3QY z>3K2=l%LU(;71EhHRbO6q2nc4yZ@3gVkahd;>N?rhnHu)1&5zHF;U{CyGV2$yoQ2U z8F{%bi()1JG(d-gejS&_L0*j5^%XBz*`Hgc312sYi1<1UofCM*TK%h znIAAB5W<;CL%*Y7dcA7sl9sVfS2mAMsi7pQ2%l0I5*bQ?Luh7s&5=XFo@6FDuFK-~ z4GiRdD-_T~O9)O9nVHzgj`}PqWoTNR042#I;*BbmfXRSMAqjk!HV478k&uJn+3?{> z;A0B4fObOsG9cewK4C-(YJj6^OISh)fmQ+)qz+2*i4pYGk4_OSfl46hKptVsGYOHm zR2+g35EmTRZ%KI|aY8C8{@ofcrk~D$3w3})&PSO>Qc!HRxLmf3epYaDZG`P2R~=SP zl_>G%uWR9X0OVS*kO(gsiXx9TEqoU010o5pnt*EyPNn71R-$$BCuUOGu#-<_@IMe{ zuzM@b+OKQ(*yS?R@%fz#PBN7go2r@VIg0CVge}f%!&W#eQM8Npd!2eIdu|7mGy-XR zei_BeI{bp6K~?|tVdAKt-3RF}?~!bK{`IC?F5kWN{S3}6v?ms_@0)l7LvCkd@45ZJ zB0#iluRh84Qo@kh>0UCHOa+2}dSi*{h>uyImXB|(9yILM_Sd8!)9XaBd~{ezHR+>( zxO4r7!VzvygP&M$+fh+rc7P)afEBNBC{vJ~_|2LKIS^Q}kt|gfrhl^0fwQw93gj*+ zP=L~-_+9`+stXu6f(U{fIsXv^0slDN3Ouxl))q^u1w<+zU0-FrZtvB}?vIIhw!`m* z{$OleyMEl3|NS3=AW~e%g9Ap@0KHi4F_jJ@6fa7AVAkj#VoHfv*xLh2f{!)+ z*18vt(?0K+PFYz%UN0e~Z(qPp_o)LI27!mLJFMMWuwLSBvk;Kn@NTEp-;eewH%ljr z{>UP+4(-cC!Qz(r3Cn0+w*XfIJ>2UbC$O}XGwKgS@$UZm zIaU#=9=2gJ8T&9-v3|)1h~M8_x4Hj0JsXgGE_isKeD`$rTej5Ibz_ugn2g=0BvE^B z)c~+`yLh7jJL0SUUD{L)S9C8n0a`dM^OHNf5aDl}!e^nC&b}Kb8#&Fw^9x|!kSwlg zbLr2!w{O5*btAVU`SM%xM_?s7?ErlBwCUcFj48#oX~G!lPUbxOLkRAC(}I5sYReES z^ZTorWczJ-QeGA6A8B!IlQIGEk}DN8wG>tNoZu0l!7>{EUNuxreMPvS8t3+|s@S?J zXJ$Ub_Vou;7mQz+7_d>meAO03q1C{RoeI6^vOkbFT1d<^HY~cDi8QeYmbMy@6gK*~Pn6#;jEz0o6A1&9u`q4JO?ln9S zed|VSWlF5T_1AQxSFG5mH!dXwwzw|NT|48I*}Nu*6{l$vA5R*7R+Jd0uhm$fu?=VK zD!V2pYm~`ufWeBmhuzvy-jHal{zGb|A!IpVcbIjUGFh}X%MJ4t(}Io##bkLI%0y$> z;dPdKjyYS}v)DN*fNt8uWppRY9|NT(e|5Ijms0c}! zZBl>pzw0q{{KS0)Xsk8g{dL>*vL^fC626)$T#4Bc1W;5{53o=>Yw3~V*fK- zJOSme;prwKAJSYBBw0xRXJ0~;KT@om4hQoH`2dANI5>8!q~|v%ja|bnFN$L2geyr0 zN&IdNzR{gHFhod9vsXv6N5`_GozIRF5K#jK_(enDh>$7DfSKC{H6!=A3MJ<`dYLDF zHy0mi3(GZJt%HGK@m}^-{gs?)!j)Wn;t=@XS~#Bm6a*=mZ!OOzA9rJxJIb1)&TLPm zj-u9w-j*(2w1-$MOasF!*%S^>G=suDyNSW#za|`-u^@u|WDnD?35%h2t>2XW;}@q&I<3(+h`Bx-H^~Y0+vB0G1v4)-+e|#KIVEcUOnvz1#dd4*G@wkm$M6&4y6E`$vSj?Mt!()10(=x5p*()f6gH;=rsf_a3J zLHha0bn$B@d#P-R*}J7lbcwDr8;({Ex;I{zg}PYPV#P1}%nUB>p9?2zmby3_5po}# zmn*iQ*9TcSioshlKIp@z4CasRQN@i7kEh%o>|7aW|E7%L?Pxq1qAIgAk#5TuycJ|6 z#9f&JvYR$o?HUIss>WrU_|E4&((kSK9@ht1SgXO)(m(umF&q3oWg4DHz+Fq?G)D6p7rw3>gxKX6W*Vuq(ij1Al1 zVr45dNRAOVB2d!0qeZZou5mWs#8(#e&Mk4u|9L77qoxIvi$D+?P*1VL4_|lvz2Qi ztaxYvYA|=~V*4N>m9(I5)F=4JtG#FogLk-Jc0z_%D@#b{83

0-%B@ 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 H9Kik$_m3P9 diff --git a/src/Core/Silk.NET.BuildTools/Bind/StructWriter.cs b/src/Core/Silk.NET.BuildTools/Bind/StructWriter.cs index 4d5c5b8f1b..aa960adad5 100644 --- a/src/Core/Silk.NET.BuildTools/Bind/StructWriter.cs +++ b/src/Core/Silk.NET.BuildTools/Bind/StructWriter.cs @@ -1,4 +1,4 @@ -// Licensed to the .NET Foundation under one or more agreements. +// Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. using System; @@ -27,10 +27,11 @@ public static class StructWriter /// The file to write to. /// The subsystem containing this enum. /// The project containing this enum. + /// The bind state. public static void WriteStruct (this Struct @struct, string file, Profile profile, Project project, BindState task) { - if (@struct.Attributes.IsBuildToolsIntrinsic(out var args)) + if (@struct.Attributes.IsBuildToolsIntrinsic(out var args) && args.FirstOrDefault() == "$PFN") { WriteBuildToolsIntrinsic(@struct, file, profile, project, task, args); return; @@ -47,14 +48,20 @@ public static void WriteStruct sw.WriteLine($"namespace {ns}{project.Namespace}"); sw.WriteLine("{"); string guid = null; - + static bool IsChar(Type type) => type.Name == "char" || type.GenericTypes.Any(IsChar); var needsCharSetFixup = @struct.Fields.Any(x => IsChar(x.Type)); - + string structuredType = null; + foreach (var attr in @struct.Attributes) { if (attr.Name == "BuildToolsIntrinsic") { + if (attr.Arguments.Count > 1 && attr.Arguments[0] == "$VKSTRUCTUREDTYPE") + { + structuredType = attr.Arguments[1]; + } + continue; } @@ -78,7 +85,10 @@ public static void WriteStruct } sw.WriteLine($" [NativeName(\"Name\", \"{@struct.NativeName}\")]"); - sw.WriteLine($" public unsafe partial struct {@struct.Name}"); + sw.WriteLine + ( + $" public unsafe partial struct {@struct.Name}{(structuredType is not null ? " : IStructuredType" : string.Empty)}" + ); sw.WriteLine(" {"); if (guid is not null) { @@ -214,7 +224,8 @@ public static void WriteStruct } else if (structField.NumBits is not null) { - WriteBitfield(structField, ref bitfieldIdx, ref bitfieldPsz, ref bitfieldRbs, ref bitfieldLbt, sw, profile); + WriteBitfield + (structField, ref bitfieldIdx, ref bitfieldPsz, ref bitfieldRbs, ref bitfieldLbt, sw, profile); } else if (!(structField.Count is null)) { @@ -347,7 +358,7 @@ public static void WriteStruct } foreach (var function in @struct.Functions.Concat - (ComVtblProcessor.GetHelperFunctions(@struct, profile.Projects["Core"]))) + (ComVtblProcessor.GetHelperFunctions(@struct, profile.Projects["Core"]))) { using (var sr = new StringReader(function.Signature.Doc)) { @@ -364,7 +375,7 @@ public static void WriteStruct } using (var sr = new StringReader - (function.Signature.ToString(null, accessibility: true, semicolon: false))) + (function.Signature.ToString(null, accessibility: true, semicolon: false))) { string line; while ((line = sr.ReadLine()) != null) @@ -383,6 +394,34 @@ public static void WriteStruct sw.WriteLine(); } + if (structuredType is not null) + { + sw.WriteLine + ( + @" + /// " + ); + if (structuredType.Length < 1) + { + sw.WriteLine(" /// Note, there is no fixed value for this type."); + } + sw.Write(@" StructureType IStructuredType.StructureType() + { + return SType" + ); + if (structuredType.Length > 0) + { + sw.Write(" = "); + sw.Write(structuredType); + } + + sw.WriteLine + ( + @"; + }" + ); + } + sw.WriteLine(" }"); sw.WriteLine("}"); sw.Flush(); @@ -395,7 +434,9 @@ public static void WriteBuildToolsIntrinsic if (args[0] == "$PFN") { WriteFunctionPointerWrapper - (@struct, file, profile, project, task, args[1], args[2], Enum.Parse(args[3])); + ( + @struct, file, profile, project, task, args[1], args[2], Enum.Parse(args[3]) + ); } else { @@ -468,7 +509,8 @@ CallingConvention conv sw.WriteLine($" => SilkMarshal.PtrToDelegate<{delegateName}>(pfn);"); sw.WriteLine(); sw.WriteLine($" public static implicit operator {fnPtrSig}({pfnName} pfn) => pfn.Handle;"); - sw.WriteLine($" public static implicit operator {pfnName}({fnPtrSig} ptr) => new {pfnName}(ptr);"); + sw.WriteLine + ($" public static implicit operator {pfnName}({fnPtrSig} ptr) => new {pfnName}(ptr);"); sw.WriteLine(" }"); sw.WriteLine(); // type.FunctionPointerSignature.Name = delegateName; @@ -476,7 +518,10 @@ CallingConvention conv // type.Name = type.FunctionPointerSignature.NativeName; // type.IndirectionLevels--; using (var sr = new StringReader - (type.FunctionPointerSignature.ToString(null, @delegate: true, semicolon: true, accessibility: true))) + ( + type.FunctionPointerSignature.ToString + (null, @delegate: true, semicolon: true, accessibility: true) + )) { string line; while ((line = sr.ReadLine()) != null) @@ -490,7 +535,8 @@ CallingConvention conv sw.Flush(); } - public static void WriteFusedField(Struct @struct, Project p, Field field, List args, StreamWriter sw) + public static void WriteFusedField + (Struct @struct, Project p, Field field, List args, StreamWriter sw) { var temporaryValue = IsTemporaryValue(p, @struct, args); if (!temporaryValue) @@ -519,7 +565,8 @@ public static void WriteFusedField(Struct @struct, Project p, Field field, List< static bool IsTemporaryValue(Project p, Struct @struct, List args) { // ReSharper disable AccessToModifiedClosure - var fusingStruct = p.Structs.First(x => x.Name == @struct.Fields.First(y => y.Name == args[1]).Type.Name); + var fusingStruct = p.Structs.First + (x => x.Name == @struct.Fields.First(y => y.Name == args[1]).Type.Name); var fusingFieldInst = fusingStruct.Fields.First(x => x.Name == args[2]); if (fusingFieldInst.NumBits is not null) { @@ -609,7 +656,8 @@ Profile profile } var bitfieldOffset = currentSize * 8 - remainingBits; - var bitwidthHexStringBacking = ((1 << fieldDecl.NumBits.Value) - 1).ToString("X") + typeNameBacking switch + var bitwidthHexStringBacking = ((1 << fieldDecl.NumBits.Value) - 1).ToString + ("X") + typeNameBacking switch { "byte" => string.Empty, "sbyte" => string.Empty, diff --git a/src/Core/Silk.NET.BuildTools/Converters/Readers/VulkanReader.cs b/src/Core/Silk.NET.BuildTools/Converters/Readers/VulkanReader.cs index 923bdf914a..8e978d8bbb 100644 --- a/src/Core/Silk.NET.BuildTools/Converters/Readers/VulkanReader.cs +++ b/src/Core/Silk.NET.BuildTools/Converters/Readers/VulkanReader.cs @@ -55,47 +55,62 @@ private Dictionary ConvertStructs(VulkanSpecification spec, Bind { var prefix = task.FunctionPrefix; var ret = new Dictionary(); + foreach (var s in spec.Structures) { - ret.Add - ( - s.Name, new Struct - { - Fields = s.Members.Select - ( - x => new Field - { - Count = string.IsNullOrEmpty(x.ElementCountSymbolic) - ? x.ElementCount != 1 ? new Count(x.ElementCount) : null - : new Count(x.ElementCountSymbolic, false), - Name = Naming.Translate(TrimName(x.Name, task), prefix), - Doc = $"///

{x.Comment}", - NativeName = x.Name, - NativeType = x.Type.ToString(), - Type = ConvertType(x.Type), - DefaultAssignment = - (x.Type.Name == "VkStructureType" || x.Type.Name == "XrStructureType") - && !string.IsNullOrWhiteSpace(x.LegalValues) - ? "StructureType." + TryTrim + var @struct = new Struct + { + Fields = s.Members.Select + ( + x => new Field + { + Count = string.IsNullOrEmpty(x.ElementCountSymbolic) + ? x.ElementCount != 1 ? new Count(x.ElementCount) : null + : new Count(x.ElementCountSymbolic, false), + Name = Naming.Translate(TrimName(x.Name, task), prefix), + Doc = $"/// {x.Comment}", + NativeName = x.Name, + NativeType = x.Type.ToString(), + Type = ConvertType(x.Type), + DefaultAssignment = + (x.Type.Name == "VkStructureType" || x.Type.Name == "XrStructureType") + && !string.IsNullOrWhiteSpace(x.LegalValues) + ? "StructureType." + TryTrim + ( + Naming.Translate ( - Naming.Translate - ( - TrimName(x.LegalValues.Split(',').FirstOrDefault(), task), - task.FunctionPrefix - ), - Naming.TranslateLite(TrimName("VkStructureType", task), task.FunctionPrefix) - ) - : null, - NumBits = x.NumBits - }.WithFixedFieldFixup09072020() - ) - .ToList(), - Name = Naming.TranslateLite(TrimName(s.Name, task), prefix), - NativeName = s.Name - } - ); + TrimName(x.LegalValues.Split(',').FirstOrDefault(), task), + task.FunctionPrefix + ), + Naming.TranslateLite(TrimName("VkStructureType", task), task.FunctionPrefix) + ) + : null, + NumBits = x.NumBits + }.WithFixedFieldFixup09072020() + ) + .ToList(), + Name = Naming.TranslateLite(TrimName(s.Name, task), prefix), + NativeName = s.Name + }; + + // Find the STYpe field (and it's position) + var sTypeField = @struct.Fields + .FirstOrDefault(f => f.Name == "SType" && f.Type.Name == "VkStructureType"); + if (sTypeField is not null) + { + @struct.Attributes.Add + ( + new() + { + Name = "BuildToolsIntrinsic", + Arguments = new() {"$VKSTRUCTUREDTYPE", sTypeField.DefaultAssignment ?? string.Empty} + } + ); + } + + ret.Add(s.Name, @struct); } - + foreach (var h in spec.Handles) { ret.Add @@ -103,7 +118,9 @@ private Dictionary ConvertStructs(VulkanSpecification spec, Bind h.Name, new Struct { Fields = new List - {new Field {Name = "Handle", Type = new Type {Name = h.CanBeDispatched ? "nint" : "ulong"}}}, + { + new Field {Name = "Handle", Type = new Type {Name = h.CanBeDispatched ? "nint" : "ulong"}} + }, Name = Naming.TranslateLite(TrimName(h.Name, task), prefix), NativeName = h.Name } @@ -112,13 +129,19 @@ private Dictionary ConvertStructs(VulkanSpecification spec, Bind foreach (var u in spec.Unions) { - ret.Add(u.Name, new Struct - { - Attributes = new List{new Attribute{Name = "StructLayout", Arguments = new List{"LayoutKind.Explicit"}}}, - Fields = GetFields(u, task).ToList(), - Name = Naming.TranslateLite(TrimName(u.Name, task), prefix), - NativeName = u.Name - }); + ret.Add + ( + u.Name, new Struct + { + Attributes = new List + { + new Attribute {Name = "StructLayout", Arguments = new List {"LayoutKind.Explicit"}} + }, + Fields = GetFields(u, task).ToList(), + Name = Naming.TranslateLite(TrimName(u.Name, task), prefix), + NativeName = u.Name + } + ); } return ret; @@ -138,7 +161,7 @@ private IEnumerable GetFields(StructureDefinition union, BindTask task) Name = $"{Naming.Translate(x.Name, task.FunctionPrefix)}_{i}", Attributes = new List { - new Attribute{Name = "FieldOffset", Arguments = new List {$"{i * fieldSize}"}} + new Attribute {Name = "FieldOffset", Arguments = new List {$"{i * fieldSize}"}} }, Doc = $"/// {x.Comment}", NativeName = x.Name, @@ -155,7 +178,7 @@ private IEnumerable GetFields(StructureDefinition union, BindTask task) Name = $"{Naming.Translate(x.Name, task.FunctionPrefix)}", Attributes = new List { - new Attribute{Name = "FieldOffset", Arguments = new List {"0"}} + new Attribute {Name = "FieldOffset", Arguments = new List {"0"}} }, Doc = $"/// {x.Comment}", NativeName = x.Name, @@ -165,7 +188,7 @@ private IEnumerable GetFields(StructureDefinition union, BindTask task) }; } } - } + } private int GetTypeSize(string type, IEnumerable> maps) { @@ -237,7 +260,7 @@ public IEnumerable ReadFunctions(object obj, BindTask task) } } } - + foreach (var extension in spec.Extensions) { foreach (var name in extension.CommandNames) @@ -273,14 +296,15 @@ private Dictionary ConvertFunctions(VulkanSpecification spec, ( function.Name, new Function { - Name = Naming.Translate(NameTrimmer.Trim(TrimName(function.Name, task), task.FunctionPrefix), task.FunctionPrefix), + Name = Naming.Translate + (NameTrimmer.Trim(TrimName(function.Name, task), task.FunctionPrefix), task.FunctionPrefix), Parameters = function.Parameters.Select ( x => new Parameter { Count = x.IsNullTerminated ? null : - x.ElementCountSymbolic != null ? - function.Parameters.Any(y => y.Name == x.ElementCountSymbolic) + x.ElementCountSymbolic != null ? function.Parameters.Any + (y => y.Name == x.ElementCountSymbolic) ? new(x.ElementCountSymbolic) : new(x.ElementCountSymbolic.Split(',')) : new(x.ElementCount), @@ -322,7 +346,7 @@ public IEnumerable ReadEnums(object obj, BindTask task) }; } } - + task.InjectTypeMap(tm); } @@ -342,7 +366,7 @@ public IEnumerable ReadConstants(object obj, BindTask task) ConstantType.Float32 => new Type {Name = "float"}, ConstantType.UInt32 => new Type {Name = "uint"}, ConstantType.UInt64 => new Type {Name = "ulong"}, - _ => new Type{Name = "ulong"} + _ => new Type {Name = "ulong"} }, ExtensionName = "Core" } @@ -363,21 +387,23 @@ public IEnumerable ReadConstants(object obj, BindTask task) } ) ) - ).Concat + ) + .Concat ( spec.Extensions.SelectMany ( - x => x.EnumExtensions.Where(y => y.ExtendedType is null).Select - ( - y => new Constant - { - Name = Naming.Translate(TrimName(y.Name, task), task.FunctionPrefix), - NativeName = y.Name, - Value = y.Value, - Type = new Type {Name = "uint"}, - ExtensionName = TrimName(x.Name, task) - } - ) + x => x.EnumExtensions.Where(y => y.ExtendedType is null) + .Select + ( + y => new Constant + { + Name = Naming.Translate(TrimName(y.Name, task), task.FunctionPrefix), + NativeName = y.Name, + Value = y.Value, + Type = new Type {Name = "uint"}, + ExtensionName = TrimName(x.Name, task) + } + ) ) ); } @@ -395,7 +421,9 @@ public string TrimName(string name, BindTask task) return name.Remove(0, task.FunctionPrefix.Length + 1); } - return name.ToLower().StartsWith(task.FunctionPrefix.ToLower()) ? name.Remove(0, task.FunctionPrefix.Length) : name; + return name.ToLower().StartsWith(task.FunctionPrefix.ToLower()) + ? name.Remove(0, task.FunctionPrefix.Length) + : name; } private static FlowDirection ConvertFlow(ParameterModifier mod) @@ -408,7 +436,7 @@ private static FlowDirection ConvertFlow(ParameterModifier mod) _ => FlowDirection.In }; } - + private Dictionary ConvertEnums(VulkanSpecification spec, BindTask task) { var ret = new Dictionary(); @@ -440,8 +468,8 @@ private Dictionary ConvertEnums(VulkanSpecification spec, BindTask : new List(), EnumBaseType = e.BitWidth switch { - 64 => new(){Name = "long"}, - _ => new(){Name = "int"} + 64 => new() {Name = "long"}, + _ => new() {Name = "int"} } } ); @@ -458,6 +486,7 @@ private Dictionary ConvertEnums(VulkanSpecification spec, BindTask } private static readonly char[] Digits = "1234567890".ToCharArray(); + private static string TryTrim(string token, string @enum) { var trimmed = token.StartsWith(@enum) ? token.Substring(@enum.Length) : token; diff --git a/src/Vulkan/Silk.NET.Vulkan/IStructuredType.cs b/src/Vulkan/Silk.NET.Vulkan/IStructuredType.cs new file mode 100644 index 0000000000..ed30531ea2 --- /dev/null +++ b/src/Vulkan/Silk.NET.Vulkan/IStructuredType.cs @@ -0,0 +1,19 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +namespace Silk.NET.Vulkan; + +/// +/// Base interface for any struct that has a field called `SType`, that must be correctly +/// set when passing into the Vulkan API. +/// +public interface IStructuredType +{ + /// + /// Gets the structured type's enum value. + /// + /// + /// Retrieving the also ensures it is set to the correct value (if any). + /// + StructureType StructureType(); +} \ No newline at end of file diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureBuildGeometryInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureBuildGeometryInfoKHR.gen.cs index 12b90a78bf..9f5c6b4dad 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureBuildGeometryInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureBuildGeometryInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAccelerationStructureBuildGeometryInfoKHR")] - public unsafe partial struct AccelerationStructureBuildGeometryInfoKHR + public unsafe partial struct AccelerationStructureBuildGeometryInfoKHR : IStructuredType { public AccelerationStructureBuildGeometryInfoKHR ( @@ -145,5 +145,11 @@ public AccelerationStructureBuildGeometryInfoKHR [NativeName("Type.Name", "VkDeviceOrHostAddressKHR")] [NativeName("Name", "scratchData")] public DeviceOrHostAddressKHR ScratchData; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.AccelerationStructureBuildGeometryInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureBuildSizesInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureBuildSizesInfoKHR.gen.cs index 95a13831f2..23531a9d36 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureBuildSizesInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureBuildSizesInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAccelerationStructureBuildSizesInfoKHR")] - public unsafe partial struct AccelerationStructureBuildSizesInfoKHR + public unsafe partial struct AccelerationStructureBuildSizesInfoKHR : IStructuredType { public AccelerationStructureBuildSizesInfoKHR ( @@ -79,5 +79,11 @@ public AccelerationStructureBuildSizesInfoKHR [NativeName("Type.Name", "VkDeviceSize")] [NativeName("Name", "buildScratchSize")] public ulong BuildScratchSize; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.AccelerationStructureBuildSizesInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureCreateInfoKHR.gen.cs index f7e7016001..8bf202c6c6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAccelerationStructureCreateInfoKHR")] - public unsafe partial struct AccelerationStructureCreateInfoKHR + public unsafe partial struct AccelerationStructureCreateInfoKHR : IStructuredType { public AccelerationStructureCreateInfoKHR ( @@ -112,5 +112,11 @@ public AccelerationStructureCreateInfoKHR [NativeName("Type.Name", "VkDeviceAddress")] [NativeName("Name", "deviceAddress")] public ulong DeviceAddress; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.AccelerationStructureCreateInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureCreateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureCreateInfoNV.gen.cs index 8835e4deea..22222a3a69 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureCreateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureCreateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAccelerationStructureCreateInfoNV")] - public unsafe partial struct AccelerationStructureCreateInfoNV + public unsafe partial struct AccelerationStructureCreateInfoNV : IStructuredType { public AccelerationStructureCreateInfoNV ( @@ -68,5 +68,11 @@ public AccelerationStructureCreateInfoNV [NativeName("Type.Name", "VkAccelerationStructureInfoNV")] [NativeName("Name", "info")] public AccelerationStructureInfoNV Info; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.AccelerationStructureCreateInfoNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureDeviceAddressInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureDeviceAddressInfoKHR.gen.cs index ac00ff95de..ebbff97e7c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureDeviceAddressInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureDeviceAddressInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAccelerationStructureDeviceAddressInfoKHR")] - public unsafe partial struct AccelerationStructureDeviceAddressInfoKHR + public unsafe partial struct AccelerationStructureDeviceAddressInfoKHR : IStructuredType { public AccelerationStructureDeviceAddressInfoKHR ( @@ -57,5 +57,11 @@ public AccelerationStructureDeviceAddressInfoKHR [NativeName("Type.Name", "VkAccelerationStructureKHR")] [NativeName("Name", "accelerationStructure")] public AccelerationStructureKHR AccelerationStructure; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.AccelerationStructureDeviceAddressInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureGeometryAabbsDataKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureGeometryAabbsDataKHR.gen.cs index 9e967adae5..0b802df2f1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureGeometryAabbsDataKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureGeometryAabbsDataKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAccelerationStructureGeometryAabbsDataKHR")] - public unsafe partial struct AccelerationStructureGeometryAabbsDataKHR + public unsafe partial struct AccelerationStructureGeometryAabbsDataKHR : IStructuredType { public AccelerationStructureGeometryAabbsDataKHR ( @@ -68,5 +68,11 @@ public AccelerationStructureGeometryAabbsDataKHR [NativeName("Type.Name", "VkDeviceSize")] [NativeName("Name", "stride")] public ulong Stride; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.AccelerationStructureGeometryAabbsDataKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureGeometryInstancesDataKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureGeometryInstancesDataKHR.gen.cs index bf35b61fab..5ae2414117 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureGeometryInstancesDataKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureGeometryInstancesDataKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAccelerationStructureGeometryInstancesDataKHR")] - public unsafe partial struct AccelerationStructureGeometryInstancesDataKHR + public unsafe partial struct AccelerationStructureGeometryInstancesDataKHR : IStructuredType { public AccelerationStructureGeometryInstancesDataKHR ( @@ -68,5 +68,11 @@ public AccelerationStructureGeometryInstancesDataKHR [NativeName("Type.Name", "VkDeviceOrHostAddressConstKHR")] [NativeName("Name", "data")] public DeviceOrHostAddressConstKHR Data; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.AccelerationStructureGeometryInstancesDataKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureGeometryKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureGeometryKHR.gen.cs index 7aaf6f8bab..33a1c5e632 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureGeometryKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureGeometryKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAccelerationStructureGeometryKHR")] - public unsafe partial struct AccelerationStructureGeometryKHR + public unsafe partial struct AccelerationStructureGeometryKHR : IStructuredType { public AccelerationStructureGeometryKHR ( @@ -79,5 +79,11 @@ public AccelerationStructureGeometryKHR [NativeName("Type.Name", "VkGeometryFlagsKHR")] [NativeName("Name", "flags")] public GeometryFlagsKHR Flags; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.AccelerationStructureGeometryKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureGeometryMotionTrianglesDataNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureGeometryMotionTrianglesDataNV.gen.cs index 2845abd7d2..035b8f9a1a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureGeometryMotionTrianglesDataNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureGeometryMotionTrianglesDataNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAccelerationStructureGeometryMotionTrianglesDataNV")] - public unsafe partial struct AccelerationStructureGeometryMotionTrianglesDataNV + public unsafe partial struct AccelerationStructureGeometryMotionTrianglesDataNV : IStructuredType { public AccelerationStructureGeometryMotionTrianglesDataNV ( @@ -57,5 +57,11 @@ public AccelerationStructureGeometryMotionTrianglesDataNV [NativeName("Type.Name", "VkDeviceOrHostAddressConstKHR")] [NativeName("Name", "vertexData")] public DeviceOrHostAddressConstKHR VertexData; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.AccelerationStructureGeometryMotionTrianglesDataNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureGeometryTrianglesDataKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureGeometryTrianglesDataKHR.gen.cs index d4372cca71..4c2f9357f2 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureGeometryTrianglesDataKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureGeometryTrianglesDataKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAccelerationStructureGeometryTrianglesDataKHR")] - public unsafe partial struct AccelerationStructureGeometryTrianglesDataKHR + public unsafe partial struct AccelerationStructureGeometryTrianglesDataKHR : IStructuredType { public AccelerationStructureGeometryTrianglesDataKHR ( @@ -123,5 +123,11 @@ public AccelerationStructureGeometryTrianglesDataKHR [NativeName("Type.Name", "VkDeviceOrHostAddressConstKHR")] [NativeName("Name", "transformData")] public DeviceOrHostAddressConstKHR TransformData; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.AccelerationStructureGeometryTrianglesDataKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureInfoNV.gen.cs index 2ad4f001ba..1b850db80f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAccelerationStructureInfoNV")] - public unsafe partial struct AccelerationStructureInfoNV + public unsafe partial struct AccelerationStructureInfoNV : IStructuredType { public AccelerationStructureInfoNV ( @@ -101,5 +101,11 @@ public AccelerationStructureInfoNV [NativeName("Type.Name", "VkGeometryNV")] [NativeName("Name", "pGeometries")] public GeometryNV* PGeometries; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.AccelerationStructureInfoNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureMemoryRequirementsInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureMemoryRequirementsInfoNV.gen.cs index 3b597c4d5f..7cced3d302 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureMemoryRequirementsInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureMemoryRequirementsInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAccelerationStructureMemoryRequirementsInfoNV")] - public unsafe partial struct AccelerationStructureMemoryRequirementsInfoNV + public unsafe partial struct AccelerationStructureMemoryRequirementsInfoNV : IStructuredType { public AccelerationStructureMemoryRequirementsInfoNV ( @@ -68,5 +68,11 @@ public AccelerationStructureMemoryRequirementsInfoNV [NativeName("Type.Name", "VkAccelerationStructureNV")] [NativeName("Name", "accelerationStructure")] public AccelerationStructureNV AccelerationStructure; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.AccelerationStructureMemoryRequirementsInfoNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureMotionInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureMotionInfoNV.gen.cs index cea6cc8378..d5b6aa34ca 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureMotionInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureMotionInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAccelerationStructureMotionInfoNV")] - public unsafe partial struct AccelerationStructureMotionInfoNV + public unsafe partial struct AccelerationStructureMotionInfoNV : IStructuredType { public AccelerationStructureMotionInfoNV ( @@ -68,5 +68,11 @@ public AccelerationStructureMotionInfoNV [NativeName("Type.Name", "VkAccelerationStructureMotionInfoFlagsNV")] [NativeName("Name", "flags")] public uint Flags; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.AccelerationStructureMotionInfoNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureVersionInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureVersionInfoKHR.gen.cs index c8d44f0f9b..41c96a1368 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureVersionInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureVersionInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAccelerationStructureVersionInfoKHR")] - public unsafe partial struct AccelerationStructureVersionInfoKHR + public unsafe partial struct AccelerationStructureVersionInfoKHR : IStructuredType { public AccelerationStructureVersionInfoKHR ( @@ -57,5 +57,11 @@ public AccelerationStructureVersionInfoKHR [NativeName("Type.Name", "uint8_t")] [NativeName("Name", "pVersionData")] public byte* PVersionData; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.AccelerationStructureVersionInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AcquireNextImageInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AcquireNextImageInfoKHR.gen.cs index b34ad6b20b..df643d3f90 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AcquireNextImageInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AcquireNextImageInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAcquireNextImageInfoKHR")] - public unsafe partial struct AcquireNextImageInfoKHR + public unsafe partial struct AcquireNextImageInfoKHR : IStructuredType { public AcquireNextImageInfoKHR ( @@ -101,5 +101,11 @@ public AcquireNextImageInfoKHR [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "deviceMask")] public uint DeviceMask; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.AcquireNextImageInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AcquireProfilingLockInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AcquireProfilingLockInfoKHR.gen.cs index 87c7e03350..dccdfde16a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AcquireProfilingLockInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AcquireProfilingLockInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAcquireProfilingLockInfoKHR")] - public unsafe partial struct AcquireProfilingLockInfoKHR + public unsafe partial struct AcquireProfilingLockInfoKHR : IStructuredType { public AcquireProfilingLockInfoKHR ( @@ -68,5 +68,11 @@ public AcquireProfilingLockInfoKHR [NativeName("Type.Name", "uint64_t")] [NativeName("Name", "timeout")] public ulong Timeout; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.AcquireProfilingLockInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidHardwareBufferFormatProperties2ANDROID.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidHardwareBufferFormatProperties2ANDROID.gen.cs index 31ca7380b5..8d33250ac7 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidHardwareBufferFormatProperties2ANDROID.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidHardwareBufferFormatProperties2ANDROID.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAndroidHardwareBufferFormatProperties2ANDROID")] - public unsafe partial struct AndroidHardwareBufferFormatProperties2ANDROID + public unsafe partial struct AndroidHardwareBufferFormatProperties2ANDROID : IStructuredType { public AndroidHardwareBufferFormatProperties2ANDROID ( @@ -134,5 +134,11 @@ public AndroidHardwareBufferFormatProperties2ANDROID [NativeName("Type.Name", "VkChromaLocation")] [NativeName("Name", "suggestedYChromaOffset")] public ChromaLocation SuggestedYChromaOffset; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.AndroidHardwareBufferFormatProperties2Android; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidHardwareBufferFormatPropertiesANDROID.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidHardwareBufferFormatPropertiesANDROID.gen.cs index 9eb6649d87..3eb4e077d9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidHardwareBufferFormatPropertiesANDROID.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidHardwareBufferFormatPropertiesANDROID.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAndroidHardwareBufferFormatPropertiesANDROID")] - public unsafe partial struct AndroidHardwareBufferFormatPropertiesANDROID + public unsafe partial struct AndroidHardwareBufferFormatPropertiesANDROID : IStructuredType { public AndroidHardwareBufferFormatPropertiesANDROID ( @@ -134,5 +134,11 @@ public AndroidHardwareBufferFormatPropertiesANDROID [NativeName("Type.Name", "VkChromaLocation")] [NativeName("Name", "suggestedYChromaOffset")] public ChromaLocation SuggestedYChromaOffset; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.AndroidHardwareBufferFormatPropertiesAndroid; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidHardwareBufferPropertiesANDROID.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidHardwareBufferPropertiesANDROID.gen.cs index 3b1ba26afd..97ee72708d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidHardwareBufferPropertiesANDROID.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidHardwareBufferPropertiesANDROID.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAndroidHardwareBufferPropertiesANDROID")] - public unsafe partial struct AndroidHardwareBufferPropertiesANDROID + public unsafe partial struct AndroidHardwareBufferPropertiesANDROID : IStructuredType { public AndroidHardwareBufferPropertiesANDROID ( @@ -68,5 +68,11 @@ public AndroidHardwareBufferPropertiesANDROID [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "memoryTypeBits")] public uint MemoryTypeBits; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.AndroidHardwareBufferPropertiesAndroid; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidHardwareBufferUsageANDROID.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidHardwareBufferUsageANDROID.gen.cs index aba41e04b1..9ff1f87355 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidHardwareBufferUsageANDROID.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidHardwareBufferUsageANDROID.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAndroidHardwareBufferUsageANDROID")] - public unsafe partial struct AndroidHardwareBufferUsageANDROID + public unsafe partial struct AndroidHardwareBufferUsageANDROID : IStructuredType { public AndroidHardwareBufferUsageANDROID ( @@ -57,5 +57,11 @@ public AndroidHardwareBufferUsageANDROID [NativeName("Type.Name", "uint64_t")] [NativeName("Name", "androidHardwareBufferUsage")] public ulong AndroidHardwareBufferUsage; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.AndroidHardwareBufferUsageAndroid; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidSurfaceCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidSurfaceCreateInfoKHR.gen.cs index df24ec9705..1715ee95b6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidSurfaceCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidSurfaceCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAndroidSurfaceCreateInfoKHR")] - public unsafe partial struct AndroidSurfaceCreateInfoKHR + public unsafe partial struct AndroidSurfaceCreateInfoKHR : IStructuredType { public AndroidSurfaceCreateInfoKHR ( @@ -68,5 +68,11 @@ public AndroidSurfaceCreateInfoKHR [NativeName("Type.Name", "ANativeWindow")] [NativeName("Name", "window")] public nint* Window; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.AndroidSurfaceCreateInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ApplicationInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ApplicationInfo.gen.cs index 239cda566e..7d1a792f29 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ApplicationInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ApplicationInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkApplicationInfo")] - public unsafe partial struct ApplicationInfo + public unsafe partial struct ApplicationInfo : IStructuredType { public ApplicationInfo ( @@ -101,5 +101,11 @@ public ApplicationInfo [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "apiVersion")] public uint ApiVersion; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ApplicationInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescription2.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescription2.gen.cs index 6ea1723170..063910ebb6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescription2.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescription2.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAttachmentDescription2")] - public unsafe partial struct AttachmentDescription2 + public unsafe partial struct AttachmentDescription2 : IStructuredType { public AttachmentDescription2 ( @@ -145,5 +145,11 @@ public AttachmentDescription2 [NativeName("Type.Name", "VkImageLayout")] [NativeName("Name", "finalLayout")] public ImageLayout FinalLayout; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.AttachmentDescription2; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescription2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescription2KHR.gen.cs index a07f77a9e1..6cb0050d40 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescription2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescription2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAttachmentDescription2KHR")] - public unsafe partial struct AttachmentDescription2KHR + public unsafe partial struct AttachmentDescription2KHR : IStructuredType { public AttachmentDescription2KHR ( @@ -145,5 +145,11 @@ public AttachmentDescription2KHR [NativeName("Type.Name", "VkImageLayout")] [NativeName("Name", "finalLayout")] public ImageLayout FinalLayout; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.AttachmentDescription2; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescriptionStencilLayout.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescriptionStencilLayout.gen.cs index b0b93cff9f..b3e2871c7a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescriptionStencilLayout.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescriptionStencilLayout.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAttachmentDescriptionStencilLayout")] - public unsafe partial struct AttachmentDescriptionStencilLayout + public unsafe partial struct AttachmentDescriptionStencilLayout : IStructuredType { public AttachmentDescriptionStencilLayout ( @@ -68,5 +68,11 @@ public AttachmentDescriptionStencilLayout [NativeName("Type.Name", "VkImageLayout")] [NativeName("Name", "stencilFinalLayout")] public ImageLayout StencilFinalLayout; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.AttachmentDescriptionStencilLayout; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescriptionStencilLayoutKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescriptionStencilLayoutKHR.gen.cs index 70bf2e2c11..db39063d32 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescriptionStencilLayoutKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescriptionStencilLayoutKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAttachmentDescriptionStencilLayoutKHR")] - public unsafe partial struct AttachmentDescriptionStencilLayoutKHR + public unsafe partial struct AttachmentDescriptionStencilLayoutKHR : IStructuredType { public AttachmentDescriptionStencilLayoutKHR ( @@ -68,5 +68,11 @@ public AttachmentDescriptionStencilLayoutKHR [NativeName("Type.Name", "VkImageLayout")] [NativeName("Name", "stencilFinalLayout")] public ImageLayout StencilFinalLayout; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.AttachmentDescriptionStencilLayout; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReference2.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReference2.gen.cs index c2ef53327c..43ff853905 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReference2.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReference2.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAttachmentReference2")] - public unsafe partial struct AttachmentReference2 + public unsafe partial struct AttachmentReference2 : IStructuredType { public AttachmentReference2 ( @@ -79,5 +79,11 @@ public AttachmentReference2 [NativeName("Type.Name", "VkImageAspectFlags")] [NativeName("Name", "aspectMask")] public ImageAspectFlags AspectMask; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.AttachmentReference2; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReference2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReference2KHR.gen.cs index 3b6bffe7cd..dccdf86a1b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReference2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReference2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAttachmentReference2KHR")] - public unsafe partial struct AttachmentReference2KHR + public unsafe partial struct AttachmentReference2KHR : IStructuredType { public AttachmentReference2KHR ( @@ -79,5 +79,11 @@ public AttachmentReference2KHR [NativeName("Type.Name", "VkImageAspectFlags")] [NativeName("Name", "aspectMask")] public ImageAspectFlags AspectMask; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.AttachmentReference2; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReferenceStencilLayout.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReferenceStencilLayout.gen.cs index 81f1952c68..a5ed805ee2 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReferenceStencilLayout.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReferenceStencilLayout.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAttachmentReferenceStencilLayout")] - public unsafe partial struct AttachmentReferenceStencilLayout + public unsafe partial struct AttachmentReferenceStencilLayout : IStructuredType { public AttachmentReferenceStencilLayout ( @@ -57,5 +57,11 @@ public AttachmentReferenceStencilLayout [NativeName("Type.Name", "VkImageLayout")] [NativeName("Name", "stencilLayout")] public ImageLayout StencilLayout; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.AttachmentReferenceStencilLayout; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReferenceStencilLayoutKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReferenceStencilLayoutKHR.gen.cs index 903f6b72ec..da45d23170 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReferenceStencilLayoutKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReferenceStencilLayoutKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAttachmentReferenceStencilLayoutKHR")] - public unsafe partial struct AttachmentReferenceStencilLayoutKHR + public unsafe partial struct AttachmentReferenceStencilLayoutKHR : IStructuredType { public AttachmentReferenceStencilLayoutKHR ( @@ -57,5 +57,11 @@ public AttachmentReferenceStencilLayoutKHR [NativeName("Type.Name", "VkImageLayout")] [NativeName("Name", "stencilLayout")] public ImageLayout StencilLayout; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.AttachmentReferenceStencilLayout; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentSampleCountInfoAMD.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentSampleCountInfoAMD.gen.cs index 8d83eda8f7..462f2005dd 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentSampleCountInfoAMD.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentSampleCountInfoAMD.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAttachmentSampleCountInfoAMD")] - public unsafe partial struct AttachmentSampleCountInfoAMD + public unsafe partial struct AttachmentSampleCountInfoAMD : IStructuredType { public AttachmentSampleCountInfoAMD ( @@ -79,5 +79,11 @@ public AttachmentSampleCountInfoAMD [NativeName("Type.Name", "VkSampleCountFlagBits")] [NativeName("Name", "depthStencilAttachmentSamples")] public SampleCountFlags DepthStencilAttachmentSamples; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.AttachmentSampleCountInfoAmd; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentSampleCountInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentSampleCountInfoNV.gen.cs index b39f193fe5..7cf8049dc7 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentSampleCountInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentSampleCountInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAttachmentSampleCountInfoNV")] - public unsafe partial struct AttachmentSampleCountInfoNV + public unsafe partial struct AttachmentSampleCountInfoNV : IStructuredType { public AttachmentSampleCountInfoNV ( @@ -79,5 +79,11 @@ public AttachmentSampleCountInfoNV [NativeName("Type.Name", "VkSampleCountFlagBits")] [NativeName("Name", "depthStencilAttachmentSamples")] public SampleCountFlags DepthStencilAttachmentSamples; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.AttachmentSampleCountInfoAmd; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BaseInStructure.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BaseInStructure.gen.cs index 3081af1381..3ee5fe7e18 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BaseInStructure.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BaseInStructure.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBaseInStructure")] - public unsafe partial struct BaseInStructure + public unsafe partial struct BaseInStructure : IStructuredType { public BaseInStructure ( @@ -46,5 +46,12 @@ public BaseInStructure [NativeName("Type.Name", "VkBaseInStructure")] [NativeName("Name", "pNext")] public BaseInStructure* PNext; + + /// + /// Note, there is no fixed value for this type. + StructureType IStructuredType.StructureType() + { + return SType; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BaseOutStructure.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BaseOutStructure.gen.cs index 1280c81c6c..3606a04f3e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BaseOutStructure.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BaseOutStructure.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBaseOutStructure")] - public unsafe partial struct BaseOutStructure + public unsafe partial struct BaseOutStructure : IStructuredType { public BaseOutStructure ( @@ -46,5 +46,12 @@ public BaseOutStructure [NativeName("Type.Name", "VkBaseOutStructure")] [NativeName("Name", "pNext")] public BaseOutStructure* PNext; + + /// + /// Note, there is no fixed value for this type. + StructureType IStructuredType.StructureType() + { + return SType; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BindAccelerationStructureMemoryInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BindAccelerationStructureMemoryInfoNV.gen.cs index dbf7bff946..d90126fd7e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BindAccelerationStructureMemoryInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BindAccelerationStructureMemoryInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBindAccelerationStructureMemoryInfoNV")] - public unsafe partial struct BindAccelerationStructureMemoryInfoNV + public unsafe partial struct BindAccelerationStructureMemoryInfoNV : IStructuredType { public BindAccelerationStructureMemoryInfoNV ( @@ -101,5 +101,11 @@ public BindAccelerationStructureMemoryInfoNV [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "pDeviceIndices")] public uint* PDeviceIndices; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.BindAccelerationStructureMemoryInfoNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryDeviceGroupInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryDeviceGroupInfo.gen.cs index 92bd72aa56..d3238749a2 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryDeviceGroupInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryDeviceGroupInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBindBufferMemoryDeviceGroupInfo")] - public unsafe partial struct BindBufferMemoryDeviceGroupInfo + public unsafe partial struct BindBufferMemoryDeviceGroupInfo : IStructuredType { public BindBufferMemoryDeviceGroupInfo ( @@ -68,5 +68,11 @@ public BindBufferMemoryDeviceGroupInfo [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "pDeviceIndices")] public uint* PDeviceIndices; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.BindBufferMemoryDeviceGroupInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryDeviceGroupInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryDeviceGroupInfoKHR.gen.cs index 50d996847a..41e7116608 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryDeviceGroupInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryDeviceGroupInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBindBufferMemoryDeviceGroupInfoKHR")] - public unsafe partial struct BindBufferMemoryDeviceGroupInfoKHR + public unsafe partial struct BindBufferMemoryDeviceGroupInfoKHR : IStructuredType { public BindBufferMemoryDeviceGroupInfoKHR ( @@ -68,5 +68,11 @@ public BindBufferMemoryDeviceGroupInfoKHR [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "pDeviceIndices")] public uint* PDeviceIndices; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.BindBufferMemoryDeviceGroupInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryInfo.gen.cs index f495a0b5e3..310bdf0494 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBindBufferMemoryInfo")] - public unsafe partial struct BindBufferMemoryInfo + public unsafe partial struct BindBufferMemoryInfo : IStructuredType { public BindBufferMemoryInfo ( @@ -79,5 +79,11 @@ public BindBufferMemoryInfo [NativeName("Type.Name", "VkDeviceSize")] [NativeName("Name", "memoryOffset")] public ulong MemoryOffset; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.BindBufferMemoryInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryInfoKHR.gen.cs index 3b2d32aaf7..16a96e1bfe 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBindBufferMemoryInfoKHR")] - public unsafe partial struct BindBufferMemoryInfoKHR + public unsafe partial struct BindBufferMemoryInfoKHR : IStructuredType { public BindBufferMemoryInfoKHR ( @@ -79,5 +79,11 @@ public BindBufferMemoryInfoKHR [NativeName("Type.Name", "VkDeviceSize")] [NativeName("Name", "memoryOffset")] public ulong MemoryOffset; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.BindBufferMemoryInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryDeviceGroupInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryDeviceGroupInfo.gen.cs index 050b4df12e..8f5ed82ddb 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryDeviceGroupInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryDeviceGroupInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBindImageMemoryDeviceGroupInfo")] - public unsafe partial struct BindImageMemoryDeviceGroupInfo + public unsafe partial struct BindImageMemoryDeviceGroupInfo : IStructuredType { public BindImageMemoryDeviceGroupInfo ( @@ -90,5 +90,11 @@ public BindImageMemoryDeviceGroupInfo [NativeName("Type.Name", "VkRect2D")] [NativeName("Name", "pSplitInstanceBindRegions")] public Rect2D* PSplitInstanceBindRegions; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.BindImageMemoryDeviceGroupInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryDeviceGroupInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryDeviceGroupInfoKHR.gen.cs index 60c8f7f09c..28602e2cab 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryDeviceGroupInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryDeviceGroupInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBindImageMemoryDeviceGroupInfoKHR")] - public unsafe partial struct BindImageMemoryDeviceGroupInfoKHR + public unsafe partial struct BindImageMemoryDeviceGroupInfoKHR : IStructuredType { public BindImageMemoryDeviceGroupInfoKHR ( @@ -90,5 +90,11 @@ public BindImageMemoryDeviceGroupInfoKHR [NativeName("Type.Name", "VkRect2D")] [NativeName("Name", "pSplitInstanceBindRegions")] public Rect2D* PSplitInstanceBindRegions; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.BindImageMemoryDeviceGroupInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryInfo.gen.cs index 16ffbab1e8..c4e5d4317c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBindImageMemoryInfo")] - public unsafe partial struct BindImageMemoryInfo + public unsafe partial struct BindImageMemoryInfo : IStructuredType { public BindImageMemoryInfo ( @@ -79,5 +79,11 @@ public BindImageMemoryInfo [NativeName("Type.Name", "VkDeviceSize")] [NativeName("Name", "memoryOffset")] public ulong MemoryOffset; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.BindImageMemoryInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryInfoKHR.gen.cs index 717f544584..f7fc97577b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBindImageMemoryInfoKHR")] - public unsafe partial struct BindImageMemoryInfoKHR + public unsafe partial struct BindImageMemoryInfoKHR : IStructuredType { public BindImageMemoryInfoKHR ( @@ -79,5 +79,11 @@ public BindImageMemoryInfoKHR [NativeName("Type.Name", "VkDeviceSize")] [NativeName("Name", "memoryOffset")] public ulong MemoryOffset; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.BindImageMemoryInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemorySwapchainInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemorySwapchainInfoKHR.gen.cs index 7177548469..8b9b277708 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemorySwapchainInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemorySwapchainInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBindImageMemorySwapchainInfoKHR")] - public unsafe partial struct BindImageMemorySwapchainInfoKHR + public unsafe partial struct BindImageMemorySwapchainInfoKHR : IStructuredType { public BindImageMemorySwapchainInfoKHR ( @@ -68,5 +68,11 @@ public BindImageMemorySwapchainInfoKHR [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "imageIndex")] public uint ImageIndex; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.BindImageMemorySwapchainInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BindImagePlaneMemoryInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BindImagePlaneMemoryInfo.gen.cs index 8a49eb4d3e..08821b21ac 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BindImagePlaneMemoryInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BindImagePlaneMemoryInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBindImagePlaneMemoryInfo")] - public unsafe partial struct BindImagePlaneMemoryInfo + public unsafe partial struct BindImagePlaneMemoryInfo : IStructuredType { public BindImagePlaneMemoryInfo ( @@ -57,5 +57,11 @@ public BindImagePlaneMemoryInfo [NativeName("Type.Name", "VkImageAspectFlagBits")] [NativeName("Name", "planeAspect")] public ImageAspectFlags PlaneAspect; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.BindImagePlaneMemoryInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BindImagePlaneMemoryInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BindImagePlaneMemoryInfoKHR.gen.cs index 22a7f29c0e..7421eb72c5 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BindImagePlaneMemoryInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BindImagePlaneMemoryInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBindImagePlaneMemoryInfoKHR")] - public unsafe partial struct BindImagePlaneMemoryInfoKHR + public unsafe partial struct BindImagePlaneMemoryInfoKHR : IStructuredType { public BindImagePlaneMemoryInfoKHR ( @@ -57,5 +57,11 @@ public BindImagePlaneMemoryInfoKHR [NativeName("Type.Name", "VkImageAspectFlagBits")] [NativeName("Name", "planeAspect")] public ImageAspectFlags PlaneAspect; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.BindImagePlaneMemoryInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BindSparseInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BindSparseInfo.gen.cs index 96182b369e..66596a1e78 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BindSparseInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BindSparseInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBindSparseInfo")] - public unsafe partial struct BindSparseInfo + public unsafe partial struct BindSparseInfo : IStructuredType { public BindSparseInfo ( @@ -156,5 +156,11 @@ public BindSparseInfo [NativeName("Type.Name", "VkSemaphore")] [NativeName("Name", "pSignalSemaphores")] public Semaphore* PSignalSemaphores; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.BindSparseInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BlitImageInfo2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BlitImageInfo2KHR.gen.cs index 58693d0f62..e28272ffb3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BlitImageInfo2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BlitImageInfo2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBlitImageInfo2KHR")] - public unsafe partial struct BlitImageInfo2KHR + public unsafe partial struct BlitImageInfo2KHR : IStructuredType { public BlitImageInfo2KHR ( @@ -123,5 +123,11 @@ public BlitImageInfo2KHR [NativeName("Type.Name", "VkFilter")] [NativeName("Name", "filter")] public Filter Filter; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.BlitImageInfo2Khr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCollectionBufferCreateInfoFUCHSIA.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCollectionBufferCreateInfoFUCHSIA.gen.cs index a471940476..6111ac03a3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCollectionBufferCreateInfoFUCHSIA.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCollectionBufferCreateInfoFUCHSIA.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferCollectionBufferCreateInfoFUCHSIA")] - public unsafe partial struct BufferCollectionBufferCreateInfoFUCHSIA + public unsafe partial struct BufferCollectionBufferCreateInfoFUCHSIA : IStructuredType { public BufferCollectionBufferCreateInfoFUCHSIA ( @@ -68,5 +68,11 @@ public BufferCollectionBufferCreateInfoFUCHSIA [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "index")] public uint Index; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.BufferCollectionBufferCreateInfoFuchsia; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCollectionConstraintsInfoFUCHSIA.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCollectionConstraintsInfoFUCHSIA.gen.cs index 3548b1b20d..c1a9ff1655 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCollectionConstraintsInfoFUCHSIA.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCollectionConstraintsInfoFUCHSIA.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferCollectionConstraintsInfoFUCHSIA")] - public unsafe partial struct BufferCollectionConstraintsInfoFUCHSIA + public unsafe partial struct BufferCollectionConstraintsInfoFUCHSIA : IStructuredType { public BufferCollectionConstraintsInfoFUCHSIA ( @@ -101,5 +101,11 @@ public BufferCollectionConstraintsInfoFUCHSIA [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "minBufferCountForSharedSlack")] public uint MinBufferCountForSharedSlack; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.BufferCollectionConstraintsInfoFuchsia; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCollectionCreateInfoFUCHSIA.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCollectionCreateInfoFUCHSIA.gen.cs index e6b133d299..1fe7b01676 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCollectionCreateInfoFUCHSIA.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCollectionCreateInfoFUCHSIA.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferCollectionCreateInfoFUCHSIA")] - public unsafe partial struct BufferCollectionCreateInfoFUCHSIA + public unsafe partial struct BufferCollectionCreateInfoFUCHSIA : IStructuredType { public BufferCollectionCreateInfoFUCHSIA ( @@ -57,5 +57,11 @@ public BufferCollectionCreateInfoFUCHSIA [NativeName("Type.Name", "zx_handle_t")] [NativeName("Name", "collectionToken")] public nint CollectionToken; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.BufferCollectionCreateInfoFuchsia; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCollectionImageCreateInfoFUCHSIA.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCollectionImageCreateInfoFUCHSIA.gen.cs index bb0662871c..76355da39c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCollectionImageCreateInfoFUCHSIA.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCollectionImageCreateInfoFUCHSIA.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferCollectionImageCreateInfoFUCHSIA")] - public unsafe partial struct BufferCollectionImageCreateInfoFUCHSIA + public unsafe partial struct BufferCollectionImageCreateInfoFUCHSIA : IStructuredType { public BufferCollectionImageCreateInfoFUCHSIA ( @@ -68,5 +68,11 @@ public BufferCollectionImageCreateInfoFUCHSIA [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "index")] public uint Index; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.BufferCollectionImageCreateInfoFuchsia; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCollectionPropertiesFUCHSIA.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCollectionPropertiesFUCHSIA.gen.cs index 39f694dce6..49d7b0f13d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCollectionPropertiesFUCHSIA.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCollectionPropertiesFUCHSIA.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferCollectionPropertiesFUCHSIA")] - public unsafe partial struct BufferCollectionPropertiesFUCHSIA + public unsafe partial struct BufferCollectionPropertiesFUCHSIA : IStructuredType { public BufferCollectionPropertiesFUCHSIA ( @@ -167,5 +167,11 @@ public BufferCollectionPropertiesFUCHSIA [NativeName("Type.Name", "VkChromaLocation")] [NativeName("Name", "suggestedYChromaOffset")] public ChromaLocation SuggestedYChromaOffset; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.BufferCollectionPropertiesFuchsia; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferConstraintsInfoFUCHSIA.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferConstraintsInfoFUCHSIA.gen.cs index 45b53c3441..875f604350 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferConstraintsInfoFUCHSIA.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferConstraintsInfoFUCHSIA.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferConstraintsInfoFUCHSIA")] - public unsafe partial struct BufferConstraintsInfoFUCHSIA + public unsafe partial struct BufferConstraintsInfoFUCHSIA : IStructuredType { public BufferConstraintsInfoFUCHSIA ( @@ -79,5 +79,11 @@ public BufferConstraintsInfoFUCHSIA [NativeName("Type.Name", "VkBufferCollectionConstraintsInfoFUCHSIA")] [NativeName("Name", "bufferCollectionConstraints")] public BufferCollectionConstraintsInfoFUCHSIA BufferCollectionConstraints; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.BufferConstraintsInfoFuchsia; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCopy2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCopy2KHR.gen.cs index 7f9d443110..7a1bb6a2fd 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCopy2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCopy2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferCopy2KHR")] - public unsafe partial struct BufferCopy2KHR + public unsafe partial struct BufferCopy2KHR : IStructuredType { public BufferCopy2KHR ( @@ -79,5 +79,11 @@ public BufferCopy2KHR [NativeName("Type.Name", "VkDeviceSize")] [NativeName("Name", "size")] public ulong Size; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.BufferCopy2Khr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCreateInfo.gen.cs index b47963e280..620bffeb7d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferCreateInfo")] - public unsafe partial struct BufferCreateInfo + public unsafe partial struct BufferCreateInfo : IStructuredType { public BufferCreateInfo ( @@ -112,5 +112,11 @@ public BufferCreateInfo [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "pQueueFamilyIndices")] public uint* PQueueFamilyIndices; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.BufferCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferDeviceAddressCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferDeviceAddressCreateInfoEXT.gen.cs index 74e8486479..0241cfce00 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferDeviceAddressCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferDeviceAddressCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferDeviceAddressCreateInfoEXT")] - public unsafe partial struct BufferDeviceAddressCreateInfoEXT + public unsafe partial struct BufferDeviceAddressCreateInfoEXT : IStructuredType { public BufferDeviceAddressCreateInfoEXT ( @@ -57,5 +57,11 @@ public BufferDeviceAddressCreateInfoEXT [NativeName("Type.Name", "VkDeviceAddress")] [NativeName("Name", "deviceAddress")] public ulong DeviceAddress; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.BufferDeviceAddressCreateInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferDeviceAddressInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferDeviceAddressInfo.gen.cs index 30d8c1dd29..1aa3733b03 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferDeviceAddressInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferDeviceAddressInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferDeviceAddressInfo")] - public unsafe partial struct BufferDeviceAddressInfo + public unsafe partial struct BufferDeviceAddressInfo : IStructuredType { public BufferDeviceAddressInfo ( @@ -57,5 +57,11 @@ public BufferDeviceAddressInfo [NativeName("Type.Name", "VkBuffer")] [NativeName("Name", "buffer")] public Buffer Buffer; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.BufferDeviceAddressInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferDeviceAddressInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferDeviceAddressInfoEXT.gen.cs index 4d45c89428..28b009e642 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferDeviceAddressInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferDeviceAddressInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferDeviceAddressInfoEXT")] - public unsafe partial struct BufferDeviceAddressInfoEXT + public unsafe partial struct BufferDeviceAddressInfoEXT : IStructuredType { public BufferDeviceAddressInfoEXT ( @@ -57,5 +57,11 @@ public BufferDeviceAddressInfoEXT [NativeName("Type.Name", "VkBuffer")] [NativeName("Name", "buffer")] public Buffer Buffer; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.BufferDeviceAddressInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferDeviceAddressInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferDeviceAddressInfoKHR.gen.cs index f0b2bb0446..ce1d3b841d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferDeviceAddressInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferDeviceAddressInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferDeviceAddressInfoKHR")] - public unsafe partial struct BufferDeviceAddressInfoKHR + public unsafe partial struct BufferDeviceAddressInfoKHR : IStructuredType { public BufferDeviceAddressInfoKHR ( @@ -57,5 +57,11 @@ public BufferDeviceAddressInfoKHR [NativeName("Type.Name", "VkBuffer")] [NativeName("Name", "buffer")] public Buffer Buffer; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.BufferDeviceAddressInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferImageCopy2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferImageCopy2KHR.gen.cs index 748c5cd857..ecaf4b3ba7 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferImageCopy2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferImageCopy2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferImageCopy2KHR")] - public unsafe partial struct BufferImageCopy2KHR + public unsafe partial struct BufferImageCopy2KHR : IStructuredType { public BufferImageCopy2KHR ( @@ -112,5 +112,11 @@ public BufferImageCopy2KHR [NativeName("Type.Name", "VkExtent3D")] [NativeName("Name", "imageExtent")] public Extent3D ImageExtent; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.BufferImageCopy2Khr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferMemoryBarrier.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferMemoryBarrier.gen.cs index 1f35d5b86a..455f04d295 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferMemoryBarrier.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferMemoryBarrier.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferMemoryBarrier")] - public unsafe partial struct BufferMemoryBarrier + public unsafe partial struct BufferMemoryBarrier : IStructuredType { public BufferMemoryBarrier ( @@ -123,5 +123,11 @@ public BufferMemoryBarrier [NativeName("Type.Name", "VkDeviceSize")] [NativeName("Name", "size")] public ulong Size; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.BufferMemoryBarrier; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferMemoryBarrier2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferMemoryBarrier2KHR.gen.cs index 14a46390d8..8684363192 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferMemoryBarrier2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferMemoryBarrier2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferMemoryBarrier2KHR")] - public unsafe partial struct BufferMemoryBarrier2KHR + public unsafe partial struct BufferMemoryBarrier2KHR : IStructuredType { public BufferMemoryBarrier2KHR ( @@ -145,5 +145,11 @@ public BufferMemoryBarrier2KHR [NativeName("Type.Name", "VkDeviceSize")] [NativeName("Name", "size")] public ulong Size; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.BufferMemoryBarrier2Khr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferMemoryRequirementsInfo2.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferMemoryRequirementsInfo2.gen.cs index f9d70a6876..5b1e416492 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferMemoryRequirementsInfo2.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferMemoryRequirementsInfo2.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferMemoryRequirementsInfo2")] - public unsafe partial struct BufferMemoryRequirementsInfo2 + public unsafe partial struct BufferMemoryRequirementsInfo2 : IStructuredType { public BufferMemoryRequirementsInfo2 ( @@ -57,5 +57,11 @@ public BufferMemoryRequirementsInfo2 [NativeName("Type.Name", "VkBuffer")] [NativeName("Name", "buffer")] public Buffer Buffer; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.BufferMemoryRequirementsInfo2; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferMemoryRequirementsInfo2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferMemoryRequirementsInfo2KHR.gen.cs index aa20d10541..98fb577b17 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferMemoryRequirementsInfo2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferMemoryRequirementsInfo2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferMemoryRequirementsInfo2KHR")] - public unsafe partial struct BufferMemoryRequirementsInfo2KHR + public unsafe partial struct BufferMemoryRequirementsInfo2KHR : IStructuredType { public BufferMemoryRequirementsInfo2KHR ( @@ -57,5 +57,11 @@ public BufferMemoryRequirementsInfo2KHR [NativeName("Type.Name", "VkBuffer")] [NativeName("Name", "buffer")] public Buffer Buffer; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.BufferMemoryRequirementsInfo2; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferOpaqueCaptureAddressCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferOpaqueCaptureAddressCreateInfo.gen.cs index ee44d8b400..e382cf7352 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferOpaqueCaptureAddressCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferOpaqueCaptureAddressCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferOpaqueCaptureAddressCreateInfo")] - public unsafe partial struct BufferOpaqueCaptureAddressCreateInfo + public unsafe partial struct BufferOpaqueCaptureAddressCreateInfo : IStructuredType { public BufferOpaqueCaptureAddressCreateInfo ( @@ -57,5 +57,11 @@ public BufferOpaqueCaptureAddressCreateInfo [NativeName("Type.Name", "uint64_t")] [NativeName("Name", "opaqueCaptureAddress")] public ulong OpaqueCaptureAddress; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.BufferOpaqueCaptureAddressCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferOpaqueCaptureAddressCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferOpaqueCaptureAddressCreateInfoKHR.gen.cs index 1c90079609..44d075233f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferOpaqueCaptureAddressCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferOpaqueCaptureAddressCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferOpaqueCaptureAddressCreateInfoKHR")] - public unsafe partial struct BufferOpaqueCaptureAddressCreateInfoKHR + public unsafe partial struct BufferOpaqueCaptureAddressCreateInfoKHR : IStructuredType { public BufferOpaqueCaptureAddressCreateInfoKHR ( @@ -57,5 +57,11 @@ public BufferOpaqueCaptureAddressCreateInfoKHR [NativeName("Type.Name", "uint64_t")] [NativeName("Name", "opaqueCaptureAddress")] public ulong OpaqueCaptureAddress; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.BufferOpaqueCaptureAddressCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferViewCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferViewCreateInfo.gen.cs index 6ca904b2fb..fbf8022c7b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferViewCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferViewCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferViewCreateInfo")] - public unsafe partial struct BufferViewCreateInfo + public unsafe partial struct BufferViewCreateInfo : IStructuredType { public BufferViewCreateInfo ( @@ -101,5 +101,11 @@ public BufferViewCreateInfo [NativeName("Type.Name", "VkDeviceSize")] [NativeName("Name", "range")] public ulong Range; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.BufferViewCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CalibratedTimestampInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CalibratedTimestampInfoEXT.gen.cs index 766a08d04c..e2c9cace4c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CalibratedTimestampInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CalibratedTimestampInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCalibratedTimestampInfoEXT")] - public unsafe partial struct CalibratedTimestampInfoEXT + public unsafe partial struct CalibratedTimestampInfoEXT : IStructuredType { public CalibratedTimestampInfoEXT ( @@ -57,5 +57,11 @@ public CalibratedTimestampInfoEXT [NativeName("Type.Name", "VkTimeDomainEXT")] [NativeName("Name", "timeDomain")] public TimeDomainEXT TimeDomain; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.CalibratedTimestampInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CheckpointData2NV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CheckpointData2NV.gen.cs index a4341792c5..c64d8d448f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CheckpointData2NV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CheckpointData2NV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCheckpointData2NV")] - public unsafe partial struct CheckpointData2NV + public unsafe partial struct CheckpointData2NV : IStructuredType { public CheckpointData2NV ( @@ -68,5 +68,11 @@ public CheckpointData2NV [NativeName("Type.Name", "void")] [NativeName("Name", "pCheckpointMarker")] public void* PCheckpointMarker; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.CheckpointData2NV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CheckpointDataNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CheckpointDataNV.gen.cs index fcedd9d29e..041210ebed 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CheckpointDataNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CheckpointDataNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCheckpointDataNV")] - public unsafe partial struct CheckpointDataNV + public unsafe partial struct CheckpointDataNV : IStructuredType { public CheckpointDataNV ( @@ -68,5 +68,11 @@ public CheckpointDataNV [NativeName("Type.Name", "void")] [NativeName("Name", "pCheckpointMarker")] public void* PCheckpointMarker; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.CheckpointDataNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferAllocateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferAllocateInfo.gen.cs index 8b6aedc1e3..ef4b0ded37 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferAllocateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferAllocateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCommandBufferAllocateInfo")] - public unsafe partial struct CommandBufferAllocateInfo + public unsafe partial struct CommandBufferAllocateInfo : IStructuredType { public CommandBufferAllocateInfo ( @@ -79,5 +79,11 @@ public CommandBufferAllocateInfo [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "commandBufferCount")] public uint CommandBufferCount; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.CommandBufferAllocateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferBeginInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferBeginInfo.gen.cs index 42ba975c6f..0b2472c22a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferBeginInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferBeginInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCommandBufferBeginInfo")] - public unsafe partial struct CommandBufferBeginInfo + public unsafe partial struct CommandBufferBeginInfo : IStructuredType { public CommandBufferBeginInfo ( @@ -68,5 +68,11 @@ public CommandBufferBeginInfo [NativeName("Type.Name", "VkCommandBufferInheritanceInfo")] [NativeName("Name", "pInheritanceInfo")] public CommandBufferInheritanceInfo* PInheritanceInfo; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.CommandBufferBeginInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferInheritanceConditionalRenderingInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferInheritanceConditionalRenderingInfoEXT.gen.cs index 8b4da9d925..6c1d62b11c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferInheritanceConditionalRenderingInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferInheritanceConditionalRenderingInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCommandBufferInheritanceConditionalRenderingInfoEXT")] - public unsafe partial struct CommandBufferInheritanceConditionalRenderingInfoEXT + public unsafe partial struct CommandBufferInheritanceConditionalRenderingInfoEXT : IStructuredType { public CommandBufferInheritanceConditionalRenderingInfoEXT ( @@ -57,5 +57,11 @@ public CommandBufferInheritanceConditionalRenderingInfoEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "conditionalRenderingEnable")] public Bool32 ConditionalRenderingEnable; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.CommandBufferInheritanceConditionalRenderingInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferInheritanceInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferInheritanceInfo.gen.cs index 683489a159..1be5678943 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferInheritanceInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferInheritanceInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCommandBufferInheritanceInfo")] - public unsafe partial struct CommandBufferInheritanceInfo + public unsafe partial struct CommandBufferInheritanceInfo : IStructuredType { public CommandBufferInheritanceInfo ( @@ -112,5 +112,11 @@ public CommandBufferInheritanceInfo [NativeName("Type.Name", "VkQueryPipelineStatisticFlags")] [NativeName("Name", "pipelineStatistics")] public QueryPipelineStatisticFlags PipelineStatistics; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.CommandBufferInheritanceInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferInheritanceRenderPassTransformInfoQCOM.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferInheritanceRenderPassTransformInfoQCOM.gen.cs index 38403fc2a6..249d1e4877 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferInheritanceRenderPassTransformInfoQCOM.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferInheritanceRenderPassTransformInfoQCOM.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCommandBufferInheritanceRenderPassTransformInfoQCOM")] - public unsafe partial struct CommandBufferInheritanceRenderPassTransformInfoQCOM + public unsafe partial struct CommandBufferInheritanceRenderPassTransformInfoQCOM : IStructuredType { public CommandBufferInheritanceRenderPassTransformInfoQCOM ( @@ -68,5 +68,11 @@ public CommandBufferInheritanceRenderPassTransformInfoQCOM [NativeName("Type.Name", "VkRect2D")] [NativeName("Name", "renderArea")] public Rect2D RenderArea; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.CommandBufferInheritanceRenderPassTransformInfoQCom; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferInheritanceRenderingInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferInheritanceRenderingInfoKHR.gen.cs index e7ded3878e..8b512d7156 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferInheritanceRenderingInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferInheritanceRenderingInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCommandBufferInheritanceRenderingInfoKHR")] - public unsafe partial struct CommandBufferInheritanceRenderingInfoKHR + public unsafe partial struct CommandBufferInheritanceRenderingInfoKHR : IStructuredType { public CommandBufferInheritanceRenderingInfoKHR ( @@ -123,5 +123,11 @@ public CommandBufferInheritanceRenderingInfoKHR [NativeName("Type.Name", "VkSampleCountFlagBits")] [NativeName("Name", "rasterizationSamples")] public SampleCountFlags RasterizationSamples; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.CommandBufferInheritanceRenderingInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferInheritanceViewportScissorInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferInheritanceViewportScissorInfoNV.gen.cs index 0682b2ab07..4909be1448 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferInheritanceViewportScissorInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferInheritanceViewportScissorInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCommandBufferInheritanceViewportScissorInfoNV")] - public unsafe partial struct CommandBufferInheritanceViewportScissorInfoNV + public unsafe partial struct CommandBufferInheritanceViewportScissorInfoNV : IStructuredType { public CommandBufferInheritanceViewportScissorInfoNV ( @@ -79,5 +79,11 @@ public CommandBufferInheritanceViewportScissorInfoNV [NativeName("Type.Name", "VkViewport")] [NativeName("Name", "pViewportDepths")] public Viewport* PViewportDepths; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.CommandBufferInheritanceViewportScissorInfoNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferSubmitInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferSubmitInfoKHR.gen.cs index fbc518f865..c49eedcf1c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferSubmitInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferSubmitInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCommandBufferSubmitInfoKHR")] - public unsafe partial struct CommandBufferSubmitInfoKHR + public unsafe partial struct CommandBufferSubmitInfoKHR : IStructuredType { public CommandBufferSubmitInfoKHR ( @@ -68,5 +68,11 @@ public CommandBufferSubmitInfoKHR [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "deviceMask")] public uint DeviceMask; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.CommandBufferSubmitInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CommandPoolCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CommandPoolCreateInfo.gen.cs index a4c690828b..06c39d6a34 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CommandPoolCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CommandPoolCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCommandPoolCreateInfo")] - public unsafe partial struct CommandPoolCreateInfo + public unsafe partial struct CommandPoolCreateInfo : IStructuredType { public CommandPoolCreateInfo ( @@ -68,5 +68,11 @@ public CommandPoolCreateInfo [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "queueFamilyIndex")] public uint QueueFamilyIndex; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.CommandPoolCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ComputePipelineCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ComputePipelineCreateInfo.gen.cs index abe21d16ca..2f753ea301 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ComputePipelineCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ComputePipelineCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkComputePipelineCreateInfo")] - public unsafe partial struct ComputePipelineCreateInfo + public unsafe partial struct ComputePipelineCreateInfo : IStructuredType { public ComputePipelineCreateInfo ( @@ -101,5 +101,11 @@ public ComputePipelineCreateInfo [NativeName("Type.Name", "int32_t")] [NativeName("Name", "basePipelineIndex")] public int BasePipelineIndex; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ComputePipelineCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ConditionalRenderingBeginInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ConditionalRenderingBeginInfoEXT.gen.cs index 32140f05b0..c7501e77b2 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ConditionalRenderingBeginInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ConditionalRenderingBeginInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkConditionalRenderingBeginInfoEXT")] - public unsafe partial struct ConditionalRenderingBeginInfoEXT + public unsafe partial struct ConditionalRenderingBeginInfoEXT : IStructuredType { public ConditionalRenderingBeginInfoEXT ( @@ -79,5 +79,11 @@ public ConditionalRenderingBeginInfoEXT [NativeName("Type.Name", "VkConditionalRenderingFlagsEXT")] [NativeName("Name", "flags")] public ConditionalRenderingFlagsEXT Flags; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ConditionalRenderingBeginInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CooperativeMatrixPropertiesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CooperativeMatrixPropertiesNV.gen.cs index a7cd5adbfe..2c6b289703 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CooperativeMatrixPropertiesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CooperativeMatrixPropertiesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCooperativeMatrixPropertiesNV")] - public unsafe partial struct CooperativeMatrixPropertiesNV + public unsafe partial struct CooperativeMatrixPropertiesNV : IStructuredType { public CooperativeMatrixPropertiesNV ( @@ -134,5 +134,11 @@ public CooperativeMatrixPropertiesNV [NativeName("Type.Name", "VkScopeNV")] [NativeName("Name", "scope")] public ScopeNV Scope; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.CooperativeMatrixPropertiesNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CopyAccelerationStructureInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CopyAccelerationStructureInfoKHR.gen.cs index 9bf4e42f4e..e45a7b368d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CopyAccelerationStructureInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CopyAccelerationStructureInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCopyAccelerationStructureInfoKHR")] - public unsafe partial struct CopyAccelerationStructureInfoKHR + public unsafe partial struct CopyAccelerationStructureInfoKHR : IStructuredType { public CopyAccelerationStructureInfoKHR ( @@ -79,5 +79,11 @@ public CopyAccelerationStructureInfoKHR [NativeName("Type.Name", "VkCopyAccelerationStructureModeKHR")] [NativeName("Name", "mode")] public CopyAccelerationStructureModeKHR Mode; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.CopyAccelerationStructureInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CopyAccelerationStructureToMemoryInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CopyAccelerationStructureToMemoryInfoKHR.gen.cs index 8dbae43af0..1fe1441ccd 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CopyAccelerationStructureToMemoryInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CopyAccelerationStructureToMemoryInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCopyAccelerationStructureToMemoryInfoKHR")] - public unsafe partial struct CopyAccelerationStructureToMemoryInfoKHR + public unsafe partial struct CopyAccelerationStructureToMemoryInfoKHR : IStructuredType { public CopyAccelerationStructureToMemoryInfoKHR ( @@ -79,5 +79,11 @@ public CopyAccelerationStructureToMemoryInfoKHR [NativeName("Type.Name", "VkCopyAccelerationStructureModeKHR")] [NativeName("Name", "mode")] public CopyAccelerationStructureModeKHR Mode; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.CopyAccelerationStructureToMemoryInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CopyBufferInfo2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CopyBufferInfo2KHR.gen.cs index 6250679329..9f8334fce9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CopyBufferInfo2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CopyBufferInfo2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCopyBufferInfo2KHR")] - public unsafe partial struct CopyBufferInfo2KHR + public unsafe partial struct CopyBufferInfo2KHR : IStructuredType { public CopyBufferInfo2KHR ( @@ -90,5 +90,11 @@ public CopyBufferInfo2KHR [NativeName("Type.Name", "VkBufferCopy2KHR")] [NativeName("Name", "pRegions")] public BufferCopy2KHR* PRegions; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.CopyBufferInfo2Khr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CopyBufferToImageInfo2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CopyBufferToImageInfo2KHR.gen.cs index cb5b82a858..68ed5b8223 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CopyBufferToImageInfo2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CopyBufferToImageInfo2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCopyBufferToImageInfo2KHR")] - public unsafe partial struct CopyBufferToImageInfo2KHR + public unsafe partial struct CopyBufferToImageInfo2KHR : IStructuredType { public CopyBufferToImageInfo2KHR ( @@ -101,5 +101,11 @@ public CopyBufferToImageInfo2KHR [NativeName("Type.Name", "VkBufferImageCopy2KHR")] [NativeName("Name", "pRegions")] public BufferImageCopy2KHR* PRegions; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.CopyBufferToImageInfo2Khr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CopyCommandTransformInfoQCOM.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CopyCommandTransformInfoQCOM.gen.cs index f6f7e3fcc7..541eb88f7c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CopyCommandTransformInfoQCOM.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CopyCommandTransformInfoQCOM.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCopyCommandTransformInfoQCOM")] - public unsafe partial struct CopyCommandTransformInfoQCOM + public unsafe partial struct CopyCommandTransformInfoQCOM : IStructuredType { public CopyCommandTransformInfoQCOM ( @@ -57,5 +57,11 @@ public CopyCommandTransformInfoQCOM [NativeName("Type.Name", "VkSurfaceTransformFlagBitsKHR")] [NativeName("Name", "transform")] public SurfaceTransformFlagsKHR Transform; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.CopyCommandTransformInfoQCom; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CopyDescriptorSet.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CopyDescriptorSet.gen.cs index 864a3d55fe..01a9e290fe 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CopyDescriptorSet.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CopyDescriptorSet.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCopyDescriptorSet")] - public unsafe partial struct CopyDescriptorSet + public unsafe partial struct CopyDescriptorSet : IStructuredType { public CopyDescriptorSet ( @@ -123,5 +123,11 @@ public CopyDescriptorSet [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "descriptorCount")] public uint DescriptorCount; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.CopyDescriptorSet; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CopyImageInfo2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CopyImageInfo2KHR.gen.cs index 81f492848f..094b0e4ecd 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CopyImageInfo2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CopyImageInfo2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCopyImageInfo2KHR")] - public unsafe partial struct CopyImageInfo2KHR + public unsafe partial struct CopyImageInfo2KHR : IStructuredType { public CopyImageInfo2KHR ( @@ -112,5 +112,11 @@ public CopyImageInfo2KHR [NativeName("Type.Name", "VkImageCopy2KHR")] [NativeName("Name", "pRegions")] public ImageCopy2KHR* PRegions; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.CopyImageInfo2Khr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CopyImageToBufferInfo2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CopyImageToBufferInfo2KHR.gen.cs index 82ef762892..3a6511756e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CopyImageToBufferInfo2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CopyImageToBufferInfo2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCopyImageToBufferInfo2KHR")] - public unsafe partial struct CopyImageToBufferInfo2KHR + public unsafe partial struct CopyImageToBufferInfo2KHR : IStructuredType { public CopyImageToBufferInfo2KHR ( @@ -101,5 +101,11 @@ public CopyImageToBufferInfo2KHR [NativeName("Type.Name", "VkBufferImageCopy2KHR")] [NativeName("Name", "pRegions")] public BufferImageCopy2KHR* PRegions; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.CopyImageToBufferInfo2Khr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CopyMemoryToAccelerationStructureInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CopyMemoryToAccelerationStructureInfoKHR.gen.cs index 0d585a5313..b10445fce3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CopyMemoryToAccelerationStructureInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CopyMemoryToAccelerationStructureInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCopyMemoryToAccelerationStructureInfoKHR")] - public unsafe partial struct CopyMemoryToAccelerationStructureInfoKHR + public unsafe partial struct CopyMemoryToAccelerationStructureInfoKHR : IStructuredType { public CopyMemoryToAccelerationStructureInfoKHR ( @@ -79,5 +79,11 @@ public CopyMemoryToAccelerationStructureInfoKHR [NativeName("Type.Name", "VkCopyAccelerationStructureModeKHR")] [NativeName("Name", "mode")] public CopyAccelerationStructureModeKHR Mode; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.CopyMemoryToAccelerationStructureInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CuFunctionCreateInfoNVX.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CuFunctionCreateInfoNVX.gen.cs index 8e56e46f55..37e7b142a3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CuFunctionCreateInfoNVX.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CuFunctionCreateInfoNVX.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCuFunctionCreateInfoNVX")] - public unsafe partial struct CuFunctionCreateInfoNVX + public unsafe partial struct CuFunctionCreateInfoNVX : IStructuredType { public CuFunctionCreateInfoNVX ( @@ -68,5 +68,11 @@ public CuFunctionCreateInfoNVX [NativeName("Type.Name", "char")] [NativeName("Name", "pName")] public byte* PName; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.CUFunctionCreateInfoNvx; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CuLaunchInfoNVX.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CuLaunchInfoNVX.gen.cs index c62828123e..674ba2bd0a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CuLaunchInfoNVX.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CuLaunchInfoNVX.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCuLaunchInfoNVX")] - public unsafe partial struct CuLaunchInfoNVX + public unsafe partial struct CuLaunchInfoNVX : IStructuredType { public CuLaunchInfoNVX ( @@ -178,5 +178,11 @@ public CuLaunchInfoNVX [NativeName("Type.Name", "void")] [NativeName("Name", "pExtras")] public void* PExtras; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.CULaunchInfoNvx; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CuModuleCreateInfoNVX.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CuModuleCreateInfoNVX.gen.cs index 8fced1ee39..7ae74cd36f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CuModuleCreateInfoNVX.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CuModuleCreateInfoNVX.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCuModuleCreateInfoNVX")] - public unsafe partial struct CuModuleCreateInfoNVX + public unsafe partial struct CuModuleCreateInfoNVX : IStructuredType { public CuModuleCreateInfoNVX ( @@ -68,5 +68,11 @@ public CuModuleCreateInfoNVX [NativeName("Type.Name", "void")] [NativeName("Name", "pData")] public void* PData; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.CUModuleCreateInfoNvx; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/D3D12FenceSubmitInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/D3D12FenceSubmitInfoKHR.gen.cs index 866e1edc91..4a63ceaf7d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/D3D12FenceSubmitInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/D3D12FenceSubmitInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkD3D12FenceSubmitInfoKHR")] - public unsafe partial struct D3D12FenceSubmitInfoKHR + public unsafe partial struct D3D12FenceSubmitInfoKHR : IStructuredType { public D3D12FenceSubmitInfoKHR ( @@ -90,5 +90,11 @@ public D3D12FenceSubmitInfoKHR [NativeName("Type.Name", "uint64_t")] [NativeName("Name", "pSignalSemaphoreValues")] public ulong* PSignalSemaphoreValues; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.D3D12FenceSubmitInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DebugMarkerMarkerInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DebugMarkerMarkerInfoEXT.gen.cs index 4cb107a54c..b1f7bd8ade 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DebugMarkerMarkerInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DebugMarkerMarkerInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDebugMarkerMarkerInfoEXT")] - public unsafe partial struct DebugMarkerMarkerInfoEXT + public unsafe partial struct DebugMarkerMarkerInfoEXT : IStructuredType { public DebugMarkerMarkerInfoEXT ( @@ -62,5 +62,11 @@ public DebugMarkerMarkerInfoEXT [NativeName("Type.Name", "float")] [NativeName("Name", "color")] public fixed float Color[4]; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DebugMarkerMarkerInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DebugMarkerObjectNameInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DebugMarkerObjectNameInfoEXT.gen.cs index 52c002d723..0e84eee9e3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DebugMarkerObjectNameInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DebugMarkerObjectNameInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDebugMarkerObjectNameInfoEXT")] - public unsafe partial struct DebugMarkerObjectNameInfoEXT + public unsafe partial struct DebugMarkerObjectNameInfoEXT : IStructuredType { public DebugMarkerObjectNameInfoEXT ( @@ -79,5 +79,11 @@ public DebugMarkerObjectNameInfoEXT [NativeName("Type.Name", "char")] [NativeName("Name", "pObjectName")] public byte* PObjectName; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DebugMarkerObjectNameInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DebugMarkerObjectTagInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DebugMarkerObjectTagInfoEXT.gen.cs index 081505dee9..e797c168cf 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DebugMarkerObjectTagInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DebugMarkerObjectTagInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDebugMarkerObjectTagInfoEXT")] - public unsafe partial struct DebugMarkerObjectTagInfoEXT + public unsafe partial struct DebugMarkerObjectTagInfoEXT : IStructuredType { public DebugMarkerObjectTagInfoEXT ( @@ -101,5 +101,11 @@ public DebugMarkerObjectTagInfoEXT [NativeName("Type.Name", "void")] [NativeName("Name", "pTag")] public void* PTag; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DebugMarkerObjectTagInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DebugReportCallbackCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DebugReportCallbackCreateInfoEXT.gen.cs index 04c99582b1..5111b48974 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DebugReportCallbackCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DebugReportCallbackCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDebugReportCallbackCreateInfoEXT")] - public unsafe partial struct DebugReportCallbackCreateInfoEXT + public unsafe partial struct DebugReportCallbackCreateInfoEXT : IStructuredType { public DebugReportCallbackCreateInfoEXT ( @@ -79,5 +79,11 @@ public DebugReportCallbackCreateInfoEXT [NativeName("Type.Name", "void")] [NativeName("Name", "pUserData")] public void* PUserData; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DebugReportCallbackCreateInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DebugUtilsLabelEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DebugUtilsLabelEXT.gen.cs index ebb4ad1328..2a8f4c608e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DebugUtilsLabelEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DebugUtilsLabelEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDebugUtilsLabelEXT")] - public unsafe partial struct DebugUtilsLabelEXT + public unsafe partial struct DebugUtilsLabelEXT : IStructuredType { public DebugUtilsLabelEXT ( @@ -62,5 +62,11 @@ public DebugUtilsLabelEXT [NativeName("Type.Name", "float")] [NativeName("Name", "color")] public fixed float Color[4]; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DebugUtilsLabelExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DebugUtilsMessengerCallbackDataEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DebugUtilsMessengerCallbackDataEXT.gen.cs index f4f5e0e756..c53840406b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DebugUtilsMessengerCallbackDataEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DebugUtilsMessengerCallbackDataEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDebugUtilsMessengerCallbackDataEXT")] - public unsafe partial struct DebugUtilsMessengerCallbackDataEXT + public unsafe partial struct DebugUtilsMessengerCallbackDataEXT : IStructuredType { public DebugUtilsMessengerCallbackDataEXT ( @@ -156,5 +156,11 @@ public DebugUtilsMessengerCallbackDataEXT [NativeName("Type.Name", "VkDebugUtilsObjectNameInfoEXT")] [NativeName("Name", "pObjects")] public DebugUtilsObjectNameInfoEXT* PObjects; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DebugUtilsMessengerCallbackDataExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DebugUtilsMessengerCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DebugUtilsMessengerCreateInfoEXT.gen.cs index 63c7244638..6d1cffdd1f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DebugUtilsMessengerCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DebugUtilsMessengerCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDebugUtilsMessengerCreateInfoEXT")] - public unsafe partial struct DebugUtilsMessengerCreateInfoEXT + public unsafe partial struct DebugUtilsMessengerCreateInfoEXT : IStructuredType { public DebugUtilsMessengerCreateInfoEXT ( @@ -101,5 +101,11 @@ public DebugUtilsMessengerCreateInfoEXT [NativeName("Type.Name", "void")] [NativeName("Name", "pUserData")] public void* PUserData; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DebugUtilsMessengerCreateInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DebugUtilsObjectNameInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DebugUtilsObjectNameInfoEXT.gen.cs index c0faf9595a..37da585358 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DebugUtilsObjectNameInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DebugUtilsObjectNameInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDebugUtilsObjectNameInfoEXT")] - public unsafe partial struct DebugUtilsObjectNameInfoEXT + public unsafe partial struct DebugUtilsObjectNameInfoEXT : IStructuredType { public DebugUtilsObjectNameInfoEXT ( @@ -79,5 +79,11 @@ public DebugUtilsObjectNameInfoEXT [NativeName("Type.Name", "char")] [NativeName("Name", "pObjectName")] public byte* PObjectName; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DebugUtilsObjectNameInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DebugUtilsObjectTagInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DebugUtilsObjectTagInfoEXT.gen.cs index 3144818f6f..a7653a1573 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DebugUtilsObjectTagInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DebugUtilsObjectTagInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDebugUtilsObjectTagInfoEXT")] - public unsafe partial struct DebugUtilsObjectTagInfoEXT + public unsafe partial struct DebugUtilsObjectTagInfoEXT : IStructuredType { public DebugUtilsObjectTagInfoEXT ( @@ -101,5 +101,11 @@ public DebugUtilsObjectTagInfoEXT [NativeName("Type.Name", "void")] [NativeName("Name", "pTag")] public void* PTag; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DebugUtilsObjectTagInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DedicatedAllocationBufferCreateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DedicatedAllocationBufferCreateInfoNV.gen.cs index b18583d711..9a521f4f0d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DedicatedAllocationBufferCreateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DedicatedAllocationBufferCreateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDedicatedAllocationBufferCreateInfoNV")] - public unsafe partial struct DedicatedAllocationBufferCreateInfoNV + public unsafe partial struct DedicatedAllocationBufferCreateInfoNV : IStructuredType { public DedicatedAllocationBufferCreateInfoNV ( @@ -57,5 +57,11 @@ public DedicatedAllocationBufferCreateInfoNV [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "dedicatedAllocation")] public Bool32 DedicatedAllocation; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DedicatedAllocationBufferCreateInfoNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DedicatedAllocationImageCreateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DedicatedAllocationImageCreateInfoNV.gen.cs index f3c70dd674..39f24998fd 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DedicatedAllocationImageCreateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DedicatedAllocationImageCreateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDedicatedAllocationImageCreateInfoNV")] - public unsafe partial struct DedicatedAllocationImageCreateInfoNV + public unsafe partial struct DedicatedAllocationImageCreateInfoNV : IStructuredType { public DedicatedAllocationImageCreateInfoNV ( @@ -57,5 +57,11 @@ public DedicatedAllocationImageCreateInfoNV [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "dedicatedAllocation")] public Bool32 DedicatedAllocation; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DedicatedAllocationImageCreateInfoNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DedicatedAllocationMemoryAllocateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DedicatedAllocationMemoryAllocateInfoNV.gen.cs index c5d2855dc7..edd889b7fe 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DedicatedAllocationMemoryAllocateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DedicatedAllocationMemoryAllocateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDedicatedAllocationMemoryAllocateInfoNV")] - public unsafe partial struct DedicatedAllocationMemoryAllocateInfoNV + public unsafe partial struct DedicatedAllocationMemoryAllocateInfoNV : IStructuredType { public DedicatedAllocationMemoryAllocateInfoNV ( @@ -68,5 +68,11 @@ public DedicatedAllocationMemoryAllocateInfoNV [NativeName("Type.Name", "VkBuffer")] [NativeName("Name", "buffer")] public Buffer Buffer; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DedicatedAllocationMemoryAllocateInfoNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DependencyInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DependencyInfoKHR.gen.cs index 6ef7eae1e0..3ea601900b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DependencyInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DependencyInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDependencyInfoKHR")] - public unsafe partial struct DependencyInfoKHR + public unsafe partial struct DependencyInfoKHR : IStructuredType { public DependencyInfoKHR ( @@ -123,5 +123,11 @@ public DependencyInfoKHR [NativeName("Type.Name", "VkImageMemoryBarrier2KHR")] [NativeName("Name", "pImageMemoryBarriers")] public ImageMemoryBarrier2KHR* PImageMemoryBarriers; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DependencyInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorPoolCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorPoolCreateInfo.gen.cs index b7ac59b9bb..1b4af4209f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorPoolCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorPoolCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDescriptorPoolCreateInfo")] - public unsafe partial struct DescriptorPoolCreateInfo + public unsafe partial struct DescriptorPoolCreateInfo : IStructuredType { public DescriptorPoolCreateInfo ( @@ -90,5 +90,11 @@ public DescriptorPoolCreateInfo [NativeName("Type.Name", "VkDescriptorPoolSize")] [NativeName("Name", "pPoolSizes")] public DescriptorPoolSize* PPoolSizes; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DescriptorPoolCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorPoolInlineUniformBlockCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorPoolInlineUniformBlockCreateInfoEXT.gen.cs index a42a2f277e..797d87cb34 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorPoolInlineUniformBlockCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorPoolInlineUniformBlockCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDescriptorPoolInlineUniformBlockCreateInfoEXT")] - public unsafe partial struct DescriptorPoolInlineUniformBlockCreateInfoEXT + public unsafe partial struct DescriptorPoolInlineUniformBlockCreateInfoEXT : IStructuredType { public DescriptorPoolInlineUniformBlockCreateInfoEXT ( @@ -57,5 +57,11 @@ public DescriptorPoolInlineUniformBlockCreateInfoEXT [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "maxInlineUniformBlockBindings")] public uint MaxInlineUniformBlockBindings; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DescriptorPoolInlineUniformBlockCreateInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetAllocateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetAllocateInfo.gen.cs index e56c39db3e..cbcc15e1e2 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetAllocateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetAllocateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDescriptorSetAllocateInfo")] - public unsafe partial struct DescriptorSetAllocateInfo + public unsafe partial struct DescriptorSetAllocateInfo : IStructuredType { public DescriptorSetAllocateInfo ( @@ -79,5 +79,11 @@ public DescriptorSetAllocateInfo [NativeName("Type.Name", "VkDescriptorSetLayout")] [NativeName("Name", "pSetLayouts")] public DescriptorSetLayout* PSetLayouts; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DescriptorSetAllocateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutBindingFlagsCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutBindingFlagsCreateInfo.gen.cs index c1a973580f..cc2daea791 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutBindingFlagsCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutBindingFlagsCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDescriptorSetLayoutBindingFlagsCreateInfo")] - public unsafe partial struct DescriptorSetLayoutBindingFlagsCreateInfo + public unsafe partial struct DescriptorSetLayoutBindingFlagsCreateInfo : IStructuredType { public DescriptorSetLayoutBindingFlagsCreateInfo ( @@ -68,5 +68,11 @@ public DescriptorSetLayoutBindingFlagsCreateInfo [NativeName("Type.Name", "VkDescriptorBindingFlags")] [NativeName("Name", "pBindingFlags")] public DescriptorBindingFlags* PBindingFlags; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DescriptorSetLayoutBindingFlagsCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutBindingFlagsCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutBindingFlagsCreateInfoEXT.gen.cs index 8785c01ffd..5ce235f224 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutBindingFlagsCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutBindingFlagsCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDescriptorSetLayoutBindingFlagsCreateInfoEXT")] - public unsafe partial struct DescriptorSetLayoutBindingFlagsCreateInfoEXT + public unsafe partial struct DescriptorSetLayoutBindingFlagsCreateInfoEXT : IStructuredType { public DescriptorSetLayoutBindingFlagsCreateInfoEXT ( @@ -68,5 +68,11 @@ public DescriptorSetLayoutBindingFlagsCreateInfoEXT [NativeName("Type.Name", "VkDescriptorBindingFlags")] [NativeName("Name", "pBindingFlags")] public DescriptorBindingFlags* PBindingFlags; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DescriptorSetLayoutBindingFlagsCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutCreateInfo.gen.cs index 44c2c25343..87ba88504c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDescriptorSetLayoutCreateInfo")] - public unsafe partial struct DescriptorSetLayoutCreateInfo + public unsafe partial struct DescriptorSetLayoutCreateInfo : IStructuredType { public DescriptorSetLayoutCreateInfo ( @@ -79,5 +79,11 @@ public DescriptorSetLayoutCreateInfo [NativeName("Type.Name", "VkDescriptorSetLayoutBinding")] [NativeName("Name", "pBindings")] public DescriptorSetLayoutBinding* PBindings; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DescriptorSetLayoutCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutSupport.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutSupport.gen.cs index aff486ce38..3012b7035a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutSupport.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutSupport.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDescriptorSetLayoutSupport")] - public unsafe partial struct DescriptorSetLayoutSupport + public unsafe partial struct DescriptorSetLayoutSupport : IStructuredType { public DescriptorSetLayoutSupport ( @@ -57,5 +57,11 @@ public DescriptorSetLayoutSupport [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "supported")] public Bool32 Supported; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DescriptorSetLayoutSupport; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutSupportKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutSupportKHR.gen.cs index f2078864cb..f099eefcc1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutSupportKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutSupportKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDescriptorSetLayoutSupportKHR")] - public unsafe partial struct DescriptorSetLayoutSupportKHR + public unsafe partial struct DescriptorSetLayoutSupportKHR : IStructuredType { public DescriptorSetLayoutSupportKHR ( @@ -57,5 +57,11 @@ public DescriptorSetLayoutSupportKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "supported")] public Bool32 Supported; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DescriptorSetLayoutSupport; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountAllocateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountAllocateInfo.gen.cs index c6d04b5760..74ab1965aa 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountAllocateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountAllocateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDescriptorSetVariableDescriptorCountAllocateInfo")] - public unsafe partial struct DescriptorSetVariableDescriptorCountAllocateInfo + public unsafe partial struct DescriptorSetVariableDescriptorCountAllocateInfo : IStructuredType { public DescriptorSetVariableDescriptorCountAllocateInfo ( @@ -68,5 +68,11 @@ public DescriptorSetVariableDescriptorCountAllocateInfo [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "pDescriptorCounts")] public uint* PDescriptorCounts; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DescriptorSetVariableDescriptorCountAllocateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountAllocateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountAllocateInfoEXT.gen.cs index f40c87ed2e..37bf89dd70 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountAllocateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountAllocateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDescriptorSetVariableDescriptorCountAllocateInfoEXT")] - public unsafe partial struct DescriptorSetVariableDescriptorCountAllocateInfoEXT + public unsafe partial struct DescriptorSetVariableDescriptorCountAllocateInfoEXT : IStructuredType { public DescriptorSetVariableDescriptorCountAllocateInfoEXT ( @@ -68,5 +68,11 @@ public DescriptorSetVariableDescriptorCountAllocateInfoEXT [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "pDescriptorCounts")] public uint* PDescriptorCounts; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DescriptorSetVariableDescriptorCountAllocateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountLayoutSupport.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountLayoutSupport.gen.cs index bd4d204d04..2eaedb875f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountLayoutSupport.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountLayoutSupport.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDescriptorSetVariableDescriptorCountLayoutSupport")] - public unsafe partial struct DescriptorSetVariableDescriptorCountLayoutSupport + public unsafe partial struct DescriptorSetVariableDescriptorCountLayoutSupport : IStructuredType { public DescriptorSetVariableDescriptorCountLayoutSupport ( @@ -57,5 +57,11 @@ public DescriptorSetVariableDescriptorCountLayoutSupport [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "maxVariableDescriptorCount")] public uint MaxVariableDescriptorCount; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DescriptorSetVariableDescriptorCountLayoutSupport; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountLayoutSupportEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountLayoutSupportEXT.gen.cs index e0fd5f9ae6..2ffd6155b3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountLayoutSupportEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountLayoutSupportEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDescriptorSetVariableDescriptorCountLayoutSupportEXT")] - public unsafe partial struct DescriptorSetVariableDescriptorCountLayoutSupportEXT + public unsafe partial struct DescriptorSetVariableDescriptorCountLayoutSupportEXT : IStructuredType { public DescriptorSetVariableDescriptorCountLayoutSupportEXT ( @@ -57,5 +57,11 @@ public DescriptorSetVariableDescriptorCountLayoutSupportEXT [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "maxVariableDescriptorCount")] public uint MaxVariableDescriptorCount; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DescriptorSetVariableDescriptorCountLayoutSupport; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorUpdateTemplateCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorUpdateTemplateCreateInfo.gen.cs index 514657ae97..4731848715 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorUpdateTemplateCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorUpdateTemplateCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDescriptorUpdateTemplateCreateInfo")] - public unsafe partial struct DescriptorUpdateTemplateCreateInfo + public unsafe partial struct DescriptorUpdateTemplateCreateInfo : IStructuredType { public DescriptorUpdateTemplateCreateInfo ( @@ -134,5 +134,11 @@ public DescriptorUpdateTemplateCreateInfo [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "set")] public uint Set; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DescriptorUpdateTemplateCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorUpdateTemplateCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorUpdateTemplateCreateInfoKHR.gen.cs index 416fbea6d4..876db9a45e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorUpdateTemplateCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorUpdateTemplateCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDescriptorUpdateTemplateCreateInfoKHR")] - public unsafe partial struct DescriptorUpdateTemplateCreateInfoKHR + public unsafe partial struct DescriptorUpdateTemplateCreateInfoKHR : IStructuredType { public DescriptorUpdateTemplateCreateInfoKHR ( @@ -134,5 +134,11 @@ public DescriptorUpdateTemplateCreateInfoKHR [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "set")] public uint Set; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DescriptorUpdateTemplateCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceBufferMemoryRequirementsKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceBufferMemoryRequirementsKHR.gen.cs index 9cb47ba0f0..91c5f6b521 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceBufferMemoryRequirementsKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceBufferMemoryRequirementsKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceBufferMemoryRequirementsKHR")] - public unsafe partial struct DeviceBufferMemoryRequirementsKHR + public unsafe partial struct DeviceBufferMemoryRequirementsKHR : IStructuredType { public DeviceBufferMemoryRequirementsKHR ( @@ -57,5 +57,11 @@ public DeviceBufferMemoryRequirementsKHR [NativeName("Type.Name", "VkBufferCreateInfo")] [NativeName("Name", "pCreateInfo")] public BufferCreateInfo* PCreateInfo; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DeviceBufferMemoryRequirementsKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceCreateInfo.gen.cs index 3310a31fb4..a45ce23282 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceCreateInfo")] - public unsafe partial struct DeviceCreateInfo + public unsafe partial struct DeviceCreateInfo : IStructuredType { public DeviceCreateInfo ( @@ -134,5 +134,11 @@ public DeviceCreateInfo [NativeName("Type.Name", "VkPhysicalDeviceFeatures")] [NativeName("Name", "pEnabledFeatures")] public PhysicalDeviceFeatures* PEnabledFeatures; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DeviceCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceDeviceMemoryReportCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceDeviceMemoryReportCreateInfoEXT.gen.cs index 00eb7571b9..517a0d20b7 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceDeviceMemoryReportCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceDeviceMemoryReportCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceDeviceMemoryReportCreateInfoEXT")] - public unsafe partial struct DeviceDeviceMemoryReportCreateInfoEXT + public unsafe partial struct DeviceDeviceMemoryReportCreateInfoEXT : IStructuredType { public DeviceDeviceMemoryReportCreateInfoEXT ( @@ -79,5 +79,11 @@ public DeviceDeviceMemoryReportCreateInfoEXT [NativeName("Type.Name", "void")] [NativeName("Name", "pUserData")] public void* PUserData; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DeviceDeviceMemoryReportCreateInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceDiagnosticsConfigCreateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceDiagnosticsConfigCreateInfoNV.gen.cs index 0c1045b866..d7bad36f2d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceDiagnosticsConfigCreateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceDiagnosticsConfigCreateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceDiagnosticsConfigCreateInfoNV")] - public unsafe partial struct DeviceDiagnosticsConfigCreateInfoNV + public unsafe partial struct DeviceDiagnosticsConfigCreateInfoNV : IStructuredType { public DeviceDiagnosticsConfigCreateInfoNV ( @@ -57,5 +57,11 @@ public DeviceDiagnosticsConfigCreateInfoNV [NativeName("Type.Name", "VkDeviceDiagnosticsConfigFlagsNV")] [NativeName("Name", "flags")] public DeviceDiagnosticsConfigFlagsNV Flags; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DeviceDiagnosticsConfigCreateInfoNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceEventInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceEventInfoEXT.gen.cs index 9b999ca658..3fef4bce44 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceEventInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceEventInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceEventInfoEXT")] - public unsafe partial struct DeviceEventInfoEXT + public unsafe partial struct DeviceEventInfoEXT : IStructuredType { public DeviceEventInfoEXT ( @@ -57,5 +57,11 @@ public DeviceEventInfoEXT [NativeName("Type.Name", "VkDeviceEventTypeEXT")] [NativeName("Name", "deviceEvent")] public DeviceEventTypeEXT DeviceEvent; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DeviceEventInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupBindSparseInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupBindSparseInfo.gen.cs index ff4daa66a2..f39eade066 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupBindSparseInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupBindSparseInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceGroupBindSparseInfo")] - public unsafe partial struct DeviceGroupBindSparseInfo + public unsafe partial struct DeviceGroupBindSparseInfo : IStructuredType { public DeviceGroupBindSparseInfo ( @@ -68,5 +68,11 @@ public DeviceGroupBindSparseInfo [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "memoryDeviceIndex")] public uint MemoryDeviceIndex; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DeviceGroupBindSparseInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupBindSparseInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupBindSparseInfoKHR.gen.cs index 05c3f46006..c7baa62265 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupBindSparseInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupBindSparseInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceGroupBindSparseInfoKHR")] - public unsafe partial struct DeviceGroupBindSparseInfoKHR + public unsafe partial struct DeviceGroupBindSparseInfoKHR : IStructuredType { public DeviceGroupBindSparseInfoKHR ( @@ -68,5 +68,11 @@ public DeviceGroupBindSparseInfoKHR [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "memoryDeviceIndex")] public uint MemoryDeviceIndex; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DeviceGroupBindSparseInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupCommandBufferBeginInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupCommandBufferBeginInfo.gen.cs index 5a705b8847..16b9be0e00 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupCommandBufferBeginInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupCommandBufferBeginInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceGroupCommandBufferBeginInfo")] - public unsafe partial struct DeviceGroupCommandBufferBeginInfo + public unsafe partial struct DeviceGroupCommandBufferBeginInfo : IStructuredType { public DeviceGroupCommandBufferBeginInfo ( @@ -57,5 +57,11 @@ public DeviceGroupCommandBufferBeginInfo [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "deviceMask")] public uint DeviceMask; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DeviceGroupCommandBufferBeginInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupCommandBufferBeginInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupCommandBufferBeginInfoKHR.gen.cs index 919187368b..021bd01103 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupCommandBufferBeginInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupCommandBufferBeginInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceGroupCommandBufferBeginInfoKHR")] - public unsafe partial struct DeviceGroupCommandBufferBeginInfoKHR + public unsafe partial struct DeviceGroupCommandBufferBeginInfoKHR : IStructuredType { public DeviceGroupCommandBufferBeginInfoKHR ( @@ -57,5 +57,11 @@ public DeviceGroupCommandBufferBeginInfoKHR [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "deviceMask")] public uint DeviceMask; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DeviceGroupCommandBufferBeginInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupDeviceCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupDeviceCreateInfo.gen.cs index d678acf328..9463c390cd 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupDeviceCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupDeviceCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceGroupDeviceCreateInfo")] - public unsafe partial struct DeviceGroupDeviceCreateInfo + public unsafe partial struct DeviceGroupDeviceCreateInfo : IStructuredType { public DeviceGroupDeviceCreateInfo ( @@ -68,5 +68,11 @@ public DeviceGroupDeviceCreateInfo [NativeName("Type.Name", "VkPhysicalDevice")] [NativeName("Name", "pPhysicalDevices")] public PhysicalDevice* PPhysicalDevices; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DeviceGroupDeviceCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupDeviceCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupDeviceCreateInfoKHR.gen.cs index 52103ac0e2..91184270ad 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupDeviceCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupDeviceCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceGroupDeviceCreateInfoKHR")] - public unsafe partial struct DeviceGroupDeviceCreateInfoKHR + public unsafe partial struct DeviceGroupDeviceCreateInfoKHR : IStructuredType { public DeviceGroupDeviceCreateInfoKHR ( @@ -68,5 +68,11 @@ public DeviceGroupDeviceCreateInfoKHR [NativeName("Type.Name", "VkPhysicalDevice")] [NativeName("Name", "pPhysicalDevices")] public PhysicalDevice* PPhysicalDevices; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DeviceGroupDeviceCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupPresentCapabilitiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupPresentCapabilitiesKHR.gen.cs index 609ea5d256..d7afc34c6b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupPresentCapabilitiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupPresentCapabilitiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceGroupPresentCapabilitiesKHR")] - public unsafe partial struct DeviceGroupPresentCapabilitiesKHR + public unsafe partial struct DeviceGroupPresentCapabilitiesKHR : IStructuredType { public DeviceGroupPresentCapabilitiesKHR ( @@ -62,5 +62,11 @@ public DeviceGroupPresentCapabilitiesKHR [NativeName("Type.Name", "VkDeviceGroupPresentModeFlagsKHR")] [NativeName("Name", "modes")] public DeviceGroupPresentModeFlagsKHR Modes; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DeviceGroupPresentCapabilitiesKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupPresentInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupPresentInfoKHR.gen.cs index 7dcf359914..fc17c18b74 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupPresentInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupPresentInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceGroupPresentInfoKHR")] - public unsafe partial struct DeviceGroupPresentInfoKHR + public unsafe partial struct DeviceGroupPresentInfoKHR : IStructuredType { public DeviceGroupPresentInfoKHR ( @@ -79,5 +79,11 @@ public DeviceGroupPresentInfoKHR [NativeName("Type.Name", "VkDeviceGroupPresentModeFlagBitsKHR")] [NativeName("Name", "mode")] public DeviceGroupPresentModeFlagsKHR Mode; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DeviceGroupPresentInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupRenderPassBeginInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupRenderPassBeginInfo.gen.cs index 739866371d..1f4fe52f44 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupRenderPassBeginInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupRenderPassBeginInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceGroupRenderPassBeginInfo")] - public unsafe partial struct DeviceGroupRenderPassBeginInfo + public unsafe partial struct DeviceGroupRenderPassBeginInfo : IStructuredType { public DeviceGroupRenderPassBeginInfo ( @@ -79,5 +79,11 @@ public DeviceGroupRenderPassBeginInfo [NativeName("Type.Name", "VkRect2D")] [NativeName("Name", "pDeviceRenderAreas")] public Rect2D* PDeviceRenderAreas; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DeviceGroupRenderPassBeginInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupRenderPassBeginInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupRenderPassBeginInfoKHR.gen.cs index e23ce7ff95..7739ce3f8e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupRenderPassBeginInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupRenderPassBeginInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceGroupRenderPassBeginInfoKHR")] - public unsafe partial struct DeviceGroupRenderPassBeginInfoKHR + public unsafe partial struct DeviceGroupRenderPassBeginInfoKHR : IStructuredType { public DeviceGroupRenderPassBeginInfoKHR ( @@ -79,5 +79,11 @@ public DeviceGroupRenderPassBeginInfoKHR [NativeName("Type.Name", "VkRect2D")] [NativeName("Name", "pDeviceRenderAreas")] public Rect2D* PDeviceRenderAreas; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DeviceGroupRenderPassBeginInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupSubmitInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupSubmitInfo.gen.cs index 713c3bda01..a6af28bb69 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupSubmitInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupSubmitInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceGroupSubmitInfo")] - public unsafe partial struct DeviceGroupSubmitInfo + public unsafe partial struct DeviceGroupSubmitInfo : IStructuredType { public DeviceGroupSubmitInfo ( @@ -112,5 +112,11 @@ public DeviceGroupSubmitInfo [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "pSignalSemaphoreDeviceIndices")] public uint* PSignalSemaphoreDeviceIndices; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DeviceGroupSubmitInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupSubmitInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupSubmitInfoKHR.gen.cs index 44bbc3e4d8..21da7826ff 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupSubmitInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupSubmitInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceGroupSubmitInfoKHR")] - public unsafe partial struct DeviceGroupSubmitInfoKHR + public unsafe partial struct DeviceGroupSubmitInfoKHR : IStructuredType { public DeviceGroupSubmitInfoKHR ( @@ -112,5 +112,11 @@ public DeviceGroupSubmitInfoKHR [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "pSignalSemaphoreDeviceIndices")] public uint* PSignalSemaphoreDeviceIndices; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DeviceGroupSubmitInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupSwapchainCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupSwapchainCreateInfoKHR.gen.cs index 06e676a452..99717ec378 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupSwapchainCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupSwapchainCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceGroupSwapchainCreateInfoKHR")] - public unsafe partial struct DeviceGroupSwapchainCreateInfoKHR + public unsafe partial struct DeviceGroupSwapchainCreateInfoKHR : IStructuredType { public DeviceGroupSwapchainCreateInfoKHR ( @@ -57,5 +57,11 @@ public DeviceGroupSwapchainCreateInfoKHR [NativeName("Type.Name", "VkDeviceGroupPresentModeFlagsKHR")] [NativeName("Name", "modes")] public DeviceGroupPresentModeFlagsKHR Modes; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DeviceGroupSwapchainCreateInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceImageMemoryRequirementsKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceImageMemoryRequirementsKHR.gen.cs index 13965ead42..e0d90ce398 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceImageMemoryRequirementsKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceImageMemoryRequirementsKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceImageMemoryRequirementsKHR")] - public unsafe partial struct DeviceImageMemoryRequirementsKHR + public unsafe partial struct DeviceImageMemoryRequirementsKHR : IStructuredType { public DeviceImageMemoryRequirementsKHR ( @@ -68,5 +68,11 @@ public DeviceImageMemoryRequirementsKHR [NativeName("Type.Name", "VkImageAspectFlagBits")] [NativeName("Name", "planeAspect")] public ImageAspectFlags PlaneAspect; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DeviceImageMemoryRequirementsKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceMemoryOpaqueCaptureAddressInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceMemoryOpaqueCaptureAddressInfo.gen.cs index 1b191c29fa..856b4a9ec8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceMemoryOpaqueCaptureAddressInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceMemoryOpaqueCaptureAddressInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceMemoryOpaqueCaptureAddressInfo")] - public unsafe partial struct DeviceMemoryOpaqueCaptureAddressInfo + public unsafe partial struct DeviceMemoryOpaqueCaptureAddressInfo : IStructuredType { public DeviceMemoryOpaqueCaptureAddressInfo ( @@ -57,5 +57,11 @@ public DeviceMemoryOpaqueCaptureAddressInfo [NativeName("Type.Name", "VkDeviceMemory")] [NativeName("Name", "memory")] public DeviceMemory Memory; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DeviceMemoryOpaqueCaptureAddressInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceMemoryOpaqueCaptureAddressInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceMemoryOpaqueCaptureAddressInfoKHR.gen.cs index 9c031ab7c9..337475de0b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceMemoryOpaqueCaptureAddressInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceMemoryOpaqueCaptureAddressInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceMemoryOpaqueCaptureAddressInfoKHR")] - public unsafe partial struct DeviceMemoryOpaqueCaptureAddressInfoKHR + public unsafe partial struct DeviceMemoryOpaqueCaptureAddressInfoKHR : IStructuredType { public DeviceMemoryOpaqueCaptureAddressInfoKHR ( @@ -57,5 +57,11 @@ public DeviceMemoryOpaqueCaptureAddressInfoKHR [NativeName("Type.Name", "VkDeviceMemory")] [NativeName("Name", "memory")] public DeviceMemory Memory; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DeviceMemoryOpaqueCaptureAddressInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceMemoryOverallocationCreateInfoAMD.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceMemoryOverallocationCreateInfoAMD.gen.cs index 3b1cb07ead..1a611d3110 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceMemoryOverallocationCreateInfoAMD.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceMemoryOverallocationCreateInfoAMD.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceMemoryOverallocationCreateInfoAMD")] - public unsafe partial struct DeviceMemoryOverallocationCreateInfoAMD + public unsafe partial struct DeviceMemoryOverallocationCreateInfoAMD : IStructuredType { public DeviceMemoryOverallocationCreateInfoAMD ( @@ -57,5 +57,11 @@ public DeviceMemoryOverallocationCreateInfoAMD [NativeName("Type.Name", "VkMemoryOverallocationBehaviorAMD")] [NativeName("Name", "overallocationBehavior")] public MemoryOverallocationBehaviorAMD OverallocationBehavior; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DeviceMemoryOverallocationCreateInfoAmd; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceMemoryReportCallbackDataEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceMemoryReportCallbackDataEXT.gen.cs index 3a5c7318ce..0bd3911fdf 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceMemoryReportCallbackDataEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceMemoryReportCallbackDataEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceMemoryReportCallbackDataEXT")] - public unsafe partial struct DeviceMemoryReportCallbackDataEXT + public unsafe partial struct DeviceMemoryReportCallbackDataEXT : IStructuredType { public DeviceMemoryReportCallbackDataEXT ( @@ -123,5 +123,11 @@ public DeviceMemoryReportCallbackDataEXT [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "heapIndex")] public uint HeapIndex; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DeviceMemoryReportCallbackDataExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DevicePrivateDataCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DevicePrivateDataCreateInfoEXT.gen.cs index 88e3416cbc..8ba97324e0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DevicePrivateDataCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DevicePrivateDataCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDevicePrivateDataCreateInfoEXT")] - public unsafe partial struct DevicePrivateDataCreateInfoEXT + public unsafe partial struct DevicePrivateDataCreateInfoEXT : IStructuredType { public DevicePrivateDataCreateInfoEXT ( @@ -57,5 +57,11 @@ public DevicePrivateDataCreateInfoEXT [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "privateDataSlotRequestCount")] public uint PrivateDataSlotRequestCount; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DevicePrivateDataCreateInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceQueueCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceQueueCreateInfo.gen.cs index b4cdf43bf8..19e09761c3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceQueueCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceQueueCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceQueueCreateInfo")] - public unsafe partial struct DeviceQueueCreateInfo + public unsafe partial struct DeviceQueueCreateInfo : IStructuredType { public DeviceQueueCreateInfo ( @@ -90,5 +90,11 @@ public DeviceQueueCreateInfo [NativeName("Type.Name", "float")] [NativeName("Name", "pQueuePriorities")] public float* PQueuePriorities; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DeviceQueueCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceQueueGlobalPriorityCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceQueueGlobalPriorityCreateInfoEXT.gen.cs index ed5a83b240..5e04e5ced9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceQueueGlobalPriorityCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceQueueGlobalPriorityCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceQueueGlobalPriorityCreateInfoEXT")] - public unsafe partial struct DeviceQueueGlobalPriorityCreateInfoEXT + public unsafe partial struct DeviceQueueGlobalPriorityCreateInfoEXT : IStructuredType { public DeviceQueueGlobalPriorityCreateInfoEXT ( @@ -57,5 +57,11 @@ public DeviceQueueGlobalPriorityCreateInfoEXT [NativeName("Type.Name", "VkQueueGlobalPriorityEXT")] [NativeName("Name", "globalPriority")] public QueueGlobalPriorityEXT GlobalPriority; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DeviceQueueGlobalPriorityCreateInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceQueueInfo2.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceQueueInfo2.gen.cs index 830f6cf6f6..65befac25f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceQueueInfo2.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceQueueInfo2.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceQueueInfo2")] - public unsafe partial struct DeviceQueueInfo2 + public unsafe partial struct DeviceQueueInfo2 : IStructuredType { public DeviceQueueInfo2 ( @@ -79,5 +79,11 @@ public DeviceQueueInfo2 [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "queueIndex")] public uint QueueIndex; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DeviceQueueInfo2; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DirectFBSurfaceCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DirectFBSurfaceCreateInfoEXT.gen.cs index 687cc0f0e7..c024c0e558 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DirectFBSurfaceCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DirectFBSurfaceCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDirectFBSurfaceCreateInfoEXT")] - public unsafe partial struct DirectFBSurfaceCreateInfoEXT + public unsafe partial struct DirectFBSurfaceCreateInfoEXT : IStructuredType { public DirectFBSurfaceCreateInfoEXT ( @@ -79,5 +79,11 @@ public DirectFBSurfaceCreateInfoEXT [NativeName("Type.Name", "IDirectFBSurface")] [NativeName("Name", "surface")] public nint Surface; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DirectfbSurfaceCreateInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayEventInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayEventInfoEXT.gen.cs index ce61acafa7..e04e6e3a75 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayEventInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayEventInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDisplayEventInfoEXT")] - public unsafe partial struct DisplayEventInfoEXT + public unsafe partial struct DisplayEventInfoEXT : IStructuredType { public DisplayEventInfoEXT ( @@ -57,5 +57,11 @@ public DisplayEventInfoEXT [NativeName("Type.Name", "VkDisplayEventTypeEXT")] [NativeName("Name", "displayEvent")] public DisplayEventTypeEXT DisplayEvent; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DisplayEventInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayModeCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayModeCreateInfoKHR.gen.cs index 987e6c38be..170aef6da4 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayModeCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayModeCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDisplayModeCreateInfoKHR")] - public unsafe partial struct DisplayModeCreateInfoKHR + public unsafe partial struct DisplayModeCreateInfoKHR : IStructuredType { public DisplayModeCreateInfoKHR ( @@ -68,5 +68,11 @@ public DisplayModeCreateInfoKHR [NativeName("Type.Name", "VkDisplayModeParametersKHR")] [NativeName("Name", "parameters")] public DisplayModeParametersKHR Parameters; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DisplayModeCreateInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayModeProperties2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayModeProperties2KHR.gen.cs index 6a618c1eef..6a05c6213c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayModeProperties2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayModeProperties2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDisplayModeProperties2KHR")] - public unsafe partial struct DisplayModeProperties2KHR + public unsafe partial struct DisplayModeProperties2KHR : IStructuredType { public DisplayModeProperties2KHR ( @@ -57,5 +57,11 @@ public DisplayModeProperties2KHR [NativeName("Type.Name", "VkDisplayModePropertiesKHR")] [NativeName("Name", "displayModeProperties")] public DisplayModePropertiesKHR DisplayModeProperties; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DisplayModeProperties2Khr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayNativeHdrSurfaceCapabilitiesAMD.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayNativeHdrSurfaceCapabilitiesAMD.gen.cs index e9add12380..186d43b541 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayNativeHdrSurfaceCapabilitiesAMD.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayNativeHdrSurfaceCapabilitiesAMD.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDisplayNativeHdrSurfaceCapabilitiesAMD")] - public unsafe partial struct DisplayNativeHdrSurfaceCapabilitiesAMD + public unsafe partial struct DisplayNativeHdrSurfaceCapabilitiesAMD : IStructuredType { public DisplayNativeHdrSurfaceCapabilitiesAMD ( @@ -57,5 +57,11 @@ public DisplayNativeHdrSurfaceCapabilitiesAMD [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "localDimmingSupport")] public Bool32 LocalDimmingSupport; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DisplayNativeHdrSurfaceCapabilitiesAmd; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayPlaneCapabilities2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayPlaneCapabilities2KHR.gen.cs index 52c24fec5d..e7616eb301 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayPlaneCapabilities2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayPlaneCapabilities2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDisplayPlaneCapabilities2KHR")] - public unsafe partial struct DisplayPlaneCapabilities2KHR + public unsafe partial struct DisplayPlaneCapabilities2KHR : IStructuredType { public DisplayPlaneCapabilities2KHR ( @@ -57,5 +57,11 @@ public DisplayPlaneCapabilities2KHR [NativeName("Type.Name", "VkDisplayPlaneCapabilitiesKHR")] [NativeName("Name", "capabilities")] public DisplayPlaneCapabilitiesKHR Capabilities; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DisplayPlaneCapabilities2Khr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayPlaneInfo2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayPlaneInfo2KHR.gen.cs index dba6c81d82..d92784bf9f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayPlaneInfo2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayPlaneInfo2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDisplayPlaneInfo2KHR")] - public unsafe partial struct DisplayPlaneInfo2KHR + public unsafe partial struct DisplayPlaneInfo2KHR : IStructuredType { public DisplayPlaneInfo2KHR ( @@ -68,5 +68,11 @@ public DisplayPlaneInfo2KHR [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "planeIndex")] public uint PlaneIndex; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DisplayPlaneInfo2Khr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayPlaneProperties2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayPlaneProperties2KHR.gen.cs index e227b32d89..08dcaead08 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayPlaneProperties2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayPlaneProperties2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDisplayPlaneProperties2KHR")] - public unsafe partial struct DisplayPlaneProperties2KHR + public unsafe partial struct DisplayPlaneProperties2KHR : IStructuredType { public DisplayPlaneProperties2KHR ( @@ -57,5 +57,11 @@ public DisplayPlaneProperties2KHR [NativeName("Type.Name", "VkDisplayPlanePropertiesKHR")] [NativeName("Name", "displayPlaneProperties")] public DisplayPlanePropertiesKHR DisplayPlaneProperties; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DisplayPlaneProperties2Khr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayPowerInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayPowerInfoEXT.gen.cs index 18faa54b1d..afb807d81c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayPowerInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayPowerInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDisplayPowerInfoEXT")] - public unsafe partial struct DisplayPowerInfoEXT + public unsafe partial struct DisplayPowerInfoEXT : IStructuredType { public DisplayPowerInfoEXT ( @@ -57,5 +57,11 @@ public DisplayPowerInfoEXT [NativeName("Type.Name", "VkDisplayPowerStateEXT")] [NativeName("Name", "powerState")] public DisplayPowerStateEXT PowerState; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DisplayPowerInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayPresentInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayPresentInfoKHR.gen.cs index 1419fd0b27..44601495b5 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayPresentInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayPresentInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDisplayPresentInfoKHR")] - public unsafe partial struct DisplayPresentInfoKHR + public unsafe partial struct DisplayPresentInfoKHR : IStructuredType { public DisplayPresentInfoKHR ( @@ -79,5 +79,11 @@ public DisplayPresentInfoKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "persistent")] public Bool32 Persistent; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DisplayPresentInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayProperties2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayProperties2KHR.gen.cs index 8ab2def3e0..91bfde46b0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayProperties2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayProperties2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDisplayProperties2KHR")] - public unsafe partial struct DisplayProperties2KHR + public unsafe partial struct DisplayProperties2KHR : IStructuredType { public DisplayProperties2KHR ( @@ -57,5 +57,11 @@ public DisplayProperties2KHR [NativeName("Type.Name", "VkDisplayPropertiesKHR")] [NativeName("Name", "displayProperties")] public DisplayPropertiesKHR DisplayProperties; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DisplayProperties2Khr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplaySurfaceCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplaySurfaceCreateInfoKHR.gen.cs index 180a0878c1..050fdc4476 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplaySurfaceCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplaySurfaceCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDisplaySurfaceCreateInfoKHR")] - public unsafe partial struct DisplaySurfaceCreateInfoKHR + public unsafe partial struct DisplaySurfaceCreateInfoKHR : IStructuredType { public DisplaySurfaceCreateInfoKHR ( @@ -134,5 +134,11 @@ public DisplaySurfaceCreateInfoKHR [NativeName("Type.Name", "VkExtent2D")] [NativeName("Name", "imageExtent")] public Extent2D ImageExtent; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DisplaySurfaceCreateInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DrmFormatModifierPropertiesList2EXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DrmFormatModifierPropertiesList2EXT.gen.cs index a03ec09869..c4ab795ea4 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DrmFormatModifierPropertiesList2EXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DrmFormatModifierPropertiesList2EXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDrmFormatModifierPropertiesList2EXT")] - public unsafe partial struct DrmFormatModifierPropertiesList2EXT + public unsafe partial struct DrmFormatModifierPropertiesList2EXT : IStructuredType { public DrmFormatModifierPropertiesList2EXT ( @@ -68,5 +68,11 @@ public DrmFormatModifierPropertiesList2EXT [NativeName("Type.Name", "VkDrmFormatModifierProperties2EXT")] [NativeName("Name", "pDrmFormatModifierProperties")] public DrmFormatModifierProperties2EXT* PDrmFormatModifierProperties; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DrmFormatModifierPropertiesList2Ext; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DrmFormatModifierPropertiesListEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DrmFormatModifierPropertiesListEXT.gen.cs index d78370a026..4faa1a0c90 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DrmFormatModifierPropertiesListEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DrmFormatModifierPropertiesListEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDrmFormatModifierPropertiesListEXT")] - public unsafe partial struct DrmFormatModifierPropertiesListEXT + public unsafe partial struct DrmFormatModifierPropertiesListEXT : IStructuredType { public DrmFormatModifierPropertiesListEXT ( @@ -68,5 +68,11 @@ public DrmFormatModifierPropertiesListEXT [NativeName("Type.Name", "VkDrmFormatModifierPropertiesEXT")] [NativeName("Name", "pDrmFormatModifierProperties")] public DrmFormatModifierPropertiesEXT* PDrmFormatModifierProperties; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.DrmFormatModifierPropertiesListExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/EventCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/EventCreateInfo.gen.cs index 577afba1eb..237369e99b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/EventCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/EventCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkEventCreateInfo")] - public unsafe partial struct EventCreateInfo + public unsafe partial struct EventCreateInfo : IStructuredType { public EventCreateInfo ( @@ -57,5 +57,11 @@ public EventCreateInfo [NativeName("Type.Name", "VkEventCreateFlags")] [NativeName("Name", "flags")] public EventCreateFlags Flags; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.EventCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportFenceCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportFenceCreateInfo.gen.cs index 71b8504487..539c7b7761 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportFenceCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportFenceCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExportFenceCreateInfo")] - public unsafe partial struct ExportFenceCreateInfo + public unsafe partial struct ExportFenceCreateInfo : IStructuredType { public ExportFenceCreateInfo ( @@ -57,5 +57,11 @@ public ExportFenceCreateInfo [NativeName("Type.Name", "VkExternalFenceHandleTypeFlags")] [NativeName("Name", "handleTypes")] public ExternalFenceHandleTypeFlags HandleTypes; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ExportFenceCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportFenceCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportFenceCreateInfoKHR.gen.cs index 85e4e86682..d9771c7ebd 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportFenceCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportFenceCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExportFenceCreateInfoKHR")] - public unsafe partial struct ExportFenceCreateInfoKHR + public unsafe partial struct ExportFenceCreateInfoKHR : IStructuredType { public ExportFenceCreateInfoKHR ( @@ -57,5 +57,11 @@ public ExportFenceCreateInfoKHR [NativeName("Type.Name", "VkExternalFenceHandleTypeFlags")] [NativeName("Name", "handleTypes")] public ExternalFenceHandleTypeFlags HandleTypes; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ExportFenceCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportFenceWin32HandleInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportFenceWin32HandleInfoKHR.gen.cs index d3c475a240..ca1a8acd93 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportFenceWin32HandleInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportFenceWin32HandleInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExportFenceWin32HandleInfoKHR")] - public unsafe partial struct ExportFenceWin32HandleInfoKHR + public unsafe partial struct ExportFenceWin32HandleInfoKHR : IStructuredType { public ExportFenceWin32HandleInfoKHR ( @@ -79,5 +79,11 @@ public ExportFenceWin32HandleInfoKHR [NativeName("Type.Name", "LPCWSTR")] [NativeName("Name", "name")] public nint Name; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ExportFenceWin32HandleInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryAllocateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryAllocateInfo.gen.cs index 02c46dd224..d526cdca89 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryAllocateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryAllocateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExportMemoryAllocateInfo")] - public unsafe partial struct ExportMemoryAllocateInfo + public unsafe partial struct ExportMemoryAllocateInfo : IStructuredType { public ExportMemoryAllocateInfo ( @@ -57,5 +57,11 @@ public ExportMemoryAllocateInfo [NativeName("Type.Name", "VkExternalMemoryHandleTypeFlags")] [NativeName("Name", "handleTypes")] public ExternalMemoryHandleTypeFlags HandleTypes; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ExportMemoryAllocateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryAllocateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryAllocateInfoKHR.gen.cs index 846acfd3fd..bc0d101b8b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryAllocateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryAllocateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExportMemoryAllocateInfoKHR")] - public unsafe partial struct ExportMemoryAllocateInfoKHR + public unsafe partial struct ExportMemoryAllocateInfoKHR : IStructuredType { public ExportMemoryAllocateInfoKHR ( @@ -57,5 +57,11 @@ public ExportMemoryAllocateInfoKHR [NativeName("Type.Name", "VkExternalMemoryHandleTypeFlags")] [NativeName("Name", "handleTypes")] public ExternalMemoryHandleTypeFlags HandleTypes; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ExportMemoryAllocateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryAllocateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryAllocateInfoNV.gen.cs index 742af2b449..c35c95aeb4 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryAllocateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryAllocateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExportMemoryAllocateInfoNV")] - public unsafe partial struct ExportMemoryAllocateInfoNV + public unsafe partial struct ExportMemoryAllocateInfoNV : IStructuredType { public ExportMemoryAllocateInfoNV ( @@ -57,5 +57,11 @@ public ExportMemoryAllocateInfoNV [NativeName("Type.Name", "VkExternalMemoryHandleTypeFlagsNV")] [NativeName("Name", "handleTypes")] public ExternalMemoryHandleTypeFlagsNV HandleTypes; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ExportMemoryAllocateInfoNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryWin32HandleInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryWin32HandleInfoKHR.gen.cs index 4fb153ddc3..3496bd33af 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryWin32HandleInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryWin32HandleInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExportMemoryWin32HandleInfoKHR")] - public unsafe partial struct ExportMemoryWin32HandleInfoKHR + public unsafe partial struct ExportMemoryWin32HandleInfoKHR : IStructuredType { public ExportMemoryWin32HandleInfoKHR ( @@ -79,5 +79,11 @@ public ExportMemoryWin32HandleInfoKHR [NativeName("Type.Name", "LPCWSTR")] [NativeName("Name", "name")] public nint Name; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ExportMemoryWin32HandleInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryWin32HandleInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryWin32HandleInfoNV.gen.cs index e9db8326b1..cf4884c606 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryWin32HandleInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryWin32HandleInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExportMemoryWin32HandleInfoNV")] - public unsafe partial struct ExportMemoryWin32HandleInfoNV + public unsafe partial struct ExportMemoryWin32HandleInfoNV : IStructuredType { public ExportMemoryWin32HandleInfoNV ( @@ -68,5 +68,11 @@ public ExportMemoryWin32HandleInfoNV [NativeName("Type.Name", "DWORD")] [NativeName("Name", "dwAccess")] public int DwAccess; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ExportMemoryWin32HandleInfoNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportSemaphoreCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportSemaphoreCreateInfo.gen.cs index d7300de420..c3123d360c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportSemaphoreCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportSemaphoreCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExportSemaphoreCreateInfo")] - public unsafe partial struct ExportSemaphoreCreateInfo + public unsafe partial struct ExportSemaphoreCreateInfo : IStructuredType { public ExportSemaphoreCreateInfo ( @@ -57,5 +57,11 @@ public ExportSemaphoreCreateInfo [NativeName("Type.Name", "VkExternalSemaphoreHandleTypeFlags")] [NativeName("Name", "handleTypes")] public ExternalSemaphoreHandleTypeFlags HandleTypes; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ExportSemaphoreCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportSemaphoreCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportSemaphoreCreateInfoKHR.gen.cs index 5d7a958bdf..53e2e7e0c7 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportSemaphoreCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportSemaphoreCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExportSemaphoreCreateInfoKHR")] - public unsafe partial struct ExportSemaphoreCreateInfoKHR + public unsafe partial struct ExportSemaphoreCreateInfoKHR : IStructuredType { public ExportSemaphoreCreateInfoKHR ( @@ -57,5 +57,11 @@ public ExportSemaphoreCreateInfoKHR [NativeName("Type.Name", "VkExternalSemaphoreHandleTypeFlags")] [NativeName("Name", "handleTypes")] public ExternalSemaphoreHandleTypeFlags HandleTypes; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ExportSemaphoreCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportSemaphoreWin32HandleInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportSemaphoreWin32HandleInfoKHR.gen.cs index 1d22e118b3..533721fe71 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportSemaphoreWin32HandleInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportSemaphoreWin32HandleInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExportSemaphoreWin32HandleInfoKHR")] - public unsafe partial struct ExportSemaphoreWin32HandleInfoKHR + public unsafe partial struct ExportSemaphoreWin32HandleInfoKHR : IStructuredType { public ExportSemaphoreWin32HandleInfoKHR ( @@ -79,5 +79,11 @@ public ExportSemaphoreWin32HandleInfoKHR [NativeName("Type.Name", "LPCWSTR")] [NativeName("Name", "name")] public nint Name; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ExportSemaphoreWin32HandleInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalBufferProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalBufferProperties.gen.cs index 08f408a93b..0d34beeea3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalBufferProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalBufferProperties.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExternalBufferProperties")] - public unsafe partial struct ExternalBufferProperties + public unsafe partial struct ExternalBufferProperties : IStructuredType { public ExternalBufferProperties ( @@ -57,5 +57,11 @@ public ExternalBufferProperties [NativeName("Type.Name", "VkExternalMemoryProperties")] [NativeName("Name", "externalMemoryProperties")] public ExternalMemoryProperties ExternalMemoryProperties; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ExternalBufferProperties; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalBufferPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalBufferPropertiesKHR.gen.cs index 6f2bc53f27..4cab0a5f1e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalBufferPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalBufferPropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExternalBufferPropertiesKHR")] - public unsafe partial struct ExternalBufferPropertiesKHR + public unsafe partial struct ExternalBufferPropertiesKHR : IStructuredType { public ExternalBufferPropertiesKHR ( @@ -57,5 +57,11 @@ public ExternalBufferPropertiesKHR [NativeName("Type.Name", "VkExternalMemoryProperties")] [NativeName("Name", "externalMemoryProperties")] public ExternalMemoryProperties ExternalMemoryProperties; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ExternalBufferProperties; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalFenceProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalFenceProperties.gen.cs index 30630ea319..38c85a5a4b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalFenceProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalFenceProperties.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExternalFenceProperties")] - public unsafe partial struct ExternalFenceProperties + public unsafe partial struct ExternalFenceProperties : IStructuredType { public ExternalFenceProperties ( @@ -79,5 +79,11 @@ public ExternalFenceProperties [NativeName("Type.Name", "VkExternalFenceFeatureFlags")] [NativeName("Name", "externalFenceFeatures")] public ExternalFenceFeatureFlags ExternalFenceFeatures; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ExternalFenceProperties; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalFencePropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalFencePropertiesKHR.gen.cs index a280f62c33..0ef91dbc54 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalFencePropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalFencePropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExternalFencePropertiesKHR")] - public unsafe partial struct ExternalFencePropertiesKHR + public unsafe partial struct ExternalFencePropertiesKHR : IStructuredType { public ExternalFencePropertiesKHR ( @@ -79,5 +79,11 @@ public ExternalFencePropertiesKHR [NativeName("Type.Name", "VkExternalFenceFeatureFlags")] [NativeName("Name", "externalFenceFeatures")] public ExternalFenceFeatureFlags ExternalFenceFeatures; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ExternalFenceProperties; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalFormatANDROID.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalFormatANDROID.gen.cs index 6d9233b1ce..21c10e13a6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalFormatANDROID.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalFormatANDROID.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExternalFormatANDROID")] - public unsafe partial struct ExternalFormatANDROID + public unsafe partial struct ExternalFormatANDROID : IStructuredType { public ExternalFormatANDROID ( @@ -57,5 +57,11 @@ public ExternalFormatANDROID [NativeName("Type.Name", "uint64_t")] [NativeName("Name", "externalFormat")] public ulong ExternalFormat; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ExternalFormatAndroid; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalImageFormatProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalImageFormatProperties.gen.cs index f233be1e4e..ccee07f599 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalImageFormatProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalImageFormatProperties.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExternalImageFormatProperties")] - public unsafe partial struct ExternalImageFormatProperties + public unsafe partial struct ExternalImageFormatProperties : IStructuredType { public ExternalImageFormatProperties ( @@ -57,5 +57,11 @@ public ExternalImageFormatProperties [NativeName("Type.Name", "VkExternalMemoryProperties")] [NativeName("Name", "externalMemoryProperties")] public ExternalMemoryProperties ExternalMemoryProperties; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ExternalImageFormatProperties; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalImageFormatPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalImageFormatPropertiesKHR.gen.cs index 2251f6e608..ddf7c3a87a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalImageFormatPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalImageFormatPropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExternalImageFormatPropertiesKHR")] - public unsafe partial struct ExternalImageFormatPropertiesKHR + public unsafe partial struct ExternalImageFormatPropertiesKHR : IStructuredType { public ExternalImageFormatPropertiesKHR ( @@ -57,5 +57,11 @@ public ExternalImageFormatPropertiesKHR [NativeName("Type.Name", "VkExternalMemoryProperties")] [NativeName("Name", "externalMemoryProperties")] public ExternalMemoryProperties ExternalMemoryProperties; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ExternalImageFormatProperties; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryBufferCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryBufferCreateInfo.gen.cs index 28dc10a543..264744ce4f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryBufferCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryBufferCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExternalMemoryBufferCreateInfo")] - public unsafe partial struct ExternalMemoryBufferCreateInfo + public unsafe partial struct ExternalMemoryBufferCreateInfo : IStructuredType { public ExternalMemoryBufferCreateInfo ( @@ -57,5 +57,11 @@ public ExternalMemoryBufferCreateInfo [NativeName("Type.Name", "VkExternalMemoryHandleTypeFlags")] [NativeName("Name", "handleTypes")] public ExternalMemoryHandleTypeFlags HandleTypes; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ExternalMemoryBufferCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryBufferCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryBufferCreateInfoKHR.gen.cs index f34751f1cd..bdb874fa32 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryBufferCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryBufferCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExternalMemoryBufferCreateInfoKHR")] - public unsafe partial struct ExternalMemoryBufferCreateInfoKHR + public unsafe partial struct ExternalMemoryBufferCreateInfoKHR : IStructuredType { public ExternalMemoryBufferCreateInfoKHR ( @@ -57,5 +57,11 @@ public ExternalMemoryBufferCreateInfoKHR [NativeName("Type.Name", "VkExternalMemoryHandleTypeFlags")] [NativeName("Name", "handleTypes")] public ExternalMemoryHandleTypeFlags HandleTypes; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ExternalMemoryBufferCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryImageCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryImageCreateInfo.gen.cs index fccbcd9be8..4aa7897590 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryImageCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryImageCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExternalMemoryImageCreateInfo")] - public unsafe partial struct ExternalMemoryImageCreateInfo + public unsafe partial struct ExternalMemoryImageCreateInfo : IStructuredType { public ExternalMemoryImageCreateInfo ( @@ -57,5 +57,11 @@ public ExternalMemoryImageCreateInfo [NativeName("Type.Name", "VkExternalMemoryHandleTypeFlags")] [NativeName("Name", "handleTypes")] public ExternalMemoryHandleTypeFlags HandleTypes; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ExternalMemoryImageCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryImageCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryImageCreateInfoKHR.gen.cs index a1ada3398f..73240d0ed9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryImageCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryImageCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExternalMemoryImageCreateInfoKHR")] - public unsafe partial struct ExternalMemoryImageCreateInfoKHR + public unsafe partial struct ExternalMemoryImageCreateInfoKHR : IStructuredType { public ExternalMemoryImageCreateInfoKHR ( @@ -57,5 +57,11 @@ public ExternalMemoryImageCreateInfoKHR [NativeName("Type.Name", "VkExternalMemoryHandleTypeFlags")] [NativeName("Name", "handleTypes")] public ExternalMemoryHandleTypeFlags HandleTypes; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ExternalMemoryImageCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryImageCreateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryImageCreateInfoNV.gen.cs index dc0830aaca..4fbb4540af 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryImageCreateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryImageCreateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExternalMemoryImageCreateInfoNV")] - public unsafe partial struct ExternalMemoryImageCreateInfoNV + public unsafe partial struct ExternalMemoryImageCreateInfoNV : IStructuredType { public ExternalMemoryImageCreateInfoNV ( @@ -57,5 +57,11 @@ public ExternalMemoryImageCreateInfoNV [NativeName("Type.Name", "VkExternalMemoryHandleTypeFlagsNV")] [NativeName("Name", "handleTypes")] public ExternalMemoryHandleTypeFlagsNV HandleTypes; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ExternalMemoryImageCreateInfoNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalSemaphoreProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalSemaphoreProperties.gen.cs index 16c4b27c17..30d9e5d4aa 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalSemaphoreProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalSemaphoreProperties.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExternalSemaphoreProperties")] - public unsafe partial struct ExternalSemaphoreProperties + public unsafe partial struct ExternalSemaphoreProperties : IStructuredType { public ExternalSemaphoreProperties ( @@ -79,5 +79,11 @@ public ExternalSemaphoreProperties [NativeName("Type.Name", "VkExternalSemaphoreFeatureFlags")] [NativeName("Name", "externalSemaphoreFeatures")] public ExternalSemaphoreFeatureFlags ExternalSemaphoreFeatures; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ExternalSemaphoreProperties; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalSemaphorePropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalSemaphorePropertiesKHR.gen.cs index 07dbbc3b88..e013dde505 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalSemaphorePropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalSemaphorePropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExternalSemaphorePropertiesKHR")] - public unsafe partial struct ExternalSemaphorePropertiesKHR + public unsafe partial struct ExternalSemaphorePropertiesKHR : IStructuredType { public ExternalSemaphorePropertiesKHR ( @@ -79,5 +79,11 @@ public ExternalSemaphorePropertiesKHR [NativeName("Type.Name", "VkExternalSemaphoreFeatureFlags")] [NativeName("Name", "externalSemaphoreFeatures")] public ExternalSemaphoreFeatureFlags ExternalSemaphoreFeatures; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ExternalSemaphoreProperties; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/FenceCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/FenceCreateInfo.gen.cs index 653706b63e..faa4fbeb82 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/FenceCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/FenceCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkFenceCreateInfo")] - public unsafe partial struct FenceCreateInfo + public unsafe partial struct FenceCreateInfo : IStructuredType { public FenceCreateInfo ( @@ -57,5 +57,11 @@ public FenceCreateInfo [NativeName("Type.Name", "VkFenceCreateFlags")] [NativeName("Name", "flags")] public FenceCreateFlags Flags; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.FenceCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/FenceGetFdInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/FenceGetFdInfoKHR.gen.cs index 124d64ccce..d13ab18867 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/FenceGetFdInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/FenceGetFdInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkFenceGetFdInfoKHR")] - public unsafe partial struct FenceGetFdInfoKHR + public unsafe partial struct FenceGetFdInfoKHR : IStructuredType { public FenceGetFdInfoKHR ( @@ -68,5 +68,11 @@ public FenceGetFdInfoKHR [NativeName("Type.Name", "VkExternalFenceHandleTypeFlagBits")] [NativeName("Name", "handleType")] public ExternalFenceHandleTypeFlags HandleType; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.FenceGetFDInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/FenceGetWin32HandleInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/FenceGetWin32HandleInfoKHR.gen.cs index a3588a684e..a1fd8a0ae6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/FenceGetWin32HandleInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/FenceGetWin32HandleInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkFenceGetWin32HandleInfoKHR")] - public unsafe partial struct FenceGetWin32HandleInfoKHR + public unsafe partial struct FenceGetWin32HandleInfoKHR : IStructuredType { public FenceGetWin32HandleInfoKHR ( @@ -68,5 +68,11 @@ public FenceGetWin32HandleInfoKHR [NativeName("Type.Name", "VkExternalFenceHandleTypeFlagBits")] [NativeName("Name", "handleType")] public ExternalFenceHandleTypeFlags HandleType; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.FenceGetWin32HandleInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/FilterCubicImageViewImageFormatPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/FilterCubicImageViewImageFormatPropertiesEXT.gen.cs index 4c8b3e54c1..1732aeffce 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/FilterCubicImageViewImageFormatPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/FilterCubicImageViewImageFormatPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkFilterCubicImageViewImageFormatPropertiesEXT")] - public unsafe partial struct FilterCubicImageViewImageFormatPropertiesEXT + public unsafe partial struct FilterCubicImageViewImageFormatPropertiesEXT : IStructuredType { public FilterCubicImageViewImageFormatPropertiesEXT ( @@ -68,5 +68,11 @@ public FilterCubicImageViewImageFormatPropertiesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "filterCubicMinmax")] public Bool32 FilterCubicMinmax; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.FilterCubicImageViewImageFormatPropertiesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/FormatProperties2.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/FormatProperties2.gen.cs index 36eb41121e..9d9cd0d0fd 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/FormatProperties2.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/FormatProperties2.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkFormatProperties2")] - public unsafe partial struct FormatProperties2 + public unsafe partial struct FormatProperties2 : IStructuredType { public FormatProperties2 ( @@ -57,5 +57,11 @@ public FormatProperties2 [NativeName("Type.Name", "VkFormatProperties")] [NativeName("Name", "formatProperties")] public FormatProperties FormatProperties; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.FormatProperties2; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/FormatProperties2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/FormatProperties2KHR.gen.cs index 91b942a809..9a6e276c05 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/FormatProperties2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/FormatProperties2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkFormatProperties2KHR")] - public unsafe partial struct FormatProperties2KHR + public unsafe partial struct FormatProperties2KHR : IStructuredType { public FormatProperties2KHR ( @@ -57,5 +57,11 @@ public FormatProperties2KHR [NativeName("Type.Name", "VkFormatProperties")] [NativeName("Name", "formatProperties")] public FormatProperties FormatProperties; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.FormatProperties2; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/FormatProperties3KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/FormatProperties3KHR.gen.cs index 5a14cb6f36..558a424503 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/FormatProperties3KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/FormatProperties3KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkFormatProperties3KHR")] - public unsafe partial struct FormatProperties3KHR + public unsafe partial struct FormatProperties3KHR : IStructuredType { public FormatProperties3KHR ( @@ -79,5 +79,11 @@ public FormatProperties3KHR [NativeName("Type.Name", "VkFormatFeatureFlags2KHR")] [NativeName("Name", "bufferFeatures")] public FormatFeatureFlags2KHR BufferFeatures; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.FormatProperties3Khr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/FragmentShadingRateAttachmentInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/FragmentShadingRateAttachmentInfoKHR.gen.cs index 9079fddc00..d6495595ca 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/FragmentShadingRateAttachmentInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/FragmentShadingRateAttachmentInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkFragmentShadingRateAttachmentInfoKHR")] - public unsafe partial struct FragmentShadingRateAttachmentInfoKHR + public unsafe partial struct FragmentShadingRateAttachmentInfoKHR : IStructuredType { public FragmentShadingRateAttachmentInfoKHR ( @@ -68,5 +68,11 @@ public FragmentShadingRateAttachmentInfoKHR [NativeName("Type.Name", "VkExtent2D")] [NativeName("Name", "shadingRateAttachmentTexelSize")] public Extent2D ShadingRateAttachmentTexelSize; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.FragmentShadingRateAttachmentInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferAttachmentImageInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferAttachmentImageInfo.gen.cs index e4335223e8..8e7a02abdc 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferAttachmentImageInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferAttachmentImageInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkFramebufferAttachmentImageInfo")] - public unsafe partial struct FramebufferAttachmentImageInfo + public unsafe partial struct FramebufferAttachmentImageInfo : IStructuredType { public FramebufferAttachmentImageInfo ( @@ -123,5 +123,11 @@ public FramebufferAttachmentImageInfo [NativeName("Type.Name", "VkFormat")] [NativeName("Name", "pViewFormats")] public Format* PViewFormats; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.FramebufferAttachmentImageInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferAttachmentImageInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferAttachmentImageInfoKHR.gen.cs index b6e72f3133..b439251b17 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferAttachmentImageInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferAttachmentImageInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkFramebufferAttachmentImageInfoKHR")] - public unsafe partial struct FramebufferAttachmentImageInfoKHR + public unsafe partial struct FramebufferAttachmentImageInfoKHR : IStructuredType { public FramebufferAttachmentImageInfoKHR ( @@ -123,5 +123,11 @@ public FramebufferAttachmentImageInfoKHR [NativeName("Type.Name", "VkFormat")] [NativeName("Name", "pViewFormats")] public Format* PViewFormats; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.FramebufferAttachmentImageInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferAttachmentsCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferAttachmentsCreateInfo.gen.cs index 8ee80a493c..fc46df2edc 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferAttachmentsCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferAttachmentsCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkFramebufferAttachmentsCreateInfo")] - public unsafe partial struct FramebufferAttachmentsCreateInfo + public unsafe partial struct FramebufferAttachmentsCreateInfo : IStructuredType { public FramebufferAttachmentsCreateInfo ( @@ -68,5 +68,11 @@ public FramebufferAttachmentsCreateInfo [NativeName("Type.Name", "VkFramebufferAttachmentImageInfo")] [NativeName("Name", "pAttachmentImageInfos")] public FramebufferAttachmentImageInfo* PAttachmentImageInfos; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.FramebufferAttachmentsCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferAttachmentsCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferAttachmentsCreateInfoKHR.gen.cs index d563fe274e..ae02f5b67f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferAttachmentsCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferAttachmentsCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkFramebufferAttachmentsCreateInfoKHR")] - public unsafe partial struct FramebufferAttachmentsCreateInfoKHR + public unsafe partial struct FramebufferAttachmentsCreateInfoKHR : IStructuredType { public FramebufferAttachmentsCreateInfoKHR ( @@ -68,5 +68,11 @@ public FramebufferAttachmentsCreateInfoKHR [NativeName("Type.Name", "VkFramebufferAttachmentImageInfo")] [NativeName("Name", "pAttachmentImageInfos")] public FramebufferAttachmentImageInfo* PAttachmentImageInfos; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.FramebufferAttachmentsCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferCreateInfo.gen.cs index 35fc19220b..50df07b41d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkFramebufferCreateInfo")] - public unsafe partial struct FramebufferCreateInfo + public unsafe partial struct FramebufferCreateInfo : IStructuredType { public FramebufferCreateInfo ( @@ -123,5 +123,11 @@ public FramebufferCreateInfo [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "layers")] public uint Layers; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.FramebufferCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferMixedSamplesCombinationNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferMixedSamplesCombinationNV.gen.cs index c8a9bce4da..d7a3d9134f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferMixedSamplesCombinationNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferMixedSamplesCombinationNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkFramebufferMixedSamplesCombinationNV")] - public unsafe partial struct FramebufferMixedSamplesCombinationNV + public unsafe partial struct FramebufferMixedSamplesCombinationNV : IStructuredType { public FramebufferMixedSamplesCombinationNV ( @@ -90,5 +90,11 @@ public FramebufferMixedSamplesCombinationNV [NativeName("Type.Name", "VkSampleCountFlags")] [NativeName("Name", "colorSamples")] public SampleCountFlags ColorSamples; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.FramebufferMixedSamplesCombinationNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/GeneratedCommandsInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/GeneratedCommandsInfoNV.gen.cs index 3bfc6296c8..6f68889009 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/GeneratedCommandsInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/GeneratedCommandsInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkGeneratedCommandsInfoNV")] - public unsafe partial struct GeneratedCommandsInfoNV + public unsafe partial struct GeneratedCommandsInfoNV : IStructuredType { public GeneratedCommandsInfoNV ( @@ -189,5 +189,11 @@ public GeneratedCommandsInfoNV [NativeName("Type.Name", "VkDeviceSize")] [NativeName("Name", "sequencesIndexOffset")] public ulong SequencesIndexOffset; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.GeneratedCommandsInfoNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/GeneratedCommandsMemoryRequirementsInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/GeneratedCommandsMemoryRequirementsInfoNV.gen.cs index 08407c19c7..524d793425 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/GeneratedCommandsMemoryRequirementsInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/GeneratedCommandsMemoryRequirementsInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkGeneratedCommandsMemoryRequirementsInfoNV")] - public unsafe partial struct GeneratedCommandsMemoryRequirementsInfoNV + public unsafe partial struct GeneratedCommandsMemoryRequirementsInfoNV : IStructuredType { public GeneratedCommandsMemoryRequirementsInfoNV ( @@ -90,5 +90,11 @@ public GeneratedCommandsMemoryRequirementsInfoNV [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "maxSequencesCount")] public uint MaxSequencesCount; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.GeneratedCommandsMemoryRequirementsInfoNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/GeometryAABBNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/GeometryAABBNV.gen.cs index 4a83af145b..7c89e4f514 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/GeometryAABBNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/GeometryAABBNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkGeometryAABBNV")] - public unsafe partial struct GeometryAABBNV + public unsafe partial struct GeometryAABBNV : IStructuredType { public GeometryAABBNV ( @@ -90,5 +90,11 @@ public GeometryAABBNV [NativeName("Type.Name", "VkDeviceSize")] [NativeName("Name", "offset")] public ulong Offset; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.GeometryAabbNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/GeometryNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/GeometryNV.gen.cs index 1f6889102f..32993023d8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/GeometryNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/GeometryNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkGeometryNV")] - public unsafe partial struct GeometryNV + public unsafe partial struct GeometryNV : IStructuredType { public GeometryNV ( @@ -79,5 +79,11 @@ public GeometryNV [NativeName("Type.Name", "VkGeometryFlagsKHR")] [NativeName("Name", "flags")] public GeometryFlagsKHR Flags; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.GeometryNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/GeometryTrianglesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/GeometryTrianglesNV.gen.cs index d59d5a56c3..86e154db99 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/GeometryTrianglesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/GeometryTrianglesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkGeometryTrianglesNV")] - public unsafe partial struct GeometryTrianglesNV + public unsafe partial struct GeometryTrianglesNV : IStructuredType { public GeometryTrianglesNV ( @@ -167,5 +167,11 @@ public GeometryTrianglesNV [NativeName("Type.Name", "VkDeviceSize")] [NativeName("Name", "transformOffset")] public ulong TransformOffset; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.GeometryTrianglesNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/GraphicsPipelineCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/GraphicsPipelineCreateInfo.gen.cs index f97a24a86f..0ad7770200 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/GraphicsPipelineCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/GraphicsPipelineCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkGraphicsPipelineCreateInfo")] - public unsafe partial struct GraphicsPipelineCreateInfo + public unsafe partial struct GraphicsPipelineCreateInfo : IStructuredType { public GraphicsPipelineCreateInfo ( @@ -233,5 +233,11 @@ public GraphicsPipelineCreateInfo [NativeName("Type.Name", "int32_t")] [NativeName("Name", "basePipelineIndex")] public int BasePipelineIndex; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.GraphicsPipelineCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/GraphicsPipelineShaderGroupsCreateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/GraphicsPipelineShaderGroupsCreateInfoNV.gen.cs index 1348ade6f5..1551d5b26c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/GraphicsPipelineShaderGroupsCreateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/GraphicsPipelineShaderGroupsCreateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkGraphicsPipelineShaderGroupsCreateInfoNV")] - public unsafe partial struct GraphicsPipelineShaderGroupsCreateInfoNV + public unsafe partial struct GraphicsPipelineShaderGroupsCreateInfoNV : IStructuredType { public GraphicsPipelineShaderGroupsCreateInfoNV ( @@ -90,5 +90,11 @@ public GraphicsPipelineShaderGroupsCreateInfoNV [NativeName("Type.Name", "VkPipeline")] [NativeName("Name", "pPipelines")] public Pipeline* PPipelines; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.GraphicsPipelineShaderGroupsCreateInfoNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/GraphicsShaderGroupCreateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/GraphicsShaderGroupCreateInfoNV.gen.cs index c7d6b26c87..ea50a6f064 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/GraphicsShaderGroupCreateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/GraphicsShaderGroupCreateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkGraphicsShaderGroupCreateInfoNV")] - public unsafe partial struct GraphicsShaderGroupCreateInfoNV + public unsafe partial struct GraphicsShaderGroupCreateInfoNV : IStructuredType { public GraphicsShaderGroupCreateInfoNV ( @@ -90,5 +90,11 @@ public GraphicsShaderGroupCreateInfoNV [NativeName("Type.Name", "VkPipelineTessellationStateCreateInfo")] [NativeName("Name", "pTessellationState")] public PipelineTessellationStateCreateInfo* PTessellationState; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.GraphicsShaderGroupCreateInfoNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/HdrMetadataEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/HdrMetadataEXT.gen.cs index bb02d2673d..048accdeae 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/HdrMetadataEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/HdrMetadataEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkHdrMetadataEXT")] - public unsafe partial struct HdrMetadataEXT + public unsafe partial struct HdrMetadataEXT : IStructuredType { public HdrMetadataEXT ( @@ -134,5 +134,11 @@ public HdrMetadataEXT [NativeName("Type.Name", "float")] [NativeName("Name", "maxFrameAverageLightLevel")] public float MaxFrameAverageLightLevel; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.HdrMetadataExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/HeadlessSurfaceCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/HeadlessSurfaceCreateInfoEXT.gen.cs index 7f571ad7ce..d7f4786aa4 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/HeadlessSurfaceCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/HeadlessSurfaceCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkHeadlessSurfaceCreateInfoEXT")] - public unsafe partial struct HeadlessSurfaceCreateInfoEXT + public unsafe partial struct HeadlessSurfaceCreateInfoEXT : IStructuredType { public HeadlessSurfaceCreateInfoEXT ( @@ -57,5 +57,11 @@ public HeadlessSurfaceCreateInfoEXT [NativeName("Type.Name", "VkHeadlessSurfaceCreateFlagsEXT")] [NativeName("Name", "flags")] public uint Flags; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.HeadlessSurfaceCreateInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/IOSSurfaceCreateInfoMVK.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/IOSSurfaceCreateInfoMVK.gen.cs index c50183591e..08aca2cba3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/IOSSurfaceCreateInfoMVK.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/IOSSurfaceCreateInfoMVK.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkIOSSurfaceCreateInfoMVK")] - public unsafe partial struct IOSSurfaceCreateInfoMVK + public unsafe partial struct IOSSurfaceCreateInfoMVK : IStructuredType { public IOSSurfaceCreateInfoMVK ( @@ -68,5 +68,11 @@ public IOSSurfaceCreateInfoMVK [NativeName("Type.Name", "void")] [NativeName("Name", "pView")] public void* PView; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.IosSurfaceCreateInfoMvk; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageBlit2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageBlit2KHR.gen.cs index 8de70ae9ba..bfcc734a02 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageBlit2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageBlit2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageBlit2KHR")] - public unsafe partial struct ImageBlit2KHR + public unsafe partial struct ImageBlit2KHR : IStructuredType { public ImageBlit2KHR ( @@ -132,5 +132,11 @@ public Span AsSpan() #endif } + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImageBlit2Khr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageConstraintsInfoFUCHSIA.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageConstraintsInfoFUCHSIA.gen.cs index cf485ba457..e1f8147677 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageConstraintsInfoFUCHSIA.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageConstraintsInfoFUCHSIA.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageConstraintsInfoFUCHSIA")] - public unsafe partial struct ImageConstraintsInfoFUCHSIA + public unsafe partial struct ImageConstraintsInfoFUCHSIA : IStructuredType { public ImageConstraintsInfoFUCHSIA ( @@ -90,5 +90,11 @@ public ImageConstraintsInfoFUCHSIA [NativeName("Type.Name", "VkImageConstraintsInfoFlagsFUCHSIA")] [NativeName("Name", "flags")] public ImageConstraintsInfoFlagsFUCHSIA Flags; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImageConstraintsInfoFuchsia; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageCopy2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageCopy2KHR.gen.cs index f27e5660d3..43d3e4e8ba 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageCopy2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageCopy2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageCopy2KHR")] - public unsafe partial struct ImageCopy2KHR + public unsafe partial struct ImageCopy2KHR : IStructuredType { public ImageCopy2KHR ( @@ -101,5 +101,11 @@ public ImageCopy2KHR [NativeName("Type.Name", "VkExtent3D")] [NativeName("Name", "extent")] public Extent3D Extent; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImageCopy2Khr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageCreateInfo.gen.cs index ba75174473..29c60d65ce 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageCreateInfo")] - public unsafe partial struct ImageCreateInfo + public unsafe partial struct ImageCreateInfo : IStructuredType { public ImageCreateInfo ( @@ -189,5 +189,11 @@ public ImageCreateInfo [NativeName("Type.Name", "VkImageLayout")] [NativeName("Name", "initialLayout")] public ImageLayout InitialLayout; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImageCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageDrmFormatModifierExplicitCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageDrmFormatModifierExplicitCreateInfoEXT.gen.cs index 5db9477040..a23316d218 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageDrmFormatModifierExplicitCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageDrmFormatModifierExplicitCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageDrmFormatModifierExplicitCreateInfoEXT")] - public unsafe partial struct ImageDrmFormatModifierExplicitCreateInfoEXT + public unsafe partial struct ImageDrmFormatModifierExplicitCreateInfoEXT : IStructuredType { public ImageDrmFormatModifierExplicitCreateInfoEXT ( @@ -79,5 +79,11 @@ public ImageDrmFormatModifierExplicitCreateInfoEXT [NativeName("Type.Name", "VkSubresourceLayout")] [NativeName("Name", "pPlaneLayouts")] public SubresourceLayout* PPlaneLayouts; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImageDrmFormatModifierExplicitCreateInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageDrmFormatModifierListCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageDrmFormatModifierListCreateInfoEXT.gen.cs index de075b7665..530e3322ad 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageDrmFormatModifierListCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageDrmFormatModifierListCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageDrmFormatModifierListCreateInfoEXT")] - public unsafe partial struct ImageDrmFormatModifierListCreateInfoEXT + public unsafe partial struct ImageDrmFormatModifierListCreateInfoEXT : IStructuredType { public ImageDrmFormatModifierListCreateInfoEXT ( @@ -68,5 +68,11 @@ public ImageDrmFormatModifierListCreateInfoEXT [NativeName("Type.Name", "uint64_t")] [NativeName("Name", "pDrmFormatModifiers")] public ulong* PDrmFormatModifiers; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImageDrmFormatModifierListCreateInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageDrmFormatModifierPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageDrmFormatModifierPropertiesEXT.gen.cs index 80b459b479..5ec4113f3b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageDrmFormatModifierPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageDrmFormatModifierPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageDrmFormatModifierPropertiesEXT")] - public unsafe partial struct ImageDrmFormatModifierPropertiesEXT + public unsafe partial struct ImageDrmFormatModifierPropertiesEXT : IStructuredType { public ImageDrmFormatModifierPropertiesEXT ( @@ -57,5 +57,11 @@ public ImageDrmFormatModifierPropertiesEXT [NativeName("Type.Name", "uint64_t")] [NativeName("Name", "drmFormatModifier")] public ulong DrmFormatModifier; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImageDrmFormatModifierPropertiesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatConstraintsInfoFUCHSIA.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatConstraintsInfoFUCHSIA.gen.cs index 331fe6e664..b91b097793 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatConstraintsInfoFUCHSIA.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatConstraintsInfoFUCHSIA.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageFormatConstraintsInfoFUCHSIA")] - public unsafe partial struct ImageFormatConstraintsInfoFUCHSIA + public unsafe partial struct ImageFormatConstraintsInfoFUCHSIA : IStructuredType { public ImageFormatConstraintsInfoFUCHSIA ( @@ -112,5 +112,11 @@ public ImageFormatConstraintsInfoFUCHSIA [NativeName("Type.Name", "VkSysmemColorSpaceFUCHSIA")] [NativeName("Name", "pColorSpaces")] public SysmemColorSpaceFUCHSIA* PColorSpaces; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImageFormatConstraintsInfoFuchsia; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatListCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatListCreateInfo.gen.cs index e78df4a6aa..0c663ce8db 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatListCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatListCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageFormatListCreateInfo")] - public unsafe partial struct ImageFormatListCreateInfo + public unsafe partial struct ImageFormatListCreateInfo : IStructuredType { public ImageFormatListCreateInfo ( @@ -68,5 +68,11 @@ public ImageFormatListCreateInfo [NativeName("Type.Name", "VkFormat")] [NativeName("Name", "pViewFormats")] public Format* PViewFormats; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImageFormatListCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatListCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatListCreateInfoKHR.gen.cs index 33d4830815..caf642efbc 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatListCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatListCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageFormatListCreateInfoKHR")] - public unsafe partial struct ImageFormatListCreateInfoKHR + public unsafe partial struct ImageFormatListCreateInfoKHR : IStructuredType { public ImageFormatListCreateInfoKHR ( @@ -68,5 +68,11 @@ public ImageFormatListCreateInfoKHR [NativeName("Type.Name", "VkFormat")] [NativeName("Name", "pViewFormats")] public Format* PViewFormats; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImageFormatListCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatProperties2.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatProperties2.gen.cs index f8cc35c162..b7bce57b6f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatProperties2.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatProperties2.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageFormatProperties2")] - public unsafe partial struct ImageFormatProperties2 + public unsafe partial struct ImageFormatProperties2 : IStructuredType { public ImageFormatProperties2 ( @@ -57,5 +57,11 @@ public ImageFormatProperties2 [NativeName("Type.Name", "VkImageFormatProperties")] [NativeName("Name", "imageFormatProperties")] public ImageFormatProperties ImageFormatProperties; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImageFormatProperties2; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatProperties2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatProperties2KHR.gen.cs index 3e1f61fb22..737db07ac7 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatProperties2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatProperties2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageFormatProperties2KHR")] - public unsafe partial struct ImageFormatProperties2KHR + public unsafe partial struct ImageFormatProperties2KHR : IStructuredType { public ImageFormatProperties2KHR ( @@ -57,5 +57,11 @@ public ImageFormatProperties2KHR [NativeName("Type.Name", "VkImageFormatProperties")] [NativeName("Name", "imageFormatProperties")] public ImageFormatProperties ImageFormatProperties; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImageFormatProperties2; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageMemoryBarrier.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageMemoryBarrier.gen.cs index 474748752e..292c451d63 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageMemoryBarrier.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageMemoryBarrier.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageMemoryBarrier")] - public unsafe partial struct ImageMemoryBarrier + public unsafe partial struct ImageMemoryBarrier : IStructuredType { public ImageMemoryBarrier ( @@ -134,5 +134,11 @@ public ImageMemoryBarrier [NativeName("Type.Name", "VkImageSubresourceRange")] [NativeName("Name", "subresourceRange")] public ImageSubresourceRange SubresourceRange; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImageMemoryBarrier; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageMemoryBarrier2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageMemoryBarrier2KHR.gen.cs index aa9a8b6a64..ae6f7f621e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageMemoryBarrier2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageMemoryBarrier2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageMemoryBarrier2KHR")] - public unsafe partial struct ImageMemoryBarrier2KHR + public unsafe partial struct ImageMemoryBarrier2KHR : IStructuredType { public ImageMemoryBarrier2KHR ( @@ -156,5 +156,11 @@ public ImageMemoryBarrier2KHR [NativeName("Type.Name", "VkImageSubresourceRange")] [NativeName("Name", "subresourceRange")] public ImageSubresourceRange SubresourceRange; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImageMemoryBarrier2Khr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageMemoryRequirementsInfo2.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageMemoryRequirementsInfo2.gen.cs index 19fa8973a5..2491eebec5 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageMemoryRequirementsInfo2.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageMemoryRequirementsInfo2.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageMemoryRequirementsInfo2")] - public unsafe partial struct ImageMemoryRequirementsInfo2 + public unsafe partial struct ImageMemoryRequirementsInfo2 : IStructuredType { public ImageMemoryRequirementsInfo2 ( @@ -57,5 +57,11 @@ public ImageMemoryRequirementsInfo2 [NativeName("Type.Name", "VkImage")] [NativeName("Name", "image")] public Image Image; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImageMemoryRequirementsInfo2; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageMemoryRequirementsInfo2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageMemoryRequirementsInfo2KHR.gen.cs index 2fcb389b2b..0bfd7edac0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageMemoryRequirementsInfo2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageMemoryRequirementsInfo2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageMemoryRequirementsInfo2KHR")] - public unsafe partial struct ImageMemoryRequirementsInfo2KHR + public unsafe partial struct ImageMemoryRequirementsInfo2KHR : IStructuredType { public ImageMemoryRequirementsInfo2KHR ( @@ -57,5 +57,11 @@ public ImageMemoryRequirementsInfo2KHR [NativeName("Type.Name", "VkImage")] [NativeName("Name", "image")] public Image Image; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImageMemoryRequirementsInfo2; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImagePipeSurfaceCreateInfoFUCHSIA.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImagePipeSurfaceCreateInfoFUCHSIA.gen.cs index f1bf048ab9..d68ea72320 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImagePipeSurfaceCreateInfoFUCHSIA.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImagePipeSurfaceCreateInfoFUCHSIA.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImagePipeSurfaceCreateInfoFUCHSIA")] - public unsafe partial struct ImagePipeSurfaceCreateInfoFUCHSIA + public unsafe partial struct ImagePipeSurfaceCreateInfoFUCHSIA : IStructuredType { public ImagePipeSurfaceCreateInfoFUCHSIA ( @@ -68,5 +68,11 @@ public ImagePipeSurfaceCreateInfoFUCHSIA [NativeName("Type.Name", "zx_handle_t")] [NativeName("Name", "imagePipeHandle")] public nint ImagePipeHandle; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImagepipeSurfaceCreateInfoFuchsia; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImagePlaneMemoryRequirementsInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImagePlaneMemoryRequirementsInfo.gen.cs index 53cb3e63e8..8033aa109b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImagePlaneMemoryRequirementsInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImagePlaneMemoryRequirementsInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImagePlaneMemoryRequirementsInfo")] - public unsafe partial struct ImagePlaneMemoryRequirementsInfo + public unsafe partial struct ImagePlaneMemoryRequirementsInfo : IStructuredType { public ImagePlaneMemoryRequirementsInfo ( @@ -57,5 +57,11 @@ public ImagePlaneMemoryRequirementsInfo [NativeName("Type.Name", "VkImageAspectFlagBits")] [NativeName("Name", "planeAspect")] public ImageAspectFlags PlaneAspect; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImagePlaneMemoryRequirementsInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImagePlaneMemoryRequirementsInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImagePlaneMemoryRequirementsInfoKHR.gen.cs index 323b65a094..3f99929336 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImagePlaneMemoryRequirementsInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImagePlaneMemoryRequirementsInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImagePlaneMemoryRequirementsInfoKHR")] - public unsafe partial struct ImagePlaneMemoryRequirementsInfoKHR + public unsafe partial struct ImagePlaneMemoryRequirementsInfoKHR : IStructuredType { public ImagePlaneMemoryRequirementsInfoKHR ( @@ -57,5 +57,11 @@ public ImagePlaneMemoryRequirementsInfoKHR [NativeName("Type.Name", "VkImageAspectFlagBits")] [NativeName("Name", "planeAspect")] public ImageAspectFlags PlaneAspect; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImagePlaneMemoryRequirementsInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageResolve2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageResolve2KHR.gen.cs index 4f3428d35a..6adb871a6e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageResolve2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageResolve2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageResolve2KHR")] - public unsafe partial struct ImageResolve2KHR + public unsafe partial struct ImageResolve2KHR : IStructuredType { public ImageResolve2KHR ( @@ -101,5 +101,11 @@ public ImageResolve2KHR [NativeName("Type.Name", "VkExtent3D")] [NativeName("Name", "extent")] public Extent3D Extent; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImageResolve2Khr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageSparseMemoryRequirementsInfo2.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageSparseMemoryRequirementsInfo2.gen.cs index 8466befee8..0eb85c8b15 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageSparseMemoryRequirementsInfo2.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageSparseMemoryRequirementsInfo2.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageSparseMemoryRequirementsInfo2")] - public unsafe partial struct ImageSparseMemoryRequirementsInfo2 + public unsafe partial struct ImageSparseMemoryRequirementsInfo2 : IStructuredType { public ImageSparseMemoryRequirementsInfo2 ( @@ -57,5 +57,11 @@ public ImageSparseMemoryRequirementsInfo2 [NativeName("Type.Name", "VkImage")] [NativeName("Name", "image")] public Image Image; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImageSparseMemoryRequirementsInfo2; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageSparseMemoryRequirementsInfo2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageSparseMemoryRequirementsInfo2KHR.gen.cs index cc6a00b967..16b7f624c9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageSparseMemoryRequirementsInfo2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageSparseMemoryRequirementsInfo2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageSparseMemoryRequirementsInfo2KHR")] - public unsafe partial struct ImageSparseMemoryRequirementsInfo2KHR + public unsafe partial struct ImageSparseMemoryRequirementsInfo2KHR : IStructuredType { public ImageSparseMemoryRequirementsInfo2KHR ( @@ -57,5 +57,11 @@ public ImageSparseMemoryRequirementsInfo2KHR [NativeName("Type.Name", "VkImage")] [NativeName("Name", "image")] public Image Image; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImageSparseMemoryRequirementsInfo2; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageStencilUsageCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageStencilUsageCreateInfo.gen.cs index 2feaa37566..b70d8ef20a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageStencilUsageCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageStencilUsageCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageStencilUsageCreateInfo")] - public unsafe partial struct ImageStencilUsageCreateInfo + public unsafe partial struct ImageStencilUsageCreateInfo : IStructuredType { public ImageStencilUsageCreateInfo ( @@ -57,5 +57,11 @@ public ImageStencilUsageCreateInfo [NativeName("Type.Name", "VkImageUsageFlags")] [NativeName("Name", "stencilUsage")] public ImageUsageFlags StencilUsage; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImageStencilUsageCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageStencilUsageCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageStencilUsageCreateInfoEXT.gen.cs index 72a4cf1bb8..449fddbebc 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageStencilUsageCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageStencilUsageCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageStencilUsageCreateInfoEXT")] - public unsafe partial struct ImageStencilUsageCreateInfoEXT + public unsafe partial struct ImageStencilUsageCreateInfoEXT : IStructuredType { public ImageStencilUsageCreateInfoEXT ( @@ -57,5 +57,11 @@ public ImageStencilUsageCreateInfoEXT [NativeName("Type.Name", "VkImageUsageFlags")] [NativeName("Name", "stencilUsage")] public ImageUsageFlags StencilUsage; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImageStencilUsageCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageSwapchainCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageSwapchainCreateInfoKHR.gen.cs index 397b597807..c51cd29a50 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageSwapchainCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageSwapchainCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageSwapchainCreateInfoKHR")] - public unsafe partial struct ImageSwapchainCreateInfoKHR + public unsafe partial struct ImageSwapchainCreateInfoKHR : IStructuredType { public ImageSwapchainCreateInfoKHR ( @@ -57,5 +57,11 @@ public ImageSwapchainCreateInfoKHR [NativeName("Type.Name", "VkSwapchainKHR")] [NativeName("Name", "swapchain")] public SwapchainKHR Swapchain; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImageSwapchainCreateInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewASTCDecodeModeEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewASTCDecodeModeEXT.gen.cs index aa72a8087e..7d8515e41d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewASTCDecodeModeEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewASTCDecodeModeEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageViewASTCDecodeModeEXT")] - public unsafe partial struct ImageViewASTCDecodeModeEXT + public unsafe partial struct ImageViewASTCDecodeModeEXT : IStructuredType { public ImageViewASTCDecodeModeEXT ( @@ -57,5 +57,11 @@ public ImageViewASTCDecodeModeEXT [NativeName("Type.Name", "VkFormat")] [NativeName("Name", "decodeMode")] public Format DecodeMode; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImageViewAstcDecodeModeExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewAddressPropertiesNVX.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewAddressPropertiesNVX.gen.cs index 71e577e151..188411ff05 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewAddressPropertiesNVX.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewAddressPropertiesNVX.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageViewAddressPropertiesNVX")] - public unsafe partial struct ImageViewAddressPropertiesNVX + public unsafe partial struct ImageViewAddressPropertiesNVX : IStructuredType { public ImageViewAddressPropertiesNVX ( @@ -68,5 +68,11 @@ public ImageViewAddressPropertiesNVX [NativeName("Type.Name", "VkDeviceSize")] [NativeName("Name", "size")] public ulong Size; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImageViewAddressPropertiesNvx; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewCreateInfo.gen.cs index 858283299f..1dfc2b0726 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageViewCreateInfo")] - public unsafe partial struct ImageViewCreateInfo + public unsafe partial struct ImageViewCreateInfo : IStructuredType { public ImageViewCreateInfo ( @@ -112,5 +112,11 @@ public ImageViewCreateInfo [NativeName("Type.Name", "VkImageSubresourceRange")] [NativeName("Name", "subresourceRange")] public ImageSubresourceRange SubresourceRange; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImageViewCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewHandleInfoNVX.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewHandleInfoNVX.gen.cs index 91dc4eb119..9bd62f9333 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewHandleInfoNVX.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewHandleInfoNVX.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageViewHandleInfoNVX")] - public unsafe partial struct ImageViewHandleInfoNVX + public unsafe partial struct ImageViewHandleInfoNVX : IStructuredType { public ImageViewHandleInfoNVX ( @@ -79,5 +79,11 @@ public ImageViewHandleInfoNVX [NativeName("Type.Name", "VkSampler")] [NativeName("Name", "sampler")] public Sampler Sampler; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImageViewHandleInfoNvx; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewUsageCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewUsageCreateInfo.gen.cs index 14f155b444..a3dd0ac294 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewUsageCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewUsageCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageViewUsageCreateInfo")] - public unsafe partial struct ImageViewUsageCreateInfo + public unsafe partial struct ImageViewUsageCreateInfo : IStructuredType { public ImageViewUsageCreateInfo ( @@ -57,5 +57,11 @@ public ImageViewUsageCreateInfo [NativeName("Type.Name", "VkImageUsageFlags")] [NativeName("Name", "usage")] public ImageUsageFlags Usage; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImageViewUsageCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewUsageCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewUsageCreateInfoKHR.gen.cs index c556a2e35b..2b7e3e93f3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewUsageCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewUsageCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageViewUsageCreateInfoKHR")] - public unsafe partial struct ImageViewUsageCreateInfoKHR + public unsafe partial struct ImageViewUsageCreateInfoKHR : IStructuredType { public ImageViewUsageCreateInfoKHR ( @@ -57,5 +57,11 @@ public ImageViewUsageCreateInfoKHR [NativeName("Type.Name", "VkImageUsageFlags")] [NativeName("Name", "usage")] public ImageUsageFlags Usage; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImageViewUsageCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportAndroidHardwareBufferInfoANDROID.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportAndroidHardwareBufferInfoANDROID.gen.cs index d8f6aa12e8..85b4cd21b1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportAndroidHardwareBufferInfoANDROID.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportAndroidHardwareBufferInfoANDROID.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImportAndroidHardwareBufferInfoANDROID")] - public unsafe partial struct ImportAndroidHardwareBufferInfoANDROID + public unsafe partial struct ImportAndroidHardwareBufferInfoANDROID : IStructuredType { public ImportAndroidHardwareBufferInfoANDROID ( @@ -57,5 +57,11 @@ public ImportAndroidHardwareBufferInfoANDROID [NativeName("Type.Name", "AHardwareBuffer")] [NativeName("Name", "buffer")] public nint* Buffer; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImportAndroidHardwareBufferInfoAndroid; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportFenceFdInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportFenceFdInfoKHR.gen.cs index 7e6789e497..04bdda066a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportFenceFdInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportFenceFdInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImportFenceFdInfoKHR")] - public unsafe partial struct ImportFenceFdInfoKHR + public unsafe partial struct ImportFenceFdInfoKHR : IStructuredType { public ImportFenceFdInfoKHR ( @@ -90,5 +90,11 @@ public ImportFenceFdInfoKHR [NativeName("Type.Name", "int")] [NativeName("Name", "fd")] public int Fd; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImportFenceFDInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportFenceWin32HandleInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportFenceWin32HandleInfoKHR.gen.cs index 0339e4fa24..f730c0d3f2 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportFenceWin32HandleInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportFenceWin32HandleInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImportFenceWin32HandleInfoKHR")] - public unsafe partial struct ImportFenceWin32HandleInfoKHR + public unsafe partial struct ImportFenceWin32HandleInfoKHR : IStructuredType { public ImportFenceWin32HandleInfoKHR ( @@ -101,5 +101,11 @@ public ImportFenceWin32HandleInfoKHR [NativeName("Type.Name", "LPCWSTR")] [NativeName("Name", "name")] public nint Name; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImportFenceWin32HandleInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryBufferCollectionFUCHSIA.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryBufferCollectionFUCHSIA.gen.cs index 80a2d135ab..78b6776548 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryBufferCollectionFUCHSIA.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryBufferCollectionFUCHSIA.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImportMemoryBufferCollectionFUCHSIA")] - public unsafe partial struct ImportMemoryBufferCollectionFUCHSIA + public unsafe partial struct ImportMemoryBufferCollectionFUCHSIA : IStructuredType { public ImportMemoryBufferCollectionFUCHSIA ( @@ -68,5 +68,11 @@ public ImportMemoryBufferCollectionFUCHSIA [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "index")] public uint Index; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImportMemoryBufferCollectionFuchsia; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryFdInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryFdInfoKHR.gen.cs index def0ab1985..2d08965aa0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryFdInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryFdInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImportMemoryFdInfoKHR")] - public unsafe partial struct ImportMemoryFdInfoKHR + public unsafe partial struct ImportMemoryFdInfoKHR : IStructuredType { public ImportMemoryFdInfoKHR ( @@ -68,5 +68,11 @@ public ImportMemoryFdInfoKHR [NativeName("Type.Name", "int")] [NativeName("Name", "fd")] public int Fd; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImportMemoryFDInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryHostPointerInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryHostPointerInfoEXT.gen.cs index 0255955dea..f33e9b66a8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryHostPointerInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryHostPointerInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImportMemoryHostPointerInfoEXT")] - public unsafe partial struct ImportMemoryHostPointerInfoEXT + public unsafe partial struct ImportMemoryHostPointerInfoEXT : IStructuredType { public ImportMemoryHostPointerInfoEXT ( @@ -68,5 +68,11 @@ public ImportMemoryHostPointerInfoEXT [NativeName("Type.Name", "void")] [NativeName("Name", "pHostPointer")] public void* PHostPointer; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImportMemoryHostPointerInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryWin32HandleInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryWin32HandleInfoKHR.gen.cs index 801296c564..eb66f18e80 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryWin32HandleInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryWin32HandleInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImportMemoryWin32HandleInfoKHR")] - public unsafe partial struct ImportMemoryWin32HandleInfoKHR + public unsafe partial struct ImportMemoryWin32HandleInfoKHR : IStructuredType { public ImportMemoryWin32HandleInfoKHR ( @@ -79,5 +79,11 @@ public ImportMemoryWin32HandleInfoKHR [NativeName("Type.Name", "LPCWSTR")] [NativeName("Name", "name")] public nint Name; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImportMemoryWin32HandleInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryWin32HandleInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryWin32HandleInfoNV.gen.cs index 37338c2efd..22fb605f4a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryWin32HandleInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryWin32HandleInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImportMemoryWin32HandleInfoNV")] - public unsafe partial struct ImportMemoryWin32HandleInfoNV + public unsafe partial struct ImportMemoryWin32HandleInfoNV : IStructuredType { public ImportMemoryWin32HandleInfoNV ( @@ -68,5 +68,11 @@ public ImportMemoryWin32HandleInfoNV [NativeName("Type.Name", "HANDLE")] [NativeName("Name", "handle")] public nint Handle; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImportMemoryWin32HandleInfoNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryZirconHandleInfoFUCHSIA.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryZirconHandleInfoFUCHSIA.gen.cs index d976a49740..94fb320f56 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryZirconHandleInfoFUCHSIA.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryZirconHandleInfoFUCHSIA.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImportMemoryZirconHandleInfoFUCHSIA")] - public unsafe partial struct ImportMemoryZirconHandleInfoFUCHSIA + public unsafe partial struct ImportMemoryZirconHandleInfoFUCHSIA : IStructuredType { public ImportMemoryZirconHandleInfoFUCHSIA ( @@ -68,5 +68,11 @@ public ImportMemoryZirconHandleInfoFUCHSIA [NativeName("Type.Name", "zx_handle_t")] [NativeName("Name", "handle")] public nint Handle; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImportMemoryZirconHandleInfoFuchsia; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportSemaphoreFdInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportSemaphoreFdInfoKHR.gen.cs index 71d8b56932..63bc003152 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportSemaphoreFdInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportSemaphoreFdInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImportSemaphoreFdInfoKHR")] - public unsafe partial struct ImportSemaphoreFdInfoKHR + public unsafe partial struct ImportSemaphoreFdInfoKHR : IStructuredType { public ImportSemaphoreFdInfoKHR ( @@ -90,5 +90,11 @@ public ImportSemaphoreFdInfoKHR [NativeName("Type.Name", "int")] [NativeName("Name", "fd")] public int Fd; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImportSemaphoreFDInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportSemaphoreWin32HandleInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportSemaphoreWin32HandleInfoKHR.gen.cs index bfdf714ef5..ef3591a6b6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportSemaphoreWin32HandleInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportSemaphoreWin32HandleInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImportSemaphoreWin32HandleInfoKHR")] - public unsafe partial struct ImportSemaphoreWin32HandleInfoKHR + public unsafe partial struct ImportSemaphoreWin32HandleInfoKHR : IStructuredType { public ImportSemaphoreWin32HandleInfoKHR ( @@ -101,5 +101,11 @@ public ImportSemaphoreWin32HandleInfoKHR [NativeName("Type.Name", "LPCWSTR")] [NativeName("Name", "name")] public nint Name; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImportSemaphoreWin32HandleInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportSemaphoreZirconHandleInfoFUCHSIA.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportSemaphoreZirconHandleInfoFUCHSIA.gen.cs index b5614c1119..cfdeebadf7 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportSemaphoreZirconHandleInfoFUCHSIA.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportSemaphoreZirconHandleInfoFUCHSIA.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImportSemaphoreZirconHandleInfoFUCHSIA")] - public unsafe partial struct ImportSemaphoreZirconHandleInfoFUCHSIA + public unsafe partial struct ImportSemaphoreZirconHandleInfoFUCHSIA : IStructuredType { public ImportSemaphoreZirconHandleInfoFUCHSIA ( @@ -90,5 +90,11 @@ public ImportSemaphoreZirconHandleInfoFUCHSIA [NativeName("Type.Name", "zx_handle_t")] [NativeName("Name", "zirconHandle")] public nint ZirconHandle; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ImportSemaphoreZirconHandleInfoFuchsia; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/IndirectCommandsLayoutCreateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/IndirectCommandsLayoutCreateInfoNV.gen.cs index 3ed04b5431..dea1b4e56d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/IndirectCommandsLayoutCreateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/IndirectCommandsLayoutCreateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkIndirectCommandsLayoutCreateInfoNV")] - public unsafe partial struct IndirectCommandsLayoutCreateInfoNV + public unsafe partial struct IndirectCommandsLayoutCreateInfoNV : IStructuredType { public IndirectCommandsLayoutCreateInfoNV ( @@ -112,5 +112,11 @@ public IndirectCommandsLayoutCreateInfoNV [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "pStreamStrides")] public uint* PStreamStrides; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.IndirectCommandsLayoutCreateInfoNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/IndirectCommandsLayoutTokenNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/IndirectCommandsLayoutTokenNV.gen.cs index 79c0aad4af..d877eb546c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/IndirectCommandsLayoutTokenNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/IndirectCommandsLayoutTokenNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkIndirectCommandsLayoutTokenNV")] - public unsafe partial struct IndirectCommandsLayoutTokenNV + public unsafe partial struct IndirectCommandsLayoutTokenNV : IStructuredType { public IndirectCommandsLayoutTokenNV ( @@ -189,5 +189,11 @@ public IndirectCommandsLayoutTokenNV [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "pIndexTypeValues")] public uint* PIndexTypeValues; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.IndirectCommandsLayoutTokenNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/InitializePerformanceApiInfoINTEL.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/InitializePerformanceApiInfoINTEL.gen.cs index d67ffda0b2..f172a9cf56 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/InitializePerformanceApiInfoINTEL.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/InitializePerformanceApiInfoINTEL.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkInitializePerformanceApiInfoINTEL")] - public unsafe partial struct InitializePerformanceApiInfoINTEL + public unsafe partial struct InitializePerformanceApiInfoINTEL : IStructuredType { public InitializePerformanceApiInfoINTEL ( @@ -57,5 +57,11 @@ public InitializePerformanceApiInfoINTEL [NativeName("Type.Name", "void")] [NativeName("Name", "pUserData")] public void* PUserData; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.InitializePerformanceApiInfoIntel; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/InstanceCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/InstanceCreateInfo.gen.cs index 3764310cca..57492e135c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/InstanceCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/InstanceCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkInstanceCreateInfo")] - public unsafe partial struct InstanceCreateInfo + public unsafe partial struct InstanceCreateInfo : IStructuredType { public InstanceCreateInfo ( @@ -112,5 +112,11 @@ public InstanceCreateInfo [NativeName("Type.Name", "char")] [NativeName("Name", "ppEnabledExtensionNames")] public byte** PpEnabledExtensionNames; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.InstanceCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MacOSSurfaceCreateInfoMVK.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MacOSSurfaceCreateInfoMVK.gen.cs index 8ee06b1482..97c2766cce 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MacOSSurfaceCreateInfoMVK.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MacOSSurfaceCreateInfoMVK.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMacOSSurfaceCreateInfoMVK")] - public unsafe partial struct MacOSSurfaceCreateInfoMVK + public unsafe partial struct MacOSSurfaceCreateInfoMVK : IStructuredType { public MacOSSurfaceCreateInfoMVK ( @@ -68,5 +68,11 @@ public MacOSSurfaceCreateInfoMVK [NativeName("Type.Name", "void")] [NativeName("Name", "pView")] public void* PView; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.MacosSurfaceCreateInfoMvk; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MappedMemoryRange.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MappedMemoryRange.gen.cs index 77a5f8a49b..8213fc4749 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MappedMemoryRange.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MappedMemoryRange.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMappedMemoryRange")] - public unsafe partial struct MappedMemoryRange + public unsafe partial struct MappedMemoryRange : IStructuredType { public MappedMemoryRange ( @@ -79,5 +79,11 @@ public MappedMemoryRange [NativeName("Type.Name", "VkDeviceSize")] [NativeName("Name", "size")] public ulong Size; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.MappedMemoryRange; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryAllocateFlagsInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryAllocateFlagsInfo.gen.cs index e94f86c417..05a665ad17 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryAllocateFlagsInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryAllocateFlagsInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryAllocateFlagsInfo")] - public unsafe partial struct MemoryAllocateFlagsInfo + public unsafe partial struct MemoryAllocateFlagsInfo : IStructuredType { public MemoryAllocateFlagsInfo ( @@ -68,5 +68,11 @@ public MemoryAllocateFlagsInfo [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "deviceMask")] public uint DeviceMask; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.MemoryAllocateFlagsInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryAllocateFlagsInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryAllocateFlagsInfoKHR.gen.cs index 349215fbab..0e0e043a91 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryAllocateFlagsInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryAllocateFlagsInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryAllocateFlagsInfoKHR")] - public unsafe partial struct MemoryAllocateFlagsInfoKHR + public unsafe partial struct MemoryAllocateFlagsInfoKHR : IStructuredType { public MemoryAllocateFlagsInfoKHR ( @@ -68,5 +68,11 @@ public MemoryAllocateFlagsInfoKHR [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "deviceMask")] public uint DeviceMask; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.MemoryAllocateFlagsInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryAllocateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryAllocateInfo.gen.cs index 578e86d502..32641aa11b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryAllocateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryAllocateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryAllocateInfo")] - public unsafe partial struct MemoryAllocateInfo + public unsafe partial struct MemoryAllocateInfo : IStructuredType { public MemoryAllocateInfo ( @@ -68,5 +68,11 @@ public MemoryAllocateInfo [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "memoryTypeIndex")] public uint MemoryTypeIndex; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.MemoryAllocateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryBarrier.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryBarrier.gen.cs index 5eb1bccc30..8a081b669a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryBarrier.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryBarrier.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryBarrier")] - public unsafe partial struct MemoryBarrier + public unsafe partial struct MemoryBarrier : IStructuredType { public MemoryBarrier ( @@ -68,5 +68,11 @@ public MemoryBarrier [NativeName("Type.Name", "VkAccessFlags")] [NativeName("Name", "dstAccessMask")] public AccessFlags DstAccessMask; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.MemoryBarrier; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryBarrier2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryBarrier2KHR.gen.cs index daee4a7a4e..ec182469f5 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryBarrier2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryBarrier2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryBarrier2KHR")] - public unsafe partial struct MemoryBarrier2KHR + public unsafe partial struct MemoryBarrier2KHR : IStructuredType { public MemoryBarrier2KHR ( @@ -90,5 +90,11 @@ public MemoryBarrier2KHR [NativeName("Type.Name", "VkAccessFlags2KHR")] [NativeName("Name", "dstAccessMask")] public AccessFlags2KHR DstAccessMask; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.MemoryBarrier2Khr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedAllocateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedAllocateInfo.gen.cs index ee5f5fe6e8..e32d25f6d9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedAllocateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedAllocateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryDedicatedAllocateInfo")] - public unsafe partial struct MemoryDedicatedAllocateInfo + public unsafe partial struct MemoryDedicatedAllocateInfo : IStructuredType { public MemoryDedicatedAllocateInfo ( @@ -68,5 +68,11 @@ public MemoryDedicatedAllocateInfo [NativeName("Type.Name", "VkBuffer")] [NativeName("Name", "buffer")] public Buffer Buffer; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.MemoryDedicatedAllocateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedAllocateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedAllocateInfoKHR.gen.cs index 604a6eb9e7..a419054ba4 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedAllocateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedAllocateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryDedicatedAllocateInfoKHR")] - public unsafe partial struct MemoryDedicatedAllocateInfoKHR + public unsafe partial struct MemoryDedicatedAllocateInfoKHR : IStructuredType { public MemoryDedicatedAllocateInfoKHR ( @@ -68,5 +68,11 @@ public MemoryDedicatedAllocateInfoKHR [NativeName("Type.Name", "VkBuffer")] [NativeName("Name", "buffer")] public Buffer Buffer; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.MemoryDedicatedAllocateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedRequirements.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedRequirements.gen.cs index aa07e862df..270a5f4a0f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedRequirements.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedRequirements.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryDedicatedRequirements")] - public unsafe partial struct MemoryDedicatedRequirements + public unsafe partial struct MemoryDedicatedRequirements : IStructuredType { public MemoryDedicatedRequirements ( @@ -68,5 +68,11 @@ public MemoryDedicatedRequirements [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "requiresDedicatedAllocation")] public Bool32 RequiresDedicatedAllocation; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.MemoryDedicatedRequirements; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedRequirementsKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedRequirementsKHR.gen.cs index 59c07f803d..cf26dac9b5 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedRequirementsKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedRequirementsKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryDedicatedRequirementsKHR")] - public unsafe partial struct MemoryDedicatedRequirementsKHR + public unsafe partial struct MemoryDedicatedRequirementsKHR : IStructuredType { public MemoryDedicatedRequirementsKHR ( @@ -68,5 +68,11 @@ public MemoryDedicatedRequirementsKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "requiresDedicatedAllocation")] public Bool32 RequiresDedicatedAllocation; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.MemoryDedicatedRequirements; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryFdPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryFdPropertiesKHR.gen.cs index fb33bbf2a6..d2870b7c63 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryFdPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryFdPropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryFdPropertiesKHR")] - public unsafe partial struct MemoryFdPropertiesKHR + public unsafe partial struct MemoryFdPropertiesKHR : IStructuredType { public MemoryFdPropertiesKHR ( @@ -57,5 +57,11 @@ public MemoryFdPropertiesKHR [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "memoryTypeBits")] public uint MemoryTypeBits; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.MemoryFDPropertiesKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryGetAndroidHardwareBufferInfoANDROID.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryGetAndroidHardwareBufferInfoANDROID.gen.cs index c5a997815e..2c4390be8d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryGetAndroidHardwareBufferInfoANDROID.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryGetAndroidHardwareBufferInfoANDROID.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryGetAndroidHardwareBufferInfoANDROID")] - public unsafe partial struct MemoryGetAndroidHardwareBufferInfoANDROID + public unsafe partial struct MemoryGetAndroidHardwareBufferInfoANDROID : IStructuredType { public MemoryGetAndroidHardwareBufferInfoANDROID ( @@ -57,5 +57,11 @@ public MemoryGetAndroidHardwareBufferInfoANDROID [NativeName("Type.Name", "VkDeviceMemory")] [NativeName("Name", "memory")] public DeviceMemory Memory; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.MemoryGetAndroidHardwareBufferInfoAndroid; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryGetFdInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryGetFdInfoKHR.gen.cs index 411ebdd9da..948876235c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryGetFdInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryGetFdInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryGetFdInfoKHR")] - public unsafe partial struct MemoryGetFdInfoKHR + public unsafe partial struct MemoryGetFdInfoKHR : IStructuredType { public MemoryGetFdInfoKHR ( @@ -68,5 +68,11 @@ public MemoryGetFdInfoKHR [NativeName("Type.Name", "VkExternalMemoryHandleTypeFlagBits")] [NativeName("Name", "handleType")] public ExternalMemoryHandleTypeFlags HandleType; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.MemoryGetFDInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryGetRemoteAddressInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryGetRemoteAddressInfoNV.gen.cs index 766774d587..fd088f6783 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryGetRemoteAddressInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryGetRemoteAddressInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryGetRemoteAddressInfoNV")] - public unsafe partial struct MemoryGetRemoteAddressInfoNV + public unsafe partial struct MemoryGetRemoteAddressInfoNV : IStructuredType { public MemoryGetRemoteAddressInfoNV ( @@ -68,5 +68,11 @@ public MemoryGetRemoteAddressInfoNV [NativeName("Type.Name", "VkExternalMemoryHandleTypeFlagBits")] [NativeName("Name", "handleType")] public ExternalMemoryHandleTypeFlags HandleType; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.MemoryGetRemoteAddressInfoNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryGetWin32HandleInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryGetWin32HandleInfoKHR.gen.cs index b94b305a7e..85e2baa723 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryGetWin32HandleInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryGetWin32HandleInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryGetWin32HandleInfoKHR")] - public unsafe partial struct MemoryGetWin32HandleInfoKHR + public unsafe partial struct MemoryGetWin32HandleInfoKHR : IStructuredType { public MemoryGetWin32HandleInfoKHR ( @@ -68,5 +68,11 @@ public MemoryGetWin32HandleInfoKHR [NativeName("Type.Name", "VkExternalMemoryHandleTypeFlagBits")] [NativeName("Name", "handleType")] public ExternalMemoryHandleTypeFlags HandleType; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.MemoryGetWin32HandleInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryGetZirconHandleInfoFUCHSIA.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryGetZirconHandleInfoFUCHSIA.gen.cs index 734d2f25bb..92bb737a0d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryGetZirconHandleInfoFUCHSIA.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryGetZirconHandleInfoFUCHSIA.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryGetZirconHandleInfoFUCHSIA")] - public unsafe partial struct MemoryGetZirconHandleInfoFUCHSIA + public unsafe partial struct MemoryGetZirconHandleInfoFUCHSIA : IStructuredType { public MemoryGetZirconHandleInfoFUCHSIA ( @@ -68,5 +68,11 @@ public MemoryGetZirconHandleInfoFUCHSIA [NativeName("Type.Name", "VkExternalMemoryHandleTypeFlagBits")] [NativeName("Name", "handleType")] public ExternalMemoryHandleTypeFlags HandleType; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.MemoryGetZirconHandleInfoFuchsia; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryHostPointerPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryHostPointerPropertiesEXT.gen.cs index 3644bb884d..835250d523 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryHostPointerPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryHostPointerPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryHostPointerPropertiesEXT")] - public unsafe partial struct MemoryHostPointerPropertiesEXT + public unsafe partial struct MemoryHostPointerPropertiesEXT : IStructuredType { public MemoryHostPointerPropertiesEXT ( @@ -57,5 +57,11 @@ public MemoryHostPointerPropertiesEXT [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "memoryTypeBits")] public uint MemoryTypeBits; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.MemoryHostPointerPropertiesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryOpaqueCaptureAddressAllocateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryOpaqueCaptureAddressAllocateInfo.gen.cs index 9398144d9a..4f8b5d7068 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryOpaqueCaptureAddressAllocateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryOpaqueCaptureAddressAllocateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryOpaqueCaptureAddressAllocateInfo")] - public unsafe partial struct MemoryOpaqueCaptureAddressAllocateInfo + public unsafe partial struct MemoryOpaqueCaptureAddressAllocateInfo : IStructuredType { public MemoryOpaqueCaptureAddressAllocateInfo ( @@ -57,5 +57,11 @@ public MemoryOpaqueCaptureAddressAllocateInfo [NativeName("Type.Name", "uint64_t")] [NativeName("Name", "opaqueCaptureAddress")] public ulong OpaqueCaptureAddress; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.MemoryOpaqueCaptureAddressAllocateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryOpaqueCaptureAddressAllocateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryOpaqueCaptureAddressAllocateInfoKHR.gen.cs index 9ac9530346..42253d3372 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryOpaqueCaptureAddressAllocateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryOpaqueCaptureAddressAllocateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryOpaqueCaptureAddressAllocateInfoKHR")] - public unsafe partial struct MemoryOpaqueCaptureAddressAllocateInfoKHR + public unsafe partial struct MemoryOpaqueCaptureAddressAllocateInfoKHR : IStructuredType { public MemoryOpaqueCaptureAddressAllocateInfoKHR ( @@ -57,5 +57,11 @@ public MemoryOpaqueCaptureAddressAllocateInfoKHR [NativeName("Type.Name", "uint64_t")] [NativeName("Name", "opaqueCaptureAddress")] public ulong OpaqueCaptureAddress; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.MemoryOpaqueCaptureAddressAllocateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryPriorityAllocateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryPriorityAllocateInfoEXT.gen.cs index 935c0bb355..469f8b22a8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryPriorityAllocateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryPriorityAllocateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryPriorityAllocateInfoEXT")] - public unsafe partial struct MemoryPriorityAllocateInfoEXT + public unsafe partial struct MemoryPriorityAllocateInfoEXT : IStructuredType { public MemoryPriorityAllocateInfoEXT ( @@ -57,5 +57,11 @@ public MemoryPriorityAllocateInfoEXT [NativeName("Type.Name", "float")] [NativeName("Name", "priority")] public float Priority; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.MemoryPriorityAllocateInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryRequirements2.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryRequirements2.gen.cs index 434d557288..2a911cb912 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryRequirements2.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryRequirements2.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryRequirements2")] - public unsafe partial struct MemoryRequirements2 + public unsafe partial struct MemoryRequirements2 : IStructuredType { public MemoryRequirements2 ( @@ -57,5 +57,11 @@ public MemoryRequirements2 [NativeName("Type.Name", "VkMemoryRequirements")] [NativeName("Name", "memoryRequirements")] public MemoryRequirements MemoryRequirements; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.MemoryRequirements2; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryRequirements2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryRequirements2KHR.gen.cs index 5fb7a35b40..a93d516d47 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryRequirements2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryRequirements2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryRequirements2KHR")] - public unsafe partial struct MemoryRequirements2KHR + public unsafe partial struct MemoryRequirements2KHR : IStructuredType { public MemoryRequirements2KHR ( @@ -57,5 +57,11 @@ public MemoryRequirements2KHR [NativeName("Type.Name", "VkMemoryRequirements")] [NativeName("Name", "memoryRequirements")] public MemoryRequirements MemoryRequirements; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.MemoryRequirements2; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryWin32HandlePropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryWin32HandlePropertiesKHR.gen.cs index e3f148fa46..cef120c0a7 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryWin32HandlePropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryWin32HandlePropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryWin32HandlePropertiesKHR")] - public unsafe partial struct MemoryWin32HandlePropertiesKHR + public unsafe partial struct MemoryWin32HandlePropertiesKHR : IStructuredType { public MemoryWin32HandlePropertiesKHR ( @@ -57,5 +57,11 @@ public MemoryWin32HandlePropertiesKHR [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "memoryTypeBits")] public uint MemoryTypeBits; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.MemoryWin32HandlePropertiesKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryZirconHandlePropertiesFUCHSIA.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryZirconHandlePropertiesFUCHSIA.gen.cs index b742347e72..29c8c58058 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryZirconHandlePropertiesFUCHSIA.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryZirconHandlePropertiesFUCHSIA.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryZirconHandlePropertiesFUCHSIA")] - public unsafe partial struct MemoryZirconHandlePropertiesFUCHSIA + public unsafe partial struct MemoryZirconHandlePropertiesFUCHSIA : IStructuredType { public MemoryZirconHandlePropertiesFUCHSIA ( @@ -57,5 +57,11 @@ public MemoryZirconHandlePropertiesFUCHSIA [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "memoryTypeBits")] public uint MemoryTypeBits; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.MemoryZirconHandlePropertiesFuchsia; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MetalSurfaceCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MetalSurfaceCreateInfoEXT.gen.cs index 4fcaa07245..28649a21ca 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MetalSurfaceCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MetalSurfaceCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMetalSurfaceCreateInfoEXT")] - public unsafe partial struct MetalSurfaceCreateInfoEXT + public unsafe partial struct MetalSurfaceCreateInfoEXT : IStructuredType { public MetalSurfaceCreateInfoEXT ( @@ -68,5 +68,11 @@ public MetalSurfaceCreateInfoEXT [NativeName("Type.Name", "CAMetalLayer")] [NativeName("Name", "pLayer")] public nint* PLayer; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.MetalSurfaceCreateInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MultisamplePropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MultisamplePropertiesEXT.gen.cs index 2192632d17..596f134ff5 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MultisamplePropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MultisamplePropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMultisamplePropertiesEXT")] - public unsafe partial struct MultisamplePropertiesEXT + public unsafe partial struct MultisamplePropertiesEXT : IStructuredType { public MultisamplePropertiesEXT ( @@ -57,5 +57,11 @@ public MultisamplePropertiesEXT [NativeName("Type.Name", "VkExtent2D")] [NativeName("Name", "maxSampleLocationGridSize")] public Extent2D MaxSampleLocationGridSize; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.MultisamplePropertiesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MultiviewPerViewAttributesInfoNVX.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MultiviewPerViewAttributesInfoNVX.gen.cs index 9b1309d727..1c55eebcd3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MultiviewPerViewAttributesInfoNVX.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MultiviewPerViewAttributesInfoNVX.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMultiviewPerViewAttributesInfoNVX")] - public unsafe partial struct MultiviewPerViewAttributesInfoNVX + public unsafe partial struct MultiviewPerViewAttributesInfoNVX : IStructuredType { public MultiviewPerViewAttributesInfoNVX ( @@ -68,5 +68,11 @@ public MultiviewPerViewAttributesInfoNVX [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "perViewAttributesPositionXOnly")] public Bool32 PerViewAttributesPositionXOnly; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.MultiviewPerViewAttributesInfoNvx; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MutableDescriptorTypeCreateInfoVALVE.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MutableDescriptorTypeCreateInfoVALVE.gen.cs index 6dfd9f7d0b..2ada2d394b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MutableDescriptorTypeCreateInfoVALVE.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MutableDescriptorTypeCreateInfoVALVE.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMutableDescriptorTypeCreateInfoVALVE")] - public unsafe partial struct MutableDescriptorTypeCreateInfoVALVE + public unsafe partial struct MutableDescriptorTypeCreateInfoVALVE : IStructuredType { public MutableDescriptorTypeCreateInfoVALVE ( @@ -68,5 +68,11 @@ public MutableDescriptorTypeCreateInfoVALVE [NativeName("Type.Name", "VkMutableDescriptorTypeListVALVE")] [NativeName("Name", "pMutableDescriptorTypeLists")] public MutableDescriptorTypeListVALVE* PMutableDescriptorTypeLists; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.MutableDescriptorTypeCreateInfoValve; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/NativeBufferANDROID.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/NativeBufferANDROID.gen.cs index a871356874..c8c1bcad2e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/NativeBufferANDROID.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/NativeBufferANDROID.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkNativeBufferANDROID")] - public unsafe partial struct NativeBufferANDROID + public unsafe partial struct NativeBufferANDROID : IStructuredType { public NativeBufferANDROID ( @@ -101,5 +101,11 @@ public NativeBufferANDROID [NativeName("Type.Name", "VkNativeBufferUsage2ANDROID")] [NativeName("Name", "usage2")] public NativeBufferUsage2ANDROID Usage2; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.NativeBufferAndroid; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceConfigurationAcquireInfoINTEL.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceConfigurationAcquireInfoINTEL.gen.cs index 643e6bd7fb..22ba22520f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceConfigurationAcquireInfoINTEL.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceConfigurationAcquireInfoINTEL.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPerformanceConfigurationAcquireInfoINTEL")] - public unsafe partial struct PerformanceConfigurationAcquireInfoINTEL + public unsafe partial struct PerformanceConfigurationAcquireInfoINTEL : IStructuredType { public PerformanceConfigurationAcquireInfoINTEL ( @@ -57,5 +57,11 @@ public PerformanceConfigurationAcquireInfoINTEL [NativeName("Type.Name", "VkPerformanceConfigurationTypeINTEL")] [NativeName("Name", "type")] public PerformanceConfigurationTypeINTEL Type; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PerformanceConfigurationAcquireInfoIntel; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceCounterDescriptionKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceCounterDescriptionKHR.gen.cs index d0af0f6b46..5c187ead43 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceCounterDescriptionKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceCounterDescriptionKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPerformanceCounterDescriptionKHR")] - public unsafe partial struct PerformanceCounterDescriptionKHR + public unsafe partial struct PerformanceCounterDescriptionKHR : IStructuredType { public PerformanceCounterDescriptionKHR ( @@ -72,5 +72,11 @@ public PerformanceCounterDescriptionKHR [NativeName("Type.Name", "char")] [NativeName("Name", "description")] public fixed byte Description[256]; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PerformanceCounterDescriptionKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceCounterKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceCounterKHR.gen.cs index 02ae97c977..c63758be75 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceCounterKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceCounterKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPerformanceCounterKHR")] - public unsafe partial struct PerformanceCounterKHR + public unsafe partial struct PerformanceCounterKHR : IStructuredType { public PerformanceCounterKHR ( @@ -84,5 +84,11 @@ public PerformanceCounterKHR [NativeName("Type.Name", "uint8_t")] [NativeName("Name", "uuid")] public fixed byte Uuid[16]; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PerformanceCounterKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceMarkerInfoINTEL.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceMarkerInfoINTEL.gen.cs index 865b97a089..6d46131002 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceMarkerInfoINTEL.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceMarkerInfoINTEL.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPerformanceMarkerInfoINTEL")] - public unsafe partial struct PerformanceMarkerInfoINTEL + public unsafe partial struct PerformanceMarkerInfoINTEL : IStructuredType { public PerformanceMarkerInfoINTEL ( @@ -57,5 +57,11 @@ public PerformanceMarkerInfoINTEL [NativeName("Type.Name", "uint64_t")] [NativeName("Name", "marker")] public ulong Marker; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PerformanceMarkerInfoIntel; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceOverrideInfoINTEL.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceOverrideInfoINTEL.gen.cs index 49f4c17597..70cd90fe8d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceOverrideInfoINTEL.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceOverrideInfoINTEL.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPerformanceOverrideInfoINTEL")] - public unsafe partial struct PerformanceOverrideInfoINTEL + public unsafe partial struct PerformanceOverrideInfoINTEL : IStructuredType { public PerformanceOverrideInfoINTEL ( @@ -79,5 +79,11 @@ public PerformanceOverrideInfoINTEL [NativeName("Type.Name", "uint64_t")] [NativeName("Name", "parameter")] public ulong Parameter; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PerformanceOverrideInfoIntel; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceQuerySubmitInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceQuerySubmitInfoKHR.gen.cs index 7db26dfc9c..106abed712 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceQuerySubmitInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceQuerySubmitInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPerformanceQuerySubmitInfoKHR")] - public unsafe partial struct PerformanceQuerySubmitInfoKHR + public unsafe partial struct PerformanceQuerySubmitInfoKHR : IStructuredType { public PerformanceQuerySubmitInfoKHR ( @@ -57,5 +57,11 @@ public PerformanceQuerySubmitInfoKHR [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "counterPassIndex")] public uint CounterPassIndex; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PerformanceQuerySubmitInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceStreamMarkerInfoINTEL.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceStreamMarkerInfoINTEL.gen.cs index a46295bf88..e6b2006a46 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceStreamMarkerInfoINTEL.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceStreamMarkerInfoINTEL.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPerformanceStreamMarkerInfoINTEL")] - public unsafe partial struct PerformanceStreamMarkerInfoINTEL + public unsafe partial struct PerformanceStreamMarkerInfoINTEL : IStructuredType { public PerformanceStreamMarkerInfoINTEL ( @@ -57,5 +57,11 @@ public PerformanceStreamMarkerInfoINTEL [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "marker")] public uint Marker; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PerformanceStreamMarkerInfoIntel; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice16BitStorageFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice16BitStorageFeatures.gen.cs index 3ffdaae961..906fe6a0aa 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice16BitStorageFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice16BitStorageFeatures.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevice16BitStorageFeatures")] - public unsafe partial struct PhysicalDevice16BitStorageFeatures + public unsafe partial struct PhysicalDevice16BitStorageFeatures : IStructuredType { public PhysicalDevice16BitStorageFeatures ( @@ -90,5 +90,11 @@ public PhysicalDevice16BitStorageFeatures [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "storageInputOutput16")] public Bool32 StorageInputOutput16; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDevice16BitStorageFeatures; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice16BitStorageFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice16BitStorageFeaturesKHR.gen.cs index dc7f82fc2c..140d0d1630 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice16BitStorageFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice16BitStorageFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevice16BitStorageFeaturesKHR")] - public unsafe partial struct PhysicalDevice16BitStorageFeaturesKHR + public unsafe partial struct PhysicalDevice16BitStorageFeaturesKHR : IStructuredType { public PhysicalDevice16BitStorageFeaturesKHR ( @@ -90,5 +90,11 @@ public PhysicalDevice16BitStorageFeaturesKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "storageInputOutput16")] public Bool32 StorageInputOutput16; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDevice16BitStorageFeatures; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice4444FormatsFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice4444FormatsFeaturesEXT.gen.cs index b0bfaff10c..313913bf43 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice4444FormatsFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice4444FormatsFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevice4444FormatsFeaturesEXT")] - public unsafe partial struct PhysicalDevice4444FormatsFeaturesEXT + public unsafe partial struct PhysicalDevice4444FormatsFeaturesEXT : IStructuredType { public PhysicalDevice4444FormatsFeaturesEXT ( @@ -68,5 +68,11 @@ public PhysicalDevice4444FormatsFeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "formatA4B4G4R4")] public Bool32 FormatA4B4G4R4; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDevice4444FormatsFeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice8BitStorageFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice8BitStorageFeatures.gen.cs index ad813e3e3d..7d7d8d42de 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice8BitStorageFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice8BitStorageFeatures.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevice8BitStorageFeatures")] - public unsafe partial struct PhysicalDevice8BitStorageFeatures + public unsafe partial struct PhysicalDevice8BitStorageFeatures : IStructuredType { public PhysicalDevice8BitStorageFeatures ( @@ -79,5 +79,11 @@ public PhysicalDevice8BitStorageFeatures [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "storagePushConstant8")] public Bool32 StoragePushConstant8; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDevice8BitStorageFeatures; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice8BitStorageFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice8BitStorageFeaturesKHR.gen.cs index 8f39a66a6c..133f6814f8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice8BitStorageFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice8BitStorageFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevice8BitStorageFeaturesKHR")] - public unsafe partial struct PhysicalDevice8BitStorageFeaturesKHR + public unsafe partial struct PhysicalDevice8BitStorageFeaturesKHR : IStructuredType { public PhysicalDevice8BitStorageFeaturesKHR ( @@ -79,5 +79,11 @@ public PhysicalDevice8BitStorageFeaturesKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "storagePushConstant8")] public Bool32 StoragePushConstant8; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDevice8BitStorageFeatures; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceASTCDecodeFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceASTCDecodeFeaturesEXT.gen.cs index a488347e44..536e75cf77 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceASTCDecodeFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceASTCDecodeFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceASTCDecodeFeaturesEXT")] - public unsafe partial struct PhysicalDeviceASTCDecodeFeaturesEXT + public unsafe partial struct PhysicalDeviceASTCDecodeFeaturesEXT : IStructuredType { public PhysicalDeviceASTCDecodeFeaturesEXT ( @@ -57,5 +57,11 @@ public PhysicalDeviceASTCDecodeFeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "decodeModeSharedExponent")] public Bool32 DecodeModeSharedExponent; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceAstcDecodeFeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceAccelerationStructureFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceAccelerationStructureFeaturesKHR.gen.cs index 944257597c..b92c8e78af 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceAccelerationStructureFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceAccelerationStructureFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceAccelerationStructureFeaturesKHR")] - public unsafe partial struct PhysicalDeviceAccelerationStructureFeaturesKHR + public unsafe partial struct PhysicalDeviceAccelerationStructureFeaturesKHR : IStructuredType { public PhysicalDeviceAccelerationStructureFeaturesKHR ( @@ -101,5 +101,11 @@ public PhysicalDeviceAccelerationStructureFeaturesKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "descriptorBindingAccelerationStructureUpdateAfterBind")] public Bool32 DescriptorBindingAccelerationStructureUpdateAfterBind; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceAccelerationStructurePropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceAccelerationStructurePropertiesKHR.gen.cs index 2d5f0cdfd0..4774a28bc3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceAccelerationStructurePropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceAccelerationStructurePropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceAccelerationStructurePropertiesKHR")] - public unsafe partial struct PhysicalDeviceAccelerationStructurePropertiesKHR + public unsafe partial struct PhysicalDeviceAccelerationStructurePropertiesKHR : IStructuredType { public PhysicalDeviceAccelerationStructurePropertiesKHR ( @@ -134,5 +134,11 @@ public PhysicalDeviceAccelerationStructurePropertiesKHR [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "minAccelerationStructureScratchOffsetAlignment")] public uint MinAccelerationStructureScratchOffsetAlignment; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceAccelerationStructurePropertiesKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBlendOperationAdvancedFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBlendOperationAdvancedFeaturesEXT.gen.cs index 74126f7509..66c53ef0d1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBlendOperationAdvancedFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBlendOperationAdvancedFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT")] - public unsafe partial struct PhysicalDeviceBlendOperationAdvancedFeaturesEXT + public unsafe partial struct PhysicalDeviceBlendOperationAdvancedFeaturesEXT : IStructuredType { public PhysicalDeviceBlendOperationAdvancedFeaturesEXT ( @@ -57,5 +57,11 @@ public PhysicalDeviceBlendOperationAdvancedFeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "advancedBlendCoherentOperations")] public Bool32 AdvancedBlendCoherentOperations; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceBlendOperationAdvancedFeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBlendOperationAdvancedPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBlendOperationAdvancedPropertiesEXT.gen.cs index 1c4c0dca21..ba6d1b32d6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBlendOperationAdvancedPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBlendOperationAdvancedPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT")] - public unsafe partial struct PhysicalDeviceBlendOperationAdvancedPropertiesEXT + public unsafe partial struct PhysicalDeviceBlendOperationAdvancedPropertiesEXT : IStructuredType { public PhysicalDeviceBlendOperationAdvancedPropertiesEXT ( @@ -112,5 +112,11 @@ public PhysicalDeviceBlendOperationAdvancedPropertiesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "advancedBlendAllOperations")] public Bool32 AdvancedBlendAllOperations; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceBlendOperationAdvancedPropertiesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBorderColorSwizzleFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBorderColorSwizzleFeaturesEXT.gen.cs index 92b8806436..d4baaa9651 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBorderColorSwizzleFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBorderColorSwizzleFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceBorderColorSwizzleFeaturesEXT")] - public unsafe partial struct PhysicalDeviceBorderColorSwizzleFeaturesEXT + public unsafe partial struct PhysicalDeviceBorderColorSwizzleFeaturesEXT : IStructuredType { public PhysicalDeviceBorderColorSwizzleFeaturesEXT ( @@ -68,5 +68,11 @@ public PhysicalDeviceBorderColorSwizzleFeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "borderColorSwizzleFromImage")] public Bool32 BorderColorSwizzleFromImage; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceBorderColorSwizzleFeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferAddressFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferAddressFeaturesEXT.gen.cs index 4a63786968..ca5b3b8d9f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferAddressFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferAddressFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceBufferAddressFeaturesEXT")] - public unsafe partial struct PhysicalDeviceBufferAddressFeaturesEXT + public unsafe partial struct PhysicalDeviceBufferAddressFeaturesEXT : IStructuredType { public PhysicalDeviceBufferAddressFeaturesEXT ( @@ -79,5 +79,11 @@ public PhysicalDeviceBufferAddressFeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "bufferDeviceAddressMultiDevice")] public Bool32 BufferDeviceAddressMultiDevice; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceBufferDeviceAddressFeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferDeviceAddressFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferDeviceAddressFeatures.gen.cs index 72694ea1ad..de87068cf4 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferDeviceAddressFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferDeviceAddressFeatures.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceBufferDeviceAddressFeatures")] - public unsafe partial struct PhysicalDeviceBufferDeviceAddressFeatures + public unsafe partial struct PhysicalDeviceBufferDeviceAddressFeatures : IStructuredType { public PhysicalDeviceBufferDeviceAddressFeatures ( @@ -79,5 +79,11 @@ public PhysicalDeviceBufferDeviceAddressFeatures [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "bufferDeviceAddressMultiDevice")] public Bool32 BufferDeviceAddressMultiDevice; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceBufferDeviceAddressFeatures; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferDeviceAddressFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferDeviceAddressFeaturesEXT.gen.cs index 3651804522..b01b9b45f8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferDeviceAddressFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferDeviceAddressFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceBufferDeviceAddressFeaturesEXT")] - public unsafe partial struct PhysicalDeviceBufferDeviceAddressFeaturesEXT + public unsafe partial struct PhysicalDeviceBufferDeviceAddressFeaturesEXT : IStructuredType { public PhysicalDeviceBufferDeviceAddressFeaturesEXT ( @@ -79,5 +79,11 @@ public PhysicalDeviceBufferDeviceAddressFeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "bufferDeviceAddressMultiDevice")] public Bool32 BufferDeviceAddressMultiDevice; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceBufferDeviceAddressFeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferDeviceAddressFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferDeviceAddressFeaturesKHR.gen.cs index a033f6998e..8c60bd7970 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferDeviceAddressFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferDeviceAddressFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceBufferDeviceAddressFeaturesKHR")] - public unsafe partial struct PhysicalDeviceBufferDeviceAddressFeaturesKHR + public unsafe partial struct PhysicalDeviceBufferDeviceAddressFeaturesKHR : IStructuredType { public PhysicalDeviceBufferDeviceAddressFeaturesKHR ( @@ -79,5 +79,11 @@ public PhysicalDeviceBufferDeviceAddressFeaturesKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "bufferDeviceAddressMultiDevice")] public Bool32 BufferDeviceAddressMultiDevice; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceBufferDeviceAddressFeatures; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCoherentMemoryFeaturesAMD.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCoherentMemoryFeaturesAMD.gen.cs index 5b9bb6aedb..e611384787 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCoherentMemoryFeaturesAMD.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCoherentMemoryFeaturesAMD.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceCoherentMemoryFeaturesAMD")] - public unsafe partial struct PhysicalDeviceCoherentMemoryFeaturesAMD + public unsafe partial struct PhysicalDeviceCoherentMemoryFeaturesAMD : IStructuredType { public PhysicalDeviceCoherentMemoryFeaturesAMD ( @@ -57,5 +57,11 @@ public PhysicalDeviceCoherentMemoryFeaturesAMD [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "deviceCoherentMemory")] public Bool32 DeviceCoherentMemory; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceCoherentMemoryFeaturesAmd; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceColorWriteEnableFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceColorWriteEnableFeaturesEXT.gen.cs index 1de3edc91b..8c0de08813 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceColorWriteEnableFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceColorWriteEnableFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceColorWriteEnableFeaturesEXT")] - public unsafe partial struct PhysicalDeviceColorWriteEnableFeaturesEXT + public unsafe partial struct PhysicalDeviceColorWriteEnableFeaturesEXT : IStructuredType { public PhysicalDeviceColorWriteEnableFeaturesEXT ( @@ -57,5 +57,11 @@ public PhysicalDeviceColorWriteEnableFeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "colorWriteEnable")] public Bool32 ColorWriteEnable; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceColorWriteEnableFeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceComputeShaderDerivativesFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceComputeShaderDerivativesFeaturesNV.gen.cs index e870ce4077..bad29ff616 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceComputeShaderDerivativesFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceComputeShaderDerivativesFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceComputeShaderDerivativesFeaturesNV")] - public unsafe partial struct PhysicalDeviceComputeShaderDerivativesFeaturesNV + public unsafe partial struct PhysicalDeviceComputeShaderDerivativesFeaturesNV : IStructuredType { public PhysicalDeviceComputeShaderDerivativesFeaturesNV ( @@ -68,5 +68,11 @@ public PhysicalDeviceComputeShaderDerivativesFeaturesNV [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "computeDerivativeGroupLinear")] public Bool32 ComputeDerivativeGroupLinear; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceComputeShaderDerivativesFeaturesNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceConditionalRenderingFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceConditionalRenderingFeaturesEXT.gen.cs index bd68973d19..16152959cb 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceConditionalRenderingFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceConditionalRenderingFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceConditionalRenderingFeaturesEXT")] - public unsafe partial struct PhysicalDeviceConditionalRenderingFeaturesEXT + public unsafe partial struct PhysicalDeviceConditionalRenderingFeaturesEXT : IStructuredType { public PhysicalDeviceConditionalRenderingFeaturesEXT ( @@ -68,5 +68,11 @@ public PhysicalDeviceConditionalRenderingFeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "inheritedConditionalRendering")] public Bool32 InheritedConditionalRendering; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceConditionalRenderingFeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceConservativeRasterizationPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceConservativeRasterizationPropertiesEXT.gen.cs index 80dfb183ac..bd8729e216 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceConservativeRasterizationPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceConservativeRasterizationPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceConservativeRasterizationPropertiesEXT")] - public unsafe partial struct PhysicalDeviceConservativeRasterizationPropertiesEXT + public unsafe partial struct PhysicalDeviceConservativeRasterizationPropertiesEXT : IStructuredType { public PhysicalDeviceConservativeRasterizationPropertiesEXT ( @@ -145,5 +145,11 @@ public PhysicalDeviceConservativeRasterizationPropertiesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "conservativeRasterizationPostDepthCoverage")] public Bool32 ConservativeRasterizationPostDepthCoverage; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceConservativeRasterizationPropertiesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCooperativeMatrixFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCooperativeMatrixFeaturesNV.gen.cs index 28c3ba756f..b96f9b0b88 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCooperativeMatrixFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCooperativeMatrixFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceCooperativeMatrixFeaturesNV")] - public unsafe partial struct PhysicalDeviceCooperativeMatrixFeaturesNV + public unsafe partial struct PhysicalDeviceCooperativeMatrixFeaturesNV : IStructuredType { public PhysicalDeviceCooperativeMatrixFeaturesNV ( @@ -68,5 +68,11 @@ public PhysicalDeviceCooperativeMatrixFeaturesNV [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "cooperativeMatrixRobustBufferAccess")] public Bool32 CooperativeMatrixRobustBufferAccess; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceCooperativeMatrixFeaturesNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCooperativeMatrixPropertiesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCooperativeMatrixPropertiesNV.gen.cs index e5b0ebcdee..56dfd47271 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCooperativeMatrixPropertiesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCooperativeMatrixPropertiesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceCooperativeMatrixPropertiesNV")] - public unsafe partial struct PhysicalDeviceCooperativeMatrixPropertiesNV + public unsafe partial struct PhysicalDeviceCooperativeMatrixPropertiesNV : IStructuredType { public PhysicalDeviceCooperativeMatrixPropertiesNV ( @@ -57,5 +57,11 @@ public PhysicalDeviceCooperativeMatrixPropertiesNV [NativeName("Type.Name", "VkShaderStageFlags")] [NativeName("Name", "cooperativeMatrixSupportedStages")] public ShaderStageFlags CooperativeMatrixSupportedStages; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceCooperativeMatrixPropertiesNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCornerSampledImageFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCornerSampledImageFeaturesNV.gen.cs index 85cfe29d4c..77698258ca 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCornerSampledImageFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCornerSampledImageFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceCornerSampledImageFeaturesNV")] - public unsafe partial struct PhysicalDeviceCornerSampledImageFeaturesNV + public unsafe partial struct PhysicalDeviceCornerSampledImageFeaturesNV : IStructuredType { public PhysicalDeviceCornerSampledImageFeaturesNV ( @@ -57,5 +57,11 @@ public PhysicalDeviceCornerSampledImageFeaturesNV [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "cornerSampledImage")] public Bool32 CornerSampledImage; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceCornerSampledImageFeaturesNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCoverageReductionModeFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCoverageReductionModeFeaturesNV.gen.cs index 1f2f02e01a..8f023f094e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCoverageReductionModeFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCoverageReductionModeFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceCoverageReductionModeFeaturesNV")] - public unsafe partial struct PhysicalDeviceCoverageReductionModeFeaturesNV + public unsafe partial struct PhysicalDeviceCoverageReductionModeFeaturesNV : IStructuredType { public PhysicalDeviceCoverageReductionModeFeaturesNV ( @@ -57,5 +57,11 @@ public PhysicalDeviceCoverageReductionModeFeaturesNV [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "coverageReductionMode")] public Bool32 CoverageReductionMode; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceCoverageReductionModeFeaturesNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCustomBorderColorFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCustomBorderColorFeaturesEXT.gen.cs index f51c857928..25f6949d57 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCustomBorderColorFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCustomBorderColorFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceCustomBorderColorFeaturesEXT")] - public unsafe partial struct PhysicalDeviceCustomBorderColorFeaturesEXT + public unsafe partial struct PhysicalDeviceCustomBorderColorFeaturesEXT : IStructuredType { public PhysicalDeviceCustomBorderColorFeaturesEXT ( @@ -68,5 +68,11 @@ public PhysicalDeviceCustomBorderColorFeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "customBorderColorWithoutFormat")] public Bool32 CustomBorderColorWithoutFormat; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceCustomBorderColorFeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCustomBorderColorPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCustomBorderColorPropertiesEXT.gen.cs index 6960df45e8..b1e11427fb 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCustomBorderColorPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCustomBorderColorPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceCustomBorderColorPropertiesEXT")] - public unsafe partial struct PhysicalDeviceCustomBorderColorPropertiesEXT + public unsafe partial struct PhysicalDeviceCustomBorderColorPropertiesEXT : IStructuredType { public PhysicalDeviceCustomBorderColorPropertiesEXT ( @@ -57,5 +57,11 @@ public PhysicalDeviceCustomBorderColorPropertiesEXT [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "maxCustomBorderColorSamplers")] public uint MaxCustomBorderColorSamplers; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceCustomBorderColorPropertiesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV.gen.cs index a6632ba7bd..f18be92a8d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV")] - public unsafe partial struct PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV + public unsafe partial struct PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV : IStructuredType { public PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV ( @@ -57,5 +57,11 @@ public PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "dedicatedAllocationImageAliasing")] public Bool32 DedicatedAllocationImageAliasing; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDepthClipEnableFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDepthClipEnableFeaturesEXT.gen.cs index 7d4127d32f..a41a97fc3d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDepthClipEnableFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDepthClipEnableFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDepthClipEnableFeaturesEXT")] - public unsafe partial struct PhysicalDeviceDepthClipEnableFeaturesEXT + public unsafe partial struct PhysicalDeviceDepthClipEnableFeaturesEXT : IStructuredType { public PhysicalDeviceDepthClipEnableFeaturesEXT ( @@ -57,5 +57,11 @@ public PhysicalDeviceDepthClipEnableFeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "depthClipEnable")] public Bool32 DepthClipEnable; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceDepthClipEnableFeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDepthStencilResolveProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDepthStencilResolveProperties.gen.cs index 5d40ccc428..0cf48d5642 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDepthStencilResolveProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDepthStencilResolveProperties.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDepthStencilResolveProperties")] - public unsafe partial struct PhysicalDeviceDepthStencilResolveProperties + public unsafe partial struct PhysicalDeviceDepthStencilResolveProperties : IStructuredType { public PhysicalDeviceDepthStencilResolveProperties ( @@ -90,5 +90,11 @@ public PhysicalDeviceDepthStencilResolveProperties [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "independentResolve")] public Bool32 IndependentResolve; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceDepthStencilResolveProperties; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDepthStencilResolvePropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDepthStencilResolvePropertiesKHR.gen.cs index d90b2dc7cd..7765cdc09a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDepthStencilResolvePropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDepthStencilResolvePropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDepthStencilResolvePropertiesKHR")] - public unsafe partial struct PhysicalDeviceDepthStencilResolvePropertiesKHR + public unsafe partial struct PhysicalDeviceDepthStencilResolvePropertiesKHR : IStructuredType { public PhysicalDeviceDepthStencilResolvePropertiesKHR ( @@ -90,5 +90,11 @@ public PhysicalDeviceDepthStencilResolvePropertiesKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "independentResolve")] public Bool32 IndependentResolve; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceDepthStencilResolveProperties; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingFeatures.gen.cs index e54ebcdc73..da7550b54b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingFeatures.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDescriptorIndexingFeatures")] - public unsafe partial struct PhysicalDeviceDescriptorIndexingFeatures + public unsafe partial struct PhysicalDeviceDescriptorIndexingFeatures : IStructuredType { public PhysicalDeviceDescriptorIndexingFeatures ( @@ -266,5 +266,11 @@ public PhysicalDeviceDescriptorIndexingFeatures [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "runtimeDescriptorArray")] public Bool32 RuntimeDescriptorArray; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceDescriptorIndexingFeatures; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingFeaturesEXT.gen.cs index 4ab18527b5..9cc2214006 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDescriptorIndexingFeaturesEXT")] - public unsafe partial struct PhysicalDeviceDescriptorIndexingFeaturesEXT + public unsafe partial struct PhysicalDeviceDescriptorIndexingFeaturesEXT : IStructuredType { public PhysicalDeviceDescriptorIndexingFeaturesEXT ( @@ -266,5 +266,11 @@ public PhysicalDeviceDescriptorIndexingFeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "runtimeDescriptorArray")] public Bool32 RuntimeDescriptorArray; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceDescriptorIndexingFeatures; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingProperties.gen.cs index 21f90850bd..cc68572727 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingProperties.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDescriptorIndexingProperties")] - public unsafe partial struct PhysicalDeviceDescriptorIndexingProperties + public unsafe partial struct PhysicalDeviceDescriptorIndexingProperties : IStructuredType { public PhysicalDeviceDescriptorIndexingProperties ( @@ -299,5 +299,11 @@ public PhysicalDeviceDescriptorIndexingProperties [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "maxDescriptorSetUpdateAfterBindInputAttachments")] public uint MaxDescriptorSetUpdateAfterBindInputAttachments; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceDescriptorIndexingProperties; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingPropertiesEXT.gen.cs index 5b645661f5..e51d4292a0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDescriptorIndexingPropertiesEXT")] - public unsafe partial struct PhysicalDeviceDescriptorIndexingPropertiesEXT + public unsafe partial struct PhysicalDeviceDescriptorIndexingPropertiesEXT : IStructuredType { public PhysicalDeviceDescriptorIndexingPropertiesEXT ( @@ -299,5 +299,11 @@ public PhysicalDeviceDescriptorIndexingPropertiesEXT [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "maxDescriptorSetUpdateAfterBindInputAttachments")] public uint MaxDescriptorSetUpdateAfterBindInputAttachments; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceDescriptorIndexingProperties; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDeviceGeneratedCommandsFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDeviceGeneratedCommandsFeaturesNV.gen.cs index 1a9e1f6f37..11ec074639 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDeviceGeneratedCommandsFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDeviceGeneratedCommandsFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV")] - public unsafe partial struct PhysicalDeviceDeviceGeneratedCommandsFeaturesNV + public unsafe partial struct PhysicalDeviceDeviceGeneratedCommandsFeaturesNV : IStructuredType { public PhysicalDeviceDeviceGeneratedCommandsFeaturesNV ( @@ -57,5 +57,11 @@ public PhysicalDeviceDeviceGeneratedCommandsFeaturesNV [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "deviceGeneratedCommands")] public Bool32 DeviceGeneratedCommands; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceDeviceGeneratedCommandsFeaturesNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDeviceGeneratedCommandsPropertiesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDeviceGeneratedCommandsPropertiesNV.gen.cs index d8292d1263..2351e0f0b5 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDeviceGeneratedCommandsPropertiesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDeviceGeneratedCommandsPropertiesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV")] - public unsafe partial struct PhysicalDeviceDeviceGeneratedCommandsPropertiesNV + public unsafe partial struct PhysicalDeviceDeviceGeneratedCommandsPropertiesNV : IStructuredType { public PhysicalDeviceDeviceGeneratedCommandsPropertiesNV ( @@ -145,5 +145,11 @@ public PhysicalDeviceDeviceGeneratedCommandsPropertiesNV [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "minIndirectCommandsBufferOffsetAlignment")] public uint MinIndirectCommandsBufferOffsetAlignment; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceDeviceGeneratedCommandsPropertiesNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDeviceMemoryReportFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDeviceMemoryReportFeaturesEXT.gen.cs index 3b6cc4a601..99fe04a72a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDeviceMemoryReportFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDeviceMemoryReportFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDeviceMemoryReportFeaturesEXT")] - public unsafe partial struct PhysicalDeviceDeviceMemoryReportFeaturesEXT + public unsafe partial struct PhysicalDeviceDeviceMemoryReportFeaturesEXT : IStructuredType { public PhysicalDeviceDeviceMemoryReportFeaturesEXT ( @@ -57,5 +57,11 @@ public PhysicalDeviceDeviceMemoryReportFeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "deviceMemoryReport")] public Bool32 DeviceMemoryReport; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceDeviceMemoryReportFeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDiagnosticsConfigFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDiagnosticsConfigFeaturesNV.gen.cs index 0efdc51b48..6d9d418577 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDiagnosticsConfigFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDiagnosticsConfigFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDiagnosticsConfigFeaturesNV")] - public unsafe partial struct PhysicalDeviceDiagnosticsConfigFeaturesNV + public unsafe partial struct PhysicalDeviceDiagnosticsConfigFeaturesNV : IStructuredType { public PhysicalDeviceDiagnosticsConfigFeaturesNV ( @@ -57,5 +57,11 @@ public PhysicalDeviceDiagnosticsConfigFeaturesNV [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "diagnosticsConfig")] public Bool32 DiagnosticsConfig; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceDiagnosticsConfigFeaturesNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDiscardRectanglePropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDiscardRectanglePropertiesEXT.gen.cs index 038b44de8e..1407f4de99 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDiscardRectanglePropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDiscardRectanglePropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDiscardRectanglePropertiesEXT")] - public unsafe partial struct PhysicalDeviceDiscardRectanglePropertiesEXT + public unsafe partial struct PhysicalDeviceDiscardRectanglePropertiesEXT : IStructuredType { public PhysicalDeviceDiscardRectanglePropertiesEXT ( @@ -57,5 +57,11 @@ public PhysicalDeviceDiscardRectanglePropertiesEXT [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "maxDiscardRectangles")] public uint MaxDiscardRectangles; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceDiscardRectanglePropertiesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDriverProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDriverProperties.gen.cs index da964dd1f9..c4d50423bb 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDriverProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDriverProperties.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDriverProperties")] - public unsafe partial struct PhysicalDeviceDriverProperties + public unsafe partial struct PhysicalDeviceDriverProperties : IStructuredType { public PhysicalDeviceDriverProperties ( @@ -78,5 +78,11 @@ public PhysicalDeviceDriverProperties [NativeName("Type.Name", "VkConformanceVersion")] [NativeName("Name", "conformanceVersion")] public ConformanceVersion ConformanceVersion; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceDriverProperties; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDriverPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDriverPropertiesKHR.gen.cs index 7e1301dd45..6a4bf68086 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDriverPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDriverPropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDriverPropertiesKHR")] - public unsafe partial struct PhysicalDeviceDriverPropertiesKHR + public unsafe partial struct PhysicalDeviceDriverPropertiesKHR : IStructuredType { public PhysicalDeviceDriverPropertiesKHR ( @@ -78,5 +78,11 @@ public PhysicalDeviceDriverPropertiesKHR [NativeName("Type.Name", "VkConformanceVersion")] [NativeName("Name", "conformanceVersion")] public ConformanceVersion ConformanceVersion; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceDriverProperties; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDrmPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDrmPropertiesEXT.gen.cs index b3c9f8bb23..09b299c2da 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDrmPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDrmPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDrmPropertiesEXT")] - public unsafe partial struct PhysicalDeviceDrmPropertiesEXT + public unsafe partial struct PhysicalDeviceDrmPropertiesEXT : IStructuredType { public PhysicalDeviceDrmPropertiesEXT ( @@ -112,5 +112,11 @@ public PhysicalDeviceDrmPropertiesEXT [NativeName("Type.Name", "int64_t")] [NativeName("Name", "renderMinor")] public long RenderMinor; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceDrmPropertiesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDynamicRenderingFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDynamicRenderingFeaturesKHR.gen.cs index e2702a9cf8..a4dc03bed3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDynamicRenderingFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDynamicRenderingFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDynamicRenderingFeaturesKHR")] - public unsafe partial struct PhysicalDeviceDynamicRenderingFeaturesKHR + public unsafe partial struct PhysicalDeviceDynamicRenderingFeaturesKHR : IStructuredType { public PhysicalDeviceDynamicRenderingFeaturesKHR ( @@ -57,5 +57,11 @@ public PhysicalDeviceDynamicRenderingFeaturesKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "dynamicRendering")] public Bool32 DynamicRendering; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceDynamicRenderingFeaturesKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExclusiveScissorFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExclusiveScissorFeaturesNV.gen.cs index d60eee12dd..f94deea93b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExclusiveScissorFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExclusiveScissorFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceExclusiveScissorFeaturesNV")] - public unsafe partial struct PhysicalDeviceExclusiveScissorFeaturesNV + public unsafe partial struct PhysicalDeviceExclusiveScissorFeaturesNV : IStructuredType { public PhysicalDeviceExclusiveScissorFeaturesNV ( @@ -57,5 +57,11 @@ public PhysicalDeviceExclusiveScissorFeaturesNV [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "exclusiveScissor")] public Bool32 ExclusiveScissor; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceExclusiveScissorFeaturesNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExtendedDynamicState2FeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExtendedDynamicState2FeaturesEXT.gen.cs index 436ede350a..284a3d3364 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExtendedDynamicState2FeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExtendedDynamicState2FeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceExtendedDynamicState2FeaturesEXT")] - public unsafe partial struct PhysicalDeviceExtendedDynamicState2FeaturesEXT + public unsafe partial struct PhysicalDeviceExtendedDynamicState2FeaturesEXT : IStructuredType { public PhysicalDeviceExtendedDynamicState2FeaturesEXT ( @@ -79,5 +79,11 @@ public PhysicalDeviceExtendedDynamicState2FeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "extendedDynamicState2PatchControlPoints")] public Bool32 ExtendedDynamicState2PatchControlPoints; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceExtendedDynamicState2FeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExtendedDynamicStateFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExtendedDynamicStateFeaturesEXT.gen.cs index 095369c306..52f12fead2 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExtendedDynamicStateFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExtendedDynamicStateFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceExtendedDynamicStateFeaturesEXT")] - public unsafe partial struct PhysicalDeviceExtendedDynamicStateFeaturesEXT + public unsafe partial struct PhysicalDeviceExtendedDynamicStateFeaturesEXT : IStructuredType { public PhysicalDeviceExtendedDynamicStateFeaturesEXT ( @@ -57,5 +57,11 @@ public PhysicalDeviceExtendedDynamicStateFeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "extendedDynamicState")] public Bool32 ExtendedDynamicState; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceExtendedDynamicStateFeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalBufferInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalBufferInfo.gen.cs index ead84c4e20..55b8eb2373 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalBufferInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalBufferInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceExternalBufferInfo")] - public unsafe partial struct PhysicalDeviceExternalBufferInfo + public unsafe partial struct PhysicalDeviceExternalBufferInfo : IStructuredType { public PhysicalDeviceExternalBufferInfo ( @@ -79,5 +79,11 @@ public PhysicalDeviceExternalBufferInfo [NativeName("Type.Name", "VkExternalMemoryHandleTypeFlagBits")] [NativeName("Name", "handleType")] public ExternalMemoryHandleTypeFlags HandleType; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceExternalBufferInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalBufferInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalBufferInfoKHR.gen.cs index 0ea403be72..c5adac3db6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalBufferInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalBufferInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceExternalBufferInfoKHR")] - public unsafe partial struct PhysicalDeviceExternalBufferInfoKHR + public unsafe partial struct PhysicalDeviceExternalBufferInfoKHR : IStructuredType { public PhysicalDeviceExternalBufferInfoKHR ( @@ -79,5 +79,11 @@ public PhysicalDeviceExternalBufferInfoKHR [NativeName("Type.Name", "VkExternalMemoryHandleTypeFlagBits")] [NativeName("Name", "handleType")] public ExternalMemoryHandleTypeFlags HandleType; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceExternalBufferInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalFenceInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalFenceInfo.gen.cs index 0e39013aee..cdac0fad52 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalFenceInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalFenceInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceExternalFenceInfo")] - public unsafe partial struct PhysicalDeviceExternalFenceInfo + public unsafe partial struct PhysicalDeviceExternalFenceInfo : IStructuredType { public PhysicalDeviceExternalFenceInfo ( @@ -57,5 +57,11 @@ public PhysicalDeviceExternalFenceInfo [NativeName("Type.Name", "VkExternalFenceHandleTypeFlagBits")] [NativeName("Name", "handleType")] public ExternalFenceHandleTypeFlags HandleType; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceExternalFenceInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalFenceInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalFenceInfoKHR.gen.cs index bff095483a..42035e9142 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalFenceInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalFenceInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceExternalFenceInfoKHR")] - public unsafe partial struct PhysicalDeviceExternalFenceInfoKHR + public unsafe partial struct PhysicalDeviceExternalFenceInfoKHR : IStructuredType { public PhysicalDeviceExternalFenceInfoKHR ( @@ -57,5 +57,11 @@ public PhysicalDeviceExternalFenceInfoKHR [NativeName("Type.Name", "VkExternalFenceHandleTypeFlagBits")] [NativeName("Name", "handleType")] public ExternalFenceHandleTypeFlags HandleType; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceExternalFenceInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalImageFormatInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalImageFormatInfo.gen.cs index 40a110c063..e2076c6221 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalImageFormatInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalImageFormatInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceExternalImageFormatInfo")] - public unsafe partial struct PhysicalDeviceExternalImageFormatInfo + public unsafe partial struct PhysicalDeviceExternalImageFormatInfo : IStructuredType { public PhysicalDeviceExternalImageFormatInfo ( @@ -57,5 +57,11 @@ public PhysicalDeviceExternalImageFormatInfo [NativeName("Type.Name", "VkExternalMemoryHandleTypeFlagBits")] [NativeName("Name", "handleType")] public ExternalMemoryHandleTypeFlags HandleType; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceExternalImageFormatInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalImageFormatInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalImageFormatInfoKHR.gen.cs index 8149a5bebd..95c93f4234 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalImageFormatInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalImageFormatInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceExternalImageFormatInfoKHR")] - public unsafe partial struct PhysicalDeviceExternalImageFormatInfoKHR + public unsafe partial struct PhysicalDeviceExternalImageFormatInfoKHR : IStructuredType { public PhysicalDeviceExternalImageFormatInfoKHR ( @@ -57,5 +57,11 @@ public PhysicalDeviceExternalImageFormatInfoKHR [NativeName("Type.Name", "VkExternalMemoryHandleTypeFlagBits")] [NativeName("Name", "handleType")] public ExternalMemoryHandleTypeFlags HandleType; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceExternalImageFormatInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalMemoryHostPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalMemoryHostPropertiesEXT.gen.cs index 754af5e798..0e855946d0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalMemoryHostPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalMemoryHostPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceExternalMemoryHostPropertiesEXT")] - public unsafe partial struct PhysicalDeviceExternalMemoryHostPropertiesEXT + public unsafe partial struct PhysicalDeviceExternalMemoryHostPropertiesEXT : IStructuredType { public PhysicalDeviceExternalMemoryHostPropertiesEXT ( @@ -57,5 +57,11 @@ public PhysicalDeviceExternalMemoryHostPropertiesEXT [NativeName("Type.Name", "VkDeviceSize")] [NativeName("Name", "minImportedHostPointerAlignment")] public ulong MinImportedHostPointerAlignment; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceExternalMemoryHostPropertiesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalMemoryRDMAFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalMemoryRDMAFeaturesNV.gen.cs index 88cb7ace3f..fac627303e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalMemoryRDMAFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalMemoryRDMAFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceExternalMemoryRDMAFeaturesNV")] - public unsafe partial struct PhysicalDeviceExternalMemoryRDMAFeaturesNV + public unsafe partial struct PhysicalDeviceExternalMemoryRDMAFeaturesNV : IStructuredType { public PhysicalDeviceExternalMemoryRDMAFeaturesNV ( @@ -57,5 +57,11 @@ public PhysicalDeviceExternalMemoryRDMAFeaturesNV [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "externalMemoryRDMA")] public Bool32 ExternalMemoryRdma; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceExternalMemoryRdmaFeaturesNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalSemaphoreInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalSemaphoreInfo.gen.cs index 0dd995e60e..bbaae33036 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalSemaphoreInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalSemaphoreInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceExternalSemaphoreInfo")] - public unsafe partial struct PhysicalDeviceExternalSemaphoreInfo + public unsafe partial struct PhysicalDeviceExternalSemaphoreInfo : IStructuredType { public PhysicalDeviceExternalSemaphoreInfo ( @@ -57,5 +57,11 @@ public PhysicalDeviceExternalSemaphoreInfo [NativeName("Type.Name", "VkExternalSemaphoreHandleTypeFlagBits")] [NativeName("Name", "handleType")] public ExternalSemaphoreHandleTypeFlags HandleType; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceExternalSemaphoreInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalSemaphoreInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalSemaphoreInfoKHR.gen.cs index d5e07ed20e..3139dd2a17 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalSemaphoreInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalSemaphoreInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceExternalSemaphoreInfoKHR")] - public unsafe partial struct PhysicalDeviceExternalSemaphoreInfoKHR + public unsafe partial struct PhysicalDeviceExternalSemaphoreInfoKHR : IStructuredType { public PhysicalDeviceExternalSemaphoreInfoKHR ( @@ -57,5 +57,11 @@ public PhysicalDeviceExternalSemaphoreInfoKHR [NativeName("Type.Name", "VkExternalSemaphoreHandleTypeFlagBits")] [NativeName("Name", "handleType")] public ExternalSemaphoreHandleTypeFlags HandleType; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceExternalSemaphoreInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFeatures2.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFeatures2.gen.cs index f4e1773ec7..c6895c8970 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFeatures2.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFeatures2.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFeatures2")] - public unsafe partial struct PhysicalDeviceFeatures2 + public unsafe partial struct PhysicalDeviceFeatures2 : IStructuredType { public PhysicalDeviceFeatures2 ( @@ -57,5 +57,11 @@ public PhysicalDeviceFeatures2 [NativeName("Type.Name", "VkPhysicalDeviceFeatures")] [NativeName("Name", "features")] public PhysicalDeviceFeatures Features; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceFeatures2; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFeatures2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFeatures2KHR.gen.cs index 20b4e344fe..e9b533a8c6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFeatures2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFeatures2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFeatures2KHR")] - public unsafe partial struct PhysicalDeviceFeatures2KHR + public unsafe partial struct PhysicalDeviceFeatures2KHR : IStructuredType { public PhysicalDeviceFeatures2KHR ( @@ -57,5 +57,11 @@ public PhysicalDeviceFeatures2KHR [NativeName("Type.Name", "VkPhysicalDeviceFeatures")] [NativeName("Name", "features")] public PhysicalDeviceFeatures Features; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceFeatures2; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFloat16Int8FeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFloat16Int8FeaturesKHR.gen.cs index acac75bd9f..5ec777c2a9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFloat16Int8FeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFloat16Int8FeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFloat16Int8FeaturesKHR")] - public unsafe partial struct PhysicalDeviceFloat16Int8FeaturesKHR + public unsafe partial struct PhysicalDeviceFloat16Int8FeaturesKHR : IStructuredType { public PhysicalDeviceFloat16Int8FeaturesKHR ( @@ -68,5 +68,11 @@ public PhysicalDeviceFloat16Int8FeaturesKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "shaderInt8")] public Bool32 ShaderInt8; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceShaderFloat16Int8Features; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFloatControlsProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFloatControlsProperties.gen.cs index 5a56e03703..c47a13f5b0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFloatControlsProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFloatControlsProperties.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFloatControlsProperties")] - public unsafe partial struct PhysicalDeviceFloatControlsProperties + public unsafe partial struct PhysicalDeviceFloatControlsProperties : IStructuredType { public PhysicalDeviceFloatControlsProperties ( @@ -233,5 +233,11 @@ public PhysicalDeviceFloatControlsProperties [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "shaderRoundingModeRTZFloat64")] public Bool32 ShaderRoundingModeRtzfloat64; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceFloatControlsProperties; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFloatControlsPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFloatControlsPropertiesKHR.gen.cs index 414ce966f6..f18918d405 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFloatControlsPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFloatControlsPropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFloatControlsPropertiesKHR")] - public unsafe partial struct PhysicalDeviceFloatControlsPropertiesKHR + public unsafe partial struct PhysicalDeviceFloatControlsPropertiesKHR : IStructuredType { public PhysicalDeviceFloatControlsPropertiesKHR ( @@ -233,5 +233,11 @@ public PhysicalDeviceFloatControlsPropertiesKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "shaderRoundingModeRTZFloat64")] public Bool32 ShaderRoundingModeRtzfloat64; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceFloatControlsProperties; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMap2FeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMap2FeaturesEXT.gen.cs index e376432c25..ba02f9bcd6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMap2FeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMap2FeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFragmentDensityMap2FeaturesEXT")] - public unsafe partial struct PhysicalDeviceFragmentDensityMap2FeaturesEXT + public unsafe partial struct PhysicalDeviceFragmentDensityMap2FeaturesEXT : IStructuredType { public PhysicalDeviceFragmentDensityMap2FeaturesEXT ( @@ -57,5 +57,11 @@ public PhysicalDeviceFragmentDensityMap2FeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "fragmentDensityMapDeferred")] public Bool32 FragmentDensityMapDeferred; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceFragmentDensityMap2FeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMap2PropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMap2PropertiesEXT.gen.cs index 0b097976b0..c5fb8d408f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMap2PropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMap2PropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFragmentDensityMap2PropertiesEXT")] - public unsafe partial struct PhysicalDeviceFragmentDensityMap2PropertiesEXT + public unsafe partial struct PhysicalDeviceFragmentDensityMap2PropertiesEXT : IStructuredType { public PhysicalDeviceFragmentDensityMap2PropertiesEXT ( @@ -90,5 +90,11 @@ public PhysicalDeviceFragmentDensityMap2PropertiesEXT [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "maxDescriptorSetSubsampledSamplers")] public uint MaxDescriptorSetSubsampledSamplers; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceFragmentDensityMap2PropertiesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMapFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMapFeaturesEXT.gen.cs index 8724d9f3d8..a1ae607627 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMapFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMapFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFragmentDensityMapFeaturesEXT")] - public unsafe partial struct PhysicalDeviceFragmentDensityMapFeaturesEXT + public unsafe partial struct PhysicalDeviceFragmentDensityMapFeaturesEXT : IStructuredType { public PhysicalDeviceFragmentDensityMapFeaturesEXT ( @@ -79,5 +79,11 @@ public PhysicalDeviceFragmentDensityMapFeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "fragmentDensityMapNonSubsampledImages")] public Bool32 FragmentDensityMapNonSubsampledImages; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceFragmentDensityMapFeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMapPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMapPropertiesEXT.gen.cs index 9adfaed054..f0faa36b0a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMapPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMapPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFragmentDensityMapPropertiesEXT")] - public unsafe partial struct PhysicalDeviceFragmentDensityMapPropertiesEXT + public unsafe partial struct PhysicalDeviceFragmentDensityMapPropertiesEXT : IStructuredType { public PhysicalDeviceFragmentDensityMapPropertiesEXT ( @@ -79,5 +79,11 @@ public PhysicalDeviceFragmentDensityMapPropertiesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "fragmentDensityInvocations")] public Bool32 FragmentDensityInvocations; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceFragmentDensityMapPropertiesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShaderBarycentricFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShaderBarycentricFeaturesNV.gen.cs index 4de881fe47..382a1558fc 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShaderBarycentricFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShaderBarycentricFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV")] - public unsafe partial struct PhysicalDeviceFragmentShaderBarycentricFeaturesNV + public unsafe partial struct PhysicalDeviceFragmentShaderBarycentricFeaturesNV : IStructuredType { public PhysicalDeviceFragmentShaderBarycentricFeaturesNV ( @@ -57,5 +57,11 @@ public PhysicalDeviceFragmentShaderBarycentricFeaturesNV [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "fragmentShaderBarycentric")] public Bool32 FragmentShaderBarycentric; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceFragmentShaderBarycentricFeaturesNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShaderInterlockFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShaderInterlockFeaturesEXT.gen.cs index 2453b85f62..75e9f7648e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShaderInterlockFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShaderInterlockFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT")] - public unsafe partial struct PhysicalDeviceFragmentShaderInterlockFeaturesEXT + public unsafe partial struct PhysicalDeviceFragmentShaderInterlockFeaturesEXT : IStructuredType { public PhysicalDeviceFragmentShaderInterlockFeaturesEXT ( @@ -79,5 +79,11 @@ public PhysicalDeviceFragmentShaderInterlockFeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "fragmentShaderShadingRateInterlock")] public Bool32 FragmentShaderShadingRateInterlock; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceFragmentShaderInterlockFeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateEnumsFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateEnumsFeaturesNV.gen.cs index ba46090b4e..f5dbc107bf 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateEnumsFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateEnumsFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV")] - public unsafe partial struct PhysicalDeviceFragmentShadingRateEnumsFeaturesNV + public unsafe partial struct PhysicalDeviceFragmentShadingRateEnumsFeaturesNV : IStructuredType { public PhysicalDeviceFragmentShadingRateEnumsFeaturesNV ( @@ -79,5 +79,11 @@ public PhysicalDeviceFragmentShadingRateEnumsFeaturesNV [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "noInvocationFragmentShadingRates")] public Bool32 NoInvocationFragmentShadingRates; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceFragmentShadingRateEnumsFeaturesNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateEnumsPropertiesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateEnumsPropertiesNV.gen.cs index e8e18ea03b..3c3dd01a56 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateEnumsPropertiesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateEnumsPropertiesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV")] - public unsafe partial struct PhysicalDeviceFragmentShadingRateEnumsPropertiesNV + public unsafe partial struct PhysicalDeviceFragmentShadingRateEnumsPropertiesNV : IStructuredType { public PhysicalDeviceFragmentShadingRateEnumsPropertiesNV ( @@ -57,5 +57,11 @@ public PhysicalDeviceFragmentShadingRateEnumsPropertiesNV [NativeName("Type.Name", "VkSampleCountFlagBits")] [NativeName("Name", "maxFragmentShadingRateInvocationCount")] public SampleCountFlags MaxFragmentShadingRateInvocationCount; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceFragmentShadingRateEnumsPropertiesNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateFeaturesKHR.gen.cs index 4e78097452..e737f96961 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFragmentShadingRateFeaturesKHR")] - public unsafe partial struct PhysicalDeviceFragmentShadingRateFeaturesKHR + public unsafe partial struct PhysicalDeviceFragmentShadingRateFeaturesKHR : IStructuredType { public PhysicalDeviceFragmentShadingRateFeaturesKHR ( @@ -79,5 +79,11 @@ public PhysicalDeviceFragmentShadingRateFeaturesKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "attachmentFragmentShadingRate")] public Bool32 AttachmentFragmentShadingRate; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceFragmentShadingRateFeaturesKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateKHR.gen.cs index ecd249e727..eb7ce16026 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFragmentShadingRateKHR")] - public unsafe partial struct PhysicalDeviceFragmentShadingRateKHR + public unsafe partial struct PhysicalDeviceFragmentShadingRateKHR : IStructuredType { public PhysicalDeviceFragmentShadingRateKHR ( @@ -68,5 +68,11 @@ public PhysicalDeviceFragmentShadingRateKHR [NativeName("Type.Name", "VkExtent2D")] [NativeName("Name", "fragmentSize")] public Extent2D FragmentSize; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceFragmentShadingRateKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRatePropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRatePropertiesKHR.gen.cs index 6c4807d17e..6afe9ccee1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRatePropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRatePropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFragmentShadingRatePropertiesKHR")] - public unsafe partial struct PhysicalDeviceFragmentShadingRatePropertiesKHR + public unsafe partial struct PhysicalDeviceFragmentShadingRatePropertiesKHR : IStructuredType { public PhysicalDeviceFragmentShadingRatePropertiesKHR ( @@ -233,5 +233,11 @@ public PhysicalDeviceFragmentShadingRatePropertiesKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "fragmentShadingRateStrictMultiplyCombiner")] public Bool32 FragmentShadingRateStrictMultiplyCombiner; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceFragmentShadingRatePropertiesKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceGlobalPriorityQueryFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceGlobalPriorityQueryFeaturesEXT.gen.cs index 4eb645bca2..7ca2aa8191 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceGlobalPriorityQueryFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceGlobalPriorityQueryFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT")] - public unsafe partial struct PhysicalDeviceGlobalPriorityQueryFeaturesEXT + public unsafe partial struct PhysicalDeviceGlobalPriorityQueryFeaturesEXT : IStructuredType { public PhysicalDeviceGlobalPriorityQueryFeaturesEXT ( @@ -57,5 +57,11 @@ public PhysicalDeviceGlobalPriorityQueryFeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "globalPriorityQuery")] public Bool32 GlobalPriorityQuery; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceGlobalPriorityQueryFeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceGroupProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceGroupProperties.gen.cs index 6c4a90021e..48e6771e79 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceGroupProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceGroupProperties.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceGroupProperties")] - public unsafe partial struct PhysicalDeviceGroupProperties + public unsafe partial struct PhysicalDeviceGroupProperties : IStructuredType { public PhysicalDeviceGroupProperties ( @@ -130,5 +130,11 @@ public Span AsSpan() [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "subsetAllocation")] public Bool32 SubsetAllocation; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceGroupProperties; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceGroupPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceGroupPropertiesKHR.gen.cs index a47145b20e..cde07ae165 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceGroupPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceGroupPropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceGroupPropertiesKHR")] - public unsafe partial struct PhysicalDeviceGroupPropertiesKHR + public unsafe partial struct PhysicalDeviceGroupPropertiesKHR : IStructuredType { public PhysicalDeviceGroupPropertiesKHR ( @@ -130,5 +130,11 @@ public Span AsSpan() [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "subsetAllocation")] public Bool32 SubsetAllocation; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceGroupProperties; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceHostQueryResetFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceHostQueryResetFeatures.gen.cs index 90b4d2b957..3a67e01491 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceHostQueryResetFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceHostQueryResetFeatures.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceHostQueryResetFeatures")] - public unsafe partial struct PhysicalDeviceHostQueryResetFeatures + public unsafe partial struct PhysicalDeviceHostQueryResetFeatures : IStructuredType { public PhysicalDeviceHostQueryResetFeatures ( @@ -57,5 +57,11 @@ public PhysicalDeviceHostQueryResetFeatures [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "hostQueryReset")] public Bool32 HostQueryReset; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceHostQueryResetFeatures; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceHostQueryResetFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceHostQueryResetFeaturesEXT.gen.cs index 960759f908..6ed8435072 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceHostQueryResetFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceHostQueryResetFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceHostQueryResetFeaturesEXT")] - public unsafe partial struct PhysicalDeviceHostQueryResetFeaturesEXT + public unsafe partial struct PhysicalDeviceHostQueryResetFeaturesEXT : IStructuredType { public PhysicalDeviceHostQueryResetFeaturesEXT ( @@ -57,5 +57,11 @@ public PhysicalDeviceHostQueryResetFeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "hostQueryReset")] public Bool32 HostQueryReset; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceHostQueryResetFeatures; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceIDProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceIDProperties.gen.cs index f31f1d221c..113e0e526d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceIDProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceIDProperties.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceIDProperties")] - public unsafe partial struct PhysicalDeviceIDProperties + public unsafe partial struct PhysicalDeviceIDProperties : IStructuredType { public PhysicalDeviceIDProperties ( @@ -83,5 +83,11 @@ public PhysicalDeviceIDProperties [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "deviceLUIDValid")] public Bool32 DeviceLuidvalid; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceIDProperties; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceIDPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceIDPropertiesKHR.gen.cs index 6361368c62..baa4c17ebc 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceIDPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceIDPropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceIDPropertiesKHR")] - public unsafe partial struct PhysicalDeviceIDPropertiesKHR + public unsafe partial struct PhysicalDeviceIDPropertiesKHR : IStructuredType { public PhysicalDeviceIDPropertiesKHR ( @@ -83,5 +83,11 @@ public PhysicalDeviceIDPropertiesKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "deviceLUIDValid")] public Bool32 DeviceLuidvalid; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceIDProperties; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageDrmFormatModifierInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageDrmFormatModifierInfoEXT.gen.cs index cd2f57ab1a..a10801860e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageDrmFormatModifierInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageDrmFormatModifierInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceImageDrmFormatModifierInfoEXT")] - public unsafe partial struct PhysicalDeviceImageDrmFormatModifierInfoEXT + public unsafe partial struct PhysicalDeviceImageDrmFormatModifierInfoEXT : IStructuredType { public PhysicalDeviceImageDrmFormatModifierInfoEXT ( @@ -90,5 +90,11 @@ public PhysicalDeviceImageDrmFormatModifierInfoEXT [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "pQueueFamilyIndices")] public uint* PQueueFamilyIndices; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceImageDrmFormatModifierInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageFormatInfo2.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageFormatInfo2.gen.cs index 7712df5d2e..1e6843fc39 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageFormatInfo2.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageFormatInfo2.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceImageFormatInfo2")] - public unsafe partial struct PhysicalDeviceImageFormatInfo2 + public unsafe partial struct PhysicalDeviceImageFormatInfo2 : IStructuredType { public PhysicalDeviceImageFormatInfo2 ( @@ -101,5 +101,11 @@ public PhysicalDeviceImageFormatInfo2 [NativeName("Type.Name", "VkImageCreateFlags")] [NativeName("Name", "flags")] public ImageCreateFlags Flags; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceImageFormatInfo2; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageFormatInfo2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageFormatInfo2KHR.gen.cs index 848c64f026..57893d6c46 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageFormatInfo2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageFormatInfo2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceImageFormatInfo2KHR")] - public unsafe partial struct PhysicalDeviceImageFormatInfo2KHR + public unsafe partial struct PhysicalDeviceImageFormatInfo2KHR : IStructuredType { public PhysicalDeviceImageFormatInfo2KHR ( @@ -101,5 +101,11 @@ public PhysicalDeviceImageFormatInfo2KHR [NativeName("Type.Name", "VkImageCreateFlags")] [NativeName("Name", "flags")] public ImageCreateFlags Flags; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceImageFormatInfo2; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageRobustnessFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageRobustnessFeaturesEXT.gen.cs index f80443a309..aa85d9a378 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageRobustnessFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageRobustnessFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceImageRobustnessFeaturesEXT")] - public unsafe partial struct PhysicalDeviceImageRobustnessFeaturesEXT + public unsafe partial struct PhysicalDeviceImageRobustnessFeaturesEXT : IStructuredType { public PhysicalDeviceImageRobustnessFeaturesEXT ( @@ -57,5 +57,11 @@ public PhysicalDeviceImageRobustnessFeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "robustImageAccess")] public Bool32 RobustImageAccess; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceImageRobustnessFeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageViewImageFormatInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageViewImageFormatInfoEXT.gen.cs index 5f201cb781..c9be9e5a9e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageViewImageFormatInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageViewImageFormatInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceImageViewImageFormatInfoEXT")] - public unsafe partial struct PhysicalDeviceImageViewImageFormatInfoEXT + public unsafe partial struct PhysicalDeviceImageViewImageFormatInfoEXT : IStructuredType { public PhysicalDeviceImageViewImageFormatInfoEXT ( @@ -57,5 +57,11 @@ public PhysicalDeviceImageViewImageFormatInfoEXT [NativeName("Type.Name", "VkImageViewType")] [NativeName("Name", "imageViewType")] public ImageViewType ImageViewType; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceImageViewImageFormatInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImagelessFramebufferFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImagelessFramebufferFeatures.gen.cs index 7a2a0bfd3d..a57f5764cb 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImagelessFramebufferFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImagelessFramebufferFeatures.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceImagelessFramebufferFeatures")] - public unsafe partial struct PhysicalDeviceImagelessFramebufferFeatures + public unsafe partial struct PhysicalDeviceImagelessFramebufferFeatures : IStructuredType { public PhysicalDeviceImagelessFramebufferFeatures ( @@ -57,5 +57,11 @@ public PhysicalDeviceImagelessFramebufferFeatures [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "imagelessFramebuffer")] public Bool32 ImagelessFramebuffer; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceImagelessFramebufferFeatures; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImagelessFramebufferFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImagelessFramebufferFeaturesKHR.gen.cs index d7587d883f..0363b7648c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImagelessFramebufferFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImagelessFramebufferFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceImagelessFramebufferFeaturesKHR")] - public unsafe partial struct PhysicalDeviceImagelessFramebufferFeaturesKHR + public unsafe partial struct PhysicalDeviceImagelessFramebufferFeaturesKHR : IStructuredType { public PhysicalDeviceImagelessFramebufferFeaturesKHR ( @@ -57,5 +57,11 @@ public PhysicalDeviceImagelessFramebufferFeaturesKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "imagelessFramebuffer")] public Bool32 ImagelessFramebuffer; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceImagelessFramebufferFeatures; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceIndexTypeUint8FeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceIndexTypeUint8FeaturesEXT.gen.cs index d44ebe10e8..6d80108f1b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceIndexTypeUint8FeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceIndexTypeUint8FeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceIndexTypeUint8FeaturesEXT")] - public unsafe partial struct PhysicalDeviceIndexTypeUint8FeaturesEXT + public unsafe partial struct PhysicalDeviceIndexTypeUint8FeaturesEXT : IStructuredType { public PhysicalDeviceIndexTypeUint8FeaturesEXT ( @@ -57,5 +57,11 @@ public PhysicalDeviceIndexTypeUint8FeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "indexTypeUint8")] public Bool32 IndexTypeUint8; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceIndexTypeUint8FeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInheritedViewportScissorFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInheritedViewportScissorFeaturesNV.gen.cs index ae1e766fab..6f58774867 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInheritedViewportScissorFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInheritedViewportScissorFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceInheritedViewportScissorFeaturesNV")] - public unsafe partial struct PhysicalDeviceInheritedViewportScissorFeaturesNV + public unsafe partial struct PhysicalDeviceInheritedViewportScissorFeaturesNV : IStructuredType { public PhysicalDeviceInheritedViewportScissorFeaturesNV ( @@ -57,5 +57,11 @@ public PhysicalDeviceInheritedViewportScissorFeaturesNV [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "inheritedViewportScissor2D")] public Bool32 InheritedViewportScissor2D; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceInheritedViewportScissorFeaturesNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInlineUniformBlockFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInlineUniformBlockFeaturesEXT.gen.cs index 129b165694..0cde16f292 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInlineUniformBlockFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInlineUniformBlockFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceInlineUniformBlockFeaturesEXT")] - public unsafe partial struct PhysicalDeviceInlineUniformBlockFeaturesEXT + public unsafe partial struct PhysicalDeviceInlineUniformBlockFeaturesEXT : IStructuredType { public PhysicalDeviceInlineUniformBlockFeaturesEXT ( @@ -68,5 +68,11 @@ public PhysicalDeviceInlineUniformBlockFeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "descriptorBindingInlineUniformBlockUpdateAfterBind")] public Bool32 DescriptorBindingInlineUniformBlockUpdateAfterBind; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceInlineUniformBlockFeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInlineUniformBlockPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInlineUniformBlockPropertiesEXT.gen.cs index 784c293632..293c21c6d1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInlineUniformBlockPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInlineUniformBlockPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceInlineUniformBlockPropertiesEXT")] - public unsafe partial struct PhysicalDeviceInlineUniformBlockPropertiesEXT + public unsafe partial struct PhysicalDeviceInlineUniformBlockPropertiesEXT : IStructuredType { public PhysicalDeviceInlineUniformBlockPropertiesEXT ( @@ -101,5 +101,11 @@ public PhysicalDeviceInlineUniformBlockPropertiesEXT [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "maxDescriptorSetUpdateAfterBindInlineUniformBlocks")] public uint MaxDescriptorSetUpdateAfterBindInlineUniformBlocks; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceInlineUniformBlockPropertiesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInvocationMaskFeaturesHUAWEI.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInvocationMaskFeaturesHUAWEI.gen.cs index d76e32277b..b2cc56dfb3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInvocationMaskFeaturesHUAWEI.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInvocationMaskFeaturesHUAWEI.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceInvocationMaskFeaturesHUAWEI")] - public unsafe partial struct PhysicalDeviceInvocationMaskFeaturesHUAWEI + public unsafe partial struct PhysicalDeviceInvocationMaskFeaturesHUAWEI : IStructuredType { public PhysicalDeviceInvocationMaskFeaturesHUAWEI ( @@ -57,5 +57,11 @@ public PhysicalDeviceInvocationMaskFeaturesHUAWEI [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "invocationMask")] public Bool32 InvocationMask; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceInvocationMaskFeaturesHuawei; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceLineRasterizationFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceLineRasterizationFeaturesEXT.gen.cs index 6c595aff75..a265078266 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceLineRasterizationFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceLineRasterizationFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceLineRasterizationFeaturesEXT")] - public unsafe partial struct PhysicalDeviceLineRasterizationFeaturesEXT + public unsafe partial struct PhysicalDeviceLineRasterizationFeaturesEXT : IStructuredType { public PhysicalDeviceLineRasterizationFeaturesEXT ( @@ -112,5 +112,11 @@ public PhysicalDeviceLineRasterizationFeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "stippledSmoothLines")] public Bool32 StippledSmoothLines; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceLineRasterizationFeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceLineRasterizationPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceLineRasterizationPropertiesEXT.gen.cs index f0626eb715..906ec6b114 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceLineRasterizationPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceLineRasterizationPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceLineRasterizationPropertiesEXT")] - public unsafe partial struct PhysicalDeviceLineRasterizationPropertiesEXT + public unsafe partial struct PhysicalDeviceLineRasterizationPropertiesEXT : IStructuredType { public PhysicalDeviceLineRasterizationPropertiesEXT ( @@ -57,5 +57,11 @@ public PhysicalDeviceLineRasterizationPropertiesEXT [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "lineSubPixelPrecisionBits")] public uint LineSubPixelPrecisionBits; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceLineRasterizationPropertiesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance3Properties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance3Properties.gen.cs index d411527072..0e134f4b6e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance3Properties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance3Properties.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMaintenance3Properties")] - public unsafe partial struct PhysicalDeviceMaintenance3Properties + public unsafe partial struct PhysicalDeviceMaintenance3Properties : IStructuredType { public PhysicalDeviceMaintenance3Properties ( @@ -68,5 +68,11 @@ public PhysicalDeviceMaintenance3Properties [NativeName("Type.Name", "VkDeviceSize")] [NativeName("Name", "maxMemoryAllocationSize")] public ulong MaxMemoryAllocationSize; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceMaintenance3Properties; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance3PropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance3PropertiesKHR.gen.cs index fe3bbf0c93..fcd00923ce 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance3PropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance3PropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMaintenance3PropertiesKHR")] - public unsafe partial struct PhysicalDeviceMaintenance3PropertiesKHR + public unsafe partial struct PhysicalDeviceMaintenance3PropertiesKHR : IStructuredType { public PhysicalDeviceMaintenance3PropertiesKHR ( @@ -68,5 +68,11 @@ public PhysicalDeviceMaintenance3PropertiesKHR [NativeName("Type.Name", "VkDeviceSize")] [NativeName("Name", "maxMemoryAllocationSize")] public ulong MaxMemoryAllocationSize; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceMaintenance3Properties; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance4FeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance4FeaturesKHR.gen.cs index 87dbbfa2be..aa18d0ff4f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance4FeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance4FeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMaintenance4FeaturesKHR")] - public unsafe partial struct PhysicalDeviceMaintenance4FeaturesKHR + public unsafe partial struct PhysicalDeviceMaintenance4FeaturesKHR : IStructuredType { public PhysicalDeviceMaintenance4FeaturesKHR ( @@ -57,5 +57,11 @@ public PhysicalDeviceMaintenance4FeaturesKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "maintenance4")] public Bool32 Maintenance4; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceMaintenance4FeaturesKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance4PropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance4PropertiesKHR.gen.cs index 846a2bab22..ae21ca3ea6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance4PropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance4PropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMaintenance4PropertiesKHR")] - public unsafe partial struct PhysicalDeviceMaintenance4PropertiesKHR + public unsafe partial struct PhysicalDeviceMaintenance4PropertiesKHR : IStructuredType { public PhysicalDeviceMaintenance4PropertiesKHR ( @@ -57,5 +57,11 @@ public PhysicalDeviceMaintenance4PropertiesKHR [NativeName("Type.Name", "VkDeviceSize")] [NativeName("Name", "maxBufferSize")] public ulong MaxBufferSize; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceMaintenance4PropertiesKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryBudgetPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryBudgetPropertiesEXT.gen.cs index ecdfc59030..6880f7abfd 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryBudgetPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryBudgetPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMemoryBudgetPropertiesEXT")] - public unsafe partial struct PhysicalDeviceMemoryBudgetPropertiesEXT + public unsafe partial struct PhysicalDeviceMemoryBudgetPropertiesEXT : IStructuredType { public PhysicalDeviceMemoryBudgetPropertiesEXT ( @@ -56,5 +56,11 @@ public PhysicalDeviceMemoryBudgetPropertiesEXT [NativeName("Type.Name", "VkDeviceSize")] [NativeName("Name", "heapUsage")] public fixed ulong HeapUsage[16]; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceMemoryBudgetPropertiesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryPriorityFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryPriorityFeaturesEXT.gen.cs index b0fbffe427..669b7d155d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryPriorityFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryPriorityFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMemoryPriorityFeaturesEXT")] - public unsafe partial struct PhysicalDeviceMemoryPriorityFeaturesEXT + public unsafe partial struct PhysicalDeviceMemoryPriorityFeaturesEXT : IStructuredType { public PhysicalDeviceMemoryPriorityFeaturesEXT ( @@ -57,5 +57,11 @@ public PhysicalDeviceMemoryPriorityFeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "memoryPriority")] public Bool32 MemoryPriority; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceMemoryPriorityFeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryProperties2.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryProperties2.gen.cs index c3f6a378ce..b007956dc9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryProperties2.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryProperties2.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMemoryProperties2")] - public unsafe partial struct PhysicalDeviceMemoryProperties2 + public unsafe partial struct PhysicalDeviceMemoryProperties2 : IStructuredType { public PhysicalDeviceMemoryProperties2 ( @@ -57,5 +57,11 @@ public PhysicalDeviceMemoryProperties2 [NativeName("Type.Name", "VkPhysicalDeviceMemoryProperties")] [NativeName("Name", "memoryProperties")] public PhysicalDeviceMemoryProperties MemoryProperties; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceMemoryProperties2; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryProperties2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryProperties2KHR.gen.cs index 6446da8fb8..82e137ea78 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryProperties2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryProperties2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMemoryProperties2KHR")] - public unsafe partial struct PhysicalDeviceMemoryProperties2KHR + public unsafe partial struct PhysicalDeviceMemoryProperties2KHR : IStructuredType { public PhysicalDeviceMemoryProperties2KHR ( @@ -57,5 +57,11 @@ public PhysicalDeviceMemoryProperties2KHR [NativeName("Type.Name", "VkPhysicalDeviceMemoryProperties")] [NativeName("Name", "memoryProperties")] public PhysicalDeviceMemoryProperties MemoryProperties; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceMemoryProperties2; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMeshShaderFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMeshShaderFeaturesNV.gen.cs index 342a7f4294..89c5f330d1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMeshShaderFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMeshShaderFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMeshShaderFeaturesNV")] - public unsafe partial struct PhysicalDeviceMeshShaderFeaturesNV + public unsafe partial struct PhysicalDeviceMeshShaderFeaturesNV : IStructuredType { public PhysicalDeviceMeshShaderFeaturesNV ( @@ -68,5 +68,11 @@ public PhysicalDeviceMeshShaderFeaturesNV [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "meshShader")] public Bool32 MeshShader; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceMeshShaderFeaturesNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMeshShaderPropertiesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMeshShaderPropertiesNV.gen.cs index ffa88a1f73..5b28c3f134 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMeshShaderPropertiesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMeshShaderPropertiesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMeshShaderPropertiesNV")] - public unsafe partial struct PhysicalDeviceMeshShaderPropertiesNV + public unsafe partial struct PhysicalDeviceMeshShaderPropertiesNV : IStructuredType { public PhysicalDeviceMeshShaderPropertiesNV ( @@ -177,5 +177,11 @@ public PhysicalDeviceMeshShaderPropertiesNV [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "meshOutputPerPrimitiveGranularity")] public uint MeshOutputPerPrimitiveGranularity; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceMeshShaderPropertiesNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiDrawFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiDrawFeaturesEXT.gen.cs index 3169388c21..17db550569 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiDrawFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiDrawFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMultiDrawFeaturesEXT")] - public unsafe partial struct PhysicalDeviceMultiDrawFeaturesEXT + public unsafe partial struct PhysicalDeviceMultiDrawFeaturesEXT : IStructuredType { public PhysicalDeviceMultiDrawFeaturesEXT ( @@ -57,5 +57,11 @@ public PhysicalDeviceMultiDrawFeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "multiDraw")] public Bool32 MultiDraw; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceMultiDrawFeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiDrawPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiDrawPropertiesEXT.gen.cs index 17c42d1b67..acc976fbc9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiDrawPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiDrawPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMultiDrawPropertiesEXT")] - public unsafe partial struct PhysicalDeviceMultiDrawPropertiesEXT + public unsafe partial struct PhysicalDeviceMultiDrawPropertiesEXT : IStructuredType { public PhysicalDeviceMultiDrawPropertiesEXT ( @@ -57,5 +57,11 @@ public PhysicalDeviceMultiDrawPropertiesEXT [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "maxMultiDrawCount")] public uint MaxMultiDrawCount; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceMultiDrawPropertiesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewFeatures.gen.cs index a5276091b6..3b03e978e1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewFeatures.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMultiviewFeatures")] - public unsafe partial struct PhysicalDeviceMultiviewFeatures + public unsafe partial struct PhysicalDeviceMultiviewFeatures : IStructuredType { public PhysicalDeviceMultiviewFeatures ( @@ -79,5 +79,11 @@ public PhysicalDeviceMultiviewFeatures [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "multiviewTessellationShader")] public Bool32 MultiviewTessellationShader; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceMultiviewFeatures; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewFeaturesKHR.gen.cs index 0f569628fd..3ee0e76707 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMultiviewFeaturesKHR")] - public unsafe partial struct PhysicalDeviceMultiviewFeaturesKHR + public unsafe partial struct PhysicalDeviceMultiviewFeaturesKHR : IStructuredType { public PhysicalDeviceMultiviewFeaturesKHR ( @@ -79,5 +79,11 @@ public PhysicalDeviceMultiviewFeaturesKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "multiviewTessellationShader")] public Bool32 MultiviewTessellationShader; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceMultiviewFeatures; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX.gen.cs index 13c3a70e2a..22bc883349 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX")] - public unsafe partial struct PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX + public unsafe partial struct PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX : IStructuredType { public PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX ( @@ -57,5 +57,11 @@ public PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "perViewPositionAllComponents")] public Bool32 PerViewPositionAllComponents; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceMultiviewPerViewAttributesPropertiesNvx; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewProperties.gen.cs index ab2c7d3560..f6a58f7cd6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewProperties.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMultiviewProperties")] - public unsafe partial struct PhysicalDeviceMultiviewProperties + public unsafe partial struct PhysicalDeviceMultiviewProperties : IStructuredType { public PhysicalDeviceMultiviewProperties ( @@ -68,5 +68,11 @@ public PhysicalDeviceMultiviewProperties [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "maxMultiviewInstanceIndex")] public uint MaxMultiviewInstanceIndex; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceMultiviewProperties; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewPropertiesKHR.gen.cs index 76fb088b5b..8f90b6616f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewPropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMultiviewPropertiesKHR")] - public unsafe partial struct PhysicalDeviceMultiviewPropertiesKHR + public unsafe partial struct PhysicalDeviceMultiviewPropertiesKHR : IStructuredType { public PhysicalDeviceMultiviewPropertiesKHR ( @@ -68,5 +68,11 @@ public PhysicalDeviceMultiviewPropertiesKHR [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "maxMultiviewInstanceIndex")] public uint MaxMultiviewInstanceIndex; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceMultiviewProperties; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMutableDescriptorTypeFeaturesVALVE.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMutableDescriptorTypeFeaturesVALVE.gen.cs index ea53c0ba28..ad1cd9dbc9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMutableDescriptorTypeFeaturesVALVE.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMutableDescriptorTypeFeaturesVALVE.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE")] - public unsafe partial struct PhysicalDeviceMutableDescriptorTypeFeaturesVALVE + public unsafe partial struct PhysicalDeviceMutableDescriptorTypeFeaturesVALVE : IStructuredType { public PhysicalDeviceMutableDescriptorTypeFeaturesVALVE ( @@ -57,5 +57,11 @@ public PhysicalDeviceMutableDescriptorTypeFeaturesVALVE [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "mutableDescriptorType")] public Bool32 MutableDescriptorType; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceMutableDescriptorTypeFeaturesValve; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePCIBusInfoPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePCIBusInfoPropertiesEXT.gen.cs index 541026d0f9..a3823c1a2c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePCIBusInfoPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePCIBusInfoPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePCIBusInfoPropertiesEXT")] - public unsafe partial struct PhysicalDevicePCIBusInfoPropertiesEXT + public unsafe partial struct PhysicalDevicePCIBusInfoPropertiesEXT : IStructuredType { public PhysicalDevicePCIBusInfoPropertiesEXT ( @@ -90,5 +90,11 @@ public PhysicalDevicePCIBusInfoPropertiesEXT [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "pciFunction")] public uint PciFunction; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDevicePciBusInfoPropertiesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT.gen.cs index 83103d80e2..77cc037fd1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT")] - public unsafe partial struct PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT + public unsafe partial struct PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT : IStructuredType { public PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT ( @@ -57,5 +57,11 @@ public PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "pageableDeviceLocalMemory")] public Bool32 PageableDeviceLocalMemory; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDevicePageableDeviceLocalMemoryFeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePerformanceQueryFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePerformanceQueryFeaturesKHR.gen.cs index af502ea695..9467cc6d62 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePerformanceQueryFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePerformanceQueryFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePerformanceQueryFeaturesKHR")] - public unsafe partial struct PhysicalDevicePerformanceQueryFeaturesKHR + public unsafe partial struct PhysicalDevicePerformanceQueryFeaturesKHR : IStructuredType { public PhysicalDevicePerformanceQueryFeaturesKHR ( @@ -68,5 +68,11 @@ public PhysicalDevicePerformanceQueryFeaturesKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "performanceCounterMultipleQueryPools")] public Bool32 PerformanceCounterMultipleQueryPools; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDevicePerformanceQueryFeaturesKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePerformanceQueryPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePerformanceQueryPropertiesKHR.gen.cs index dc81ff8b19..d1b1d4633e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePerformanceQueryPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePerformanceQueryPropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePerformanceQueryPropertiesKHR")] - public unsafe partial struct PhysicalDevicePerformanceQueryPropertiesKHR + public unsafe partial struct PhysicalDevicePerformanceQueryPropertiesKHR : IStructuredType { public PhysicalDevicePerformanceQueryPropertiesKHR ( @@ -57,5 +57,11 @@ public PhysicalDevicePerformanceQueryPropertiesKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "allowCommandBufferQueryCopies")] public Bool32 AllowCommandBufferQueryCopies; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDevicePerformanceQueryPropertiesKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePipelineCreationCacheControlFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePipelineCreationCacheControlFeaturesEXT.gen.cs index 51c1f5bbda..2b9feb4a19 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePipelineCreationCacheControlFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePipelineCreationCacheControlFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT")] - public unsafe partial struct PhysicalDevicePipelineCreationCacheControlFeaturesEXT + public unsafe partial struct PhysicalDevicePipelineCreationCacheControlFeaturesEXT : IStructuredType { public PhysicalDevicePipelineCreationCacheControlFeaturesEXT ( @@ -57,5 +57,11 @@ public PhysicalDevicePipelineCreationCacheControlFeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "pipelineCreationCacheControl")] public Bool32 PipelineCreationCacheControl; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDevicePipelineCreationCacheControlFeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePipelineExecutablePropertiesFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePipelineExecutablePropertiesFeaturesKHR.gen.cs index 2c0c152b9c..d8587751b0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePipelineExecutablePropertiesFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePipelineExecutablePropertiesFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR")] - public unsafe partial struct PhysicalDevicePipelineExecutablePropertiesFeaturesKHR + public unsafe partial struct PhysicalDevicePipelineExecutablePropertiesFeaturesKHR : IStructuredType { public PhysicalDevicePipelineExecutablePropertiesFeaturesKHR ( @@ -57,5 +57,11 @@ public PhysicalDevicePipelineExecutablePropertiesFeaturesKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "pipelineExecutableInfo")] public Bool32 PipelineExecutableInfo; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDevicePipelineExecutablePropertiesFeaturesKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePointClippingProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePointClippingProperties.gen.cs index af4432e044..21fe04b79e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePointClippingProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePointClippingProperties.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePointClippingProperties")] - public unsafe partial struct PhysicalDevicePointClippingProperties + public unsafe partial struct PhysicalDevicePointClippingProperties : IStructuredType { public PhysicalDevicePointClippingProperties ( @@ -57,5 +57,11 @@ public PhysicalDevicePointClippingProperties [NativeName("Type.Name", "VkPointClippingBehavior")] [NativeName("Name", "pointClippingBehavior")] public PointClippingBehavior PointClippingBehavior; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDevicePointClippingProperties; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePointClippingPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePointClippingPropertiesKHR.gen.cs index f5a57662b5..2f61d1d2dd 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePointClippingPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePointClippingPropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePointClippingPropertiesKHR")] - public unsafe partial struct PhysicalDevicePointClippingPropertiesKHR + public unsafe partial struct PhysicalDevicePointClippingPropertiesKHR : IStructuredType { public PhysicalDevicePointClippingPropertiesKHR ( @@ -57,5 +57,11 @@ public PhysicalDevicePointClippingPropertiesKHR [NativeName("Type.Name", "VkPointClippingBehavior")] [NativeName("Name", "pointClippingBehavior")] public PointClippingBehavior PointClippingBehavior; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDevicePointClippingProperties; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePortabilitySubsetFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePortabilitySubsetFeaturesKHR.gen.cs index 670295a1e2..916436d42a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePortabilitySubsetFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePortabilitySubsetFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePortabilitySubsetFeaturesKHR")] - public unsafe partial struct PhysicalDevicePortabilitySubsetFeaturesKHR + public unsafe partial struct PhysicalDevicePortabilitySubsetFeaturesKHR : IStructuredType { public PhysicalDevicePortabilitySubsetFeaturesKHR ( @@ -211,5 +211,11 @@ public PhysicalDevicePortabilitySubsetFeaturesKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "vertexAttributeAccessBeyondStride")] public Bool32 VertexAttributeAccessBeyondStride; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDevicePortabilitySubsetFeaturesKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePortabilitySubsetPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePortabilitySubsetPropertiesKHR.gen.cs index 653a19b7e1..f33df74c2f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePortabilitySubsetPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePortabilitySubsetPropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePortabilitySubsetPropertiesKHR")] - public unsafe partial struct PhysicalDevicePortabilitySubsetPropertiesKHR + public unsafe partial struct PhysicalDevicePortabilitySubsetPropertiesKHR : IStructuredType { public PhysicalDevicePortabilitySubsetPropertiesKHR ( @@ -57,5 +57,11 @@ public PhysicalDevicePortabilitySubsetPropertiesKHR [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "minVertexInputBindingStrideAlignment")] public uint MinVertexInputBindingStrideAlignment; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDevicePortabilitySubsetPropertiesKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePresentIdFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePresentIdFeaturesKHR.gen.cs index 7a313d2103..5f411dbb82 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePresentIdFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePresentIdFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePresentIdFeaturesKHR")] - public unsafe partial struct PhysicalDevicePresentIdFeaturesKHR + public unsafe partial struct PhysicalDevicePresentIdFeaturesKHR : IStructuredType { public PhysicalDevicePresentIdFeaturesKHR ( @@ -57,5 +57,11 @@ public PhysicalDevicePresentIdFeaturesKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "presentId")] public Bool32 PresentId; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDevicePresentIDFeaturesKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePresentWaitFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePresentWaitFeaturesKHR.gen.cs index 7c70bec94e..b0c4f9b833 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePresentWaitFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePresentWaitFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePresentWaitFeaturesKHR")] - public unsafe partial struct PhysicalDevicePresentWaitFeaturesKHR + public unsafe partial struct PhysicalDevicePresentWaitFeaturesKHR : IStructuredType { public PhysicalDevicePresentWaitFeaturesKHR ( @@ -57,5 +57,11 @@ public PhysicalDevicePresentWaitFeaturesKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "presentWait")] public Bool32 PresentWait; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDevicePresentWaitFeaturesKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePresentationPropertiesANDROID.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePresentationPropertiesANDROID.gen.cs index 018ba3b19c..27999a343d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePresentationPropertiesANDROID.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePresentationPropertiesANDROID.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePresentationPropertiesANDROID")] - public unsafe partial struct PhysicalDevicePresentationPropertiesANDROID + public unsafe partial struct PhysicalDevicePresentationPropertiesANDROID : IStructuredType { public PhysicalDevicePresentationPropertiesANDROID ( @@ -57,5 +57,11 @@ public PhysicalDevicePresentationPropertiesANDROID [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "sharedImage")] public Bool32 SharedImage; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDevicePresentationPropertiesAndroid; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT.gen.cs index cfc2a15a7e..a633de2d10 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT")] - public unsafe partial struct PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT + public unsafe partial struct PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT : IStructuredType { public PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT ( @@ -68,5 +68,11 @@ public PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "primitiveTopologyPatchListRestart")] public Bool32 PrimitiveTopologyPatchListRestart; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDevicePrimitiveTopologyListRestartFeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePrivateDataFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePrivateDataFeaturesEXT.gen.cs index 4cc9c2b120..c822834358 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePrivateDataFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePrivateDataFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePrivateDataFeaturesEXT")] - public unsafe partial struct PhysicalDevicePrivateDataFeaturesEXT + public unsafe partial struct PhysicalDevicePrivateDataFeaturesEXT : IStructuredType { public PhysicalDevicePrivateDataFeaturesEXT ( @@ -57,5 +57,11 @@ public PhysicalDevicePrivateDataFeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "privateData")] public Bool32 PrivateData; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDevicePrivateDataFeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProperties2.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProperties2.gen.cs index 3cb15e6234..15cd90eb44 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProperties2.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProperties2.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceProperties2")] - public unsafe partial struct PhysicalDeviceProperties2 + public unsafe partial struct PhysicalDeviceProperties2 : IStructuredType { public PhysicalDeviceProperties2 ( @@ -57,5 +57,11 @@ public PhysicalDeviceProperties2 [NativeName("Type.Name", "VkPhysicalDeviceProperties")] [NativeName("Name", "properties")] public PhysicalDeviceProperties Properties; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceProperties2; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProperties2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProperties2KHR.gen.cs index 18136a8ab4..57c85576bc 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProperties2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProperties2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceProperties2KHR")] - public unsafe partial struct PhysicalDeviceProperties2KHR + public unsafe partial struct PhysicalDeviceProperties2KHR : IStructuredType { public PhysicalDeviceProperties2KHR ( @@ -57,5 +57,11 @@ public PhysicalDeviceProperties2KHR [NativeName("Type.Name", "VkPhysicalDeviceProperties")] [NativeName("Name", "properties")] public PhysicalDeviceProperties Properties; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceProperties2; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProtectedMemoryFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProtectedMemoryFeatures.gen.cs index 813c4ba1ed..b23d391e94 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProtectedMemoryFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProtectedMemoryFeatures.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceProtectedMemoryFeatures")] - public unsafe partial struct PhysicalDeviceProtectedMemoryFeatures + public unsafe partial struct PhysicalDeviceProtectedMemoryFeatures : IStructuredType { public PhysicalDeviceProtectedMemoryFeatures ( @@ -57,5 +57,11 @@ public PhysicalDeviceProtectedMemoryFeatures [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "protectedMemory")] public Bool32 ProtectedMemory; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceProtectedMemoryFeatures; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProtectedMemoryProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProtectedMemoryProperties.gen.cs index c7f18ffb3d..66d2cfccec 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProtectedMemoryProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProtectedMemoryProperties.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceProtectedMemoryProperties")] - public unsafe partial struct PhysicalDeviceProtectedMemoryProperties + public unsafe partial struct PhysicalDeviceProtectedMemoryProperties : IStructuredType { public PhysicalDeviceProtectedMemoryProperties ( @@ -57,5 +57,11 @@ public PhysicalDeviceProtectedMemoryProperties [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "protectedNoFault")] public Bool32 ProtectedNoFault; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceProtectedMemoryProperties; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProvokingVertexFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProvokingVertexFeaturesEXT.gen.cs index 425cab6640..748453bed8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProvokingVertexFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProvokingVertexFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceProvokingVertexFeaturesEXT")] - public unsafe partial struct PhysicalDeviceProvokingVertexFeaturesEXT + public unsafe partial struct PhysicalDeviceProvokingVertexFeaturesEXT : IStructuredType { public PhysicalDeviceProvokingVertexFeaturesEXT ( @@ -68,5 +68,11 @@ public PhysicalDeviceProvokingVertexFeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "transformFeedbackPreservesProvokingVertex")] public Bool32 TransformFeedbackPreservesProvokingVertex; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceProvokingVertexFeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProvokingVertexPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProvokingVertexPropertiesEXT.gen.cs index 40b450791a..64c453018a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProvokingVertexPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProvokingVertexPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceProvokingVertexPropertiesEXT")] - public unsafe partial struct PhysicalDeviceProvokingVertexPropertiesEXT + public unsafe partial struct PhysicalDeviceProvokingVertexPropertiesEXT : IStructuredType { public PhysicalDeviceProvokingVertexPropertiesEXT ( @@ -68,5 +68,11 @@ public PhysicalDeviceProvokingVertexPropertiesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "transformFeedbackPreservesTriangleFanProvokingVertex")] public Bool32 TransformFeedbackPreservesTriangleFanProvokingVertex; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceProvokingVertexPropertiesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePushDescriptorPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePushDescriptorPropertiesKHR.gen.cs index 8dec550efd..d1cb21f1c6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePushDescriptorPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePushDescriptorPropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePushDescriptorPropertiesKHR")] - public unsafe partial struct PhysicalDevicePushDescriptorPropertiesKHR + public unsafe partial struct PhysicalDevicePushDescriptorPropertiesKHR : IStructuredType { public PhysicalDevicePushDescriptorPropertiesKHR ( @@ -57,5 +57,11 @@ public PhysicalDevicePushDescriptorPropertiesKHR [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "maxPushDescriptors")] public uint MaxPushDescriptors; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDevicePushDescriptorPropertiesKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRGBA10X6FormatsFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRGBA10X6FormatsFeaturesEXT.gen.cs index 0b20691f99..0b12309b83 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRGBA10X6FormatsFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRGBA10X6FormatsFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT")] - public unsafe partial struct PhysicalDeviceRGBA10X6FormatsFeaturesEXT + public unsafe partial struct PhysicalDeviceRGBA10X6FormatsFeaturesEXT : IStructuredType { public PhysicalDeviceRGBA10X6FormatsFeaturesEXT ( @@ -57,5 +57,11 @@ public PhysicalDeviceRGBA10X6FormatsFeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "formatRgba10x6WithoutYCbCrSampler")] public Bool32 FormatRgba10x6WithoutYCbCrSampler; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceRgba10X6FormatsFeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayQueryFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayQueryFeaturesKHR.gen.cs index de7d0288e1..d3f82fce26 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayQueryFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayQueryFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceRayQueryFeaturesKHR")] - public unsafe partial struct PhysicalDeviceRayQueryFeaturesKHR + public unsafe partial struct PhysicalDeviceRayQueryFeaturesKHR : IStructuredType { public PhysicalDeviceRayQueryFeaturesKHR ( @@ -57,5 +57,11 @@ public PhysicalDeviceRayQueryFeaturesKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "rayQuery")] public Bool32 RayQuery; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceRayQueryFeaturesKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingMotionBlurFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingMotionBlurFeaturesNV.gen.cs index e078094f16..acdf09e149 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingMotionBlurFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingMotionBlurFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceRayTracingMotionBlurFeaturesNV")] - public unsafe partial struct PhysicalDeviceRayTracingMotionBlurFeaturesNV + public unsafe partial struct PhysicalDeviceRayTracingMotionBlurFeaturesNV : IStructuredType { public PhysicalDeviceRayTracingMotionBlurFeaturesNV ( @@ -68,5 +68,11 @@ public PhysicalDeviceRayTracingMotionBlurFeaturesNV [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "rayTracingMotionBlurPipelineTraceRaysIndirect")] public Bool32 RayTracingMotionBlurPipelineTraceRaysIndirect; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceRayTracingMotionBlurFeaturesNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingPipelineFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingPipelineFeaturesKHR.gen.cs index f34205a06d..01bd6835d0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingPipelineFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingPipelineFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceRayTracingPipelineFeaturesKHR")] - public unsafe partial struct PhysicalDeviceRayTracingPipelineFeaturesKHR + public unsafe partial struct PhysicalDeviceRayTracingPipelineFeaturesKHR : IStructuredType { public PhysicalDeviceRayTracingPipelineFeaturesKHR ( @@ -101,5 +101,11 @@ public PhysicalDeviceRayTracingPipelineFeaturesKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "rayTraversalPrimitiveCulling")] public Bool32 RayTraversalPrimitiveCulling; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceRayTracingPipelineFeaturesKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingPipelinePropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingPipelinePropertiesKHR.gen.cs index f0c275d2de..8d3101e9f7 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingPipelinePropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingPipelinePropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceRayTracingPipelinePropertiesKHR")] - public unsafe partial struct PhysicalDeviceRayTracingPipelinePropertiesKHR + public unsafe partial struct PhysicalDeviceRayTracingPipelinePropertiesKHR : IStructuredType { public PhysicalDeviceRayTracingPipelinePropertiesKHR ( @@ -134,5 +134,11 @@ public PhysicalDeviceRayTracingPipelinePropertiesKHR [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "maxRayHitAttributeSize")] public uint MaxRayHitAttributeSize; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceRayTracingPipelinePropertiesKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingPropertiesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingPropertiesNV.gen.cs index be7b5e0f44..33b28eede3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingPropertiesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingPropertiesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceRayTracingPropertiesNV")] - public unsafe partial struct PhysicalDeviceRayTracingPropertiesNV + public unsafe partial struct PhysicalDeviceRayTracingPropertiesNV : IStructuredType { public PhysicalDeviceRayTracingPropertiesNV ( @@ -134,5 +134,11 @@ public PhysicalDeviceRayTracingPropertiesNV [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "maxDescriptorSetAccelerationStructures")] public uint MaxDescriptorSetAccelerationStructures; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceRayTracingPropertiesNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRepresentativeFragmentTestFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRepresentativeFragmentTestFeaturesNV.gen.cs index f32f19627d..4a78dbebe9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRepresentativeFragmentTestFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRepresentativeFragmentTestFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV")] - public unsafe partial struct PhysicalDeviceRepresentativeFragmentTestFeaturesNV + public unsafe partial struct PhysicalDeviceRepresentativeFragmentTestFeaturesNV : IStructuredType { public PhysicalDeviceRepresentativeFragmentTestFeaturesNV ( @@ -57,5 +57,11 @@ public PhysicalDeviceRepresentativeFragmentTestFeaturesNV [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "representativeFragmentTest")] public Bool32 RepresentativeFragmentTest; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceRepresentativeFragmentTestFeaturesNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRobustness2FeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRobustness2FeaturesEXT.gen.cs index 89b4613ec8..8f2cafd1eb 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRobustness2FeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRobustness2FeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceRobustness2FeaturesEXT")] - public unsafe partial struct PhysicalDeviceRobustness2FeaturesEXT + public unsafe partial struct PhysicalDeviceRobustness2FeaturesEXT : IStructuredType { public PhysicalDeviceRobustness2FeaturesEXT ( @@ -79,5 +79,11 @@ public PhysicalDeviceRobustness2FeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "nullDescriptor")] public Bool32 NullDescriptor; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceRobustness2FeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRobustness2PropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRobustness2PropertiesEXT.gen.cs index 62b18c6c47..c6046f7af9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRobustness2PropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRobustness2PropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceRobustness2PropertiesEXT")] - public unsafe partial struct PhysicalDeviceRobustness2PropertiesEXT + public unsafe partial struct PhysicalDeviceRobustness2PropertiesEXT : IStructuredType { public PhysicalDeviceRobustness2PropertiesEXT ( @@ -68,5 +68,11 @@ public PhysicalDeviceRobustness2PropertiesEXT [NativeName("Type.Name", "VkDeviceSize")] [NativeName("Name", "robustUniformBufferAccessSizeAlignment")] public ulong RobustUniformBufferAccessSizeAlignment; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceRobustness2PropertiesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSampleLocationsPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSampleLocationsPropertiesEXT.gen.cs index 5009a57cea..31b33f1060 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSampleLocationsPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSampleLocationsPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSampleLocationsPropertiesEXT")] - public unsafe partial struct PhysicalDeviceSampleLocationsPropertiesEXT + public unsafe partial struct PhysicalDeviceSampleLocationsPropertiesEXT : IStructuredType { public PhysicalDeviceSampleLocationsPropertiesEXT ( @@ -95,5 +95,11 @@ public PhysicalDeviceSampleLocationsPropertiesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "variableSampleLocations")] public Bool32 VariableSampleLocations; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceSampleLocationsPropertiesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerFilterMinmaxProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerFilterMinmaxProperties.gen.cs index 2152bc626d..cc320a2e08 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerFilterMinmaxProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerFilterMinmaxProperties.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSamplerFilterMinmaxProperties")] - public unsafe partial struct PhysicalDeviceSamplerFilterMinmaxProperties + public unsafe partial struct PhysicalDeviceSamplerFilterMinmaxProperties : IStructuredType { public PhysicalDeviceSamplerFilterMinmaxProperties ( @@ -68,5 +68,11 @@ public PhysicalDeviceSamplerFilterMinmaxProperties [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "filterMinmaxImageComponentMapping")] public Bool32 FilterMinmaxImageComponentMapping; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceSamplerFilterMinmaxProperties; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerFilterMinmaxPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerFilterMinmaxPropertiesEXT.gen.cs index 7d3aee1097..0b4146943d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerFilterMinmaxPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerFilterMinmaxPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT")] - public unsafe partial struct PhysicalDeviceSamplerFilterMinmaxPropertiesEXT + public unsafe partial struct PhysicalDeviceSamplerFilterMinmaxPropertiesEXT : IStructuredType { public PhysicalDeviceSamplerFilterMinmaxPropertiesEXT ( @@ -68,5 +68,11 @@ public PhysicalDeviceSamplerFilterMinmaxPropertiesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "filterMinmaxImageComponentMapping")] public Bool32 FilterMinmaxImageComponentMapping; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceSamplerFilterMinmaxProperties; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerYcbcrConversionFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerYcbcrConversionFeatures.gen.cs index 96a15c26b2..0e52ad4f8f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerYcbcrConversionFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerYcbcrConversionFeatures.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSamplerYcbcrConversionFeatures")] - public unsafe partial struct PhysicalDeviceSamplerYcbcrConversionFeatures + public unsafe partial struct PhysicalDeviceSamplerYcbcrConversionFeatures : IStructuredType { public PhysicalDeviceSamplerYcbcrConversionFeatures ( @@ -57,5 +57,11 @@ public PhysicalDeviceSamplerYcbcrConversionFeatures [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "samplerYcbcrConversion")] public Bool32 SamplerYcbcrConversion; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceSamplerYcbcrConversionFeatures; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerYcbcrConversionFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerYcbcrConversionFeaturesKHR.gen.cs index b8ba9cb9dc..db7f9ac22c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerYcbcrConversionFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerYcbcrConversionFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR")] - public unsafe partial struct PhysicalDeviceSamplerYcbcrConversionFeaturesKHR + public unsafe partial struct PhysicalDeviceSamplerYcbcrConversionFeaturesKHR : IStructuredType { public PhysicalDeviceSamplerYcbcrConversionFeaturesKHR ( @@ -57,5 +57,11 @@ public PhysicalDeviceSamplerYcbcrConversionFeaturesKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "samplerYcbcrConversion")] public Bool32 SamplerYcbcrConversion; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceSamplerYcbcrConversionFeatures; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceScalarBlockLayoutFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceScalarBlockLayoutFeatures.gen.cs index 6ed8cb0809..9d2e71f673 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceScalarBlockLayoutFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceScalarBlockLayoutFeatures.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceScalarBlockLayoutFeatures")] - public unsafe partial struct PhysicalDeviceScalarBlockLayoutFeatures + public unsafe partial struct PhysicalDeviceScalarBlockLayoutFeatures : IStructuredType { public PhysicalDeviceScalarBlockLayoutFeatures ( @@ -57,5 +57,11 @@ public PhysicalDeviceScalarBlockLayoutFeatures [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "scalarBlockLayout")] public Bool32 ScalarBlockLayout; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceScalarBlockLayoutFeatures; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceScalarBlockLayoutFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceScalarBlockLayoutFeaturesEXT.gen.cs index 05c40b771e..3246d25044 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceScalarBlockLayoutFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceScalarBlockLayoutFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceScalarBlockLayoutFeaturesEXT")] - public unsafe partial struct PhysicalDeviceScalarBlockLayoutFeaturesEXT + public unsafe partial struct PhysicalDeviceScalarBlockLayoutFeaturesEXT : IStructuredType { public PhysicalDeviceScalarBlockLayoutFeaturesEXT ( @@ -57,5 +57,11 @@ public PhysicalDeviceScalarBlockLayoutFeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "scalarBlockLayout")] public Bool32 ScalarBlockLayout; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceScalarBlockLayoutFeatures; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSeparateDepthStencilLayoutsFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSeparateDepthStencilLayoutsFeatures.gen.cs index 0b8fb76dff..e571ddd82a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSeparateDepthStencilLayoutsFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSeparateDepthStencilLayoutsFeatures.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures")] - public unsafe partial struct PhysicalDeviceSeparateDepthStencilLayoutsFeatures + public unsafe partial struct PhysicalDeviceSeparateDepthStencilLayoutsFeatures : IStructuredType { public PhysicalDeviceSeparateDepthStencilLayoutsFeatures ( @@ -57,5 +57,11 @@ public PhysicalDeviceSeparateDepthStencilLayoutsFeatures [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "separateDepthStencilLayouts")] public Bool32 SeparateDepthStencilLayouts; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceSeparateDepthStencilLayoutsFeatures; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR.gen.cs index 70883b2b8d..d2694f5c8a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR")] - public unsafe partial struct PhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR + public unsafe partial struct PhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR : IStructuredType { public PhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR ( @@ -57,5 +57,11 @@ public PhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "separateDepthStencilLayouts")] public Bool32 SeparateDepthStencilLayouts; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceSeparateDepthStencilLayoutsFeatures; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicFloat2FeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicFloat2FeaturesEXT.gen.cs index e7edcb81ea..12cbf4cae2 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicFloat2FeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicFloat2FeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT")] - public unsafe partial struct PhysicalDeviceShaderAtomicFloat2FeaturesEXT + public unsafe partial struct PhysicalDeviceShaderAtomicFloat2FeaturesEXT : IStructuredType { public PhysicalDeviceShaderAtomicFloat2FeaturesEXT ( @@ -178,5 +178,11 @@ public PhysicalDeviceShaderAtomicFloat2FeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "sparseImageFloat32AtomicMinMax")] public Bool32 SparseImageFloat32AtomicMinMax; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceShaderAtomicFloat2FeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicFloatFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicFloatFeaturesEXT.gen.cs index 7417b8baae..8d99c7433d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicFloatFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicFloatFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderAtomicFloatFeaturesEXT")] - public unsafe partial struct PhysicalDeviceShaderAtomicFloatFeaturesEXT + public unsafe partial struct PhysicalDeviceShaderAtomicFloatFeaturesEXT : IStructuredType { public PhysicalDeviceShaderAtomicFloatFeaturesEXT ( @@ -178,5 +178,11 @@ public PhysicalDeviceShaderAtomicFloatFeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "sparseImageFloat32AtomicAdd")] public Bool32 SparseImageFloat32AtomicAdd; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceShaderAtomicFloatFeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicInt64Features.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicInt64Features.gen.cs index 8622c16e5e..26d6453e3e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicInt64Features.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicInt64Features.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderAtomicInt64Features")] - public unsafe partial struct PhysicalDeviceShaderAtomicInt64Features + public unsafe partial struct PhysicalDeviceShaderAtomicInt64Features : IStructuredType { public PhysicalDeviceShaderAtomicInt64Features ( @@ -68,5 +68,11 @@ public PhysicalDeviceShaderAtomicInt64Features [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "shaderSharedInt64Atomics")] public Bool32 ShaderSharedInt64Atomics; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceShaderAtomicInt64Features; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicInt64FeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicInt64FeaturesKHR.gen.cs index 57a49dcd8b..44c91c5524 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicInt64FeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicInt64FeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderAtomicInt64FeaturesKHR")] - public unsafe partial struct PhysicalDeviceShaderAtomicInt64FeaturesKHR + public unsafe partial struct PhysicalDeviceShaderAtomicInt64FeaturesKHR : IStructuredType { public PhysicalDeviceShaderAtomicInt64FeaturesKHR ( @@ -68,5 +68,11 @@ public PhysicalDeviceShaderAtomicInt64FeaturesKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "shaderSharedInt64Atomics")] public Bool32 ShaderSharedInt64Atomics; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceShaderAtomicInt64Features; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderClockFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderClockFeaturesKHR.gen.cs index 15a1d53cf7..4f92e63b2b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderClockFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderClockFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderClockFeaturesKHR")] - public unsafe partial struct PhysicalDeviceShaderClockFeaturesKHR + public unsafe partial struct PhysicalDeviceShaderClockFeaturesKHR : IStructuredType { public PhysicalDeviceShaderClockFeaturesKHR ( @@ -68,5 +68,11 @@ public PhysicalDeviceShaderClockFeaturesKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "shaderDeviceClock")] public Bool32 ShaderDeviceClock; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceShaderClockFeaturesKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderCoreProperties2AMD.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderCoreProperties2AMD.gen.cs index 56f03e9655..8d188d0d6a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderCoreProperties2AMD.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderCoreProperties2AMD.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderCoreProperties2AMD")] - public unsafe partial struct PhysicalDeviceShaderCoreProperties2AMD + public unsafe partial struct PhysicalDeviceShaderCoreProperties2AMD : IStructuredType { public PhysicalDeviceShaderCoreProperties2AMD ( @@ -68,5 +68,11 @@ public PhysicalDeviceShaderCoreProperties2AMD [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "activeComputeUnitCount")] public uint ActiveComputeUnitCount; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceShaderCoreProperties2Amd; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderCorePropertiesAMD.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderCorePropertiesAMD.gen.cs index f36f0edc5e..15ed2960f2 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderCorePropertiesAMD.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderCorePropertiesAMD.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderCorePropertiesAMD")] - public unsafe partial struct PhysicalDeviceShaderCorePropertiesAMD + public unsafe partial struct PhysicalDeviceShaderCorePropertiesAMD : IStructuredType { public PhysicalDeviceShaderCorePropertiesAMD ( @@ -200,5 +200,11 @@ public PhysicalDeviceShaderCorePropertiesAMD [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "vgprAllocationGranularity")] public uint VgprAllocationGranularity; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceShaderCorePropertiesAmd; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT.gen.cs index 9c39f62017..ecc2253404 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT")] - public unsafe partial struct PhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT + public unsafe partial struct PhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT : IStructuredType { public PhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT ( @@ -57,5 +57,11 @@ public PhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "shaderDemoteToHelperInvocation")] public Bool32 ShaderDemoteToHelperInvocation; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceShaderDemoteToHelperInvocationFeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderDrawParameterFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderDrawParameterFeatures.gen.cs index b2846c7ad5..2766ed71d9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderDrawParameterFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderDrawParameterFeatures.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderDrawParameterFeatures")] - public unsafe partial struct PhysicalDeviceShaderDrawParameterFeatures + public unsafe partial struct PhysicalDeviceShaderDrawParameterFeatures : IStructuredType { public PhysicalDeviceShaderDrawParameterFeatures ( @@ -57,5 +57,11 @@ public PhysicalDeviceShaderDrawParameterFeatures [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "shaderDrawParameters")] public Bool32 ShaderDrawParameters; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceShaderDrawParametersFeatures; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderDrawParametersFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderDrawParametersFeatures.gen.cs index 9102fdafda..81c13df85b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderDrawParametersFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderDrawParametersFeatures.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderDrawParametersFeatures")] - public unsafe partial struct PhysicalDeviceShaderDrawParametersFeatures + public unsafe partial struct PhysicalDeviceShaderDrawParametersFeatures : IStructuredType { public PhysicalDeviceShaderDrawParametersFeatures ( @@ -57,5 +57,11 @@ public PhysicalDeviceShaderDrawParametersFeatures [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "shaderDrawParameters")] public Bool32 ShaderDrawParameters; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceShaderDrawParametersFeatures; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderFloat16Int8Features.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderFloat16Int8Features.gen.cs index 9273d0683b..90685d55fa 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderFloat16Int8Features.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderFloat16Int8Features.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderFloat16Int8Features")] - public unsafe partial struct PhysicalDeviceShaderFloat16Int8Features + public unsafe partial struct PhysicalDeviceShaderFloat16Int8Features : IStructuredType { public PhysicalDeviceShaderFloat16Int8Features ( @@ -68,5 +68,11 @@ public PhysicalDeviceShaderFloat16Int8Features [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "shaderInt8")] public Bool32 ShaderInt8; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceShaderFloat16Int8Features; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderFloat16Int8FeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderFloat16Int8FeaturesKHR.gen.cs index 891fc818f0..7e3714b6d8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderFloat16Int8FeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderFloat16Int8FeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderFloat16Int8FeaturesKHR")] - public unsafe partial struct PhysicalDeviceShaderFloat16Int8FeaturesKHR + public unsafe partial struct PhysicalDeviceShaderFloat16Int8FeaturesKHR : IStructuredType { public PhysicalDeviceShaderFloat16Int8FeaturesKHR ( @@ -68,5 +68,11 @@ public PhysicalDeviceShaderFloat16Int8FeaturesKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "shaderInt8")] public Bool32 ShaderInt8; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceShaderFloat16Int8Features; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderImageAtomicInt64FeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderImageAtomicInt64FeaturesEXT.gen.cs index 803dd639e9..58aee61c9e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderImageAtomicInt64FeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderImageAtomicInt64FeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT")] - public unsafe partial struct PhysicalDeviceShaderImageAtomicInt64FeaturesEXT + public unsafe partial struct PhysicalDeviceShaderImageAtomicInt64FeaturesEXT : IStructuredType { public PhysicalDeviceShaderImageAtomicInt64FeaturesEXT ( @@ -68,5 +68,11 @@ public PhysicalDeviceShaderImageAtomicInt64FeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "sparseImageInt64Atomics")] public Bool32 SparseImageInt64Atomics; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceShaderImageAtomicInt64FeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderImageFootprintFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderImageFootprintFeaturesNV.gen.cs index 5bd0041ea3..4b0970bc9e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderImageFootprintFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderImageFootprintFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderImageFootprintFeaturesNV")] - public unsafe partial struct PhysicalDeviceShaderImageFootprintFeaturesNV + public unsafe partial struct PhysicalDeviceShaderImageFootprintFeaturesNV : IStructuredType { public PhysicalDeviceShaderImageFootprintFeaturesNV ( @@ -57,5 +57,11 @@ public PhysicalDeviceShaderImageFootprintFeaturesNV [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "imageFootprint")] public Bool32 ImageFootprint; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceShaderImageFootprintFeaturesNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderIntegerDotProductFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderIntegerDotProductFeaturesKHR.gen.cs index 2c3b0e3ccd..b3642a20fd 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderIntegerDotProductFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderIntegerDotProductFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR")] - public unsafe partial struct PhysicalDeviceShaderIntegerDotProductFeaturesKHR + public unsafe partial struct PhysicalDeviceShaderIntegerDotProductFeaturesKHR : IStructuredType { public PhysicalDeviceShaderIntegerDotProductFeaturesKHR ( @@ -57,5 +57,11 @@ public PhysicalDeviceShaderIntegerDotProductFeaturesKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "shaderIntegerDotProduct")] public Bool32 ShaderIntegerDotProduct; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceShaderIntegerDotProductFeaturesKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderIntegerDotProductPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderIntegerDotProductPropertiesKHR.gen.cs index 5c854ed0bf..5a62d7518e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderIntegerDotProductPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderIntegerDotProductPropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR")] - public unsafe partial struct PhysicalDeviceShaderIntegerDotProductPropertiesKHR + public unsafe partial struct PhysicalDeviceShaderIntegerDotProductPropertiesKHR : IStructuredType { public PhysicalDeviceShaderIntegerDotProductPropertiesKHR ( @@ -376,5 +376,11 @@ public PhysicalDeviceShaderIntegerDotProductPropertiesKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "integerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated")] public Bool32 IntegerDotProductAccumulatingSaturating64BitMixedSignednessAccelerated; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceShaderIntegerDotProductPropertiesKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL.gen.cs index b8408d7048..2e7bd91ae2 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL")] - public unsafe partial struct PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL + public unsafe partial struct PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL : IStructuredType { public PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL ( @@ -57,5 +57,11 @@ public PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "shaderIntegerFunctions2")] public Bool32 ShaderIntegerFunctions2; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceShaderIntegerFunctions2FeaturesIntel; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSMBuiltinsFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSMBuiltinsFeaturesNV.gen.cs index d9269716f2..46e9f6cf2b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSMBuiltinsFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSMBuiltinsFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderSMBuiltinsFeaturesNV")] - public unsafe partial struct PhysicalDeviceShaderSMBuiltinsFeaturesNV + public unsafe partial struct PhysicalDeviceShaderSMBuiltinsFeaturesNV : IStructuredType { public PhysicalDeviceShaderSMBuiltinsFeaturesNV ( @@ -57,5 +57,11 @@ public PhysicalDeviceShaderSMBuiltinsFeaturesNV [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "shaderSMBuiltins")] public Bool32 ShaderSmbuiltins; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceShaderSMBuiltinsFeaturesNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSMBuiltinsPropertiesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSMBuiltinsPropertiesNV.gen.cs index d68d45c909..0358bf6a6a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSMBuiltinsPropertiesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSMBuiltinsPropertiesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderSMBuiltinsPropertiesNV")] - public unsafe partial struct PhysicalDeviceShaderSMBuiltinsPropertiesNV + public unsafe partial struct PhysicalDeviceShaderSMBuiltinsPropertiesNV : IStructuredType { public PhysicalDeviceShaderSMBuiltinsPropertiesNV ( @@ -68,5 +68,11 @@ public PhysicalDeviceShaderSMBuiltinsPropertiesNV [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "shaderWarpsPerSM")] public uint ShaderWarpsPerSM; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceShaderSMBuiltinsPropertiesNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSubgroupExtendedTypesFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSubgroupExtendedTypesFeatures.gen.cs index 853a3e5ba9..99933147a7 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSubgroupExtendedTypesFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSubgroupExtendedTypesFeatures.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures")] - public unsafe partial struct PhysicalDeviceShaderSubgroupExtendedTypesFeatures + public unsafe partial struct PhysicalDeviceShaderSubgroupExtendedTypesFeatures : IStructuredType { public PhysicalDeviceShaderSubgroupExtendedTypesFeatures ( @@ -57,5 +57,11 @@ public PhysicalDeviceShaderSubgroupExtendedTypesFeatures [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "shaderSubgroupExtendedTypes")] public Bool32 ShaderSubgroupExtendedTypes; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceShaderSubgroupExtendedTypesFeatures; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR.gen.cs index 65fa208eba..7c4e90cff5 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR")] - public unsafe partial struct PhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR + public unsafe partial struct PhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR : IStructuredType { public PhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR ( @@ -57,5 +57,11 @@ public PhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "shaderSubgroupExtendedTypes")] public Bool32 ShaderSubgroupExtendedTypes; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceShaderSubgroupExtendedTypesFeatures; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR.gen.cs index d47801bd4e..9e551bc12e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR")] - public unsafe partial struct PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR + public unsafe partial struct PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR : IStructuredType { public PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR ( @@ -57,5 +57,11 @@ public PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "shaderSubgroupUniformControlFlow")] public Bool32 ShaderSubgroupUniformControlFlow; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderTerminateInvocationFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderTerminateInvocationFeaturesKHR.gen.cs index 43188f1e24..7165154937 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderTerminateInvocationFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderTerminateInvocationFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR")] - public unsafe partial struct PhysicalDeviceShaderTerminateInvocationFeaturesKHR + public unsafe partial struct PhysicalDeviceShaderTerminateInvocationFeaturesKHR : IStructuredType { public PhysicalDeviceShaderTerminateInvocationFeaturesKHR ( @@ -57,5 +57,11 @@ public PhysicalDeviceShaderTerminateInvocationFeaturesKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "shaderTerminateInvocation")] public Bool32 ShaderTerminateInvocation; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceShaderTerminateInvocationFeaturesKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShadingRateImageFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShadingRateImageFeaturesNV.gen.cs index 912e84b0bd..95f5eada57 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShadingRateImageFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShadingRateImageFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShadingRateImageFeaturesNV")] - public unsafe partial struct PhysicalDeviceShadingRateImageFeaturesNV + public unsafe partial struct PhysicalDeviceShadingRateImageFeaturesNV : IStructuredType { public PhysicalDeviceShadingRateImageFeaturesNV ( @@ -68,5 +68,11 @@ public PhysicalDeviceShadingRateImageFeaturesNV [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "shadingRateCoarseSampleOrder")] public Bool32 ShadingRateCoarseSampleOrder; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceShadingRateImageFeaturesNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShadingRateImagePropertiesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShadingRateImagePropertiesNV.gen.cs index b42091b867..b19e969c09 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShadingRateImagePropertiesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShadingRateImagePropertiesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShadingRateImagePropertiesNV")] - public unsafe partial struct PhysicalDeviceShadingRateImagePropertiesNV + public unsafe partial struct PhysicalDeviceShadingRateImagePropertiesNV : IStructuredType { public PhysicalDeviceShadingRateImagePropertiesNV ( @@ -79,5 +79,11 @@ public PhysicalDeviceShadingRateImagePropertiesNV [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "shadingRateMaxCoarseSamples")] public uint ShadingRateMaxCoarseSamples; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceShadingRateImagePropertiesNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSparseImageFormatInfo2.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSparseImageFormatInfo2.gen.cs index 5fab9ffc4f..19a57c3638 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSparseImageFormatInfo2.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSparseImageFormatInfo2.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSparseImageFormatInfo2")] - public unsafe partial struct PhysicalDeviceSparseImageFormatInfo2 + public unsafe partial struct PhysicalDeviceSparseImageFormatInfo2 : IStructuredType { public PhysicalDeviceSparseImageFormatInfo2 ( @@ -101,5 +101,11 @@ public PhysicalDeviceSparseImageFormatInfo2 [NativeName("Type.Name", "VkImageTiling")] [NativeName("Name", "tiling")] public ImageTiling Tiling; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceSparseImageFormatInfo2; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSparseImageFormatInfo2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSparseImageFormatInfo2KHR.gen.cs index e2f7ed656b..040689c8df 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSparseImageFormatInfo2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSparseImageFormatInfo2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSparseImageFormatInfo2KHR")] - public unsafe partial struct PhysicalDeviceSparseImageFormatInfo2KHR + public unsafe partial struct PhysicalDeviceSparseImageFormatInfo2KHR : IStructuredType { public PhysicalDeviceSparseImageFormatInfo2KHR ( @@ -101,5 +101,11 @@ public PhysicalDeviceSparseImageFormatInfo2KHR [NativeName("Type.Name", "VkImageTiling")] [NativeName("Name", "tiling")] public ImageTiling Tiling; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceSparseImageFormatInfo2; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubgroupProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubgroupProperties.gen.cs index 31786c4382..e71b8394fb 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubgroupProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubgroupProperties.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSubgroupProperties")] - public unsafe partial struct PhysicalDeviceSubgroupProperties + public unsafe partial struct PhysicalDeviceSubgroupProperties : IStructuredType { public PhysicalDeviceSubgroupProperties ( @@ -90,5 +90,11 @@ public PhysicalDeviceSubgroupProperties [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "quadOperationsInAllStages")] public Bool32 QuadOperationsInAllStages; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceSubgroupProperties; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubgroupSizeControlFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubgroupSizeControlFeaturesEXT.gen.cs index 4247fba02a..db2ecffa50 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubgroupSizeControlFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubgroupSizeControlFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSubgroupSizeControlFeaturesEXT")] - public unsafe partial struct PhysicalDeviceSubgroupSizeControlFeaturesEXT + public unsafe partial struct PhysicalDeviceSubgroupSizeControlFeaturesEXT : IStructuredType { public PhysicalDeviceSubgroupSizeControlFeaturesEXT ( @@ -68,5 +68,11 @@ public PhysicalDeviceSubgroupSizeControlFeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "computeFullSubgroups")] public Bool32 ComputeFullSubgroups; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceSubgroupSizeControlFeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubgroupSizeControlPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubgroupSizeControlPropertiesEXT.gen.cs index 7a70402d4d..37153faec3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubgroupSizeControlPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubgroupSizeControlPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSubgroupSizeControlPropertiesEXT")] - public unsafe partial struct PhysicalDeviceSubgroupSizeControlPropertiesEXT + public unsafe partial struct PhysicalDeviceSubgroupSizeControlPropertiesEXT : IStructuredType { public PhysicalDeviceSubgroupSizeControlPropertiesEXT ( @@ -90,5 +90,11 @@ public PhysicalDeviceSubgroupSizeControlPropertiesEXT [NativeName("Type.Name", "VkShaderStageFlags")] [NativeName("Name", "requiredSubgroupSizeStages")] public ShaderStageFlags RequiredSubgroupSizeStages; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceSubgroupSizeControlPropertiesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubpassShadingFeaturesHUAWEI.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubpassShadingFeaturesHUAWEI.gen.cs index 1be8200327..7b0af7b6c8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubpassShadingFeaturesHUAWEI.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubpassShadingFeaturesHUAWEI.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSubpassShadingFeaturesHUAWEI")] - public unsafe partial struct PhysicalDeviceSubpassShadingFeaturesHUAWEI + public unsafe partial struct PhysicalDeviceSubpassShadingFeaturesHUAWEI : IStructuredType { public PhysicalDeviceSubpassShadingFeaturesHUAWEI ( @@ -57,5 +57,11 @@ public PhysicalDeviceSubpassShadingFeaturesHUAWEI [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "subpassShading")] public Bool32 SubpassShading; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceSubpassShadingFeaturesHuawei; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubpassShadingPropertiesHUAWEI.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubpassShadingPropertiesHUAWEI.gen.cs index 4233d50a11..fcbef6a93f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubpassShadingPropertiesHUAWEI.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubpassShadingPropertiesHUAWEI.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSubpassShadingPropertiesHUAWEI")] - public unsafe partial struct PhysicalDeviceSubpassShadingPropertiesHUAWEI + public unsafe partial struct PhysicalDeviceSubpassShadingPropertiesHUAWEI : IStructuredType { public PhysicalDeviceSubpassShadingPropertiesHUAWEI ( @@ -57,5 +57,11 @@ public PhysicalDeviceSubpassShadingPropertiesHUAWEI [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "maxSubpassShadingWorkgroupSizeAspectRatio")] public uint MaxSubpassShadingWorkgroupSizeAspectRatio; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceSubpassShadingPropertiesHuawei; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSurfaceInfo2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSurfaceInfo2KHR.gen.cs index 82e3f0c7bb..233a8b9f74 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSurfaceInfo2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSurfaceInfo2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSurfaceInfo2KHR")] - public unsafe partial struct PhysicalDeviceSurfaceInfo2KHR + public unsafe partial struct PhysicalDeviceSurfaceInfo2KHR : IStructuredType { public PhysicalDeviceSurfaceInfo2KHR ( @@ -57,5 +57,11 @@ public PhysicalDeviceSurfaceInfo2KHR [NativeName("Type.Name", "VkSurfaceKHR")] [NativeName("Name", "surface")] public SurfaceKHR Surface; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceSurfaceInfo2Khr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSynchronization2FeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSynchronization2FeaturesKHR.gen.cs index 1579ad5f0c..49beea7f30 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSynchronization2FeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSynchronization2FeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSynchronization2FeaturesKHR")] - public unsafe partial struct PhysicalDeviceSynchronization2FeaturesKHR + public unsafe partial struct PhysicalDeviceSynchronization2FeaturesKHR : IStructuredType { public PhysicalDeviceSynchronization2FeaturesKHR ( @@ -57,5 +57,11 @@ public PhysicalDeviceSynchronization2FeaturesKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "synchronization2")] public Bool32 Synchronization2; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceSynchronization2FeaturesKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTexelBufferAlignmentFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTexelBufferAlignmentFeaturesEXT.gen.cs index 9cf25135db..4bf5183b25 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTexelBufferAlignmentFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTexelBufferAlignmentFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT")] - public unsafe partial struct PhysicalDeviceTexelBufferAlignmentFeaturesEXT + public unsafe partial struct PhysicalDeviceTexelBufferAlignmentFeaturesEXT : IStructuredType { public PhysicalDeviceTexelBufferAlignmentFeaturesEXT ( @@ -57,5 +57,11 @@ public PhysicalDeviceTexelBufferAlignmentFeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "texelBufferAlignment")] public Bool32 TexelBufferAlignment; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceTexelBufferAlignmentFeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTexelBufferAlignmentPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTexelBufferAlignmentPropertiesEXT.gen.cs index 2daeac205c..d8e5d8307c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTexelBufferAlignmentPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTexelBufferAlignmentPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT")] - public unsafe partial struct PhysicalDeviceTexelBufferAlignmentPropertiesEXT + public unsafe partial struct PhysicalDeviceTexelBufferAlignmentPropertiesEXT : IStructuredType { public PhysicalDeviceTexelBufferAlignmentPropertiesEXT ( @@ -90,5 +90,11 @@ public PhysicalDeviceTexelBufferAlignmentPropertiesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "uniformTexelBufferOffsetSingleTexelAlignment")] public Bool32 UniformTexelBufferOffsetSingleTexelAlignment; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceTexelBufferAlignmentPropertiesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTextureCompressionASTCHDRFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTextureCompressionASTCHDRFeaturesEXT.gen.cs index 227e8e122e..5e992f23e8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTextureCompressionASTCHDRFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTextureCompressionASTCHDRFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT")] - public unsafe partial struct PhysicalDeviceTextureCompressionASTCHDRFeaturesEXT + public unsafe partial struct PhysicalDeviceTextureCompressionASTCHDRFeaturesEXT : IStructuredType { public PhysicalDeviceTextureCompressionASTCHDRFeaturesEXT ( @@ -57,5 +57,11 @@ public PhysicalDeviceTextureCompressionASTCHDRFeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "textureCompressionASTC_HDR")] public Bool32 TextureCompressionAstcHdr; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceTextureCompressionAstcHdrFeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphoreFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphoreFeatures.gen.cs index 1287770909..0412a30fb7 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphoreFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphoreFeatures.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceTimelineSemaphoreFeatures")] - public unsafe partial struct PhysicalDeviceTimelineSemaphoreFeatures + public unsafe partial struct PhysicalDeviceTimelineSemaphoreFeatures : IStructuredType { public PhysicalDeviceTimelineSemaphoreFeatures ( @@ -57,5 +57,11 @@ public PhysicalDeviceTimelineSemaphoreFeatures [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "timelineSemaphore")] public Bool32 TimelineSemaphore; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceTimelineSemaphoreFeatures; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphoreFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphoreFeaturesKHR.gen.cs index fd70840a7e..4651b5429d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphoreFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphoreFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceTimelineSemaphoreFeaturesKHR")] - public unsafe partial struct PhysicalDeviceTimelineSemaphoreFeaturesKHR + public unsafe partial struct PhysicalDeviceTimelineSemaphoreFeaturesKHR : IStructuredType { public PhysicalDeviceTimelineSemaphoreFeaturesKHR ( @@ -57,5 +57,11 @@ public PhysicalDeviceTimelineSemaphoreFeaturesKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "timelineSemaphore")] public Bool32 TimelineSemaphore; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceTimelineSemaphoreFeatures; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphoreProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphoreProperties.gen.cs index c4df2bbecc..1587b34f8b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphoreProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphoreProperties.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceTimelineSemaphoreProperties")] - public unsafe partial struct PhysicalDeviceTimelineSemaphoreProperties + public unsafe partial struct PhysicalDeviceTimelineSemaphoreProperties : IStructuredType { public PhysicalDeviceTimelineSemaphoreProperties ( @@ -57,5 +57,11 @@ public PhysicalDeviceTimelineSemaphoreProperties [NativeName("Type.Name", "uint64_t")] [NativeName("Name", "maxTimelineSemaphoreValueDifference")] public ulong MaxTimelineSemaphoreValueDifference; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceTimelineSemaphoreProperties; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphorePropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphorePropertiesKHR.gen.cs index 7e54c7f883..61f4903155 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphorePropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphorePropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceTimelineSemaphorePropertiesKHR")] - public unsafe partial struct PhysicalDeviceTimelineSemaphorePropertiesKHR + public unsafe partial struct PhysicalDeviceTimelineSemaphorePropertiesKHR : IStructuredType { public PhysicalDeviceTimelineSemaphorePropertiesKHR ( @@ -57,5 +57,11 @@ public PhysicalDeviceTimelineSemaphorePropertiesKHR [NativeName("Type.Name", "uint64_t")] [NativeName("Name", "maxTimelineSemaphoreValueDifference")] public ulong MaxTimelineSemaphoreValueDifference; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceTimelineSemaphoreProperties; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceToolPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceToolPropertiesEXT.gen.cs index 94cd10fbb5..b04a936235 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceToolPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceToolPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceToolPropertiesEXT")] - public unsafe partial struct PhysicalDeviceToolPropertiesEXT + public unsafe partial struct PhysicalDeviceToolPropertiesEXT : IStructuredType { public PhysicalDeviceToolPropertiesEXT ( @@ -77,5 +77,11 @@ public PhysicalDeviceToolPropertiesEXT [NativeName("Type.Name", "char")] [NativeName("Name", "layer")] public fixed byte Layer[256]; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceToolPropertiesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTransformFeedbackFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTransformFeedbackFeaturesEXT.gen.cs index 9f371e4c95..d0f44b11ab 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTransformFeedbackFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTransformFeedbackFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceTransformFeedbackFeaturesEXT")] - public unsafe partial struct PhysicalDeviceTransformFeedbackFeaturesEXT + public unsafe partial struct PhysicalDeviceTransformFeedbackFeaturesEXT : IStructuredType { public PhysicalDeviceTransformFeedbackFeaturesEXT ( @@ -68,5 +68,11 @@ public PhysicalDeviceTransformFeedbackFeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "geometryStreams")] public Bool32 GeometryStreams; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceTransformFeedbackFeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTransformFeedbackPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTransformFeedbackPropertiesEXT.gen.cs index dd0e900a7b..90711dfdfd 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTransformFeedbackPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTransformFeedbackPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceTransformFeedbackPropertiesEXT")] - public unsafe partial struct PhysicalDeviceTransformFeedbackPropertiesEXT + public unsafe partial struct PhysicalDeviceTransformFeedbackPropertiesEXT : IStructuredType { public PhysicalDeviceTransformFeedbackPropertiesEXT ( @@ -156,5 +156,11 @@ public PhysicalDeviceTransformFeedbackPropertiesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "transformFeedbackDraw")] public Bool32 TransformFeedbackDraw; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceTransformFeedbackPropertiesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceUniformBufferStandardLayoutFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceUniformBufferStandardLayoutFeatures.gen.cs index 6274f055d2..3f5eafa046 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceUniformBufferStandardLayoutFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceUniformBufferStandardLayoutFeatures.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceUniformBufferStandardLayoutFeatures")] - public unsafe partial struct PhysicalDeviceUniformBufferStandardLayoutFeatures + public unsafe partial struct PhysicalDeviceUniformBufferStandardLayoutFeatures : IStructuredType { public PhysicalDeviceUniformBufferStandardLayoutFeatures ( @@ -57,5 +57,11 @@ public PhysicalDeviceUniformBufferStandardLayoutFeatures [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "uniformBufferStandardLayout")] public Bool32 UniformBufferStandardLayout; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceUniformBufferStandardLayoutFeatures; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceUniformBufferStandardLayoutFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceUniformBufferStandardLayoutFeaturesKHR.gen.cs index 007bab55de..b9d9bb16ea 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceUniformBufferStandardLayoutFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceUniformBufferStandardLayoutFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR")] - public unsafe partial struct PhysicalDeviceUniformBufferStandardLayoutFeaturesKHR + public unsafe partial struct PhysicalDeviceUniformBufferStandardLayoutFeaturesKHR : IStructuredType { public PhysicalDeviceUniformBufferStandardLayoutFeaturesKHR ( @@ -57,5 +57,11 @@ public PhysicalDeviceUniformBufferStandardLayoutFeaturesKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "uniformBufferStandardLayout")] public Bool32 UniformBufferStandardLayout; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceUniformBufferStandardLayoutFeatures; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointerFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointerFeatures.gen.cs index ddeced77df..1813806f23 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointerFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointerFeatures.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceVariablePointerFeatures")] - public unsafe partial struct PhysicalDeviceVariablePointerFeatures + public unsafe partial struct PhysicalDeviceVariablePointerFeatures : IStructuredType { public PhysicalDeviceVariablePointerFeatures ( @@ -68,5 +68,11 @@ public PhysicalDeviceVariablePointerFeatures [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "variablePointers")] public Bool32 VariablePointers; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceVariablePointersFeatures; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointerFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointerFeaturesKHR.gen.cs index 9d47c69893..8a88b64808 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointerFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointerFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceVariablePointerFeaturesKHR")] - public unsafe partial struct PhysicalDeviceVariablePointerFeaturesKHR + public unsafe partial struct PhysicalDeviceVariablePointerFeaturesKHR : IStructuredType { public PhysicalDeviceVariablePointerFeaturesKHR ( @@ -68,5 +68,11 @@ public PhysicalDeviceVariablePointerFeaturesKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "variablePointers")] public Bool32 VariablePointers; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceVariablePointersFeatures; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointersFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointersFeatures.gen.cs index a3d7e0284e..aa3a5a5bc9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointersFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointersFeatures.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceVariablePointersFeatures")] - public unsafe partial struct PhysicalDeviceVariablePointersFeatures + public unsafe partial struct PhysicalDeviceVariablePointersFeatures : IStructuredType { public PhysicalDeviceVariablePointersFeatures ( @@ -68,5 +68,11 @@ public PhysicalDeviceVariablePointersFeatures [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "variablePointers")] public Bool32 VariablePointers; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceVariablePointersFeatures; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointersFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointersFeaturesKHR.gen.cs index eda4cacf36..23890525b2 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointersFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointersFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceVariablePointersFeaturesKHR")] - public unsafe partial struct PhysicalDeviceVariablePointersFeaturesKHR + public unsafe partial struct PhysicalDeviceVariablePointersFeaturesKHR : IStructuredType { public PhysicalDeviceVariablePointersFeaturesKHR ( @@ -68,5 +68,11 @@ public PhysicalDeviceVariablePointersFeaturesKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "variablePointers")] public Bool32 VariablePointers; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceVariablePointersFeatures; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVertexAttributeDivisorFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVertexAttributeDivisorFeaturesEXT.gen.cs index be23fe3627..2b01da546d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVertexAttributeDivisorFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVertexAttributeDivisorFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT")] - public unsafe partial struct PhysicalDeviceVertexAttributeDivisorFeaturesEXT + public unsafe partial struct PhysicalDeviceVertexAttributeDivisorFeaturesEXT : IStructuredType { public PhysicalDeviceVertexAttributeDivisorFeaturesEXT ( @@ -68,5 +68,11 @@ public PhysicalDeviceVertexAttributeDivisorFeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "vertexAttributeInstanceRateZeroDivisor")] public Bool32 VertexAttributeInstanceRateZeroDivisor; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceVertexAttributeDivisorFeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVertexAttributeDivisorPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVertexAttributeDivisorPropertiesEXT.gen.cs index 074f541486..2e20a6e21e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVertexAttributeDivisorPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVertexAttributeDivisorPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT")] - public unsafe partial struct PhysicalDeviceVertexAttributeDivisorPropertiesEXT + public unsafe partial struct PhysicalDeviceVertexAttributeDivisorPropertiesEXT : IStructuredType { public PhysicalDeviceVertexAttributeDivisorPropertiesEXT ( @@ -57,5 +57,11 @@ public PhysicalDeviceVertexAttributeDivisorPropertiesEXT [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "maxVertexAttribDivisor")] public uint MaxVertexAttribDivisor; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceVertexAttributeDivisorPropertiesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVertexInputDynamicStateFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVertexInputDynamicStateFeaturesEXT.gen.cs index a03c67bb64..813b19ca3c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVertexInputDynamicStateFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVertexInputDynamicStateFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT")] - public unsafe partial struct PhysicalDeviceVertexInputDynamicStateFeaturesEXT + public unsafe partial struct PhysicalDeviceVertexInputDynamicStateFeaturesEXT : IStructuredType { public PhysicalDeviceVertexInputDynamicStateFeaturesEXT ( @@ -57,5 +57,11 @@ public PhysicalDeviceVertexInputDynamicStateFeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "vertexInputDynamicState")] public Bool32 VertexInputDynamicState; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceVertexInputDynamicStateFeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVideoFormatInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVideoFormatInfoKHR.gen.cs index 8e6ebcac80..200438d3bf 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVideoFormatInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVideoFormatInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceVideoFormatInfoKHR")] - public unsafe partial struct PhysicalDeviceVideoFormatInfoKHR + public unsafe partial struct PhysicalDeviceVideoFormatInfoKHR : IStructuredType { public PhysicalDeviceVideoFormatInfoKHR ( @@ -68,5 +68,11 @@ public PhysicalDeviceVideoFormatInfoKHR [NativeName("Type.Name", "VkVideoProfilesKHR")] [NativeName("Name", "pVideoProfiles")] public VideoProfilesKHR* PVideoProfiles; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceVideoFormatInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan11Features.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan11Features.gen.cs index 5b91d525b5..7717087b0b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan11Features.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan11Features.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceVulkan11Features")] - public unsafe partial struct PhysicalDeviceVulkan11Features + public unsafe partial struct PhysicalDeviceVulkan11Features : IStructuredType { public PhysicalDeviceVulkan11Features ( @@ -178,5 +178,11 @@ public PhysicalDeviceVulkan11Features [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "shaderDrawParameters")] public Bool32 ShaderDrawParameters; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceVulkan11Features; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan11Properties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan11Properties.gen.cs index 2f5715ed1a..36069f66c3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan11Properties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan11Properties.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceVulkan11Properties")] - public unsafe partial struct PhysicalDeviceVulkan11Properties + public unsafe partial struct PhysicalDeviceVulkan11Properties : IStructuredType { public PhysicalDeviceVulkan11Properties ( @@ -193,5 +193,11 @@ public PhysicalDeviceVulkan11Properties [NativeName("Type.Name", "VkDeviceSize")] [NativeName("Name", "maxMemoryAllocationSize")] public ulong MaxMemoryAllocationSize; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceVulkan11Properties; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan12Features.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan12Features.gen.cs index 2d104d2b8e..6acf37212b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan12Features.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan12Features.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceVulkan12Features")] - public unsafe partial struct PhysicalDeviceVulkan12Features + public unsafe partial struct PhysicalDeviceVulkan12Features : IStructuredType { public PhysicalDeviceVulkan12Features ( @@ -563,5 +563,11 @@ public PhysicalDeviceVulkan12Features [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "subgroupBroadcastDynamicId")] public Bool32 SubgroupBroadcastDynamicId; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceVulkan12Features; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan12Properties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan12Properties.gen.cs index 6edaee6722..969169133b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan12Properties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan12Properties.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceVulkan12Properties")] - public unsafe partial struct PhysicalDeviceVulkan12Properties + public unsafe partial struct PhysicalDeviceVulkan12Properties : IStructuredType { public PhysicalDeviceVulkan12Properties ( @@ -606,5 +606,11 @@ public PhysicalDeviceVulkan12Properties [NativeName("Type.Name", "VkSampleCountFlags")] [NativeName("Name", "framebufferIntegerColorSampleCounts")] public SampleCountFlags FramebufferIntegerColorSampleCounts; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceVulkan12Properties; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkanMemoryModelFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkanMemoryModelFeatures.gen.cs index 20f2697e09..6d8bd2d6b0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkanMemoryModelFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkanMemoryModelFeatures.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceVulkanMemoryModelFeatures")] - public unsafe partial struct PhysicalDeviceVulkanMemoryModelFeatures + public unsafe partial struct PhysicalDeviceVulkanMemoryModelFeatures : IStructuredType { public PhysicalDeviceVulkanMemoryModelFeatures ( @@ -79,5 +79,11 @@ public PhysicalDeviceVulkanMemoryModelFeatures [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "vulkanMemoryModelAvailabilityVisibilityChains")] public Bool32 VulkanMemoryModelAvailabilityVisibilityChains; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceVulkanMemoryModelFeatures; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkanMemoryModelFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkanMemoryModelFeaturesKHR.gen.cs index 3fc26e2710..6570f4bdde 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkanMemoryModelFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkanMemoryModelFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceVulkanMemoryModelFeaturesKHR")] - public unsafe partial struct PhysicalDeviceVulkanMemoryModelFeaturesKHR + public unsafe partial struct PhysicalDeviceVulkanMemoryModelFeaturesKHR : IStructuredType { public PhysicalDeviceVulkanMemoryModelFeaturesKHR ( @@ -79,5 +79,11 @@ public PhysicalDeviceVulkanMemoryModelFeaturesKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "vulkanMemoryModelAvailabilityVisibilityChains")] public Bool32 VulkanMemoryModelAvailabilityVisibilityChains; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceVulkanMemoryModelFeatures; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR.gen.cs index 50ee55afe2..f64e865782 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR")] - public unsafe partial struct PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR + public unsafe partial struct PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR : IStructuredType { public PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR ( @@ -90,5 +90,11 @@ public PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "workgroupMemoryExplicitLayout16BitAccess")] public Bool32 WorkgroupMemoryExplicitLayout16BitAccess; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT.gen.cs index 40b4b7382e..b345d01d92 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT")] - public unsafe partial struct PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT + public unsafe partial struct PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT : IStructuredType { public PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT ( @@ -57,5 +57,11 @@ public PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "ycbcr2plane444Formats")] public Bool32 Ycbcr2plane444formats; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceYcbcr2Plane444FormatsFeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceYcbcrImageArraysFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceYcbcrImageArraysFeaturesEXT.gen.cs index 18e18452db..bc3f002e48 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceYcbcrImageArraysFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceYcbcrImageArraysFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceYcbcrImageArraysFeaturesEXT")] - public unsafe partial struct PhysicalDeviceYcbcrImageArraysFeaturesEXT + public unsafe partial struct PhysicalDeviceYcbcrImageArraysFeaturesEXT : IStructuredType { public PhysicalDeviceYcbcrImageArraysFeaturesEXT ( @@ -57,5 +57,11 @@ public PhysicalDeviceYcbcrImageArraysFeaturesEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "ycbcrImageArrays")] public Bool32 YcbcrImageArrays; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceYcbcrImageArraysFeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR.gen.cs index 6325f69aa1..21262a53e8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR")] - public unsafe partial struct PhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR + public unsafe partial struct PhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR : IStructuredType { public PhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR ( @@ -57,5 +57,11 @@ public PhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "shaderZeroInitializeWorkgroupMemory")] public Bool32 ShaderZeroInitializeWorkgroupMemory; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCacheCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCacheCreateInfo.gen.cs index 0402ab0707..aba51570ce 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCacheCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCacheCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineCacheCreateInfo")] - public unsafe partial struct PipelineCacheCreateInfo + public unsafe partial struct PipelineCacheCreateInfo : IStructuredType { public PipelineCacheCreateInfo ( @@ -79,5 +79,11 @@ public PipelineCacheCreateInfo [NativeName("Type.Name", "void")] [NativeName("Name", "pInitialData")] public void* PInitialData; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineCacheCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineColorBlendAdvancedStateCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineColorBlendAdvancedStateCreateInfoEXT.gen.cs index 01e04fb865..c285407f63 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineColorBlendAdvancedStateCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineColorBlendAdvancedStateCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineColorBlendAdvancedStateCreateInfoEXT")] - public unsafe partial struct PipelineColorBlendAdvancedStateCreateInfoEXT + public unsafe partial struct PipelineColorBlendAdvancedStateCreateInfoEXT : IStructuredType { public PipelineColorBlendAdvancedStateCreateInfoEXT ( @@ -79,5 +79,11 @@ public PipelineColorBlendAdvancedStateCreateInfoEXT [NativeName("Type.Name", "VkBlendOverlapEXT")] [NativeName("Name", "blendOverlap")] public BlendOverlapEXT BlendOverlap; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineColorBlendAdvancedStateCreateInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineColorBlendStateCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineColorBlendStateCreateInfo.gen.cs index d49f734d50..caadf66ea9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineColorBlendStateCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineColorBlendStateCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineColorBlendStateCreateInfo")] - public unsafe partial struct PipelineColorBlendStateCreateInfo + public unsafe partial struct PipelineColorBlendStateCreateInfo : IStructuredType { public PipelineColorBlendStateCreateInfo ( @@ -106,5 +106,11 @@ public PipelineColorBlendStateCreateInfo [NativeName("Type.Name", "float")] [NativeName("Name", "blendConstants")] public fixed float BlendConstants[4]; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineColorBlendStateCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineColorWriteCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineColorWriteCreateInfoEXT.gen.cs index 48c112a615..4f279eff88 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineColorWriteCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineColorWriteCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineColorWriteCreateInfoEXT")] - public unsafe partial struct PipelineColorWriteCreateInfoEXT + public unsafe partial struct PipelineColorWriteCreateInfoEXT : IStructuredType { public PipelineColorWriteCreateInfoEXT ( @@ -68,5 +68,11 @@ public PipelineColorWriteCreateInfoEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "pColorWriteEnables")] public Bool32* PColorWriteEnables; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineColorWriteCreateInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCompilerControlCreateInfoAMD.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCompilerControlCreateInfoAMD.gen.cs index ae67f41b37..5ad9ef19c5 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCompilerControlCreateInfoAMD.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCompilerControlCreateInfoAMD.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineCompilerControlCreateInfoAMD")] - public unsafe partial struct PipelineCompilerControlCreateInfoAMD + public unsafe partial struct PipelineCompilerControlCreateInfoAMD : IStructuredType { public PipelineCompilerControlCreateInfoAMD ( @@ -57,5 +57,11 @@ public PipelineCompilerControlCreateInfoAMD [NativeName("Type.Name", "VkPipelineCompilerControlFlagsAMD")] [NativeName("Name", "compilerControlFlags")] public PipelineCompilerControlFlagsAMD CompilerControlFlags; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineCompilerControlCreateInfoAmd; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCoverageModulationStateCreateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCoverageModulationStateCreateInfoNV.gen.cs index 84ab26cbbb..95b89a34bc 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCoverageModulationStateCreateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCoverageModulationStateCreateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineCoverageModulationStateCreateInfoNV")] - public unsafe partial struct PipelineCoverageModulationStateCreateInfoNV + public unsafe partial struct PipelineCoverageModulationStateCreateInfoNV : IStructuredType { public PipelineCoverageModulationStateCreateInfoNV ( @@ -101,5 +101,11 @@ public PipelineCoverageModulationStateCreateInfoNV [NativeName("Type.Name", "float")] [NativeName("Name", "pCoverageModulationTable")] public float* PCoverageModulationTable; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineCoverageModulationStateCreateInfoNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCoverageReductionStateCreateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCoverageReductionStateCreateInfoNV.gen.cs index 4a3c8a2c61..0d97c2acda 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCoverageReductionStateCreateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCoverageReductionStateCreateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineCoverageReductionStateCreateInfoNV")] - public unsafe partial struct PipelineCoverageReductionStateCreateInfoNV + public unsafe partial struct PipelineCoverageReductionStateCreateInfoNV : IStructuredType { public PipelineCoverageReductionStateCreateInfoNV ( @@ -68,5 +68,11 @@ public PipelineCoverageReductionStateCreateInfoNV [NativeName("Type.Name", "VkCoverageReductionModeNV")] [NativeName("Name", "coverageReductionMode")] public CoverageReductionModeNV CoverageReductionMode; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineCoverageReductionStateCreateInfoNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCoverageToColorStateCreateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCoverageToColorStateCreateInfoNV.gen.cs index 922e52b172..542e3689d2 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCoverageToColorStateCreateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCoverageToColorStateCreateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineCoverageToColorStateCreateInfoNV")] - public unsafe partial struct PipelineCoverageToColorStateCreateInfoNV + public unsafe partial struct PipelineCoverageToColorStateCreateInfoNV : IStructuredType { public PipelineCoverageToColorStateCreateInfoNV ( @@ -79,5 +79,11 @@ public PipelineCoverageToColorStateCreateInfoNV [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "coverageToColorLocation")] public uint CoverageToColorLocation; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineCoverageToColorStateCreateInfoNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCreationFeedbackCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCreationFeedbackCreateInfoEXT.gen.cs index 494cc0b518..7c60c58d3b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCreationFeedbackCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCreationFeedbackCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineCreationFeedbackCreateInfoEXT")] - public unsafe partial struct PipelineCreationFeedbackCreateInfoEXT + public unsafe partial struct PipelineCreationFeedbackCreateInfoEXT : IStructuredType { public PipelineCreationFeedbackCreateInfoEXT ( @@ -79,5 +79,11 @@ public PipelineCreationFeedbackCreateInfoEXT [NativeName("Type.Name", "VkPipelineCreationFeedbackEXT")] [NativeName("Name", "pPipelineStageCreationFeedbacks")] public PipelineCreationFeedbackEXT* PPipelineStageCreationFeedbacks; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineCreationFeedbackCreateInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineDepthStencilStateCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineDepthStencilStateCreateInfo.gen.cs index 2ef827c074..74a55c6db7 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineDepthStencilStateCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineDepthStencilStateCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineDepthStencilStateCreateInfo")] - public unsafe partial struct PipelineDepthStencilStateCreateInfo + public unsafe partial struct PipelineDepthStencilStateCreateInfo : IStructuredType { public PipelineDepthStencilStateCreateInfo ( @@ -156,5 +156,11 @@ public PipelineDepthStencilStateCreateInfo [NativeName("Type.Name", "float")] [NativeName("Name", "maxDepthBounds")] public float MaxDepthBounds; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineDepthStencilStateCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineDiscardRectangleStateCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineDiscardRectangleStateCreateInfoEXT.gen.cs index 492574c36d..d81de4abfb 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineDiscardRectangleStateCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineDiscardRectangleStateCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineDiscardRectangleStateCreateInfoEXT")] - public unsafe partial struct PipelineDiscardRectangleStateCreateInfoEXT + public unsafe partial struct PipelineDiscardRectangleStateCreateInfoEXT : IStructuredType { public PipelineDiscardRectangleStateCreateInfoEXT ( @@ -90,5 +90,11 @@ public PipelineDiscardRectangleStateCreateInfoEXT [NativeName("Type.Name", "VkRect2D")] [NativeName("Name", "pDiscardRectangles")] public Rect2D* PDiscardRectangles; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineDiscardRectangleStateCreateInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineDynamicStateCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineDynamicStateCreateInfo.gen.cs index e8b1a84e9c..6149d255fe 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineDynamicStateCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineDynamicStateCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineDynamicStateCreateInfo")] - public unsafe partial struct PipelineDynamicStateCreateInfo + public unsafe partial struct PipelineDynamicStateCreateInfo : IStructuredType { public PipelineDynamicStateCreateInfo ( @@ -79,5 +79,11 @@ public PipelineDynamicStateCreateInfo [NativeName("Type.Name", "VkDynamicState")] [NativeName("Name", "pDynamicStates")] public DynamicState* PDynamicStates; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineDynamicStateCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineExecutableInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineExecutableInfoKHR.gen.cs index 6b066aa83f..419ac64ebd 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineExecutableInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineExecutableInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineExecutableInfoKHR")] - public unsafe partial struct PipelineExecutableInfoKHR + public unsafe partial struct PipelineExecutableInfoKHR : IStructuredType { public PipelineExecutableInfoKHR ( @@ -68,5 +68,11 @@ public PipelineExecutableInfoKHR [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "executableIndex")] public uint ExecutableIndex; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineExecutableInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineExecutableInternalRepresentationKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineExecutableInternalRepresentationKHR.gen.cs index 7de5cf19f4..a01b53bf2c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineExecutableInternalRepresentationKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineExecutableInternalRepresentationKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineExecutableInternalRepresentationKHR")] - public unsafe partial struct PipelineExecutableInternalRepresentationKHR + public unsafe partial struct PipelineExecutableInternalRepresentationKHR : IStructuredType { public PipelineExecutableInternalRepresentationKHR ( @@ -89,5 +89,11 @@ public PipelineExecutableInternalRepresentationKHR [NativeName("Type.Name", "void")] [NativeName("Name", "pData")] public void* PData; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineExecutableInternalRepresentationKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineExecutablePropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineExecutablePropertiesKHR.gen.cs index 81191d37a0..687e0643a7 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineExecutablePropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineExecutablePropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineExecutablePropertiesKHR")] - public unsafe partial struct PipelineExecutablePropertiesKHR + public unsafe partial struct PipelineExecutablePropertiesKHR : IStructuredType { public PipelineExecutablePropertiesKHR ( @@ -78,5 +78,11 @@ public PipelineExecutablePropertiesKHR [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "subgroupSize")] public uint SubgroupSize; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineExecutablePropertiesKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineExecutableStatisticKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineExecutableStatisticKHR.gen.cs index 4765b3e6a1..81d9679a7c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineExecutableStatisticKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineExecutableStatisticKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineExecutableStatisticKHR")] - public unsafe partial struct PipelineExecutableStatisticKHR + public unsafe partial struct PipelineExecutableStatisticKHR : IStructuredType { public PipelineExecutableStatisticKHR ( @@ -78,5 +78,11 @@ public PipelineExecutableStatisticKHR [NativeName("Type.Name", "VkPipelineExecutableStatisticValueKHR")] [NativeName("Name", "value")] public PipelineExecutableStatisticValueKHR Value; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineExecutableStatisticKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineFragmentShadingRateEnumStateCreateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineFragmentShadingRateEnumStateCreateInfoNV.gen.cs index 4beb07b185..1265a82cff 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineFragmentShadingRateEnumStateCreateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineFragmentShadingRateEnumStateCreateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineFragmentShadingRateEnumStateCreateInfoNV")] - public unsafe partial struct PipelineFragmentShadingRateEnumStateCreateInfoNV + public unsafe partial struct PipelineFragmentShadingRateEnumStateCreateInfoNV : IStructuredType { public PipelineFragmentShadingRateEnumStateCreateInfoNV ( @@ -100,5 +100,11 @@ public Span AsSpan() #endif } + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineFragmentShadingRateEnumStateCreateInfoNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineFragmentShadingRateStateCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineFragmentShadingRateStateCreateInfoKHR.gen.cs index e97767c30d..9ec62db19e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineFragmentShadingRateStateCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineFragmentShadingRateStateCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineFragmentShadingRateStateCreateInfoKHR")] - public unsafe partial struct PipelineFragmentShadingRateStateCreateInfoKHR + public unsafe partial struct PipelineFragmentShadingRateStateCreateInfoKHR : IStructuredType { public PipelineFragmentShadingRateStateCreateInfoKHR ( @@ -89,5 +89,11 @@ public Span AsSpan() #endif } + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineFragmentShadingRateStateCreateInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineInfoKHR.gen.cs index 5f36ace08c..351cec483f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineInfoKHR")] - public unsafe partial struct PipelineInfoKHR + public unsafe partial struct PipelineInfoKHR : IStructuredType { public PipelineInfoKHR ( @@ -57,5 +57,11 @@ public PipelineInfoKHR [NativeName("Type.Name", "VkPipeline")] [NativeName("Name", "pipeline")] public Pipeline Pipeline; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineInputAssemblyStateCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineInputAssemblyStateCreateInfo.gen.cs index b82af0adbd..2887bbbc87 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineInputAssemblyStateCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineInputAssemblyStateCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineInputAssemblyStateCreateInfo")] - public unsafe partial struct PipelineInputAssemblyStateCreateInfo + public unsafe partial struct PipelineInputAssemblyStateCreateInfo : IStructuredType { public PipelineInputAssemblyStateCreateInfo ( @@ -79,5 +79,11 @@ public PipelineInputAssemblyStateCreateInfo [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "primitiveRestartEnable")] public Bool32 PrimitiveRestartEnable; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineInputAssemblyStateCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineLayoutCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineLayoutCreateInfo.gen.cs index d63fb5d3a6..69a0bef922 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineLayoutCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineLayoutCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineLayoutCreateInfo")] - public unsafe partial struct PipelineLayoutCreateInfo + public unsafe partial struct PipelineLayoutCreateInfo : IStructuredType { public PipelineLayoutCreateInfo ( @@ -101,5 +101,11 @@ public PipelineLayoutCreateInfo [NativeName("Type.Name", "VkPushConstantRange")] [NativeName("Name", "pPushConstantRanges")] public PushConstantRange* PPushConstantRanges; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineLayoutCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineLibraryCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineLibraryCreateInfoKHR.gen.cs index 07bb02bb40..9cba2709a8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineLibraryCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineLibraryCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineLibraryCreateInfoKHR")] - public unsafe partial struct PipelineLibraryCreateInfoKHR + public unsafe partial struct PipelineLibraryCreateInfoKHR : IStructuredType { public PipelineLibraryCreateInfoKHR ( @@ -68,5 +68,11 @@ public PipelineLibraryCreateInfoKHR [NativeName("Type.Name", "VkPipeline")] [NativeName("Name", "pLibraries")] public Pipeline* PLibraries; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineLibraryCreateInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineMultisampleStateCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineMultisampleStateCreateInfo.gen.cs index 318cd5d511..030547d18c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineMultisampleStateCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineMultisampleStateCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineMultisampleStateCreateInfo")] - public unsafe partial struct PipelineMultisampleStateCreateInfo + public unsafe partial struct PipelineMultisampleStateCreateInfo : IStructuredType { public PipelineMultisampleStateCreateInfo ( @@ -123,5 +123,11 @@ public PipelineMultisampleStateCreateInfo [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "alphaToOneEnable")] public Bool32 AlphaToOneEnable; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineMultisampleStateCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationConservativeStateCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationConservativeStateCreateInfoEXT.gen.cs index 5d241b4e73..31344e0692 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationConservativeStateCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationConservativeStateCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineRasterizationConservativeStateCreateInfoEXT")] - public unsafe partial struct PipelineRasterizationConservativeStateCreateInfoEXT + public unsafe partial struct PipelineRasterizationConservativeStateCreateInfoEXT : IStructuredType { public PipelineRasterizationConservativeStateCreateInfoEXT ( @@ -79,5 +79,11 @@ public PipelineRasterizationConservativeStateCreateInfoEXT [NativeName("Type.Name", "float")] [NativeName("Name", "extraPrimitiveOverestimationSize")] public float ExtraPrimitiveOverestimationSize; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineRasterizationConservativeStateCreateInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationDepthClipStateCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationDepthClipStateCreateInfoEXT.gen.cs index bab89d4847..a6b988d61c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationDepthClipStateCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationDepthClipStateCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineRasterizationDepthClipStateCreateInfoEXT")] - public unsafe partial struct PipelineRasterizationDepthClipStateCreateInfoEXT + public unsafe partial struct PipelineRasterizationDepthClipStateCreateInfoEXT : IStructuredType { public PipelineRasterizationDepthClipStateCreateInfoEXT ( @@ -68,5 +68,11 @@ public PipelineRasterizationDepthClipStateCreateInfoEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "depthClipEnable")] public Bool32 DepthClipEnable; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineRasterizationDepthClipStateCreateInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationLineStateCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationLineStateCreateInfoEXT.gen.cs index 82d0c910f9..fb1b64f0f8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationLineStateCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationLineStateCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineRasterizationLineStateCreateInfoEXT")] - public unsafe partial struct PipelineRasterizationLineStateCreateInfoEXT + public unsafe partial struct PipelineRasterizationLineStateCreateInfoEXT : IStructuredType { public PipelineRasterizationLineStateCreateInfoEXT ( @@ -90,5 +90,11 @@ public PipelineRasterizationLineStateCreateInfoEXT [NativeName("Type.Name", "uint16_t")] [NativeName("Name", "lineStipplePattern")] public ushort LineStipplePattern; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineRasterizationLineStateCreateInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationProvokingVertexStateCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationProvokingVertexStateCreateInfoEXT.gen.cs index f15039a0cf..706283907d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationProvokingVertexStateCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationProvokingVertexStateCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineRasterizationProvokingVertexStateCreateInfoEXT")] - public unsafe partial struct PipelineRasterizationProvokingVertexStateCreateInfoEXT + public unsafe partial struct PipelineRasterizationProvokingVertexStateCreateInfoEXT : IStructuredType { public PipelineRasterizationProvokingVertexStateCreateInfoEXT ( @@ -57,5 +57,11 @@ public PipelineRasterizationProvokingVertexStateCreateInfoEXT [NativeName("Type.Name", "VkProvokingVertexModeEXT")] [NativeName("Name", "provokingVertexMode")] public ProvokingVertexModeEXT ProvokingVertexMode; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineRasterizationProvokingVertexStateCreateInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationStateCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationStateCreateInfo.gen.cs index 3ce3258f4a..a560caeadd 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationStateCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationStateCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineRasterizationStateCreateInfo")] - public unsafe partial struct PipelineRasterizationStateCreateInfo + public unsafe partial struct PipelineRasterizationStateCreateInfo : IStructuredType { public PipelineRasterizationStateCreateInfo ( @@ -167,5 +167,11 @@ public PipelineRasterizationStateCreateInfo [NativeName("Type.Name", "float")] [NativeName("Name", "lineWidth")] public float LineWidth; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineRasterizationStateCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationStateRasterizationOrderAMD.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationStateRasterizationOrderAMD.gen.cs index 6140ec8070..b7fe0f655e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationStateRasterizationOrderAMD.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationStateRasterizationOrderAMD.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineRasterizationStateRasterizationOrderAMD")] - public unsafe partial struct PipelineRasterizationStateRasterizationOrderAMD + public unsafe partial struct PipelineRasterizationStateRasterizationOrderAMD : IStructuredType { public PipelineRasterizationStateRasterizationOrderAMD ( @@ -57,5 +57,11 @@ public PipelineRasterizationStateRasterizationOrderAMD [NativeName("Type.Name", "VkRasterizationOrderAMD")] [NativeName("Name", "rasterizationOrder")] public RasterizationOrderAMD RasterizationOrder; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineRasterizationStateRasterizationOrderAmd; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationStateStreamCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationStateStreamCreateInfoEXT.gen.cs index 71bc58cfe3..097dde81f1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationStateStreamCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationStateStreamCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineRasterizationStateStreamCreateInfoEXT")] - public unsafe partial struct PipelineRasterizationStateStreamCreateInfoEXT + public unsafe partial struct PipelineRasterizationStateStreamCreateInfoEXT : IStructuredType { public PipelineRasterizationStateStreamCreateInfoEXT ( @@ -68,5 +68,11 @@ public PipelineRasterizationStateStreamCreateInfoEXT [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "rasterizationStream")] public uint RasterizationStream; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineRasterizationStateStreamCreateInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRenderingCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRenderingCreateInfoKHR.gen.cs index 7dfdb6e735..c6b75bf6af 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRenderingCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRenderingCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineRenderingCreateInfoKHR")] - public unsafe partial struct PipelineRenderingCreateInfoKHR + public unsafe partial struct PipelineRenderingCreateInfoKHR : IStructuredType { public PipelineRenderingCreateInfoKHR ( @@ -101,5 +101,11 @@ public PipelineRenderingCreateInfoKHR [NativeName("Type.Name", "VkFormat")] [NativeName("Name", "stencilAttachmentFormat")] public Format StencilAttachmentFormat; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineRenderingCreateInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRepresentativeFragmentTestStateCreateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRepresentativeFragmentTestStateCreateInfoNV.gen.cs index 661020a823..930fd75826 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRepresentativeFragmentTestStateCreateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRepresentativeFragmentTestStateCreateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineRepresentativeFragmentTestStateCreateInfoNV")] - public unsafe partial struct PipelineRepresentativeFragmentTestStateCreateInfoNV + public unsafe partial struct PipelineRepresentativeFragmentTestStateCreateInfoNV : IStructuredType { public PipelineRepresentativeFragmentTestStateCreateInfoNV ( @@ -57,5 +57,11 @@ public PipelineRepresentativeFragmentTestStateCreateInfoNV [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "representativeFragmentTestEnable")] public Bool32 RepresentativeFragmentTestEnable; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineRepresentativeFragmentTestStateCreateInfoNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineSampleLocationsStateCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineSampleLocationsStateCreateInfoEXT.gen.cs index a6d57e4415..43634444c8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineSampleLocationsStateCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineSampleLocationsStateCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineSampleLocationsStateCreateInfoEXT")] - public unsafe partial struct PipelineSampleLocationsStateCreateInfoEXT + public unsafe partial struct PipelineSampleLocationsStateCreateInfoEXT : IStructuredType { public PipelineSampleLocationsStateCreateInfoEXT ( @@ -68,5 +68,11 @@ public PipelineSampleLocationsStateCreateInfoEXT [NativeName("Type.Name", "VkSampleLocationsInfoEXT")] [NativeName("Name", "sampleLocationsInfo")] public SampleLocationsInfoEXT SampleLocationsInfo; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineSampleLocationsStateCreateInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineShaderStageCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineShaderStageCreateInfo.gen.cs index 117230668e..746203f92c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineShaderStageCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineShaderStageCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineShaderStageCreateInfo")] - public unsafe partial struct PipelineShaderStageCreateInfo + public unsafe partial struct PipelineShaderStageCreateInfo : IStructuredType { public PipelineShaderStageCreateInfo ( @@ -101,5 +101,11 @@ public PipelineShaderStageCreateInfo [NativeName("Type.Name", "VkSpecializationInfo")] [NativeName("Name", "pSpecializationInfo")] public SpecializationInfo* PSpecializationInfo; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineShaderStageCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineShaderStageRequiredSubgroupSizeCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineShaderStageRequiredSubgroupSizeCreateInfoEXT.gen.cs index 01d5dd31c2..3c5101680a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineShaderStageRequiredSubgroupSizeCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineShaderStageRequiredSubgroupSizeCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT")] - public unsafe partial struct PipelineShaderStageRequiredSubgroupSizeCreateInfoEXT + public unsafe partial struct PipelineShaderStageRequiredSubgroupSizeCreateInfoEXT : IStructuredType { public PipelineShaderStageRequiredSubgroupSizeCreateInfoEXT ( @@ -57,5 +57,11 @@ public PipelineShaderStageRequiredSubgroupSizeCreateInfoEXT [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "requiredSubgroupSize")] public uint RequiredSubgroupSize; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineShaderStageRequiredSubgroupSizeCreateInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineTessellationDomainOriginStateCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineTessellationDomainOriginStateCreateInfo.gen.cs index ee73090b4a..63e9f30846 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineTessellationDomainOriginStateCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineTessellationDomainOriginStateCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineTessellationDomainOriginStateCreateInfo")] - public unsafe partial struct PipelineTessellationDomainOriginStateCreateInfo + public unsafe partial struct PipelineTessellationDomainOriginStateCreateInfo : IStructuredType { public PipelineTessellationDomainOriginStateCreateInfo ( @@ -57,5 +57,11 @@ public PipelineTessellationDomainOriginStateCreateInfo [NativeName("Type.Name", "VkTessellationDomainOrigin")] [NativeName("Name", "domainOrigin")] public TessellationDomainOrigin DomainOrigin; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineTessellationDomainOriginStateCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineTessellationDomainOriginStateCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineTessellationDomainOriginStateCreateInfoKHR.gen.cs index da8ba064ed..720a774a50 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineTessellationDomainOriginStateCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineTessellationDomainOriginStateCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineTessellationDomainOriginStateCreateInfoKHR")] - public unsafe partial struct PipelineTessellationDomainOriginStateCreateInfoKHR + public unsafe partial struct PipelineTessellationDomainOriginStateCreateInfoKHR : IStructuredType { public PipelineTessellationDomainOriginStateCreateInfoKHR ( @@ -57,5 +57,11 @@ public PipelineTessellationDomainOriginStateCreateInfoKHR [NativeName("Type.Name", "VkTessellationDomainOrigin")] [NativeName("Name", "domainOrigin")] public TessellationDomainOrigin DomainOrigin; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineTessellationDomainOriginStateCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineTessellationStateCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineTessellationStateCreateInfo.gen.cs index 18ece41ec7..89aa43c8df 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineTessellationStateCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineTessellationStateCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineTessellationStateCreateInfo")] - public unsafe partial struct PipelineTessellationStateCreateInfo + public unsafe partial struct PipelineTessellationStateCreateInfo : IStructuredType { public PipelineTessellationStateCreateInfo ( @@ -68,5 +68,11 @@ public PipelineTessellationStateCreateInfo [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "patchControlPoints")] public uint PatchControlPoints; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineTessellationStateCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineVertexInputDivisorStateCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineVertexInputDivisorStateCreateInfoEXT.gen.cs index 4060a03f7d..24d6035237 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineVertexInputDivisorStateCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineVertexInputDivisorStateCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineVertexInputDivisorStateCreateInfoEXT")] - public unsafe partial struct PipelineVertexInputDivisorStateCreateInfoEXT + public unsafe partial struct PipelineVertexInputDivisorStateCreateInfoEXT : IStructuredType { public PipelineVertexInputDivisorStateCreateInfoEXT ( @@ -68,5 +68,11 @@ public PipelineVertexInputDivisorStateCreateInfoEXT [NativeName("Type.Name", "VkVertexInputBindingDivisorDescriptionEXT")] [NativeName("Name", "pVertexBindingDivisors")] public VertexInputBindingDivisorDescriptionEXT* PVertexBindingDivisors; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineVertexInputDivisorStateCreateInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineVertexInputStateCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineVertexInputStateCreateInfo.gen.cs index afcf90b6ae..781f4c47ef 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineVertexInputStateCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineVertexInputStateCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineVertexInputStateCreateInfo")] - public unsafe partial struct PipelineVertexInputStateCreateInfo + public unsafe partial struct PipelineVertexInputStateCreateInfo : IStructuredType { public PipelineVertexInputStateCreateInfo ( @@ -101,5 +101,11 @@ public PipelineVertexInputStateCreateInfo [NativeName("Type.Name", "VkVertexInputAttributeDescription")] [NativeName("Name", "pVertexAttributeDescriptions")] public VertexInputAttributeDescription* PVertexAttributeDescriptions; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineVertexInputStateCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportCoarseSampleOrderStateCreateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportCoarseSampleOrderStateCreateInfoNV.gen.cs index b2a36a8af0..6c0e845732 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportCoarseSampleOrderStateCreateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportCoarseSampleOrderStateCreateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineViewportCoarseSampleOrderStateCreateInfoNV")] - public unsafe partial struct PipelineViewportCoarseSampleOrderStateCreateInfoNV + public unsafe partial struct PipelineViewportCoarseSampleOrderStateCreateInfoNV : IStructuredType { public PipelineViewportCoarseSampleOrderStateCreateInfoNV ( @@ -79,5 +79,11 @@ public PipelineViewportCoarseSampleOrderStateCreateInfoNV [NativeName("Type.Name", "VkCoarseSampleOrderCustomNV")] [NativeName("Name", "pCustomSampleOrders")] public CoarseSampleOrderCustomNV* PCustomSampleOrders; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineViewportCoarseSampleOrderStateCreateInfoNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportExclusiveScissorStateCreateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportExclusiveScissorStateCreateInfoNV.gen.cs index ea773767db..f12a828228 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportExclusiveScissorStateCreateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportExclusiveScissorStateCreateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineViewportExclusiveScissorStateCreateInfoNV")] - public unsafe partial struct PipelineViewportExclusiveScissorStateCreateInfoNV + public unsafe partial struct PipelineViewportExclusiveScissorStateCreateInfoNV : IStructuredType { public PipelineViewportExclusiveScissorStateCreateInfoNV ( @@ -68,5 +68,11 @@ public PipelineViewportExclusiveScissorStateCreateInfoNV [NativeName("Type.Name", "VkRect2D")] [NativeName("Name", "pExclusiveScissors")] public Rect2D* PExclusiveScissors; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineViewportExclusiveScissorStateCreateInfoNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportShadingRateImageStateCreateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportShadingRateImageStateCreateInfoNV.gen.cs index 07706fa6de..903267342a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportShadingRateImageStateCreateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportShadingRateImageStateCreateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineViewportShadingRateImageStateCreateInfoNV")] - public unsafe partial struct PipelineViewportShadingRateImageStateCreateInfoNV + public unsafe partial struct PipelineViewportShadingRateImageStateCreateInfoNV : IStructuredType { public PipelineViewportShadingRateImageStateCreateInfoNV ( @@ -79,5 +79,11 @@ public PipelineViewportShadingRateImageStateCreateInfoNV [NativeName("Type.Name", "VkShadingRatePaletteNV")] [NativeName("Name", "pShadingRatePalettes")] public ShadingRatePaletteNV* PShadingRatePalettes; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineViewportShadingRateImageStateCreateInfoNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportStateCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportStateCreateInfo.gen.cs index eda9a78a40..b6a02b8f9b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportStateCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportStateCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineViewportStateCreateInfo")] - public unsafe partial struct PipelineViewportStateCreateInfo + public unsafe partial struct PipelineViewportStateCreateInfo : IStructuredType { public PipelineViewportStateCreateInfo ( @@ -101,5 +101,11 @@ public PipelineViewportStateCreateInfo [NativeName("Type.Name", "VkRect2D")] [NativeName("Name", "pScissors")] public Rect2D* PScissors; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineViewportStateCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportSwizzleStateCreateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportSwizzleStateCreateInfoNV.gen.cs index d1f7c59b63..b0c5590345 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportSwizzleStateCreateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportSwizzleStateCreateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineViewportSwizzleStateCreateInfoNV")] - public unsafe partial struct PipelineViewportSwizzleStateCreateInfoNV + public unsafe partial struct PipelineViewportSwizzleStateCreateInfoNV : IStructuredType { public PipelineViewportSwizzleStateCreateInfoNV ( @@ -79,5 +79,11 @@ public PipelineViewportSwizzleStateCreateInfoNV [NativeName("Type.Name", "VkViewportSwizzleNV")] [NativeName("Name", "pViewportSwizzles")] public ViewportSwizzleNV* PViewportSwizzles; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineViewportSwizzleStateCreateInfoNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportWScalingStateCreateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportWScalingStateCreateInfoNV.gen.cs index ccc7f9d365..c2ac6fbf62 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportWScalingStateCreateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportWScalingStateCreateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineViewportWScalingStateCreateInfoNV")] - public unsafe partial struct PipelineViewportWScalingStateCreateInfoNV + public unsafe partial struct PipelineViewportWScalingStateCreateInfoNV : IStructuredType { public PipelineViewportWScalingStateCreateInfoNV ( @@ -79,5 +79,11 @@ public PipelineViewportWScalingStateCreateInfoNV [NativeName("Type.Name", "VkViewportWScalingNV")] [NativeName("Name", "pViewportWScalings")] public ViewportWScalingNV* PViewportWScalings; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PipelineViewportWScalingStateCreateInfoNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PresentFrameTokenGGP.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PresentFrameTokenGGP.gen.cs index 6bd22c0921..abd02ccf93 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PresentFrameTokenGGP.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PresentFrameTokenGGP.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPresentFrameTokenGGP")] - public unsafe partial struct PresentFrameTokenGGP + public unsafe partial struct PresentFrameTokenGGP : IStructuredType { public PresentFrameTokenGGP ( @@ -57,5 +57,11 @@ public PresentFrameTokenGGP [NativeName("Type.Name", "GgpFrameToken")] [NativeName("Name", "frameToken")] public nint FrameToken; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PresentFrameTokenGgp; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PresentIdKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PresentIdKHR.gen.cs index 93930f6e55..f328d616a3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PresentIdKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PresentIdKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPresentIdKHR")] - public unsafe partial struct PresentIdKHR + public unsafe partial struct PresentIdKHR : IStructuredType { public PresentIdKHR ( @@ -68,5 +68,11 @@ public PresentIdKHR [NativeName("Type.Name", "uint64_t")] [NativeName("Name", "pPresentIds")] public ulong* PPresentIds; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PresentIDKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PresentInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PresentInfoKHR.gen.cs index 82be4a197a..196259a188 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PresentInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PresentInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPresentInfoKHR")] - public unsafe partial struct PresentInfoKHR + public unsafe partial struct PresentInfoKHR : IStructuredType { public PresentInfoKHR ( @@ -112,5 +112,11 @@ public PresentInfoKHR [NativeName("Type.Name", "VkResult")] [NativeName("Name", "pResults")] public Result* PResults; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PresentInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PresentRegionsKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PresentRegionsKHR.gen.cs index 3c04317c95..a1a21578ff 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PresentRegionsKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PresentRegionsKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPresentRegionsKHR")] - public unsafe partial struct PresentRegionsKHR + public unsafe partial struct PresentRegionsKHR : IStructuredType { public PresentRegionsKHR ( @@ -68,5 +68,11 @@ public PresentRegionsKHR [NativeName("Type.Name", "VkPresentRegionKHR")] [NativeName("Name", "pRegions")] public PresentRegionKHR* PRegions; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PresentRegionsKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PresentTimesInfoGOOGLE.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PresentTimesInfoGOOGLE.gen.cs index 64906c33d1..2734781e90 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PresentTimesInfoGOOGLE.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PresentTimesInfoGOOGLE.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPresentTimesInfoGOOGLE")] - public unsafe partial struct PresentTimesInfoGOOGLE + public unsafe partial struct PresentTimesInfoGOOGLE : IStructuredType { public PresentTimesInfoGOOGLE ( @@ -68,5 +68,11 @@ public PresentTimesInfoGOOGLE [NativeName("Type.Name", "VkPresentTimeGOOGLE")] [NativeName("Name", "pTimes")] public PresentTimeGOOGLE* PTimes; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PresentTimesInfoGoogle; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PrivateDataSlotCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PrivateDataSlotCreateInfoEXT.gen.cs index f8dcce2115..991c2904d9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PrivateDataSlotCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PrivateDataSlotCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPrivateDataSlotCreateInfoEXT")] - public unsafe partial struct PrivateDataSlotCreateInfoEXT + public unsafe partial struct PrivateDataSlotCreateInfoEXT : IStructuredType { public PrivateDataSlotCreateInfoEXT ( @@ -57,5 +57,11 @@ public PrivateDataSlotCreateInfoEXT [NativeName("Type.Name", "VkPrivateDataSlotCreateFlagsEXT")] [NativeName("Name", "flags")] public PrivateDataSlotCreateFlagsEXT Flags; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.PrivateDataSlotCreateInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ProtectedSubmitInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ProtectedSubmitInfo.gen.cs index 2374c848d4..a809f13c10 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ProtectedSubmitInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ProtectedSubmitInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkProtectedSubmitInfo")] - public unsafe partial struct ProtectedSubmitInfo + public unsafe partial struct ProtectedSubmitInfo : IStructuredType { public ProtectedSubmitInfo ( @@ -57,5 +57,11 @@ public ProtectedSubmitInfo [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "protectedSubmit")] public Bool32 ProtectedSubmit; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ProtectedSubmitInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/QueryPoolCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/QueryPoolCreateInfo.gen.cs index d8189773c7..cf90b5fa32 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/QueryPoolCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/QueryPoolCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkQueryPoolCreateInfo")] - public unsafe partial struct QueryPoolCreateInfo + public unsafe partial struct QueryPoolCreateInfo : IStructuredType { public QueryPoolCreateInfo ( @@ -90,5 +90,11 @@ public QueryPoolCreateInfo [NativeName("Type.Name", "VkQueryPipelineStatisticFlags")] [NativeName("Name", "pipelineStatistics")] public QueryPipelineStatisticFlags PipelineStatistics; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.QueryPoolCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/QueryPoolCreateInfoINTEL.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/QueryPoolCreateInfoINTEL.gen.cs index 42d4d421f6..d6ece87c13 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/QueryPoolCreateInfoINTEL.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/QueryPoolCreateInfoINTEL.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkQueryPoolCreateInfoINTEL")] - public unsafe partial struct QueryPoolCreateInfoINTEL + public unsafe partial struct QueryPoolCreateInfoINTEL : IStructuredType { public QueryPoolCreateInfoINTEL ( @@ -57,5 +57,11 @@ public QueryPoolCreateInfoINTEL [NativeName("Type.Name", "VkQueryPoolSamplingModeINTEL")] [NativeName("Name", "performanceCountersSampling")] public QueryPoolSamplingModeINTEL PerformanceCountersSampling; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.QueryPoolPerformanceQueryCreateInfoIntel; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/QueryPoolPerformanceCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/QueryPoolPerformanceCreateInfoKHR.gen.cs index bcb945e86c..4cf8bd0833 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/QueryPoolPerformanceCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/QueryPoolPerformanceCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkQueryPoolPerformanceCreateInfoKHR")] - public unsafe partial struct QueryPoolPerformanceCreateInfoKHR + public unsafe partial struct QueryPoolPerformanceCreateInfoKHR : IStructuredType { public QueryPoolPerformanceCreateInfoKHR ( @@ -79,5 +79,11 @@ public QueryPoolPerformanceCreateInfoKHR [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "pCounterIndices")] public uint* PCounterIndices; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.QueryPoolPerformanceCreateInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/QueryPoolPerformanceQueryCreateInfoINTEL.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/QueryPoolPerformanceQueryCreateInfoINTEL.gen.cs index 9962fec41c..55cac0b397 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/QueryPoolPerformanceQueryCreateInfoINTEL.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/QueryPoolPerformanceQueryCreateInfoINTEL.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkQueryPoolPerformanceQueryCreateInfoINTEL")] - public unsafe partial struct QueryPoolPerformanceQueryCreateInfoINTEL + public unsafe partial struct QueryPoolPerformanceQueryCreateInfoINTEL : IStructuredType { public QueryPoolPerformanceQueryCreateInfoINTEL ( @@ -57,5 +57,11 @@ public QueryPoolPerformanceQueryCreateInfoINTEL [NativeName("Type.Name", "VkQueryPoolSamplingModeINTEL")] [NativeName("Name", "performanceCountersSampling")] public QueryPoolSamplingModeINTEL PerformanceCountersSampling; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.QueryPoolPerformanceQueryCreateInfoIntel; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyCheckpointProperties2NV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyCheckpointProperties2NV.gen.cs index 8d451eab1b..9af3db33a6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyCheckpointProperties2NV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyCheckpointProperties2NV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkQueueFamilyCheckpointProperties2NV")] - public unsafe partial struct QueueFamilyCheckpointProperties2NV + public unsafe partial struct QueueFamilyCheckpointProperties2NV : IStructuredType { public QueueFamilyCheckpointProperties2NV ( @@ -57,5 +57,11 @@ public QueueFamilyCheckpointProperties2NV [NativeName("Type.Name", "VkPipelineStageFlags2KHR")] [NativeName("Name", "checkpointExecutionStageMask")] public PipelineStageFlags2KHR CheckpointExecutionStageMask; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.QueueFamilyCheckpointProperties2NV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyCheckpointPropertiesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyCheckpointPropertiesNV.gen.cs index fc34a3c18a..545c677c2e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyCheckpointPropertiesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyCheckpointPropertiesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkQueueFamilyCheckpointPropertiesNV")] - public unsafe partial struct QueueFamilyCheckpointPropertiesNV + public unsafe partial struct QueueFamilyCheckpointPropertiesNV : IStructuredType { public QueueFamilyCheckpointPropertiesNV ( @@ -57,5 +57,11 @@ public QueueFamilyCheckpointPropertiesNV [NativeName("Type.Name", "VkPipelineStageFlags")] [NativeName("Name", "checkpointExecutionStageMask")] public PipelineStageFlags CheckpointExecutionStageMask; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.QueueFamilyCheckpointPropertiesNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyGlobalPriorityPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyGlobalPriorityPropertiesEXT.gen.cs index 3372bcc325..00acfd1cdb 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyGlobalPriorityPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyGlobalPriorityPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkQueueFamilyGlobalPriorityPropertiesEXT")] - public unsafe partial struct QueueFamilyGlobalPriorityPropertiesEXT + public unsafe partial struct QueueFamilyGlobalPriorityPropertiesEXT : IStructuredType { public QueueFamilyGlobalPriorityPropertiesEXT ( @@ -103,5 +103,11 @@ public Span AsSpan() #endif } + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.QueueFamilyGlobalPriorityPropertiesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyProperties2.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyProperties2.gen.cs index 1b9a34e75f..687e43fd1f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyProperties2.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyProperties2.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkQueueFamilyProperties2")] - public unsafe partial struct QueueFamilyProperties2 + public unsafe partial struct QueueFamilyProperties2 : IStructuredType { public QueueFamilyProperties2 ( @@ -57,5 +57,11 @@ public QueueFamilyProperties2 [NativeName("Type.Name", "VkQueueFamilyProperties")] [NativeName("Name", "queueFamilyProperties")] public QueueFamilyProperties QueueFamilyProperties; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.QueueFamilyProperties2; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyProperties2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyProperties2KHR.gen.cs index c672fb2adc..be53281009 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyProperties2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyProperties2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkQueueFamilyProperties2KHR")] - public unsafe partial struct QueueFamilyProperties2KHR + public unsafe partial struct QueueFamilyProperties2KHR : IStructuredType { public QueueFamilyProperties2KHR ( @@ -57,5 +57,11 @@ public QueueFamilyProperties2KHR [NativeName("Type.Name", "VkQueueFamilyProperties")] [NativeName("Name", "queueFamilyProperties")] public QueueFamilyProperties QueueFamilyProperties; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.QueueFamilyProperties2; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RayTracingPipelineCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RayTracingPipelineCreateInfoKHR.gen.cs index 1605b519e7..7a7f415c9b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RayTracingPipelineCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RayTracingPipelineCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRayTracingPipelineCreateInfoKHR")] - public unsafe partial struct RayTracingPipelineCreateInfoKHR + public unsafe partial struct RayTracingPipelineCreateInfoKHR : IStructuredType { public RayTracingPipelineCreateInfoKHR ( @@ -178,5 +178,11 @@ public RayTracingPipelineCreateInfoKHR [NativeName("Type.Name", "int32_t")] [NativeName("Name", "basePipelineIndex")] public int BasePipelineIndex; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.RayTracingPipelineCreateInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RayTracingPipelineCreateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RayTracingPipelineCreateInfoNV.gen.cs index 7e63706b2f..1e133c8337 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RayTracingPipelineCreateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RayTracingPipelineCreateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRayTracingPipelineCreateInfoNV")] - public unsafe partial struct RayTracingPipelineCreateInfoNV + public unsafe partial struct RayTracingPipelineCreateInfoNV : IStructuredType { public RayTracingPipelineCreateInfoNV ( @@ -145,5 +145,11 @@ public RayTracingPipelineCreateInfoNV [NativeName("Type.Name", "int32_t")] [NativeName("Name", "basePipelineIndex")] public int BasePipelineIndex; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.RayTracingPipelineCreateInfoNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RayTracingPipelineInterfaceCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RayTracingPipelineInterfaceCreateInfoKHR.gen.cs index 5ea369c8d3..16ba17ea90 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RayTracingPipelineInterfaceCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RayTracingPipelineInterfaceCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRayTracingPipelineInterfaceCreateInfoKHR")] - public unsafe partial struct RayTracingPipelineInterfaceCreateInfoKHR + public unsafe partial struct RayTracingPipelineInterfaceCreateInfoKHR : IStructuredType { public RayTracingPipelineInterfaceCreateInfoKHR ( @@ -68,5 +68,11 @@ public RayTracingPipelineInterfaceCreateInfoKHR [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "maxPipelineRayHitAttributeSize")] public uint MaxPipelineRayHitAttributeSize; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.RayTracingPipelineInterfaceCreateInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RayTracingShaderGroupCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RayTracingShaderGroupCreateInfoKHR.gen.cs index 247444d970..9d69a8d66d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RayTracingShaderGroupCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RayTracingShaderGroupCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRayTracingShaderGroupCreateInfoKHR")] - public unsafe partial struct RayTracingShaderGroupCreateInfoKHR + public unsafe partial struct RayTracingShaderGroupCreateInfoKHR : IStructuredType { public RayTracingShaderGroupCreateInfoKHR ( @@ -112,5 +112,11 @@ public RayTracingShaderGroupCreateInfoKHR [NativeName("Type.Name", "void")] [NativeName("Name", "pShaderGroupCaptureReplayHandle")] public void* PShaderGroupCaptureReplayHandle; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.RayTracingShaderGroupCreateInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RayTracingShaderGroupCreateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RayTracingShaderGroupCreateInfoNV.gen.cs index 0d2b7aaba1..962f35f0ac 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RayTracingShaderGroupCreateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RayTracingShaderGroupCreateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRayTracingShaderGroupCreateInfoNV")] - public unsafe partial struct RayTracingShaderGroupCreateInfoNV + public unsafe partial struct RayTracingShaderGroupCreateInfoNV : IStructuredType { public RayTracingShaderGroupCreateInfoNV ( @@ -101,5 +101,11 @@ public RayTracingShaderGroupCreateInfoNV [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "intersectionShader")] public uint IntersectionShader; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.RayTracingShaderGroupCreateInfoNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassAttachmentBeginInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassAttachmentBeginInfo.gen.cs index 071199ea38..4a88442de9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassAttachmentBeginInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassAttachmentBeginInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRenderPassAttachmentBeginInfo")] - public unsafe partial struct RenderPassAttachmentBeginInfo + public unsafe partial struct RenderPassAttachmentBeginInfo : IStructuredType { public RenderPassAttachmentBeginInfo ( @@ -68,5 +68,11 @@ public RenderPassAttachmentBeginInfo [NativeName("Type.Name", "VkImageView")] [NativeName("Name", "pAttachments")] public ImageView* PAttachments; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.RenderPassAttachmentBeginInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassAttachmentBeginInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassAttachmentBeginInfoKHR.gen.cs index 062082e015..bd65ebaee1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassAttachmentBeginInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassAttachmentBeginInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRenderPassAttachmentBeginInfoKHR")] - public unsafe partial struct RenderPassAttachmentBeginInfoKHR + public unsafe partial struct RenderPassAttachmentBeginInfoKHR : IStructuredType { public RenderPassAttachmentBeginInfoKHR ( @@ -68,5 +68,11 @@ public RenderPassAttachmentBeginInfoKHR [NativeName("Type.Name", "VkImageView")] [NativeName("Name", "pAttachments")] public ImageView* PAttachments; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.RenderPassAttachmentBeginInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassBeginInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassBeginInfo.gen.cs index 0c3e4e37e0..c2804af7c0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassBeginInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassBeginInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRenderPassBeginInfo")] - public unsafe partial struct RenderPassBeginInfo + public unsafe partial struct RenderPassBeginInfo : IStructuredType { public RenderPassBeginInfo ( @@ -101,5 +101,11 @@ public RenderPassBeginInfo [NativeName("Type.Name", "VkClearValue")] [NativeName("Name", "pClearValues")] public ClearValue* PClearValues; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.RenderPassBeginInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassCreateInfo.gen.cs index c280724ab3..024b99563a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRenderPassCreateInfo")] - public unsafe partial struct RenderPassCreateInfo + public unsafe partial struct RenderPassCreateInfo : IStructuredType { public RenderPassCreateInfo ( @@ -123,5 +123,11 @@ public RenderPassCreateInfo [NativeName("Type.Name", "VkSubpassDependency")] [NativeName("Name", "pDependencies")] public SubpassDependency* PDependencies; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.RenderPassCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassCreateInfo2.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassCreateInfo2.gen.cs index 8499729d63..36f7dda720 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassCreateInfo2.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassCreateInfo2.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRenderPassCreateInfo2")] - public unsafe partial struct RenderPassCreateInfo2 + public unsafe partial struct RenderPassCreateInfo2 : IStructuredType { public RenderPassCreateInfo2 ( @@ -145,5 +145,11 @@ public RenderPassCreateInfo2 [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "pCorrelatedViewMasks")] public uint* PCorrelatedViewMasks; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.RenderPassCreateInfo2; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassCreateInfo2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassCreateInfo2KHR.gen.cs index d4aae52ac3..5824c9a535 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassCreateInfo2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassCreateInfo2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRenderPassCreateInfo2KHR")] - public unsafe partial struct RenderPassCreateInfo2KHR + public unsafe partial struct RenderPassCreateInfo2KHR : IStructuredType { public RenderPassCreateInfo2KHR ( @@ -145,5 +145,11 @@ public RenderPassCreateInfo2KHR [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "pCorrelatedViewMasks")] public uint* PCorrelatedViewMasks; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.RenderPassCreateInfo2; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassFragmentDensityMapCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassFragmentDensityMapCreateInfoEXT.gen.cs index 9d07fb74a8..6e5bf0d0bc 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassFragmentDensityMapCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassFragmentDensityMapCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRenderPassFragmentDensityMapCreateInfoEXT")] - public unsafe partial struct RenderPassFragmentDensityMapCreateInfoEXT + public unsafe partial struct RenderPassFragmentDensityMapCreateInfoEXT : IStructuredType { public RenderPassFragmentDensityMapCreateInfoEXT ( @@ -57,5 +57,11 @@ public RenderPassFragmentDensityMapCreateInfoEXT [NativeName("Type.Name", "VkAttachmentReference")] [NativeName("Name", "fragmentDensityMapAttachment")] public AttachmentReference FragmentDensityMapAttachment; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.RenderPassFragmentDensityMapCreateInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassInputAttachmentAspectCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassInputAttachmentAspectCreateInfo.gen.cs index 668301b76b..481b1ed341 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassInputAttachmentAspectCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassInputAttachmentAspectCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRenderPassInputAttachmentAspectCreateInfo")] - public unsafe partial struct RenderPassInputAttachmentAspectCreateInfo + public unsafe partial struct RenderPassInputAttachmentAspectCreateInfo : IStructuredType { public RenderPassInputAttachmentAspectCreateInfo ( @@ -68,5 +68,11 @@ public RenderPassInputAttachmentAspectCreateInfo [NativeName("Type.Name", "VkInputAttachmentAspectReference")] [NativeName("Name", "pAspectReferences")] public InputAttachmentAspectReference* PAspectReferences; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.RenderPassInputAttachmentAspectCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassInputAttachmentAspectCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassInputAttachmentAspectCreateInfoKHR.gen.cs index 6664956b0d..9b2094d128 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassInputAttachmentAspectCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassInputAttachmentAspectCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRenderPassInputAttachmentAspectCreateInfoKHR")] - public unsafe partial struct RenderPassInputAttachmentAspectCreateInfoKHR + public unsafe partial struct RenderPassInputAttachmentAspectCreateInfoKHR : IStructuredType { public RenderPassInputAttachmentAspectCreateInfoKHR ( @@ -68,5 +68,11 @@ public RenderPassInputAttachmentAspectCreateInfoKHR [NativeName("Type.Name", "VkInputAttachmentAspectReference")] [NativeName("Name", "pAspectReferences")] public InputAttachmentAspectReference* PAspectReferences; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.RenderPassInputAttachmentAspectCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassMultiviewCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassMultiviewCreateInfo.gen.cs index 6630255c68..a7170b2f8b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassMultiviewCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassMultiviewCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRenderPassMultiviewCreateInfo")] - public unsafe partial struct RenderPassMultiviewCreateInfo + public unsafe partial struct RenderPassMultiviewCreateInfo : IStructuredType { public RenderPassMultiviewCreateInfo ( @@ -112,5 +112,11 @@ public RenderPassMultiviewCreateInfo [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "pCorrelationMasks")] public uint* PCorrelationMasks; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.RenderPassMultiviewCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassMultiviewCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassMultiviewCreateInfoKHR.gen.cs index 65194b6d9a..65f8e3b8c4 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassMultiviewCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassMultiviewCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRenderPassMultiviewCreateInfoKHR")] - public unsafe partial struct RenderPassMultiviewCreateInfoKHR + public unsafe partial struct RenderPassMultiviewCreateInfoKHR : IStructuredType { public RenderPassMultiviewCreateInfoKHR ( @@ -112,5 +112,11 @@ public RenderPassMultiviewCreateInfoKHR [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "pCorrelationMasks")] public uint* PCorrelationMasks; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.RenderPassMultiviewCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassSampleLocationsBeginInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassSampleLocationsBeginInfoEXT.gen.cs index ddba77768c..1bb2557ad1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassSampleLocationsBeginInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassSampleLocationsBeginInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRenderPassSampleLocationsBeginInfoEXT")] - public unsafe partial struct RenderPassSampleLocationsBeginInfoEXT + public unsafe partial struct RenderPassSampleLocationsBeginInfoEXT : IStructuredType { public RenderPassSampleLocationsBeginInfoEXT ( @@ -90,5 +90,11 @@ public RenderPassSampleLocationsBeginInfoEXT [NativeName("Type.Name", "VkSubpassSampleLocationsEXT")] [NativeName("Name", "pPostSubpassSampleLocations")] public SubpassSampleLocationsEXT* PPostSubpassSampleLocations; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.RenderPassSampleLocationsBeginInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassTransformBeginInfoQCOM.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassTransformBeginInfoQCOM.gen.cs index 205e660fd8..ecaeaae533 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassTransformBeginInfoQCOM.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassTransformBeginInfoQCOM.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRenderPassTransformBeginInfoQCOM")] - public unsafe partial struct RenderPassTransformBeginInfoQCOM + public unsafe partial struct RenderPassTransformBeginInfoQCOM : IStructuredType { public RenderPassTransformBeginInfoQCOM ( @@ -57,5 +57,11 @@ public RenderPassTransformBeginInfoQCOM [NativeName("Type.Name", "VkSurfaceTransformFlagBitsKHR")] [NativeName("Name", "transform")] public SurfaceTransformFlagsKHR Transform; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.RenderPassTransformBeginInfoQCom; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderingAttachmentInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderingAttachmentInfoKHR.gen.cs index 5d89ffdf75..9fd228a6ef 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderingAttachmentInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderingAttachmentInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRenderingAttachmentInfoKHR")] - public unsafe partial struct RenderingAttachmentInfoKHR + public unsafe partial struct RenderingAttachmentInfoKHR : IStructuredType { public RenderingAttachmentInfoKHR ( @@ -134,5 +134,11 @@ public RenderingAttachmentInfoKHR [NativeName("Type.Name", "VkClearValue")] [NativeName("Name", "clearValue")] public ClearValue ClearValue; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.RenderingAttachmentInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderingFragmentDensityMapAttachmentInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderingFragmentDensityMapAttachmentInfoEXT.gen.cs index 72c1e1d492..4e21637154 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderingFragmentDensityMapAttachmentInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderingFragmentDensityMapAttachmentInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRenderingFragmentDensityMapAttachmentInfoEXT")] - public unsafe partial struct RenderingFragmentDensityMapAttachmentInfoEXT + public unsafe partial struct RenderingFragmentDensityMapAttachmentInfoEXT : IStructuredType { public RenderingFragmentDensityMapAttachmentInfoEXT ( @@ -68,5 +68,11 @@ public RenderingFragmentDensityMapAttachmentInfoEXT [NativeName("Type.Name", "VkImageLayout")] [NativeName("Name", "imageLayout")] public ImageLayout ImageLayout; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.RenderingFragmentDensityMapAttachmentInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderingFragmentShadingRateAttachmentInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderingFragmentShadingRateAttachmentInfoKHR.gen.cs index 6f29e02319..3a89f7eb6b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderingFragmentShadingRateAttachmentInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderingFragmentShadingRateAttachmentInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRenderingFragmentShadingRateAttachmentInfoKHR")] - public unsafe partial struct RenderingFragmentShadingRateAttachmentInfoKHR + public unsafe partial struct RenderingFragmentShadingRateAttachmentInfoKHR : IStructuredType { public RenderingFragmentShadingRateAttachmentInfoKHR ( @@ -79,5 +79,11 @@ public RenderingFragmentShadingRateAttachmentInfoKHR [NativeName("Type.Name", "VkExtent2D")] [NativeName("Name", "shadingRateAttachmentTexelSize")] public Extent2D ShadingRateAttachmentTexelSize; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.RenderingFragmentShadingRateAttachmentInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderingInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderingInfoKHR.gen.cs index 31ad589b96..0ad44f3980 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderingInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderingInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRenderingInfoKHR")] - public unsafe partial struct RenderingInfoKHR + public unsafe partial struct RenderingInfoKHR : IStructuredType { public RenderingInfoKHR ( @@ -134,5 +134,11 @@ public RenderingInfoKHR [NativeName("Type.Name", "VkRenderingAttachmentInfoKHR")] [NativeName("Name", "pStencilAttachment")] public RenderingAttachmentInfoKHR* PStencilAttachment; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.RenderingInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ResolveImageInfo2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ResolveImageInfo2KHR.gen.cs index dc5d59b0d4..eb265a442a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ResolveImageInfo2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ResolveImageInfo2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkResolveImageInfo2KHR")] - public unsafe partial struct ResolveImageInfo2KHR + public unsafe partial struct ResolveImageInfo2KHR : IStructuredType { public ResolveImageInfo2KHR ( @@ -112,5 +112,11 @@ public ResolveImageInfo2KHR [NativeName("Type.Name", "VkImageResolve2KHR")] [NativeName("Name", "pRegions")] public ImageResolve2KHR* PRegions; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ResolveImageInfo2Khr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SampleLocationsInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SampleLocationsInfoEXT.gen.cs index 39bf6f1a3e..c07066d726 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SampleLocationsInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SampleLocationsInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSampleLocationsInfoEXT")] - public unsafe partial struct SampleLocationsInfoEXT + public unsafe partial struct SampleLocationsInfoEXT : IStructuredType { public SampleLocationsInfoEXT ( @@ -90,5 +90,11 @@ public SampleLocationsInfoEXT [NativeName("Type.Name", "VkSampleLocationEXT")] [NativeName("Name", "pSampleLocations")] public SampleLocationEXT* PSampleLocations; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SampleLocationsInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerBorderColorComponentMappingCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerBorderColorComponentMappingCreateInfoEXT.gen.cs index b4daf5c649..73547377b3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerBorderColorComponentMappingCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerBorderColorComponentMappingCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSamplerBorderColorComponentMappingCreateInfoEXT")] - public unsafe partial struct SamplerBorderColorComponentMappingCreateInfoEXT + public unsafe partial struct SamplerBorderColorComponentMappingCreateInfoEXT : IStructuredType { public SamplerBorderColorComponentMappingCreateInfoEXT ( @@ -68,5 +68,11 @@ public SamplerBorderColorComponentMappingCreateInfoEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "srgb")] public Bool32 Srgb; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SamplerBorderColorComponentMappingCreateInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerCreateInfo.gen.cs index 6dab9a319f..0eae090cd2 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSamplerCreateInfo")] - public unsafe partial struct SamplerCreateInfo + public unsafe partial struct SamplerCreateInfo : IStructuredType { public SamplerCreateInfo ( @@ -222,5 +222,11 @@ public SamplerCreateInfo [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "unnormalizedCoordinates")] public Bool32 UnnormalizedCoordinates; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SamplerCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerCustomBorderColorCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerCustomBorderColorCreateInfoEXT.gen.cs index 5d19e32103..f324be7877 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerCustomBorderColorCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerCustomBorderColorCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSamplerCustomBorderColorCreateInfoEXT")] - public unsafe partial struct SamplerCustomBorderColorCreateInfoEXT + public unsafe partial struct SamplerCustomBorderColorCreateInfoEXT : IStructuredType { public SamplerCustomBorderColorCreateInfoEXT ( @@ -68,5 +68,11 @@ public SamplerCustomBorderColorCreateInfoEXT [NativeName("Type.Name", "VkFormat")] [NativeName("Name", "format")] public Format Format; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SamplerCustomBorderColorCreateInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerReductionModeCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerReductionModeCreateInfo.gen.cs index 8d20b05eca..bb25c01836 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerReductionModeCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerReductionModeCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSamplerReductionModeCreateInfo")] - public unsafe partial struct SamplerReductionModeCreateInfo + public unsafe partial struct SamplerReductionModeCreateInfo : IStructuredType { public SamplerReductionModeCreateInfo ( @@ -57,5 +57,11 @@ public SamplerReductionModeCreateInfo [NativeName("Type.Name", "VkSamplerReductionMode")] [NativeName("Name", "reductionMode")] public SamplerReductionMode ReductionMode; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SamplerReductionModeCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerReductionModeCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerReductionModeCreateInfoEXT.gen.cs index e476417d36..81f71b7dfc 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerReductionModeCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerReductionModeCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSamplerReductionModeCreateInfoEXT")] - public unsafe partial struct SamplerReductionModeCreateInfoEXT + public unsafe partial struct SamplerReductionModeCreateInfoEXT : IStructuredType { public SamplerReductionModeCreateInfoEXT ( @@ -57,5 +57,11 @@ public SamplerReductionModeCreateInfoEXT [NativeName("Type.Name", "VkSamplerReductionMode")] [NativeName("Name", "reductionMode")] public SamplerReductionMode ReductionMode; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SamplerReductionModeCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionCreateInfo.gen.cs index 304c61bcba..c5db31038d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSamplerYcbcrConversionCreateInfo")] - public unsafe partial struct SamplerYcbcrConversionCreateInfo + public unsafe partial struct SamplerYcbcrConversionCreateInfo : IStructuredType { public SamplerYcbcrConversionCreateInfo ( @@ -134,5 +134,11 @@ public SamplerYcbcrConversionCreateInfo [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "forceExplicitReconstruction")] public Bool32 ForceExplicitReconstruction; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SamplerYcbcrConversionCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionCreateInfoKHR.gen.cs index e248e865aa..d8f2cbaa02 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSamplerYcbcrConversionCreateInfoKHR")] - public unsafe partial struct SamplerYcbcrConversionCreateInfoKHR + public unsafe partial struct SamplerYcbcrConversionCreateInfoKHR : IStructuredType { public SamplerYcbcrConversionCreateInfoKHR ( @@ -134,5 +134,11 @@ public SamplerYcbcrConversionCreateInfoKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "forceExplicitReconstruction")] public Bool32 ForceExplicitReconstruction; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SamplerYcbcrConversionCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionImageFormatProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionImageFormatProperties.gen.cs index 05d0e2137d..9fcbfc6d9c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionImageFormatProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionImageFormatProperties.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSamplerYcbcrConversionImageFormatProperties")] - public unsafe partial struct SamplerYcbcrConversionImageFormatProperties + public unsafe partial struct SamplerYcbcrConversionImageFormatProperties : IStructuredType { public SamplerYcbcrConversionImageFormatProperties ( @@ -57,5 +57,11 @@ public SamplerYcbcrConversionImageFormatProperties [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "combinedImageSamplerDescriptorCount")] public uint CombinedImageSamplerDescriptorCount; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SamplerYcbcrConversionImageFormatProperties; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionImageFormatPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionImageFormatPropertiesKHR.gen.cs index 0c21e4986f..bc749be1aa 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionImageFormatPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionImageFormatPropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSamplerYcbcrConversionImageFormatPropertiesKHR")] - public unsafe partial struct SamplerYcbcrConversionImageFormatPropertiesKHR + public unsafe partial struct SamplerYcbcrConversionImageFormatPropertiesKHR : IStructuredType { public SamplerYcbcrConversionImageFormatPropertiesKHR ( @@ -57,5 +57,11 @@ public SamplerYcbcrConversionImageFormatPropertiesKHR [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "combinedImageSamplerDescriptorCount")] public uint CombinedImageSamplerDescriptorCount; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SamplerYcbcrConversionImageFormatProperties; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionInfo.gen.cs index 6af5edf275..7906d71b59 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSamplerYcbcrConversionInfo")] - public unsafe partial struct SamplerYcbcrConversionInfo + public unsafe partial struct SamplerYcbcrConversionInfo : IStructuredType { public SamplerYcbcrConversionInfo ( @@ -57,5 +57,11 @@ public SamplerYcbcrConversionInfo [NativeName("Type.Name", "VkSamplerYcbcrConversion")] [NativeName("Name", "conversion")] public SamplerYcbcrConversion Conversion; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SamplerYcbcrConversionInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionInfoKHR.gen.cs index 88a8056674..d84eed4fce 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSamplerYcbcrConversionInfoKHR")] - public unsafe partial struct SamplerYcbcrConversionInfoKHR + public unsafe partial struct SamplerYcbcrConversionInfoKHR : IStructuredType { public SamplerYcbcrConversionInfoKHR ( @@ -57,5 +57,11 @@ public SamplerYcbcrConversionInfoKHR [NativeName("Type.Name", "VkSamplerYcbcrConversion")] [NativeName("Name", "conversion")] public SamplerYcbcrConversion Conversion; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SamplerYcbcrConversionInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ScreenSurfaceCreateInfoQNX.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ScreenSurfaceCreateInfoQNX.gen.cs index f439d147f0..97ef52448e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ScreenSurfaceCreateInfoQNX.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ScreenSurfaceCreateInfoQNX.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkScreenSurfaceCreateInfoQNX")] - public unsafe partial struct ScreenSurfaceCreateInfoQNX + public unsafe partial struct ScreenSurfaceCreateInfoQNX : IStructuredType { public ScreenSurfaceCreateInfoQNX ( @@ -79,5 +79,11 @@ public ScreenSurfaceCreateInfoQNX [NativeName("Type.Name", "_screen_window")] [NativeName("Name", "window")] public void* Window; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ScreenSurfaceCreateInfoQnx; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreCreateInfo.gen.cs index 5865e6c45d..30feda27df 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSemaphoreCreateInfo")] - public unsafe partial struct SemaphoreCreateInfo + public unsafe partial struct SemaphoreCreateInfo : IStructuredType { public SemaphoreCreateInfo ( @@ -57,5 +57,11 @@ public SemaphoreCreateInfo [NativeName("Type.Name", "VkSemaphoreCreateFlags")] [NativeName("Name", "flags")] public uint Flags; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SemaphoreCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreGetFdInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreGetFdInfoKHR.gen.cs index 502a8caafa..7700a2e65f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreGetFdInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreGetFdInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSemaphoreGetFdInfoKHR")] - public unsafe partial struct SemaphoreGetFdInfoKHR + public unsafe partial struct SemaphoreGetFdInfoKHR : IStructuredType { public SemaphoreGetFdInfoKHR ( @@ -68,5 +68,11 @@ public SemaphoreGetFdInfoKHR [NativeName("Type.Name", "VkExternalSemaphoreHandleTypeFlagBits")] [NativeName("Name", "handleType")] public ExternalSemaphoreHandleTypeFlags HandleType; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SemaphoreGetFDInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreGetWin32HandleInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreGetWin32HandleInfoKHR.gen.cs index d588742132..8d46797d00 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreGetWin32HandleInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreGetWin32HandleInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSemaphoreGetWin32HandleInfoKHR")] - public unsafe partial struct SemaphoreGetWin32HandleInfoKHR + public unsafe partial struct SemaphoreGetWin32HandleInfoKHR : IStructuredType { public SemaphoreGetWin32HandleInfoKHR ( @@ -68,5 +68,11 @@ public SemaphoreGetWin32HandleInfoKHR [NativeName("Type.Name", "VkExternalSemaphoreHandleTypeFlagBits")] [NativeName("Name", "handleType")] public ExternalSemaphoreHandleTypeFlags HandleType; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SemaphoreGetWin32HandleInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreGetZirconHandleInfoFUCHSIA.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreGetZirconHandleInfoFUCHSIA.gen.cs index b1cff9174f..3ca91bb142 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreGetZirconHandleInfoFUCHSIA.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreGetZirconHandleInfoFUCHSIA.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSemaphoreGetZirconHandleInfoFUCHSIA")] - public unsafe partial struct SemaphoreGetZirconHandleInfoFUCHSIA + public unsafe partial struct SemaphoreGetZirconHandleInfoFUCHSIA : IStructuredType { public SemaphoreGetZirconHandleInfoFUCHSIA ( @@ -68,5 +68,11 @@ public SemaphoreGetZirconHandleInfoFUCHSIA [NativeName("Type.Name", "VkExternalSemaphoreHandleTypeFlagBits")] [NativeName("Name", "handleType")] public ExternalSemaphoreHandleTypeFlags HandleType; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SemaphoreGetZirconHandleInfoFuchsia; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreSignalInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreSignalInfo.gen.cs index 130fe8fec6..5171d288f9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreSignalInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreSignalInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSemaphoreSignalInfo")] - public unsafe partial struct SemaphoreSignalInfo + public unsafe partial struct SemaphoreSignalInfo : IStructuredType { public SemaphoreSignalInfo ( @@ -68,5 +68,11 @@ public SemaphoreSignalInfo [NativeName("Type.Name", "uint64_t")] [NativeName("Name", "value")] public ulong Value; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SemaphoreSignalInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreSignalInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreSignalInfoKHR.gen.cs index 9c24dcff6a..8c52b3eb97 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreSignalInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreSignalInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSemaphoreSignalInfoKHR")] - public unsafe partial struct SemaphoreSignalInfoKHR + public unsafe partial struct SemaphoreSignalInfoKHR : IStructuredType { public SemaphoreSignalInfoKHR ( @@ -68,5 +68,11 @@ public SemaphoreSignalInfoKHR [NativeName("Type.Name", "uint64_t")] [NativeName("Name", "value")] public ulong Value; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SemaphoreSignalInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreSubmitInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreSubmitInfoKHR.gen.cs index 31c189fa57..95c966bb04 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreSubmitInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreSubmitInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSemaphoreSubmitInfoKHR")] - public unsafe partial struct SemaphoreSubmitInfoKHR + public unsafe partial struct SemaphoreSubmitInfoKHR : IStructuredType { public SemaphoreSubmitInfoKHR ( @@ -90,5 +90,11 @@ public SemaphoreSubmitInfoKHR [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "deviceIndex")] public uint DeviceIndex; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SemaphoreSubmitInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreTypeCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreTypeCreateInfo.gen.cs index 9d3db84a7c..707a447458 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreTypeCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreTypeCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSemaphoreTypeCreateInfo")] - public unsafe partial struct SemaphoreTypeCreateInfo + public unsafe partial struct SemaphoreTypeCreateInfo : IStructuredType { public SemaphoreTypeCreateInfo ( @@ -68,5 +68,11 @@ public SemaphoreTypeCreateInfo [NativeName("Type.Name", "uint64_t")] [NativeName("Name", "initialValue")] public ulong InitialValue; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SemaphoreTypeCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreTypeCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreTypeCreateInfoKHR.gen.cs index 203a962761..973434156a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreTypeCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreTypeCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSemaphoreTypeCreateInfoKHR")] - public unsafe partial struct SemaphoreTypeCreateInfoKHR + public unsafe partial struct SemaphoreTypeCreateInfoKHR : IStructuredType { public SemaphoreTypeCreateInfoKHR ( @@ -68,5 +68,11 @@ public SemaphoreTypeCreateInfoKHR [NativeName("Type.Name", "uint64_t")] [NativeName("Name", "initialValue")] public ulong InitialValue; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SemaphoreTypeCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreWaitInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreWaitInfo.gen.cs index 1217904fa9..03053e78c2 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreWaitInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreWaitInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSemaphoreWaitInfo")] - public unsafe partial struct SemaphoreWaitInfo + public unsafe partial struct SemaphoreWaitInfo : IStructuredType { public SemaphoreWaitInfo ( @@ -90,5 +90,11 @@ public SemaphoreWaitInfo [NativeName("Type.Name", "uint64_t")] [NativeName("Name", "pValues")] public ulong* PValues; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SemaphoreWaitInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreWaitInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreWaitInfoKHR.gen.cs index 364863905d..2c3c1de190 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreWaitInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreWaitInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSemaphoreWaitInfoKHR")] - public unsafe partial struct SemaphoreWaitInfoKHR + public unsafe partial struct SemaphoreWaitInfoKHR : IStructuredType { public SemaphoreWaitInfoKHR ( @@ -90,5 +90,11 @@ public SemaphoreWaitInfoKHR [NativeName("Type.Name", "uint64_t")] [NativeName("Name", "pValues")] public ulong* PValues; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SemaphoreWaitInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ShaderModuleCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ShaderModuleCreateInfo.gen.cs index 6a1e449e64..c7b304c5ae 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ShaderModuleCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ShaderModuleCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkShaderModuleCreateInfo")] - public unsafe partial struct ShaderModuleCreateInfo + public unsafe partial struct ShaderModuleCreateInfo : IStructuredType { public ShaderModuleCreateInfo ( @@ -79,5 +79,11 @@ public ShaderModuleCreateInfo [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "pCode")] public uint* PCode; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ShaderModuleCreateInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ShaderModuleValidationCacheCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ShaderModuleValidationCacheCreateInfoEXT.gen.cs index 029c67a9ce..9212cc9669 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ShaderModuleValidationCacheCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ShaderModuleValidationCacheCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkShaderModuleValidationCacheCreateInfoEXT")] - public unsafe partial struct ShaderModuleValidationCacheCreateInfoEXT + public unsafe partial struct ShaderModuleValidationCacheCreateInfoEXT : IStructuredType { public ShaderModuleValidationCacheCreateInfoEXT ( @@ -57,5 +57,11 @@ public ShaderModuleValidationCacheCreateInfoEXT [NativeName("Type.Name", "VkValidationCacheEXT")] [NativeName("Name", "validationCache")] public ValidationCacheEXT ValidationCache; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ShaderModuleValidationCacheCreateInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SharedPresentSurfaceCapabilitiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SharedPresentSurfaceCapabilitiesKHR.gen.cs index caec89aecd..1a037ddef0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SharedPresentSurfaceCapabilitiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SharedPresentSurfaceCapabilitiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSharedPresentSurfaceCapabilitiesKHR")] - public unsafe partial struct SharedPresentSurfaceCapabilitiesKHR + public unsafe partial struct SharedPresentSurfaceCapabilitiesKHR : IStructuredType { public SharedPresentSurfaceCapabilitiesKHR ( @@ -57,5 +57,11 @@ public SharedPresentSurfaceCapabilitiesKHR [NativeName("Type.Name", "VkImageUsageFlags")] [NativeName("Name", "sharedPresentSupportedUsageFlags")] public ImageUsageFlags SharedPresentSupportedUsageFlags; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SharedPresentSurfaceCapabilitiesKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SparseImageFormatProperties2.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SparseImageFormatProperties2.gen.cs index d05deb4c3e..1bd6db37fe 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SparseImageFormatProperties2.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SparseImageFormatProperties2.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSparseImageFormatProperties2")] - public unsafe partial struct SparseImageFormatProperties2 + public unsafe partial struct SparseImageFormatProperties2 : IStructuredType { public SparseImageFormatProperties2 ( @@ -57,5 +57,11 @@ public SparseImageFormatProperties2 [NativeName("Type.Name", "VkSparseImageFormatProperties")] [NativeName("Name", "properties")] public SparseImageFormatProperties Properties; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SparseImageFormatProperties2; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SparseImageFormatProperties2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SparseImageFormatProperties2KHR.gen.cs index 5f8f130730..c7fbbcb27d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SparseImageFormatProperties2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SparseImageFormatProperties2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSparseImageFormatProperties2KHR")] - public unsafe partial struct SparseImageFormatProperties2KHR + public unsafe partial struct SparseImageFormatProperties2KHR : IStructuredType { public SparseImageFormatProperties2KHR ( @@ -57,5 +57,11 @@ public SparseImageFormatProperties2KHR [NativeName("Type.Name", "VkSparseImageFormatProperties")] [NativeName("Name", "properties")] public SparseImageFormatProperties Properties; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SparseImageFormatProperties2; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SparseImageMemoryRequirements2.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SparseImageMemoryRequirements2.gen.cs index c9c89970eb..3fc08b08bd 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SparseImageMemoryRequirements2.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SparseImageMemoryRequirements2.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSparseImageMemoryRequirements2")] - public unsafe partial struct SparseImageMemoryRequirements2 + public unsafe partial struct SparseImageMemoryRequirements2 : IStructuredType { public SparseImageMemoryRequirements2 ( @@ -57,5 +57,11 @@ public SparseImageMemoryRequirements2 [NativeName("Type.Name", "VkSparseImageMemoryRequirements")] [NativeName("Name", "memoryRequirements")] public SparseImageMemoryRequirements MemoryRequirements; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SparseImageMemoryRequirements2; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SparseImageMemoryRequirements2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SparseImageMemoryRequirements2KHR.gen.cs index e00ad53012..3a89d2aae1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SparseImageMemoryRequirements2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SparseImageMemoryRequirements2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSparseImageMemoryRequirements2KHR")] - public unsafe partial struct SparseImageMemoryRequirements2KHR + public unsafe partial struct SparseImageMemoryRequirements2KHR : IStructuredType { public SparseImageMemoryRequirements2KHR ( @@ -57,5 +57,11 @@ public SparseImageMemoryRequirements2KHR [NativeName("Type.Name", "VkSparseImageMemoryRequirements")] [NativeName("Name", "memoryRequirements")] public SparseImageMemoryRequirements MemoryRequirements; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SparseImageMemoryRequirements2; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/StreamDescriptorSurfaceCreateInfoGGP.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/StreamDescriptorSurfaceCreateInfoGGP.gen.cs index f3468b7c73..8a2713f6e3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/StreamDescriptorSurfaceCreateInfoGGP.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/StreamDescriptorSurfaceCreateInfoGGP.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkStreamDescriptorSurfaceCreateInfoGGP")] - public unsafe partial struct StreamDescriptorSurfaceCreateInfoGGP + public unsafe partial struct StreamDescriptorSurfaceCreateInfoGGP : IStructuredType { public StreamDescriptorSurfaceCreateInfoGGP ( @@ -68,5 +68,11 @@ public StreamDescriptorSurfaceCreateInfoGGP [NativeName("Type.Name", "GgpStreamDescriptor")] [NativeName("Name", "streamDescriptor")] public nint StreamDescriptor; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.StreamDescriptorSurfaceCreateInfoGgp; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SubmitInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SubmitInfo.gen.cs index a157486bb5..68e488879e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SubmitInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SubmitInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSubmitInfo")] - public unsafe partial struct SubmitInfo + public unsafe partial struct SubmitInfo : IStructuredType { public SubmitInfo ( @@ -123,5 +123,11 @@ public SubmitInfo [NativeName("Type.Name", "VkSemaphore")] [NativeName("Name", "pSignalSemaphores")] public Semaphore* PSignalSemaphores; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SubmitInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SubmitInfo2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SubmitInfo2KHR.gen.cs index 67251e39b5..71b32b0df1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SubmitInfo2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SubmitInfo2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSubmitInfo2KHR")] - public unsafe partial struct SubmitInfo2KHR + public unsafe partial struct SubmitInfo2KHR : IStructuredType { public SubmitInfo2KHR ( @@ -123,5 +123,11 @@ public SubmitInfo2KHR [NativeName("Type.Name", "VkSemaphoreSubmitInfoKHR")] [NativeName("Name", "pSignalSemaphoreInfos")] public SemaphoreSubmitInfoKHR* PSignalSemaphoreInfos; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SubmitInfo2Khr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassBeginInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassBeginInfo.gen.cs index a5ca819c45..83039a8987 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassBeginInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassBeginInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSubpassBeginInfo")] - public unsafe partial struct SubpassBeginInfo + public unsafe partial struct SubpassBeginInfo : IStructuredType { public SubpassBeginInfo ( @@ -57,5 +57,11 @@ public SubpassBeginInfo [NativeName("Type.Name", "VkSubpassContents")] [NativeName("Name", "contents")] public SubpassContents Contents; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SubpassBeginInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassBeginInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassBeginInfoKHR.gen.cs index 20a1eea2d3..2baa802783 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassBeginInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassBeginInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSubpassBeginInfoKHR")] - public unsafe partial struct SubpassBeginInfoKHR + public unsafe partial struct SubpassBeginInfoKHR : IStructuredType { public SubpassBeginInfoKHR ( @@ -57,5 +57,11 @@ public SubpassBeginInfoKHR [NativeName("Type.Name", "VkSubpassContents")] [NativeName("Name", "contents")] public SubpassContents Contents; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SubpassBeginInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDependency2.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDependency2.gen.cs index 746615fba6..5d1791d665 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDependency2.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDependency2.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSubpassDependency2")] - public unsafe partial struct SubpassDependency2 + public unsafe partial struct SubpassDependency2 : IStructuredType { public SubpassDependency2 ( @@ -134,5 +134,11 @@ public SubpassDependency2 [NativeName("Type.Name", "int32_t")] [NativeName("Name", "viewOffset")] public int ViewOffset; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SubpassDependency2; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDependency2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDependency2KHR.gen.cs index d6737774bc..aa7b7ecb9a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDependency2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDependency2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSubpassDependency2KHR")] - public unsafe partial struct SubpassDependency2KHR + public unsafe partial struct SubpassDependency2KHR : IStructuredType { public SubpassDependency2KHR ( @@ -134,5 +134,11 @@ public SubpassDependency2KHR [NativeName("Type.Name", "int32_t")] [NativeName("Name", "viewOffset")] public int ViewOffset; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SubpassDependency2; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescription2.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescription2.gen.cs index 77e30fe74b..8eab57185f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescription2.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescription2.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSubpassDescription2")] - public unsafe partial struct SubpassDescription2 + public unsafe partial struct SubpassDescription2 : IStructuredType { public SubpassDescription2 ( @@ -167,5 +167,11 @@ public SubpassDescription2 [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "pPreserveAttachments")] public uint* PPreserveAttachments; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SubpassDescription2; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescription2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescription2KHR.gen.cs index c3aa14b16f..b418f57fb5 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescription2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescription2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSubpassDescription2KHR")] - public unsafe partial struct SubpassDescription2KHR + public unsafe partial struct SubpassDescription2KHR : IStructuredType { public SubpassDescription2KHR ( @@ -167,5 +167,11 @@ public SubpassDescription2KHR [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "pPreserveAttachments")] public uint* PPreserveAttachments; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SubpassDescription2; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescriptionDepthStencilResolve.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescriptionDepthStencilResolve.gen.cs index 8083053c62..bdcb4fad11 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescriptionDepthStencilResolve.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescriptionDepthStencilResolve.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSubpassDescriptionDepthStencilResolve")] - public unsafe partial struct SubpassDescriptionDepthStencilResolve + public unsafe partial struct SubpassDescriptionDepthStencilResolve : IStructuredType { public SubpassDescriptionDepthStencilResolve ( @@ -79,5 +79,11 @@ public SubpassDescriptionDepthStencilResolve [NativeName("Type.Name", "VkAttachmentReference2")] [NativeName("Name", "pDepthStencilResolveAttachment")] public AttachmentReference2* PDepthStencilResolveAttachment; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SubpassDescriptionDepthStencilResolve; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescriptionDepthStencilResolveKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescriptionDepthStencilResolveKHR.gen.cs index 1be093b3c3..853b0fd3c6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescriptionDepthStencilResolveKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescriptionDepthStencilResolveKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSubpassDescriptionDepthStencilResolveKHR")] - public unsafe partial struct SubpassDescriptionDepthStencilResolveKHR + public unsafe partial struct SubpassDescriptionDepthStencilResolveKHR : IStructuredType { public SubpassDescriptionDepthStencilResolveKHR ( @@ -79,5 +79,11 @@ public SubpassDescriptionDepthStencilResolveKHR [NativeName("Type.Name", "VkAttachmentReference2")] [NativeName("Name", "pDepthStencilResolveAttachment")] public AttachmentReference2* PDepthStencilResolveAttachment; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SubpassDescriptionDepthStencilResolve; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassEndInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassEndInfo.gen.cs index f02ccbc138..3fba369305 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassEndInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassEndInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSubpassEndInfo")] - public unsafe partial struct SubpassEndInfo + public unsafe partial struct SubpassEndInfo : IStructuredType { public SubpassEndInfo ( @@ -46,5 +46,11 @@ public SubpassEndInfo [NativeName("Type.Name", "void")] [NativeName("Name", "pNext")] public void* PNext; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SubpassEndInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassEndInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassEndInfoKHR.gen.cs index 2776328fe2..54ac3444e6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassEndInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassEndInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSubpassEndInfoKHR")] - public unsafe partial struct SubpassEndInfoKHR + public unsafe partial struct SubpassEndInfoKHR : IStructuredType { public SubpassEndInfoKHR ( @@ -46,5 +46,11 @@ public SubpassEndInfoKHR [NativeName("Type.Name", "void")] [NativeName("Name", "pNext")] public void* PNext; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SubpassEndInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassShadingPipelineCreateInfoHUAWEI.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassShadingPipelineCreateInfoHUAWEI.gen.cs index c4a2f7af0c..11312a27f4 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassShadingPipelineCreateInfoHUAWEI.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassShadingPipelineCreateInfoHUAWEI.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSubpassShadingPipelineCreateInfoHUAWEI")] - public unsafe partial struct SubpassShadingPipelineCreateInfoHUAWEI + public unsafe partial struct SubpassShadingPipelineCreateInfoHUAWEI : IStructuredType { public SubpassShadingPipelineCreateInfoHUAWEI ( @@ -68,5 +68,11 @@ public SubpassShadingPipelineCreateInfoHUAWEI [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "subpass")] public uint Subpass; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SubpassShadingPipelineCreateInfoHuawei; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceCapabilities2EXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceCapabilities2EXT.gen.cs index ded2d024b5..80d7ec357b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceCapabilities2EXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceCapabilities2EXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSurfaceCapabilities2EXT")] - public unsafe partial struct SurfaceCapabilities2EXT + public unsafe partial struct SurfaceCapabilities2EXT : IStructuredType { public SurfaceCapabilities2EXT ( @@ -167,5 +167,11 @@ public SurfaceCapabilities2EXT [NativeName("Type.Name", "VkSurfaceCounterFlagsEXT")] [NativeName("Name", "supportedSurfaceCounters")] public SurfaceCounterFlagsEXT SupportedSurfaceCounters; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SurfaceCapabilities2Ext; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceCapabilities2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceCapabilities2KHR.gen.cs index 2d010ea1d3..82fa02312f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceCapabilities2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceCapabilities2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSurfaceCapabilities2KHR")] - public unsafe partial struct SurfaceCapabilities2KHR + public unsafe partial struct SurfaceCapabilities2KHR : IStructuredType { public SurfaceCapabilities2KHR ( @@ -57,5 +57,11 @@ public SurfaceCapabilities2KHR [NativeName("Type.Name", "VkSurfaceCapabilitiesKHR")] [NativeName("Name", "surfaceCapabilities")] public SurfaceCapabilitiesKHR SurfaceCapabilities; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SurfaceCapabilities2Khr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceCapabilitiesFullScreenExclusiveEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceCapabilitiesFullScreenExclusiveEXT.gen.cs index b98733f169..3c6745d7d5 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceCapabilitiesFullScreenExclusiveEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceCapabilitiesFullScreenExclusiveEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSurfaceCapabilitiesFullScreenExclusiveEXT")] - public unsafe partial struct SurfaceCapabilitiesFullScreenExclusiveEXT + public unsafe partial struct SurfaceCapabilitiesFullScreenExclusiveEXT : IStructuredType { public SurfaceCapabilitiesFullScreenExclusiveEXT ( @@ -57,5 +57,11 @@ public SurfaceCapabilitiesFullScreenExclusiveEXT [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "fullScreenExclusiveSupported")] public Bool32 FullScreenExclusiveSupported; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SurfaceCapabilitiesFullScreenExclusiveExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceFormat2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceFormat2KHR.gen.cs index 46a11663b6..2ef4db8434 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceFormat2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceFormat2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSurfaceFormat2KHR")] - public unsafe partial struct SurfaceFormat2KHR + public unsafe partial struct SurfaceFormat2KHR : IStructuredType { public SurfaceFormat2KHR ( @@ -57,5 +57,11 @@ public SurfaceFormat2KHR [NativeName("Type.Name", "VkSurfaceFormatKHR")] [NativeName("Name", "surfaceFormat")] public SurfaceFormatKHR SurfaceFormat; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SurfaceFormat2Khr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceFullScreenExclusiveInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceFullScreenExclusiveInfoEXT.gen.cs index 7cd2f3adc6..1078e7b6a0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceFullScreenExclusiveInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceFullScreenExclusiveInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSurfaceFullScreenExclusiveInfoEXT")] - public unsafe partial struct SurfaceFullScreenExclusiveInfoEXT + public unsafe partial struct SurfaceFullScreenExclusiveInfoEXT : IStructuredType { public SurfaceFullScreenExclusiveInfoEXT ( @@ -57,5 +57,11 @@ public SurfaceFullScreenExclusiveInfoEXT [NativeName("Type.Name", "VkFullScreenExclusiveEXT")] [NativeName("Name", "fullScreenExclusive")] public FullScreenExclusiveEXT FullScreenExclusive; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SurfaceFullScreenExclusiveInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceFullScreenExclusiveWin32InfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceFullScreenExclusiveWin32InfoEXT.gen.cs index 469fee9b83..82a871048f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceFullScreenExclusiveWin32InfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceFullScreenExclusiveWin32InfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSurfaceFullScreenExclusiveWin32InfoEXT")] - public unsafe partial struct SurfaceFullScreenExclusiveWin32InfoEXT + public unsafe partial struct SurfaceFullScreenExclusiveWin32InfoEXT : IStructuredType { public SurfaceFullScreenExclusiveWin32InfoEXT ( @@ -57,5 +57,11 @@ public SurfaceFullScreenExclusiveWin32InfoEXT [NativeName("Type.Name", "HMONITOR")] [NativeName("Name", "hmonitor")] public nint Hmonitor; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SurfaceFullScreenExclusiveWin32InfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceProtectedCapabilitiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceProtectedCapabilitiesKHR.gen.cs index 67a3352024..3ba9d8b039 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceProtectedCapabilitiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceProtectedCapabilitiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSurfaceProtectedCapabilitiesKHR")] - public unsafe partial struct SurfaceProtectedCapabilitiesKHR + public unsafe partial struct SurfaceProtectedCapabilitiesKHR : IStructuredType { public SurfaceProtectedCapabilitiesKHR ( @@ -57,5 +57,11 @@ public SurfaceProtectedCapabilitiesKHR [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "supportsProtected")] public Bool32 SupportsProtected; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SurfaceProtectedCapabilitiesKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SwapchainCounterCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SwapchainCounterCreateInfoEXT.gen.cs index 4069dd2e77..afc3ae8bb8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SwapchainCounterCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SwapchainCounterCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSwapchainCounterCreateInfoEXT")] - public unsafe partial struct SwapchainCounterCreateInfoEXT + public unsafe partial struct SwapchainCounterCreateInfoEXT : IStructuredType { public SwapchainCounterCreateInfoEXT ( @@ -57,5 +57,11 @@ public SwapchainCounterCreateInfoEXT [NativeName("Type.Name", "VkSurfaceCounterFlagsEXT")] [NativeName("Name", "surfaceCounters")] public SurfaceCounterFlagsEXT SurfaceCounters; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SwapchainCounterCreateInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SwapchainCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SwapchainCreateInfoKHR.gen.cs index 80338cbdf8..7cfbca5ce1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SwapchainCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SwapchainCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSwapchainCreateInfoKHR")] - public unsafe partial struct SwapchainCreateInfoKHR + public unsafe partial struct SwapchainCreateInfoKHR : IStructuredType { public SwapchainCreateInfoKHR ( @@ -222,5 +222,11 @@ public SwapchainCreateInfoKHR [NativeName("Type.Name", "VkSwapchainKHR")] [NativeName("Name", "oldSwapchain")] public SwapchainKHR OldSwapchain; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SwapchainCreateInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SwapchainDisplayNativeHdrCreateInfoAMD.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SwapchainDisplayNativeHdrCreateInfoAMD.gen.cs index 038669c69a..297d191705 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SwapchainDisplayNativeHdrCreateInfoAMD.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SwapchainDisplayNativeHdrCreateInfoAMD.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSwapchainDisplayNativeHdrCreateInfoAMD")] - public unsafe partial struct SwapchainDisplayNativeHdrCreateInfoAMD + public unsafe partial struct SwapchainDisplayNativeHdrCreateInfoAMD : IStructuredType { public SwapchainDisplayNativeHdrCreateInfoAMD ( @@ -57,5 +57,11 @@ public SwapchainDisplayNativeHdrCreateInfoAMD [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "localDimmingEnable")] public Bool32 LocalDimmingEnable; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SwapchainDisplayNativeHdrCreateInfoAmd; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SwapchainImageCreateInfoANDROID.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SwapchainImageCreateInfoANDROID.gen.cs index 058a6b0a6f..696cbdd99a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SwapchainImageCreateInfoANDROID.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SwapchainImageCreateInfoANDROID.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSwapchainImageCreateInfoANDROID")] - public unsafe partial struct SwapchainImageCreateInfoANDROID + public unsafe partial struct SwapchainImageCreateInfoANDROID : IStructuredType { public SwapchainImageCreateInfoANDROID ( @@ -57,5 +57,11 @@ public SwapchainImageCreateInfoANDROID [NativeName("Type.Name", "VkSwapchainImageUsageFlagsANDROID")] [NativeName("Name", "usage")] public SwapchainImageUsageFlagsANDROID Usage; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SwapchainImageCreateInfoAndroid; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SysmemColorSpaceFUCHSIA.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SysmemColorSpaceFUCHSIA.gen.cs index 39d0ac3f2a..f6ed40e56d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SysmemColorSpaceFUCHSIA.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SysmemColorSpaceFUCHSIA.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSysmemColorSpaceFUCHSIA")] - public unsafe partial struct SysmemColorSpaceFUCHSIA + public unsafe partial struct SysmemColorSpaceFUCHSIA : IStructuredType { public SysmemColorSpaceFUCHSIA ( @@ -57,5 +57,11 @@ public SysmemColorSpaceFUCHSIA [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "colorSpace")] public uint ColorSpace; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.SysmemColorSpaceFuchsia; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/TextureLODGatherFormatPropertiesAMD.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/TextureLODGatherFormatPropertiesAMD.gen.cs index 1ebf41c071..8817a3a400 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/TextureLODGatherFormatPropertiesAMD.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/TextureLODGatherFormatPropertiesAMD.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkTextureLODGatherFormatPropertiesAMD")] - public unsafe partial struct TextureLODGatherFormatPropertiesAMD + public unsafe partial struct TextureLODGatherFormatPropertiesAMD : IStructuredType { public TextureLODGatherFormatPropertiesAMD ( @@ -57,5 +57,11 @@ public TextureLODGatherFormatPropertiesAMD [NativeName("Type.Name", "VkBool32")] [NativeName("Name", "supportsTextureGatherLODBiasAMD")] public Bool32 SupportsTextureGatherLodbiasAmd; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.TextureLodGatherFormatPropertiesAmd; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/TimelineSemaphoreSubmitInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/TimelineSemaphoreSubmitInfo.gen.cs index 77da3ce58a..1f9a3db854 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/TimelineSemaphoreSubmitInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/TimelineSemaphoreSubmitInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkTimelineSemaphoreSubmitInfo")] - public unsafe partial struct TimelineSemaphoreSubmitInfo + public unsafe partial struct TimelineSemaphoreSubmitInfo : IStructuredType { public TimelineSemaphoreSubmitInfo ( @@ -90,5 +90,11 @@ public TimelineSemaphoreSubmitInfo [NativeName("Type.Name", "uint64_t")] [NativeName("Name", "pSignalSemaphoreValues")] public ulong* PSignalSemaphoreValues; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.TimelineSemaphoreSubmitInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/TimelineSemaphoreSubmitInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/TimelineSemaphoreSubmitInfoKHR.gen.cs index aa1a2a7fba..342cb0ab36 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/TimelineSemaphoreSubmitInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/TimelineSemaphoreSubmitInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkTimelineSemaphoreSubmitInfoKHR")] - public unsafe partial struct TimelineSemaphoreSubmitInfoKHR + public unsafe partial struct TimelineSemaphoreSubmitInfoKHR : IStructuredType { public TimelineSemaphoreSubmitInfoKHR ( @@ -90,5 +90,11 @@ public TimelineSemaphoreSubmitInfoKHR [NativeName("Type.Name", "uint64_t")] [NativeName("Name", "pSignalSemaphoreValues")] public ulong* PSignalSemaphoreValues; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.TimelineSemaphoreSubmitInfo; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ValidationCacheCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ValidationCacheCreateInfoEXT.gen.cs index 6307a7a559..fd17f79026 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ValidationCacheCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ValidationCacheCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkValidationCacheCreateInfoEXT")] - public unsafe partial struct ValidationCacheCreateInfoEXT + public unsafe partial struct ValidationCacheCreateInfoEXT : IStructuredType { public ValidationCacheCreateInfoEXT ( @@ -79,5 +79,11 @@ public ValidationCacheCreateInfoEXT [NativeName("Type.Name", "void")] [NativeName("Name", "pInitialData")] public void* PInitialData; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ValidationCacheCreateInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ValidationFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ValidationFeaturesEXT.gen.cs index 2323272ea6..092b46ee5f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ValidationFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ValidationFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkValidationFeaturesEXT")] - public unsafe partial struct ValidationFeaturesEXT + public unsafe partial struct ValidationFeaturesEXT : IStructuredType { public ValidationFeaturesEXT ( @@ -90,5 +90,11 @@ public ValidationFeaturesEXT [NativeName("Type.Name", "VkValidationFeatureDisableEXT")] [NativeName("Name", "pDisabledValidationFeatures")] public ValidationFeatureDisableEXT* PDisabledValidationFeatures; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ValidationFeaturesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ValidationFlagsEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ValidationFlagsEXT.gen.cs index 50427e37d7..e2adebbe95 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ValidationFlagsEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ValidationFlagsEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkValidationFlagsEXT")] - public unsafe partial struct ValidationFlagsEXT + public unsafe partial struct ValidationFlagsEXT : IStructuredType { public ValidationFlagsEXT ( @@ -68,5 +68,11 @@ public ValidationFlagsEXT [NativeName("Type.Name", "VkValidationCheckEXT")] [NativeName("Name", "pDisabledValidationChecks")] public ValidationCheckEXT* PDisabledValidationChecks; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.ValidationFlagsExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VertexInputAttributeDescription2EXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VertexInputAttributeDescription2EXT.gen.cs index efb345de94..1002e14dcf 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VertexInputAttributeDescription2EXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VertexInputAttributeDescription2EXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVertexInputAttributeDescription2EXT")] - public unsafe partial struct VertexInputAttributeDescription2EXT + public unsafe partial struct VertexInputAttributeDescription2EXT : IStructuredType { public VertexInputAttributeDescription2EXT ( @@ -90,5 +90,11 @@ public VertexInputAttributeDescription2EXT [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "offset")] public uint Offset; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VertexInputAttributeDescription2Ext; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VertexInputBindingDescription2EXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VertexInputBindingDescription2EXT.gen.cs index 08e0a0eb8e..25213a7a14 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VertexInputBindingDescription2EXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VertexInputBindingDescription2EXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVertexInputBindingDescription2EXT")] - public unsafe partial struct VertexInputBindingDescription2EXT + public unsafe partial struct VertexInputBindingDescription2EXT : IStructuredType { public VertexInputBindingDescription2EXT ( @@ -90,5 +90,11 @@ public VertexInputBindingDescription2EXT [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "divisor")] public uint Divisor; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VertexInputBindingDescription2Ext; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ViSurfaceCreateInfoNN.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ViSurfaceCreateInfoNN.gen.cs index 1838713401..02306afc01 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ViSurfaceCreateInfoNN.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ViSurfaceCreateInfoNN.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkViSurfaceCreateInfoNN")] - public unsafe partial struct ViSurfaceCreateInfoNN + public unsafe partial struct ViSurfaceCreateInfoNN : IStructuredType { public ViSurfaceCreateInfoNN ( @@ -68,5 +68,11 @@ public ViSurfaceCreateInfoNN [NativeName("Type.Name", "void")] [NativeName("Name", "window")] public void* Window; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VISurfaceCreateInfoNN; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoBeginCodingInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoBeginCodingInfoKHR.gen.cs index e5e1915b17..ea3d6e00a4 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoBeginCodingInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoBeginCodingInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoBeginCodingInfoKHR")] - public unsafe partial struct VideoBeginCodingInfoKHR + public unsafe partial struct VideoBeginCodingInfoKHR : IStructuredType { public VideoBeginCodingInfoKHR ( @@ -112,5 +112,11 @@ public VideoBeginCodingInfoKHR [NativeName("Type.Name", "VkVideoReferenceSlotKHR")] [NativeName("Name", "pReferenceSlots")] public VideoReferenceSlotKHR* PReferenceSlots; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoBeginCodingInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoBindMemoryKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoBindMemoryKHR.gen.cs index f352b4fa81..dec99e331e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoBindMemoryKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoBindMemoryKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoBindMemoryKHR")] - public unsafe partial struct VideoBindMemoryKHR + public unsafe partial struct VideoBindMemoryKHR : IStructuredType { public VideoBindMemoryKHR ( @@ -90,5 +90,11 @@ public VideoBindMemoryKHR [NativeName("Type.Name", "VkDeviceSize")] [NativeName("Name", "memorySize")] public ulong MemorySize; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoBindMemoryKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoCapabilitiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoCapabilitiesKHR.gen.cs index 18b4f48228..44ba36306e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoCapabilitiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoCapabilitiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoCapabilitiesKHR")] - public unsafe partial struct VideoCapabilitiesKHR + public unsafe partial struct VideoCapabilitiesKHR : IStructuredType { public VideoCapabilitiesKHR ( @@ -134,5 +134,11 @@ public VideoCapabilitiesKHR [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "maxReferencePicturesActiveCount")] public uint MaxReferencePicturesActiveCount; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoCapabilitiesKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoCodingControlInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoCodingControlInfoKHR.gen.cs index 46bf44a872..57b2d24593 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoCodingControlInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoCodingControlInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoCodingControlInfoKHR")] - public unsafe partial struct VideoCodingControlInfoKHR + public unsafe partial struct VideoCodingControlInfoKHR : IStructuredType { public VideoCodingControlInfoKHR ( @@ -57,5 +57,11 @@ public VideoCodingControlInfoKHR [NativeName("Type.Name", "VkVideoCodingControlFlagsKHR")] [NativeName("Name", "flags")] public VideoCodingControlFlagsKHR Flags; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoCodingControlInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264CapabilitiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264CapabilitiesEXT.gen.cs index 121ab9106f..9a0c02c915 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264CapabilitiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264CapabilitiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoDecodeH264CapabilitiesEXT")] - public unsafe partial struct VideoDecodeH264CapabilitiesEXT + public unsafe partial struct VideoDecodeH264CapabilitiesEXT : IStructuredType { public VideoDecodeH264CapabilitiesEXT ( @@ -79,5 +79,11 @@ public VideoDecodeH264CapabilitiesEXT [NativeName("Type.Name", "VkExtensionProperties")] [NativeName("Name", "stdExtensionVersion")] public ExtensionProperties StdExtensionVersion; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoDecodeH264CapabilitiesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264DpbSlotInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264DpbSlotInfoEXT.gen.cs index 1296ea86de..3031596f29 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264DpbSlotInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264DpbSlotInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoDecodeH264DpbSlotInfoEXT")] - public unsafe partial struct VideoDecodeH264DpbSlotInfoEXT + public unsafe partial struct VideoDecodeH264DpbSlotInfoEXT : IStructuredType { public VideoDecodeH264DpbSlotInfoEXT ( @@ -57,5 +57,11 @@ public VideoDecodeH264DpbSlotInfoEXT [NativeName("Type.Name", "StdVideoDecodeH264ReferenceInfo")] [NativeName("Name", "pStdReferenceInfo")] public Video.StdVideoDecodeH264ReferenceInfo* PStdReferenceInfo; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoDecodeH264DpbSlotInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264MvcEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264MvcEXT.gen.cs index 7b14e7b638..7de6f50df8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264MvcEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264MvcEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoDecodeH264MvcEXT")] - public unsafe partial struct VideoDecodeH264MvcEXT + public unsafe partial struct VideoDecodeH264MvcEXT : IStructuredType { public VideoDecodeH264MvcEXT ( @@ -57,5 +57,11 @@ public VideoDecodeH264MvcEXT [NativeName("Type.Name", "StdVideoDecodeH264Mvc")] [NativeName("Name", "pStdMvc")] public Video.StdVideoDecodeH264Mvc* PStdMvc; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoDecodeH264MvcExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264PictureInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264PictureInfoEXT.gen.cs index a5150cb305..4df8cbefd8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264PictureInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264PictureInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoDecodeH264PictureInfoEXT")] - public unsafe partial struct VideoDecodeH264PictureInfoEXT + public unsafe partial struct VideoDecodeH264PictureInfoEXT : IStructuredType { public VideoDecodeH264PictureInfoEXT ( @@ -79,5 +79,11 @@ public VideoDecodeH264PictureInfoEXT [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "pSlicesDataOffsets")] public uint* PSlicesDataOffsets; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoDecodeH264PictureInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264ProfileEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264ProfileEXT.gen.cs index 9951b87fcf..71648ea1c0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264ProfileEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264ProfileEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoDecodeH264ProfileEXT")] - public unsafe partial struct VideoDecodeH264ProfileEXT + public unsafe partial struct VideoDecodeH264ProfileEXT : IStructuredType { public VideoDecodeH264ProfileEXT ( @@ -68,5 +68,11 @@ public VideoDecodeH264ProfileEXT [NativeName("Type.Name", "VkVideoDecodeH264PictureLayoutFlagsEXT")] [NativeName("Name", "pictureLayout")] public VideoDecodeH264PictureLayoutFlagsEXT PictureLayout; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoDecodeH264ProfileExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264SessionCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264SessionCreateInfoEXT.gen.cs index fae1cc3e97..0ca7840de1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264SessionCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264SessionCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoDecodeH264SessionCreateInfoEXT")] - public unsafe partial struct VideoDecodeH264SessionCreateInfoEXT + public unsafe partial struct VideoDecodeH264SessionCreateInfoEXT : IStructuredType { public VideoDecodeH264SessionCreateInfoEXT ( @@ -68,5 +68,11 @@ public VideoDecodeH264SessionCreateInfoEXT [NativeName("Type.Name", "VkExtensionProperties")] [NativeName("Name", "pStdExtensionVersion")] public ExtensionProperties* PStdExtensionVersion; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoDecodeH264SessionCreateInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264SessionParametersAddInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264SessionParametersAddInfoEXT.gen.cs index 56deadf169..89392f653b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264SessionParametersAddInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264SessionParametersAddInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoDecodeH264SessionParametersAddInfoEXT")] - public unsafe partial struct VideoDecodeH264SessionParametersAddInfoEXT + public unsafe partial struct VideoDecodeH264SessionParametersAddInfoEXT : IStructuredType { public VideoDecodeH264SessionParametersAddInfoEXT ( @@ -90,5 +90,11 @@ public VideoDecodeH264SessionParametersAddInfoEXT [NativeName("Type.Name", "StdVideoH264PictureParameterSet")] [NativeName("Name", "pPpsStd")] public Video.StdVideoH264PictureParameterSet* PPpsStd; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoDecodeH264SessionParametersAddInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264SessionParametersCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264SessionParametersCreateInfoEXT.gen.cs index 1a5ae0da00..90238ae393 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264SessionParametersCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264SessionParametersCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoDecodeH264SessionParametersCreateInfoEXT")] - public unsafe partial struct VideoDecodeH264SessionParametersCreateInfoEXT + public unsafe partial struct VideoDecodeH264SessionParametersCreateInfoEXT : IStructuredType { public VideoDecodeH264SessionParametersCreateInfoEXT ( @@ -79,5 +79,11 @@ public VideoDecodeH264SessionParametersCreateInfoEXT [NativeName("Type.Name", "VkVideoDecodeH264SessionParametersAddInfoEXT")] [NativeName("Name", "pParametersAddInfo")] public VideoDecodeH264SessionParametersAddInfoEXT* PParametersAddInfo; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoDecodeH264SessionParametersCreateInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265CapabilitiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265CapabilitiesEXT.gen.cs index 72c8ef847b..685f45b345 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265CapabilitiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265CapabilitiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoDecodeH265CapabilitiesEXT")] - public unsafe partial struct VideoDecodeH265CapabilitiesEXT + public unsafe partial struct VideoDecodeH265CapabilitiesEXT : IStructuredType { public VideoDecodeH265CapabilitiesEXT ( @@ -68,5 +68,11 @@ public VideoDecodeH265CapabilitiesEXT [NativeName("Type.Name", "VkExtensionProperties")] [NativeName("Name", "stdExtensionVersion")] public ExtensionProperties StdExtensionVersion; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoDecodeH265CapabilitiesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265DpbSlotInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265DpbSlotInfoEXT.gen.cs index 67cc6de101..f862b08ffe 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265DpbSlotInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265DpbSlotInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoDecodeH265DpbSlotInfoEXT")] - public unsafe partial struct VideoDecodeH265DpbSlotInfoEXT + public unsafe partial struct VideoDecodeH265DpbSlotInfoEXT : IStructuredType { public VideoDecodeH265DpbSlotInfoEXT ( @@ -57,5 +57,11 @@ public VideoDecodeH265DpbSlotInfoEXT [NativeName("Type.Name", "StdVideoDecodeH265ReferenceInfo")] [NativeName("Name", "pStdReferenceInfo")] public Video.StdVideoDecodeH265ReferenceInfo* PStdReferenceInfo; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoDecodeH265DpbSlotInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265PictureInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265PictureInfoEXT.gen.cs index 61c6f7e0fe..04df6851c9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265PictureInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265PictureInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoDecodeH265PictureInfoEXT")] - public unsafe partial struct VideoDecodeH265PictureInfoEXT + public unsafe partial struct VideoDecodeH265PictureInfoEXT : IStructuredType { public VideoDecodeH265PictureInfoEXT ( @@ -79,5 +79,11 @@ public VideoDecodeH265PictureInfoEXT [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "pSlicesDataOffsets")] public uint* PSlicesDataOffsets; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoDecodeH265PictureInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265ProfileEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265ProfileEXT.gen.cs index eef3d81712..d4062909a5 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265ProfileEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265ProfileEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoDecodeH265ProfileEXT")] - public unsafe partial struct VideoDecodeH265ProfileEXT + public unsafe partial struct VideoDecodeH265ProfileEXT : IStructuredType { public VideoDecodeH265ProfileEXT ( @@ -57,5 +57,11 @@ public VideoDecodeH265ProfileEXT [NativeName("Type.Name", "StdVideoH265ProfileIdc")] [NativeName("Name", "stdProfileIdc")] public Video.StdVideoH265ProfileIdc StdProfileIdc; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoDecodeH265ProfileExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265SessionCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265SessionCreateInfoEXT.gen.cs index 8368d28e7e..2f567e913f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265SessionCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265SessionCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoDecodeH265SessionCreateInfoEXT")] - public unsafe partial struct VideoDecodeH265SessionCreateInfoEXT + public unsafe partial struct VideoDecodeH265SessionCreateInfoEXT : IStructuredType { public VideoDecodeH265SessionCreateInfoEXT ( @@ -68,5 +68,11 @@ public VideoDecodeH265SessionCreateInfoEXT [NativeName("Type.Name", "VkExtensionProperties")] [NativeName("Name", "pStdExtensionVersion")] public ExtensionProperties* PStdExtensionVersion; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoDecodeH265SessionCreateInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265SessionParametersAddInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265SessionParametersAddInfoEXT.gen.cs index 452554677a..89eb02649d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265SessionParametersAddInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265SessionParametersAddInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoDecodeH265SessionParametersAddInfoEXT")] - public unsafe partial struct VideoDecodeH265SessionParametersAddInfoEXT + public unsafe partial struct VideoDecodeH265SessionParametersAddInfoEXT : IStructuredType { public VideoDecodeH265SessionParametersAddInfoEXT ( @@ -90,5 +90,11 @@ public VideoDecodeH265SessionParametersAddInfoEXT [NativeName("Type.Name", "StdVideoH265PictureParameterSet")] [NativeName("Name", "pPpsStd")] public Video.StdVideoH265PictureParameterSet* PPpsStd; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoDecodeH265SessionParametersAddInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265SessionParametersCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265SessionParametersCreateInfoEXT.gen.cs index 8b69608b3c..cf449621ed 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265SessionParametersCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265SessionParametersCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoDecodeH265SessionParametersCreateInfoEXT")] - public unsafe partial struct VideoDecodeH265SessionParametersCreateInfoEXT + public unsafe partial struct VideoDecodeH265SessionParametersCreateInfoEXT : IStructuredType { public VideoDecodeH265SessionParametersCreateInfoEXT ( @@ -79,5 +79,11 @@ public VideoDecodeH265SessionParametersCreateInfoEXT [NativeName("Type.Name", "VkVideoDecodeH265SessionParametersAddInfoEXT")] [NativeName("Name", "pParametersAddInfo")] public VideoDecodeH265SessionParametersAddInfoEXT* PParametersAddInfo; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoDecodeH265SessionParametersCreateInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeInfoKHR.gen.cs index 2baaafe34a..79f011a98f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoDecodeInfoKHR")] - public unsafe partial struct VideoDecodeInfoKHR + public unsafe partial struct VideoDecodeInfoKHR : IStructuredType { public VideoDecodeInfoKHR ( @@ -156,5 +156,11 @@ public VideoDecodeInfoKHR [NativeName("Type.Name", "VkVideoReferenceSlotKHR")] [NativeName("Name", "pReferenceSlots")] public VideoReferenceSlotKHR* PReferenceSlots; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoDecodeInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264CapabilitiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264CapabilitiesEXT.gen.cs index 33038d0288..b4a4c3626a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264CapabilitiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264CapabilitiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeH264CapabilitiesEXT")] - public unsafe partial struct VideoEncodeH264CapabilitiesEXT + public unsafe partial struct VideoEncodeH264CapabilitiesEXT : IStructuredType { public VideoEncodeH264CapabilitiesEXT ( @@ -167,5 +167,11 @@ public VideoEncodeH264CapabilitiesEXT [NativeName("Type.Name", "VkExtensionProperties")] [NativeName("Name", "stdExtensionVersion")] public ExtensionProperties StdExtensionVersion; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoEncodeH264CapabilitiesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264DpbSlotInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264DpbSlotInfoEXT.gen.cs index 20e3771f4c..87c1fb9832 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264DpbSlotInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264DpbSlotInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeH264DpbSlotInfoEXT")] - public unsafe partial struct VideoEncodeH264DpbSlotInfoEXT + public unsafe partial struct VideoEncodeH264DpbSlotInfoEXT : IStructuredType { public VideoEncodeH264DpbSlotInfoEXT ( @@ -68,5 +68,11 @@ public VideoEncodeH264DpbSlotInfoEXT [NativeName("Type.Name", "StdVideoEncodeH264PictureInfo")] [NativeName("Name", "pStdPictureInfo")] public Video.StdVideoEncodeH264PictureInfo* PStdPictureInfo; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoEncodeH264DpbSlotInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264EmitPictureParametersEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264EmitPictureParametersEXT.gen.cs index b4c78804d6..b386491b53 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264EmitPictureParametersEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264EmitPictureParametersEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeH264EmitPictureParametersEXT")] - public unsafe partial struct VideoEncodeH264EmitPictureParametersEXT + public unsafe partial struct VideoEncodeH264EmitPictureParametersEXT : IStructuredType { public VideoEncodeH264EmitPictureParametersEXT ( @@ -90,5 +90,11 @@ public VideoEncodeH264EmitPictureParametersEXT [NativeName("Type.Name", "uint8_t")] [NativeName("Name", "ppsIdEntries")] public byte* PpsIdEntries; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoEncodeH264EmitPictureParametersExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264NaluSliceEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264NaluSliceEXT.gen.cs index adbdc19daf..7f95e7a687 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264NaluSliceEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264NaluSliceEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeH264NaluSliceEXT")] - public unsafe partial struct VideoEncodeH264NaluSliceEXT + public unsafe partial struct VideoEncodeH264NaluSliceEXT : IStructuredType { public VideoEncodeH264NaluSliceEXT ( @@ -145,5 +145,11 @@ public VideoEncodeH264NaluSliceEXT [NativeName("Type.Name", "uint8_t")] [NativeName("Name", "maxQp")] public byte MaxQp; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoEncodeH264NaluSliceExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264ProfileEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264ProfileEXT.gen.cs index e51ce683c0..07dd472f36 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264ProfileEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264ProfileEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeH264ProfileEXT")] - public unsafe partial struct VideoEncodeH264ProfileEXT + public unsafe partial struct VideoEncodeH264ProfileEXT : IStructuredType { public VideoEncodeH264ProfileEXT ( @@ -57,5 +57,11 @@ public VideoEncodeH264ProfileEXT [NativeName("Type.Name", "StdVideoH264ProfileIdc")] [NativeName("Name", "stdProfileIdc")] public Video.StdVideoH264ProfileIdc StdProfileIdc; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoEncodeH264ProfileExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264SessionCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264SessionCreateInfoEXT.gen.cs index de619cb0d8..db78fc214f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264SessionCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264SessionCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeH264SessionCreateInfoEXT")] - public unsafe partial struct VideoEncodeH264SessionCreateInfoEXT + public unsafe partial struct VideoEncodeH264SessionCreateInfoEXT : IStructuredType { public VideoEncodeH264SessionCreateInfoEXT ( @@ -79,5 +79,11 @@ public VideoEncodeH264SessionCreateInfoEXT [NativeName("Type.Name", "VkExtensionProperties")] [NativeName("Name", "pStdExtensionVersion")] public ExtensionProperties* PStdExtensionVersion; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoEncodeH264SessionCreateInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264SessionParametersAddInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264SessionParametersAddInfoEXT.gen.cs index b45e0bb0b8..3657c1a78a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264SessionParametersAddInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264SessionParametersAddInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeH264SessionParametersAddInfoEXT")] - public unsafe partial struct VideoEncodeH264SessionParametersAddInfoEXT + public unsafe partial struct VideoEncodeH264SessionParametersAddInfoEXT : IStructuredType { public VideoEncodeH264SessionParametersAddInfoEXT ( @@ -90,5 +90,11 @@ public VideoEncodeH264SessionParametersAddInfoEXT [NativeName("Type.Name", "StdVideoH264PictureParameterSet")] [NativeName("Name", "pPpsStd")] public Video.StdVideoH264PictureParameterSet* PPpsStd; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoEncodeH264SessionParametersAddInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264SessionParametersCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264SessionParametersCreateInfoEXT.gen.cs index 3639270d9c..335c42cd9e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264SessionParametersCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264SessionParametersCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeH264SessionParametersCreateInfoEXT")] - public unsafe partial struct VideoEncodeH264SessionParametersCreateInfoEXT + public unsafe partial struct VideoEncodeH264SessionParametersCreateInfoEXT : IStructuredType { public VideoEncodeH264SessionParametersCreateInfoEXT ( @@ -79,5 +79,11 @@ public VideoEncodeH264SessionParametersCreateInfoEXT [NativeName("Type.Name", "VkVideoEncodeH264SessionParametersAddInfoEXT")] [NativeName("Name", "pParametersAddInfo")] public VideoEncodeH264SessionParametersAddInfoEXT* PParametersAddInfo; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoEncodeH264SessionParametersCreateInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264VclFrameInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264VclFrameInfoEXT.gen.cs index c3f06adf3a..6fdfc9e5b1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264VclFrameInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264VclFrameInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeH264VclFrameInfoEXT")] - public unsafe partial struct VideoEncodeH264VclFrameInfoEXT + public unsafe partial struct VideoEncodeH264VclFrameInfoEXT : IStructuredType { public VideoEncodeH264VclFrameInfoEXT ( @@ -123,5 +123,11 @@ public VideoEncodeH264VclFrameInfoEXT [NativeName("Type.Name", "VkVideoEncodeH264DpbSlotInfoEXT")] [NativeName("Name", "pCurrentPictureInfo")] public VideoEncodeH264DpbSlotInfoEXT* PCurrentPictureInfo; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoEncodeH264VclFrameInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265CapabilitiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265CapabilitiesEXT.gen.cs index d7e72d755f..19d41940ad 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265CapabilitiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265CapabilitiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeH265CapabilitiesEXT")] - public unsafe partial struct VideoEncodeH265CapabilitiesEXT + public unsafe partial struct VideoEncodeH265CapabilitiesEXT : IStructuredType { public VideoEncodeH265CapabilitiesEXT ( @@ -167,5 +167,11 @@ public VideoEncodeH265CapabilitiesEXT [NativeName("Type.Name", "VkExtensionProperties")] [NativeName("Name", "stdExtensionVersion")] public ExtensionProperties StdExtensionVersion; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoEncodeH265CapabilitiesExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265DpbSlotInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265DpbSlotInfoEXT.gen.cs index 56e940dec0..f55e50306e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265DpbSlotInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265DpbSlotInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeH265DpbSlotInfoEXT")] - public unsafe partial struct VideoEncodeH265DpbSlotInfoEXT + public unsafe partial struct VideoEncodeH265DpbSlotInfoEXT : IStructuredType { public VideoEncodeH265DpbSlotInfoEXT ( @@ -68,5 +68,11 @@ public VideoEncodeH265DpbSlotInfoEXT [NativeName("Type.Name", "StdVideoEncodeH265ReferenceInfo")] [NativeName("Name", "pStdReferenceInfo")] public Video.StdVideoEncodeH265ReferenceInfo* PStdReferenceInfo; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoEncodeH265DpbSlotInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265EmitPictureParametersEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265EmitPictureParametersEXT.gen.cs index 872afaeb5c..18861b5971 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265EmitPictureParametersEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265EmitPictureParametersEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeH265EmitPictureParametersEXT")] - public unsafe partial struct VideoEncodeH265EmitPictureParametersEXT + public unsafe partial struct VideoEncodeH265EmitPictureParametersEXT : IStructuredType { public VideoEncodeH265EmitPictureParametersEXT ( @@ -112,5 +112,11 @@ public VideoEncodeH265EmitPictureParametersEXT [NativeName("Type.Name", "uint8_t")] [NativeName("Name", "ppsIdEntries")] public byte* PpsIdEntries; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoEncodeH265EmitPictureParametersExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265NaluSliceEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265NaluSliceEXT.gen.cs index 5d3c7a0e31..98f492a309 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265NaluSliceEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265NaluSliceEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeH265NaluSliceEXT")] - public unsafe partial struct VideoEncodeH265NaluSliceEXT + public unsafe partial struct VideoEncodeH265NaluSliceEXT : IStructuredType { public VideoEncodeH265NaluSliceEXT ( @@ -79,5 +79,11 @@ public VideoEncodeH265NaluSliceEXT [NativeName("Type.Name", "StdVideoEncodeH265SliceHeader")] [NativeName("Name", "pSliceHeaderStd")] public Video.StdVideoEncodeH265SliceHeader* PSliceHeaderStd; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoEncodeH265NaluSliceExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265ProfileEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265ProfileEXT.gen.cs index 653c8289de..36f9cf6011 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265ProfileEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265ProfileEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeH265ProfileEXT")] - public unsafe partial struct VideoEncodeH265ProfileEXT + public unsafe partial struct VideoEncodeH265ProfileEXT : IStructuredType { public VideoEncodeH265ProfileEXT ( @@ -57,5 +57,11 @@ public VideoEncodeH265ProfileEXT [NativeName("Type.Name", "StdVideoH265ProfileIdc")] [NativeName("Name", "stdProfileIdc")] public Video.StdVideoH265ProfileIdc StdProfileIdc; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoEncodeH265ProfileExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265ReferenceListsEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265ReferenceListsEXT.gen.cs index cddb17f77c..5af05e99ee 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265ReferenceListsEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265ReferenceListsEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeH265ReferenceListsEXT")] - public unsafe partial struct VideoEncodeH265ReferenceListsEXT + public unsafe partial struct VideoEncodeH265ReferenceListsEXT : IStructuredType { public VideoEncodeH265ReferenceListsEXT ( @@ -101,5 +101,11 @@ public VideoEncodeH265ReferenceListsEXT [NativeName("Type.Name", "StdVideoEncodeH265ReferenceModifications")] [NativeName("Name", "pReferenceModifications")] public Video.StdVideoEncodeH265ReferenceModifications* PReferenceModifications; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoEncodeH265ReferenceListsExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265SessionCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265SessionCreateInfoEXT.gen.cs index 3f5ac731a4..48ba2dcaa0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265SessionCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265SessionCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeH265SessionCreateInfoEXT")] - public unsafe partial struct VideoEncodeH265SessionCreateInfoEXT + public unsafe partial struct VideoEncodeH265SessionCreateInfoEXT : IStructuredType { public VideoEncodeH265SessionCreateInfoEXT ( @@ -68,5 +68,11 @@ public VideoEncodeH265SessionCreateInfoEXT [NativeName("Type.Name", "VkExtensionProperties")] [NativeName("Name", "pStdExtensionVersion")] public ExtensionProperties* PStdExtensionVersion; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoEncodeH265SessionCreateInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265SessionParametersAddInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265SessionParametersAddInfoEXT.gen.cs index ea28c8a692..7997c3d7b4 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265SessionParametersAddInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265SessionParametersAddInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeH265SessionParametersAddInfoEXT")] - public unsafe partial struct VideoEncodeH265SessionParametersAddInfoEXT + public unsafe partial struct VideoEncodeH265SessionParametersAddInfoEXT : IStructuredType { public VideoEncodeH265SessionParametersAddInfoEXT ( @@ -112,5 +112,11 @@ public VideoEncodeH265SessionParametersAddInfoEXT [NativeName("Type.Name", "StdVideoH265PictureParameterSet")] [NativeName("Name", "pPpsStd")] public Video.StdVideoH265PictureParameterSet* PPpsStd; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoEncodeH265SessionParametersAddInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265SessionParametersCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265SessionParametersCreateInfoEXT.gen.cs index 62a04b678f..207f93bb67 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265SessionParametersCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265SessionParametersCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeH265SessionParametersCreateInfoEXT")] - public unsafe partial struct VideoEncodeH265SessionParametersCreateInfoEXT + public unsafe partial struct VideoEncodeH265SessionParametersCreateInfoEXT : IStructuredType { public VideoEncodeH265SessionParametersCreateInfoEXT ( @@ -90,5 +90,11 @@ public VideoEncodeH265SessionParametersCreateInfoEXT [NativeName("Type.Name", "VkVideoEncodeH265SessionParametersAddInfoEXT")] [NativeName("Name", "pParametersAddInfo")] public VideoEncodeH265SessionParametersAddInfoEXT* PParametersAddInfo; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoEncodeH265SessionParametersCreateInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265VclFrameInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265VclFrameInfoEXT.gen.cs index cf7c4fcffc..827ec8b2be 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265VclFrameInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265VclFrameInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeH265VclFrameInfoEXT")] - public unsafe partial struct VideoEncodeH265VclFrameInfoEXT + public unsafe partial struct VideoEncodeH265VclFrameInfoEXT : IStructuredType { public VideoEncodeH265VclFrameInfoEXT ( @@ -90,5 +90,11 @@ public VideoEncodeH265VclFrameInfoEXT [NativeName("Type.Name", "StdVideoEncodeH265PictureInfo")] [NativeName("Name", "pCurrentPictureInfo")] public Video.StdVideoEncodeH265PictureInfo* PCurrentPictureInfo; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoEncodeH265VclFrameInfoExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeInfoKHR.gen.cs index ebd8319e71..b63c688f85 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeInfoKHR")] - public unsafe partial struct VideoEncodeInfoKHR + public unsafe partial struct VideoEncodeInfoKHR : IStructuredType { public VideoEncodeInfoKHR ( @@ -156,5 +156,11 @@ public VideoEncodeInfoKHR [NativeName("Type.Name", "VkVideoReferenceSlotKHR")] [NativeName("Name", "pReferenceSlots")] public VideoReferenceSlotKHR* PReferenceSlots; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoEncodeInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeRateControlInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeRateControlInfoKHR.gen.cs index 2dba36b355..cc172aade7 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeRateControlInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeRateControlInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeRateControlInfoKHR")] - public unsafe partial struct VideoEncodeRateControlInfoKHR + public unsafe partial struct VideoEncodeRateControlInfoKHR : IStructuredType { public VideoEncodeRateControlInfoKHR ( @@ -123,5 +123,11 @@ public VideoEncodeRateControlInfoKHR [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "virtualBufferSizeInMs")] public uint VirtualBufferSizeInMs; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoEncodeRateControlInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEndCodingInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEndCodingInfoKHR.gen.cs index d9347f7443..6fdb694d91 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEndCodingInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEndCodingInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEndCodingInfoKHR")] - public unsafe partial struct VideoEndCodingInfoKHR + public unsafe partial struct VideoEndCodingInfoKHR : IStructuredType { public VideoEndCodingInfoKHR ( @@ -57,5 +57,11 @@ public VideoEndCodingInfoKHR [NativeName("Type.Name", "VkVideoEndCodingFlagsKHR")] [NativeName("Name", "flags")] public uint Flags; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoEndCodingInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoFormatPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoFormatPropertiesKHR.gen.cs index 83b4031298..01aa615985 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoFormatPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoFormatPropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoFormatPropertiesKHR")] - public unsafe partial struct VideoFormatPropertiesKHR + public unsafe partial struct VideoFormatPropertiesKHR : IStructuredType { public VideoFormatPropertiesKHR ( @@ -57,5 +57,11 @@ public VideoFormatPropertiesKHR [NativeName("Type.Name", "VkFormat")] [NativeName("Name", "format")] public Format Format; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoFormatPropertiesKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoGetMemoryPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoGetMemoryPropertiesKHR.gen.cs index d16dbe3cb6..9830822156 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoGetMemoryPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoGetMemoryPropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoGetMemoryPropertiesKHR")] - public unsafe partial struct VideoGetMemoryPropertiesKHR + public unsafe partial struct VideoGetMemoryPropertiesKHR : IStructuredType { public VideoGetMemoryPropertiesKHR ( @@ -68,5 +68,11 @@ public VideoGetMemoryPropertiesKHR [NativeName("Type.Name", "VkMemoryRequirements2")] [NativeName("Name", "pMemoryRequirements")] public MemoryRequirements2* PMemoryRequirements; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoGetMemoryPropertiesKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoPictureResourceKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoPictureResourceKHR.gen.cs index d414e22715..0f45a76727 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoPictureResourceKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoPictureResourceKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoPictureResourceKHR")] - public unsafe partial struct VideoPictureResourceKHR + public unsafe partial struct VideoPictureResourceKHR : IStructuredType { public VideoPictureResourceKHR ( @@ -90,5 +90,11 @@ public VideoPictureResourceKHR [NativeName("Type.Name", "VkImageView")] [NativeName("Name", "imageViewBinding")] public ImageView ImageViewBinding; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoPictureResourceKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoProfileKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoProfileKHR.gen.cs index e0aa5c2cfc..0c156a0858 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoProfileKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoProfileKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoProfileKHR")] - public unsafe partial struct VideoProfileKHR + public unsafe partial struct VideoProfileKHR : IStructuredType { public VideoProfileKHR ( @@ -90,5 +90,11 @@ public VideoProfileKHR [NativeName("Type.Name", "VkVideoComponentBitDepthFlagsKHR")] [NativeName("Name", "chromaBitDepth")] public VideoComponentBitDepthFlagsKHR ChromaBitDepth; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoProfileKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoProfilesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoProfilesKHR.gen.cs index 32571501cc..f9cccbd746 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoProfilesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoProfilesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoProfilesKHR")] - public unsafe partial struct VideoProfilesKHR + public unsafe partial struct VideoProfilesKHR : IStructuredType { public VideoProfilesKHR ( @@ -68,5 +68,11 @@ public VideoProfilesKHR [NativeName("Type.Name", "VkVideoProfileKHR")] [NativeName("Name", "pProfiles")] public VideoProfileKHR* PProfiles; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoProfilesKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoQueueFamilyProperties2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoQueueFamilyProperties2KHR.gen.cs index bac7505dd1..9562ea50c5 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoQueueFamilyProperties2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoQueueFamilyProperties2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoQueueFamilyProperties2KHR")] - public unsafe partial struct VideoQueueFamilyProperties2KHR + public unsafe partial struct VideoQueueFamilyProperties2KHR : IStructuredType { public VideoQueueFamilyProperties2KHR ( @@ -57,5 +57,11 @@ public VideoQueueFamilyProperties2KHR [NativeName("Type.Name", "VkVideoCodecOperationFlagsKHR")] [NativeName("Name", "videoCodecOperations")] public VideoCodecOperationFlagsKHR VideoCodecOperations; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoQueueFamilyProperties2Khr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoReferenceSlotKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoReferenceSlotKHR.gen.cs index d17e1eb207..0b375956a2 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoReferenceSlotKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoReferenceSlotKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoReferenceSlotKHR")] - public unsafe partial struct VideoReferenceSlotKHR + public unsafe partial struct VideoReferenceSlotKHR : IStructuredType { public VideoReferenceSlotKHR ( @@ -68,5 +68,11 @@ public VideoReferenceSlotKHR [NativeName("Type.Name", "VkVideoPictureResourceKHR")] [NativeName("Name", "pPictureResource")] public VideoPictureResourceKHR* PPictureResource; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoReferenceSlotKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoSessionCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoSessionCreateInfoKHR.gen.cs index 75b9d3dd17..570c5e49b4 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoSessionCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoSessionCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoSessionCreateInfoKHR")] - public unsafe partial struct VideoSessionCreateInfoKHR + public unsafe partial struct VideoSessionCreateInfoKHR : IStructuredType { public VideoSessionCreateInfoKHR ( @@ -134,5 +134,11 @@ public VideoSessionCreateInfoKHR [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "maxReferencePicturesActiveCount")] public uint MaxReferencePicturesActiveCount; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoSessionCreateInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoSessionParametersCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoSessionParametersCreateInfoKHR.gen.cs index ee866bc6a9..e07a2437a8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoSessionParametersCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoSessionParametersCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoSessionParametersCreateInfoKHR")] - public unsafe partial struct VideoSessionParametersCreateInfoKHR + public unsafe partial struct VideoSessionParametersCreateInfoKHR : IStructuredType { public VideoSessionParametersCreateInfoKHR ( @@ -68,5 +68,11 @@ public VideoSessionParametersCreateInfoKHR [NativeName("Type.Name", "VkVideoSessionKHR")] [NativeName("Name", "videoSession")] public VideoSessionKHR VideoSession; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoSessionParametersCreateInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoSessionParametersUpdateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoSessionParametersUpdateInfoKHR.gen.cs index efb45c39b1..0b8b5dfacc 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoSessionParametersUpdateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoSessionParametersUpdateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoSessionParametersUpdateInfoKHR")] - public unsafe partial struct VideoSessionParametersUpdateInfoKHR + public unsafe partial struct VideoSessionParametersUpdateInfoKHR : IStructuredType { public VideoSessionParametersUpdateInfoKHR ( @@ -57,5 +57,11 @@ public VideoSessionParametersUpdateInfoKHR [NativeName("Type.Name", "uint32_t")] [NativeName("Name", "updateSequenceCount")] public uint UpdateSequenceCount; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.VideoSessionParametersUpdateInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/WaylandSurfaceCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/WaylandSurfaceCreateInfoKHR.gen.cs index a61d0fc406..24575480ea 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/WaylandSurfaceCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/WaylandSurfaceCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkWaylandSurfaceCreateInfoKHR")] - public unsafe partial struct WaylandSurfaceCreateInfoKHR + public unsafe partial struct WaylandSurfaceCreateInfoKHR : IStructuredType { public WaylandSurfaceCreateInfoKHR ( @@ -79,5 +79,11 @@ public WaylandSurfaceCreateInfoKHR [NativeName("Type.Name", "wl_surface")] [NativeName("Name", "surface")] public nint* Surface; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.WaylandSurfaceCreateInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/Win32KeyedMutexAcquireReleaseInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/Win32KeyedMutexAcquireReleaseInfoKHR.gen.cs index 86f9e6a569..5e88526deb 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/Win32KeyedMutexAcquireReleaseInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/Win32KeyedMutexAcquireReleaseInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkWin32KeyedMutexAcquireReleaseInfoKHR")] - public unsafe partial struct Win32KeyedMutexAcquireReleaseInfoKHR + public unsafe partial struct Win32KeyedMutexAcquireReleaseInfoKHR : IStructuredType { public Win32KeyedMutexAcquireReleaseInfoKHR ( @@ -123,5 +123,11 @@ public Win32KeyedMutexAcquireReleaseInfoKHR [NativeName("Type.Name", "uint64_t")] [NativeName("Name", "pReleaseKeys")] public ulong* PReleaseKeys; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.Win32KeyedMutexAcquireReleaseInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/Win32KeyedMutexAcquireReleaseInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/Win32KeyedMutexAcquireReleaseInfoNV.gen.cs index 19c515e137..dce1a6975f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/Win32KeyedMutexAcquireReleaseInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/Win32KeyedMutexAcquireReleaseInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkWin32KeyedMutexAcquireReleaseInfoNV")] - public unsafe partial struct Win32KeyedMutexAcquireReleaseInfoNV + public unsafe partial struct Win32KeyedMutexAcquireReleaseInfoNV : IStructuredType { public Win32KeyedMutexAcquireReleaseInfoNV ( @@ -123,5 +123,11 @@ public Win32KeyedMutexAcquireReleaseInfoNV [NativeName("Type.Name", "uint64_t")] [NativeName("Name", "pReleaseKeys")] public ulong* PReleaseKeys; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.Win32KeyedMutexAcquireReleaseInfoNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/Win32SurfaceCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/Win32SurfaceCreateInfoKHR.gen.cs index 9cfabde2c7..9d088f4a7f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/Win32SurfaceCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/Win32SurfaceCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkWin32SurfaceCreateInfoKHR")] - public unsafe partial struct Win32SurfaceCreateInfoKHR + public unsafe partial struct Win32SurfaceCreateInfoKHR : IStructuredType { public Win32SurfaceCreateInfoKHR ( @@ -79,5 +79,11 @@ public Win32SurfaceCreateInfoKHR [NativeName("Type.Name", "HWND")] [NativeName("Name", "hwnd")] public nint Hwnd; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.Win32SurfaceCreateInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/WriteDescriptorSet.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/WriteDescriptorSet.gen.cs index 84b99f16fd..02e1069d63 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/WriteDescriptorSet.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/WriteDescriptorSet.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkWriteDescriptorSet")] - public unsafe partial struct WriteDescriptorSet + public unsafe partial struct WriteDescriptorSet : IStructuredType { public WriteDescriptorSet ( @@ -134,5 +134,11 @@ public WriteDescriptorSet [NativeName("Type.Name", "VkBufferView")] [NativeName("Name", "pTexelBufferView")] public BufferView* PTexelBufferView; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.WriteDescriptorSet; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/WriteDescriptorSetAccelerationStructureKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/WriteDescriptorSetAccelerationStructureKHR.gen.cs index 687ddbeeea..bec1dbe016 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/WriteDescriptorSetAccelerationStructureKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/WriteDescriptorSetAccelerationStructureKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkWriteDescriptorSetAccelerationStructureKHR")] - public unsafe partial struct WriteDescriptorSetAccelerationStructureKHR + public unsafe partial struct WriteDescriptorSetAccelerationStructureKHR : IStructuredType { public WriteDescriptorSetAccelerationStructureKHR ( @@ -68,5 +68,11 @@ public WriteDescriptorSetAccelerationStructureKHR [NativeName("Type.Name", "VkAccelerationStructureKHR")] [NativeName("Name", "pAccelerationStructures")] public AccelerationStructureKHR* PAccelerationStructures; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.WriteDescriptorSetAccelerationStructureKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/WriteDescriptorSetAccelerationStructureNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/WriteDescriptorSetAccelerationStructureNV.gen.cs index a60422bca8..f881be59df 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/WriteDescriptorSetAccelerationStructureNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/WriteDescriptorSetAccelerationStructureNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkWriteDescriptorSetAccelerationStructureNV")] - public unsafe partial struct WriteDescriptorSetAccelerationStructureNV + public unsafe partial struct WriteDescriptorSetAccelerationStructureNV : IStructuredType { public WriteDescriptorSetAccelerationStructureNV ( @@ -68,5 +68,11 @@ public WriteDescriptorSetAccelerationStructureNV [NativeName("Type.Name", "VkAccelerationStructureNV")] [NativeName("Name", "pAccelerationStructures")] public AccelerationStructureNV* PAccelerationStructures; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.WriteDescriptorSetAccelerationStructureNV; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/WriteDescriptorSetInlineUniformBlockEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/WriteDescriptorSetInlineUniformBlockEXT.gen.cs index 493dd06d7d..a87c66d433 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/WriteDescriptorSetInlineUniformBlockEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/WriteDescriptorSetInlineUniformBlockEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkWriteDescriptorSetInlineUniformBlockEXT")] - public unsafe partial struct WriteDescriptorSetInlineUniformBlockEXT + public unsafe partial struct WriteDescriptorSetInlineUniformBlockEXT : IStructuredType { public WriteDescriptorSetInlineUniformBlockEXT ( @@ -68,5 +68,11 @@ public WriteDescriptorSetInlineUniformBlockEXT [NativeName("Type.Name", "void")] [NativeName("Name", "pData")] public void* PData; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.WriteDescriptorSetInlineUniformBlockExt; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/XcbSurfaceCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/XcbSurfaceCreateInfoKHR.gen.cs index 113870ecf3..d8e2cb7209 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/XcbSurfaceCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/XcbSurfaceCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkXcbSurfaceCreateInfoKHR")] - public unsafe partial struct XcbSurfaceCreateInfoKHR + public unsafe partial struct XcbSurfaceCreateInfoKHR : IStructuredType { public XcbSurfaceCreateInfoKHR ( @@ -79,5 +79,11 @@ public XcbSurfaceCreateInfoKHR [NativeName("Type.Name", "xcb_window_t")] [NativeName("Name", "window")] public nint Window; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.XcbSurfaceCreateInfoKhr; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/XlibSurfaceCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/XlibSurfaceCreateInfoKHR.gen.cs index 40181f2a2f..c4f5578e11 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/XlibSurfaceCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/XlibSurfaceCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkXlibSurfaceCreateInfoKHR")] - public unsafe partial struct XlibSurfaceCreateInfoKHR + public unsafe partial struct XlibSurfaceCreateInfoKHR : IStructuredType { public XlibSurfaceCreateInfoKHR ( @@ -79,5 +79,11 @@ public XlibSurfaceCreateInfoKHR [NativeName("Type.Name", "Window")] [NativeName("Name", "window")] public nint Window; + + /// + StructureType IStructuredType.StructureType() + { + return SType = StructureType.XlibSurfaceCreateInfoKhr; + } } } From 66f0e0530854538c1314f02be2802ae411dbfd90 Mon Sep 17 00:00:00 2001 From: Craig Dean Date: Tue, 9 Nov 2021 22:59:51 +0000 Subject: [PATCH 32/42] feat: Implements Unmanaged Chains Full implementation of [Proposal 2] (https://github.com/dotnet/Silk.NET/blob/866f2dcdcc7817995e9fb633213e7630d510ee35/documentation/proposals/Proposal%20-%20Vulkan%20Struct%20Chaining%20-%20%232%20Unmanaged%20Chaining.md) * Added `IReadOnlyList Extends` property to `StructureDefinition`, to store the `structextends` values. * Added `string Alias` property to `StructureDefinition`, to store the value of the `alias` attribute. * Added `Clone()` methods to `Struct` and `Attribute`, to make alias creation faster and easier. * `VulkanReader` creates aliases by cloning existing structs, making it slightly faster to build. This speed improvement is then used to handle the complex chaining logic which requires alias expansion, creating a net even performance. * Added `$VKCHAINABLE` intrinsic to indicate a structure is `IChainable` (a lower bar than a chain start or chain extension). * Added `$VKALIASOF` intrinsic to indicate a structure is an alias of another structure. * Added `$VKALIASES` intrinsic to indicate which structures are aliases of the current structure. * Added `$VKEXTENDSCHAIN` intrinsic to indicate which structures the current structure extends. * Added `$VKCHAINSTART` intrinsic to indicate which structures the current structure can be extended by. * `StructWriter` uses the intrinsics to annotate the structs. * Added `Chain` extensions from proposal. * Added `IChainable`, `IChainStart` and `IExtendsChain` interfaces from proposal. * `ProjectWriter` has `GetFilename` added, which will disambiguate filenames whenever case-sensitivity is an issue (hasn't actually occurred yet though). TODOs * Update `PrototypeStructChaining` projects to remove manually generated code and instead link directly to `Silk.NET.Vulkan` project. * Run tests to confirm functionality. * Update proposals with any changes (e.g. `IChainable.PNext`) * Consider what to do with teh 208 structures (out of 739) that implement `IChainable` directly (i.e. are not part of a specified chain). * Check in the changes to generated structs in a standalone commit. --- .../Silk.NET.BuildTools/Bind/ProjectWriter.cs | 32 ++- .../Silk.NET.BuildTools/Bind/StructWriter.cs | 131 +++++++++++- .../Silk.NET.BuildTools/Common/Attribute.cs | 14 ++ src/Core/Silk.NET.BuildTools/Common/Struct.cs | 45 ++++- .../Converters/Khronos/StructureDefinition.cs | 47 +++-- .../Converters/Readers/VulkanReader.cs | 190 +++++++++++++++++- src/Vulkan/Silk.NET.Vulkan/Chain.cs | 173 ++++++++++++++++ src/Vulkan/Silk.NET.Vulkan/IChainStart.cs | 10 + src/Vulkan/Silk.NET.Vulkan/IChainable.cs | 12 ++ src/Vulkan/Silk.NET.Vulkan/IExtendsChain.cs | 11 + 10 files changed, 635 insertions(+), 30 deletions(-) create mode 100644 src/Vulkan/Silk.NET.Vulkan/Chain.cs create mode 100644 src/Vulkan/Silk.NET.Vulkan/IChainStart.cs create mode 100644 src/Vulkan/Silk.NET.Vulkan/IChainable.cs create mode 100644 src/Vulkan/Silk.NET.Vulkan/IExtendsChain.cs diff --git a/src/Core/Silk.NET.BuildTools/Bind/ProjectWriter.cs b/src/Core/Silk.NET.BuildTools/Bind/ProjectWriter.cs index 24932a3493..bb2f589938 100644 --- a/src/Core/Silk.NET.BuildTools/Bind/ProjectWriter.cs +++ b/src/Core/Silk.NET.BuildTools/Bind/ProjectWriter.cs @@ -1,6 +1,8 @@ // Licensed to the .NET Foundation under one or more agreements. // The .NET Foundation licenses this file to you under the MIT license. +using System; +using System.Collections.Generic; using System.IO; using System.Linq; using Silk.NET.BuildTools.Common; @@ -9,6 +11,30 @@ namespace Silk.NET.BuildTools.Bind { public static class ProjectWriter { + /// + /// Creates a unique file name (that doesn't already exist), preventing clashes of names with different cases on + /// case insensitive filesystems. + /// + /// The name (goes before any disambiguator) + /// The extension (goes after any disambiguator) + /// Any number of directory segements + /// A unique filename. + private static string GetFileName(string name, string ext, params string[] directories) + { + var count = 1; + string filename; + Array.Resize(ref directories, directories.Length + 1); + var nameIndex = directories.Length - 1; + do + { + directories[nameIndex] = $"{name}{(count > 1 ? count.ToString() : "")}{ext}"; + filename = Path.Combine(directories); + count++; + } while (File.Exists(filename)); + + return filename; + } + /// /// Writes this project in the given folder, with the given settings and parent subsystem. /// @@ -38,14 +64,16 @@ public static void Write(this Project project, string folder, Profile profile, B ( x => x.WriteStruct ( - Path.Combine(folder, ProfileWriter.StructsSubfolder, $"{x.Name}.gen.cs"), profile, project, task + GetFileName(x.Name, ".gen.cs", folder, ProfileWriter.StructsSubfolder), profile, project, task ) ); project.Enums.ForEach ( x => x.WriteEnum - (Path.Combine(folder, ProfileWriter.EnumsSubfolder, $"{x.Name}.gen.cs"), profile, project, task) + ( + GetFileName(x.Name, ".gen.cs", folder, ProfileWriter.EnumsSubfolder), profile, project, task + ) ); project.WriteMixedModeClasses(profile, folder, task); diff --git a/src/Core/Silk.NET.BuildTools/Bind/StructWriter.cs b/src/Core/Silk.NET.BuildTools/Bind/StructWriter.cs index aa960adad5..68b595d906 100644 --- a/src/Core/Silk.NET.BuildTools/Bind/StructWriter.cs +++ b/src/Core/Silk.NET.BuildTools/Bind/StructWriter.cs @@ -52,14 +52,47 @@ public static void WriteStruct static bool IsChar(Type type) => type.Name == "char" || type.GenericTypes.Any(IsChar); var needsCharSetFixup = @struct.Fields.Any(x => IsChar(x.Type)); string structuredType = null; + var isChainable = false; + // Which chain this struct extends + IReadOnlyList chainExtensions = null; + // Which chain extend the current struct + IReadOnlyList chainExtenderss = null; + IReadOnlyList aliases = null; + string aliasOf = null; foreach (var attr in @struct.Attributes) { if (attr.Name == "BuildToolsIntrinsic") { - if (attr.Arguments.Count > 1 && attr.Arguments[0] == "$VKSTRUCTUREDTYPE") + if (attr.Arguments.Count > 0) { - structuredType = attr.Arguments[1]; + switch (attr.Arguments[0]) + { + case "$VKSTRUCTUREDTYPE": + structuredType = attr.Arguments.Count > 1 ? attr.Arguments[1] : null; + break; + case "$VKCHAINABLE": + isChainable = true; + break; + case "$VKEXTENDSCHAIN": + chainExtensions = attr.Arguments.Count > 1 ? attr.Arguments.Skip(1).ToArray() : null; + break; + case "$VKCHAINSTART": + chainExtenderss = attr.Arguments.Count > 1 ? attr.Arguments.Skip(1).ToArray() : null; + break; + case "$VKALIASOF": + aliasOf = attr.Arguments.Count > 1 ? attr.Arguments[1] : null; + break; + case "$VKALIASES": + aliases = attr.Arguments.Count > 1 ? attr.Arguments.Skip(1).ToArray() : null; + break; + default: + Console.WriteLine + ( + $"Unexpected build intrinsic attribute '{attr.Arguments[0]}' on '{@struct.Name}' struct!" + ); + break; + } } continue; @@ -79,15 +112,50 @@ public static void WriteStruct sw.WriteLine($" {attr}"); } + // Build interface list + var interfaces = new List(); + if (chainExtenderss?.Any() == true) + { + interfaces.Add("IChainStart"); + } + + interfaces.AddRange + ( + chainExtensions?.Select(e => $"IExtendsChain<{e}>") ?? + Array.Empty() + ); + if (!interfaces.Any()) + { + // We only need to add these interfaces if a descendant not already added above. + if (isChainable) + { + interfaces.Add("IChainable"); + } + else if (structuredType is not null) + { + interfaces.Add("IStructuredType"); + } + } + if (needsCharSetFixup) { sw.WriteLine(" [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]"); } sw.WriteLine($" [NativeName(\"Name\", \"{@struct.NativeName}\")]"); + if (!string.IsNullOrWhiteSpace(aliasOf)) + { + sw.WriteLine($" [NativeName(\"AliasOf\", \"{aliasOf}\")]"); + } + + if (aliases is not null) + { + sw.WriteLine($" [NativeName(\"Aliases\", \"{string.Join(", ", aliases)}\")]"); + } + sw.WriteLine ( - $" public unsafe partial struct {@struct.Name}{(structuredType is not null ? " : IStructuredType" : string.Empty)}" + $" public unsafe partial struct {@struct.Name}{(interfaces.Any() ? " : " + string.Join(", ", interfaces) : string.Empty)}" ); sw.WriteLine(" {"); if (guid is not null) @@ -405,7 +473,10 @@ public static void WriteStruct { sw.WriteLine(" /// Note, there is no fixed value for this type."); } - sw.Write(@" StructureType IStructuredType.StructureType() + + sw.Write + ( + @" StructureType IStructuredType.StructureType() { return SType" ); @@ -420,6 +491,58 @@ public static void WriteStruct @"; }" ); + + + if (isChainable) + { + // Correct for none void* or BaseInStructure* PNext + var pNextType = @struct.Fields.FirstOrDefault(f => f.Name == "PNext")?.Type.Name ?? "void"; + string getCast, setCast; + switch (pNextType) + { + case "void": + getCast = "(BaseInStructure*) "; + setCast = ""; + break; + case "BaseInStructure": + getCast = setCast = ""; + break; + default: + getCast = "(BaseInStructure*) "; + setCast = $"({pNextType}*) "; + break; + + } + sw.WriteLine + ( + @$" + /// + unsafe BaseInStructure* IChainable.PNext + {{ + get => {getCast}PNext; + set => PNext = {setCast}value; + }}" + ); + } + + if (chainExtenderss?.Any() == true && structuredType.Length > 0) + { + sw.WriteLine + ( + @$" + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref {@struct.Name} Chain( + out {@struct.Name} capture) + {{ + capture = new {@struct.Name}({structuredType}); + return ref capture; + }}" + ); + } } sw.WriteLine(" }"); diff --git a/src/Core/Silk.NET.BuildTools/Common/Attribute.cs b/src/Core/Silk.NET.BuildTools/Common/Attribute.cs index 377d89b047..aa78182f00 100644 --- a/src/Core/Silk.NET.BuildTools/Common/Attribute.cs +++ b/src/Core/Silk.NET.BuildTools/Common/Attribute.cs @@ -2,6 +2,7 @@ // The .NET Foundation licenses this file to you under the MIT license. using System.Collections.Generic; +using System.Linq; using System.Text; namespace Silk.NET.BuildTools.Common @@ -39,5 +40,18 @@ public override string ToString() sb.Append(")]"); return sb.ToString(); } + + /// + /// Clones this attribute. + /// + /// A copy. + public Attribute Clone() + { + return new Attribute + { + Name = Name, + Arguments = Arguments.ToList() + }; + } } } diff --git a/src/Core/Silk.NET.BuildTools/Common/Struct.cs b/src/Core/Silk.NET.BuildTools/Common/Struct.cs index a9d643963c..6223bcf846 100644 --- a/src/Core/Silk.NET.BuildTools/Common/Struct.cs +++ b/src/Core/Silk.NET.BuildTools/Common/Struct.cs @@ -3,6 +3,7 @@ using System; using System.Collections.Generic; +using System.Linq; using Newtonsoft.Json; using Silk.NET.BuildTools.Common.Functions; using Silk.NET.BuildTools.Common.Structs; @@ -18,30 +19,31 @@ public class Struct : IProfileConstituent /// The name of the struct. ///

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≪XB_-hE0|M#DX zFxiCQ*x1rLqX6`0{%v!)ed;)C`saWCpMQW?oy;@^g{$xWa((#vPw;DD=sfp8f6_0p z;)K2yeI;bv!Pn68X~(B8F1NnFdyO=1%D>q4!K#a2ymXgt=*@}wfaLu1AJ)19O4E;j z{O1qHU%UAC2$a6vU)D19$Mn%#Cx2dSmvopBtqvt373qzC%UY*?Ey?&wwBzV|{y$h5 zG-{CCh|n$wXeQ%KgP-sq{FU~ye-gVW5{|IG-W(#pEVhYlok;H8bqo-a5G2Z|rfhy7 zUwgEUe(MO88dA`{mUacFL0$(NR}$kj4syssipOe-b95@79fV z;$r`XUsW+rOl;C{odkksJcX zrObY+xtmq)=AGX=T23Q;f7sFn$YhVWS2tL%Nf!ZNB2GJUYNqab1R&?+dX6hH4&Wfr z>9-bHCi{NFEHBS2))GA*Z0?|$n2@m))wiRYBgGtw18e621{0n$y^_~5Kx`BK2?2xK zT#IB|BjaL*0cL$Mn~nc0KG3l4er%9jrpMR~u|wDH!+1mfVh-J6f24PSkCS%kN~YM` z(QTO-yQRd|JjmlxB-{)(0AQdBCBs-sUej ztdgi9(s~(1TrSC+R{;ALoY!&_rY>3<&x`VZs)3E7c5(6&1M9g4dD2U*ELVx*JlM#W z*U+Qrct6bigF}4pe>=;cz*n3>NAWm6Oz6WC+vyv_uY{Fy}2`nQw3;X$)HpH%O?i5wtj4_^BUmbLkx5$`q8yN*FXm!e`26J*NN^b2)(~Sb9VfJ z7luJt0VKoF^^GS8W(lYnZh z%_V@%>|8HjJqoPlBZO);RRrwt$^^GRONOa>^0LrGt{Lu=&8__kxAt#mHGg!xsBfjc z@-g>g4e6MWf6(A97t}yo^LgyX7cw$L%I;oEV{{#({ z8Ouc&cncwK(TsFj7z5skC}wsC&d$lm>S;6KiYN({f4iUIF&Xy*4YR#Gvqdg+7DL@a zz;zI(8xdDm7g9ZA$GI+N{^KUT+Pf>atI%4M#0cXe#&SQpb4}RAH(jVOvfhgT|ym=`_Mio5S@ai6TmABq+hKG3o-#l+K4F&PT z4TtZ8!y)aME_KpOmBljFz>HaC*Dh5X6DJtD*lS=AEQ3w3^ycMQx}=}LU^E;}M?*+N z)fms>ftonKtK-6km04_UJ=jS78^rO^6Nb80e-z3pM@Z}4KpYX@z%Uh#%i=s%I{XPv zX80}tc5}e@alnJXA8*4|uy$cjy#*1j+*t8+H0s}tXA?;1zzI%$t4FU1&B5XnDDb-d z@F3CaK@Jmm+%7E0_PS(1YHNZ7zU8?zAaIU%*>FxY!7&yKlAnXE&1pH995SQVBS|@= zf3tZsgSUwCTocMcu<(97ry5_$fgFr_*2QhQ#TAR!&NPASx%bX??B}cVO33=jty1Oz-##ubDe`qw!>v~G|fCwX#y~;n(u-YEfhSah@y7Qml z8!Km@D-)Dn@agHa4RSbWCgoZZ3r(K1_r$-5r;KHH&oo@RS1ygTj-I#1K&cG7#sx|} z%O*k6y)kYUnk)zB;c4ULa){GMh|?}?=ZCv_u8ebf1+nMeoo!s0kcg*ILFexEf6Cj9 z$*8{TV=FxsL)rK($4etpeGgU_?BD8$X@KgkZ@~hCL2v7{I(V4zND^6A9d4Hl1440} zM|!#sq_d^>KU?<-Vvc@|wVe$uY$b370myz~WzY5}4suFPP2o_~<+22P)^qV?2`IS% zSr0c?;Y(bF<`P%@a&+NkNgHshud5Q!F>S1WHM&!9w%dEXM=4t3 zdl-k_a`U4qR_cTpPpskeVy`zSMQT4U=Z_)y;{PV^?VhTN+rAxkuO{H2fB#P3PCco7 zrwRlor9w__rk`!Z=03!xyIcgJ)w}k7v3SQE_ON?>@9x@4_boU(Jw4{!rtn1$gkX+- zkuN^7dXl^z<5+uQ9JZCi!ExY%i^Q|Ru|5x$b+LSP{&to^G+&MH#xRG6GscX3*^wRm z*!+fM!z0>!)(xv6>IMsUf8{&RLQvgN&m8xS+bpgV&Ycy1)QG~Blj?(-II z&~;YMJzPAS=cJ$_>PEpWT)4J+<_H`386Al2g4<|UR}r<=&|UhGLmGFbPL_itk+0;_mZPmaC4U*nVvuxzd6FI4!;*bHox zfq~s2$aD;}V67pse^nUFrDmBkQDW*78eC6qb)c96MP4@dbAt0&PuicVgM<(1uHWLJ zYu7>7)?Jm&L3eUe1Kr7qo~rD;h|8lZlXQaT8-e#)0uOAf`6%u=C@Jm0dh6a{(|78L z*{i6_;4_zV`1`7ThR1;8OJYKV>mG*`;U`%sIA9Z>?F;H@e{HCztURmZ)~C;H%~*SG z&1HqZ1k2jm7tGVzFj-5gLD|c|EE9vghZ`CAdNL4hqi9TP&;8+S{WAH7_i8ka6}aod znDzG}`gX9$0F`pNoW?~brD$%;SwvRO?#yQ!Zhuv7|7+_|`ycsgh@}a>9C!USGa~z+ zu-6c46Z-qHe;kTH$5=B}3+I@WP3^^mD8h{Xs0B3sQ*$Q>9#pB*%lkxghF|RrKdpi# z_1BRxZIR+GX1Bo@GKC{Y9Ua3KYwr55t{lGe(z8$mcfKd7l7rUzR0CT}dmAosKt zrAoil# zp+!A%dS(Zk@sJJ^Rv#POL`73QP3;nDP(-u(wGl+i8CdivHVl_0hztfKPJS%}k(q&! z<3A^W>$Dk{AZP%pnz!;@8$_>vJ9fhhEGVr<&H!{dYmDV3Aa}uX0D3O4zLY`DX=^_x z$b@`t{~69r^uYxo%l7`RNspP3C)~B|5Jb^`6iBVMYkw%St zeKnGF0FP`VX-=fw%ws!Ax6>q#E^RSYgqX9QboQNKA(cN4`Nx~1@aji@fm9<5(9o@T z*U&}#yq^2@fDW+?w9C>wbY5t?t(QH(tWPv& z_|?zwXuGL-h{4hPqNjL=wCXWVBYlZ;yhB>~Ag7_e%t=l$fb3Cbexy0euYHzJyPJEo zkmP+MRr%8wR^@j%tLXq4oG+jP>~L1p05U*dL;*-`z3d5YRC)iO|FG7V z?$Qmt`Sf|^zKJtjSCv0~X;nUjwCXW_VO2hbwDLiIaaBIe0J2Aaxl!f)H+Pn?zlVIa zRh;#L&f9<ov%ilwGj^?yvT$08uJahy8q`m%f#A5D8$n2CK#Lm({*u4<`bVcJITw zK)W60*!BJ3ysnS)nu$|Am6VCI>JiR;ra8v1bc}7xG7qAe$r4wYjXCAm`8OLa)qQ3& zuqt+V%0b*ym#5r+p~wI(ISjmKn?vv#hrs=fgL=9_5H7qW4wwJ!{r$J^j)S#_TlZ~v z&Ez!m21oS(PmLx$Ye;6w-&o(jLq^VcWLs0LyZClTKC9_eaBvRY2d5s+p?PVra4Ozp zCF^-xe?4!rINN(&&)fRznZtR!*Y*5fe?7lvah~jTJ-^p~U(X!Q)4i_eP5t$}$>KcQ z>w4bQU(Xy)wTAs%oY$<|PxNqe{i!v}giWzG;dV|gyo8aA`P}uRPCfMPZRmEkp1-(s z1Ng!4*;@Vxn953(k8&Vhc&@*oc(Q2ASq}X?|M<`U^ABse@Ip}k;Jf?oFV}~Uf5OW> zbRhTiiT)^meJ%Rw1S>C7zKrFFtN%;Ur$zl5I+iEOtWTT*HGkXT;6K=VAARGCZlm~sGuaQnjf$eed6#_tfHt0W`ZvtO zU$Qpuf**+FVG@!ut_xgI=~D;98?kwuVU8b}7ZdJ~TBCQ)Bj|~&%p%1P9T0~gad`%L zO1~z5!5_N?dKc`$q@l`na3g}Ye_*~D?RRQj-pKBX?MWtg#^hJIJ=mW)Af6aU6ncO&Z;vwG z5}*InYP}(wwcW6a9#&Zictwp_{^Pw|8$I`b7vx-y!m9vo%Eba(!EwY%>5~T}MC>{2 z?fkLlYzouw){M6jzTmD=ZC-#i%JV`@dGzP?=H93O>IP38XB|H_+k&%^d~GV&!}q67 zoaKXC!$F_>+#B-Fe?*OF9C}YAxX4tAR_u4*tWMPIFL!@wM9qYizyRW(z&joOyoZIhLnjW)c<;+{vB5|asJoV zFAp=$zx9LV1K;RH20ToAfqCd6ax;7Els=dafQ z%9^4vFAL_3x5P2K!h*dEeYLaw0ZYZsBh0;XKpUUXmeW}>uci_Pqu1ZXj(%7JlhH+D|+C;M6^F4&~(;aNx#8N!x%r_5B15M zy!2~gw@|V)Z(1YCs87`*9h{Fg8p=o4P>PJv#66n0M^gy>>Pb0L2{|uQ*7_26TU<?zWG9w-p(Gqq*CfyX}RlD!cH=M!vL?@%RCmXRN}?g=|G-YH8ku zt^Q$SyC8VIVt*eT;=Op+sfF=9Qco?Zt&!~7PU8bf;5^-Y`X8VELArCktluf7Y#Msb z^1*jgN>{a}6oM}}pkt9xS*!rdzaiIffU#`a1ml}$x}26@jo~;SJ|Jd)BNP^F$IOdz zOqN@!kHcUVXd4c!b8RLQe8B-RT0&*f?Vf)_j^P-~rcEnIn2!Ex-+2zU1+Js7e)X1% zf17_+zBl(aln?i&P%ucYqFFFL-Z(wp)FF9Ar$?4K8plWD_}EKkdJy=>ZDwYA{+$E5 z`^bWfenj70RJS;9?{d|D6H zeih$2B;O1pFQCdL$M|@2zcu$8i#eKbQsctehh=sVgij7*h{N^I!aE0dVI>qYuB_a9 z$)%ON{x0n9CXn=w6qhDr`o&H@J8$|I>%Dhe!u}D*^9-Cn?9m=ig*V>mP#*Yz`zLat z6fSMnn+LSJY4UP^DUkU$l5?B>%)8j&=F*m60@j^PnBZWq?1nAMiaw(0J}lNqM*kd~ zE2>hvw5Czo+q~CaA&kN!5-@K%1`hn*IcjC^2aM!wpd4?rF^)8QfzQuw}9f{!C4_;5gSebVq z5ZFEbkdMz!4%JP-RIqoSm1$U9d^#loqLq6W7D$C4SLy?e{qaUwyRkn$jE}RiKMs1I z8~fuxHnOol8vCQMKN|a^u|Lx0gnZ;fDdIsTv1apsID0D{kj`=CEEj&>0FIy78M*Y8 zH*Mb1Pzr5kP}$Vwez-Av-@4g5{lpEtrQSM#&|4FBW$%BBzyGa6+W!xo-qpB14tk#( z*T;cuWaIj1Tpx|=qj7ySu8)j)={^M^i0l8^g33pxwp6M%6ny***{At>x+Xt7k$d%kIN>8zBo;bW#9d5+Dx8^<| zW<2%^YSR-EuA@KLcbzue4V0f-9<+S9MsY@Zk?R*uBa^y=j|W`U+LKG@Ig* zk6B#8)=g!&js3|tq_Y7)z8Gb_c|c;aZV^d(S>DB6+H7+5N|ATB$xVSs)0?j;5NUez zz3D5rDG+g*-h54OzNR-{)0;14C0@IK;W|o@kZ+Sw_|RLjDw|@E*GPU$vqUrLyeR?M zMMPcJsq9Bsl(#jUg4B&*A(HjvJh*}@hxcG}&3ve9 zhQS8S)$-Z`=`gDc?cdI7{^)p1PI@Wl{R6sb5(*0ky70#CP-j==UF`IS>_R_(g{7cL zXW1x3?q!XATXj zGv$h`(3o?LIk%q--Xg<^CXPveKL24eyoIatKD3U;?0X5bPq)J1`@x(9n!1kf-#hc4 z1)c@=WIptw3P#g`EaM}bt=*6ru_(Op9({%5AIlxf#oS%IRmK;?yI((rPae>Hl3A3( zzBAv9_Fk|~?}Z&Et|QG5CC?rfOQeZqFa`7N3|nwk>%B0>Md-R^48eJS=CBw6iDWQ9 z=H<-B=T_ytY`BH12OG5$XTxCQ{qPbVXR?6wrw)rLiexibMDS3CVM^EVy|ECUfGW%* zc>XZih9gs$Z!=kiv0`t=@L4WG(21{{aPiv--Olz0tjQH(5LVRn?{yRx{c<5F5xz2L^uD=0o`2*ZCR&l_SIcbH-7zH zC@vq;zlzr;Q6!if>$2Z{r%5)HiVK&l9`XLSIl+|DCl81NGPD-sDeQN1N1U-z?}8&h zja>yx05@<}D+mj*ctP;Y0daxtJgs~;yq(|A!)~zrMf36#+6#Ptv6g*4;S|O?z6%~n zugoA=xc-h@X0o2tS;ik_*ftcw}b<2p8_%vC70*KCrVn1rHr8Tf~G4 z*dqG~lP%&$-UTysAH(3ufkXq2>kA|z?}0c6WCAf?vVV7HJtGNIN?@` z6K-FM6JEpZspj>6Y@D8NmBnA*>Dl-^-vT2XXo+Ft^K5*c2cVOFY@er`zwS=Yna_%`3X>GTS|&Bm+wwpidm zy_%f7zw4j0<%#Y6eV`%wU7blpV`gI=_Pfa;&#cb-*ys;`*tTcjJ_X@3ev)iMZjYbX z@4n&oJ*<0Twss!eY6?g0BTezhN7pqdLo@{=Z(#R7mYQ+c?BiJT8LylVdFga^8fsZ&K>%I_%e{b+M>W!}){HqP;acVf4H(IB#dSAze9 zMkjf5i1&Di%_WE+mwA2}Z#75veaL3Ib(~Y{GT(fEvj?^j%tgWMaRqYWoi`k<+-#ir zBLe8T>v`y{SPdewHFgY!J@op6T2( zQNG9l9%f1?r{NLfK(iO-UF`c#7WD&XFf zYD@Z%+HcE=ln-kcZA{Js2PBO4oCd(VF5!>oEoxlCjZ3(32_N_&Z(PD3Jqpyggd3M|;}SmX2*5{h3A0Ph1&=n4;Wx#j zjbpfR3^$J9CRdo9a?s=ozbk#CaSS)P!cDI5f%*&@$MDDV5;eKPA1wOQIEEX?aFZ*4 z+~f*3xx$TO_+2}Ox{pPqB@}Fs3#UDL~xWGkCK5^4stSM94gT*1NR$7amX^NKK zy}2m}RIm9@ynD4oK6cIcSfiZ0ElzHflcw0|9kxDgYN#9Kq$!~Pz{<()eiNu7>4)Bs z;_(qD+wC@`&?B<=&O7b>`O#Z0iG}ch#S=VufyMZ5syQ4-Q$sOsr=$SX0%PAgv(+t^7dpB}iz?rbHDtSya zg!kRJL>k6OF-Ff_Z5|_~w3I!67E%xIYf|$|>8-=-3Ti8PxY1f0t+mlw|MBYP%7Oau zKVm*eqqXuAPTBYB0Wv|OwKiHSlQ9~tHC9CX!5r>2xG>Cb({i;n_w*amTR-9*x7!_9 zF82?=tTy}hoAt-YnB55nqVYtzkaNEYo;)BPV9;9dw+kN0+1iXXdn@LDHok8ylK?ASdV3z@A_o>k6aSG9X+{?o zg%0PL4=i=kEApnqj<;OkZ}@IVbg=~Fz>DnfQ2>z z=4NK>0NKOjdyP_+Stm;(Lsh%6>32OX^AY1o3o`#tx!93z74S7Jv^-fo@Uhp{sUAQD z7`1Uw2bKB`2q!%YCkOP$Ad7`S(uqLQN5=zl;XcNmkqh!#fl+-xF^tk%Pz+EE6v$ie zen2rmF>I$8!Eqy|GFu+T7S0! zQEW?NTN>Nad)k&h03#fgX+nC*P|pHhh(|cU3&9J)3(d35;Dz9Y_VB{$y4x)ZowV}U zg!GIh>a_=DPRJvo%n5stsG&B#%n7xMdv?W3KGT;;UIbi!wDg=e?2-Rl562*=Kv3aXP%&y_0=p3}zVAk03*yc3cC?haQZg!mB{n!jG}c4wK^gTv zwo7*{YXz8psA5L73aVACtX3JDQ$`}$P^SVu$dz2;5kg_JLnH!x&>1Mf2XWadE?c#2 z)w<0Gr{99*Y#v0(SYk+YK&gSh46&~c^Xh=ML4{K|@a9DJu+_5K;K;A?(d`a}0qqE- zg)KE~7I%MEtU%hws*=i_lFw{b$>P1eu(>a0F^PkJWZcH1ED0{*BbOjF1|;GVDW~0U zK_2Hz-beX-y&&W8^Y!J5s|PA=HWN+#eM)J9Om{*0z?Kw-BQi=~;fN5;I#mk;N94RC zD&w~LUa+-_@Sckx2~}^b4)id{B@H~ib{vKopIM zbk+V9M8%XXg5{iBPx5k{Z)yo+iLAb|qa6)@X{m`uhphCZ2e^E4Rnfe$-0L=LQf59< z!aC1T`b=_3-z%DJUC$LS=w72=XT&O=ATRJS(hljuWTOo7a;MrhYh5{0So{V9UZuCM zm%%?PrnCT&PR438&>8($TQH`JO9nwu5ZNjy1q9QeoH*DAgYmCW(_01?ZNgU8z#lt* zps@hMYagrL8nmmw7VAU(Tqk3z1@Jl87eFU2s!|E;IN;yIUcnv9iY<#IhPoKEqkt+2 zR7p6UqH?uL!pC$Y->Qp38O{DzgLj_G%NpzBQV;17UGPna800Om|GfA8=e`2qwDMb1 zTikW%jQ7Z9yPcM-kpo{EjtjGraT~UW4q=8ul@Y(>#!tx$_=cy|cmp_ z&GRV0X%wUacTZkK<=faGiOmd)I^>x)!xY#3Om1lxzj}(SV6r~Oqx7|gwwz`a^zD@Y znIa4L56!n?BFcUsA|4YFQ7gcILkv&>N4F$>bUjzmn(I^9&;{LUY(f?CT)(3UO$Fy&5o`2iaKoDOroc z%k6XA$Zi|2&<74Gk=Hf~eMjTTgp4P@KYy85TaK=Vl$&*Sn|@`Q+;zWyxk0!;J*Il0 z(Z1)0)0o)I_ii)4DnWV$&r$Y62Hj(_BWeXQ=mw~Oql^bT`Pj+#dOO9bo%~6bE?HJY zEFVols4ie19Y~FS1r~TP zO*BsO#hIen*0oDNgH{fIj0Dj9hjT>u>$6L6c?t@oV&^E!iNFk_mt9K)gx>4P{}((vb6p-oh# zoH#2~gl8g_X~KWpRj_PI&?Mc^$hf2wyaq33*}rG^Gfw7`Czh3elhux0G8_3=`P;Rs z5c6n-j&x_{Dh*k@87^r`Mv1$mIjhGeKFEF*PMI19yrWxH;?*h?NzuqSL{oa>Q)Iy9HBQWp z6}Tfm+Qt5c{j=ip7wYq*nO@3)eCg<0Fb1!}8SLqh<wNZD#oSH^_moI9X zTeaEq;7{{hiktU?E8;Jyq1DLVoLFJeyoL8HFKBo}sR8hRy8DdNuGZ|{JcZ)jAFvsa7(f3hw70_v>khLC@Hfn>%tkLHO!W z8o`5YFJ*POPRJpM*F)>qg!ev@+g(=eY3%bOy3(Rf)HOcvFW%?@GQA7Fn$6HOZq)@!r^Y99|!|G8o-b`dP1_@z2& zLmsvLM=NCPkxV_O_7Uw#A8zh=O1>Z4aaX zyh{P7^r4PC4KiOy2{@4w7>E!XMRd~}i9_rcjF63gLfE)zHrNm8GR~ABypG>q2l?kW z$K2`svpQeprkkOk7_V!hRe37&J<8aa2GNY6Y6-uBAO?N~e#J1qqA844$Rb{WUqNyV z@e1M<#4D{|sb5^toXPA8800~`t=Oqip%3rXv9d$w_dMMCt?|7{zkOiIV=<>8mYa>; z+y}ycG{Ti#eb1uDxndbp0+ym&4Q0Bz=kZ9o%4Y0C@WL{(9&b?6p_ML`Tn~{%SZHby?#zl=`xw++Awqv7cM$p`^hfBA&>x{cLVvqL|N8CL zlOW3?xjb_n`invc{k;qQB|X6@EELA?Hj7sqJmqZ;bhBHxGS_3g3i7YgawZ$wW!;|~ zEA|h3hx;rq)NqGnqs?&pSnk1Bw0N}xv96UOmKFr~h%{f!LrC)_?HbZJ%65pOYzCcw zgm<^{k}lXt-Kn*;7I|cA>i2n z7y|e4-$jPkCPUz3?hjdBUyw$Y7Z;X)ASzgn#yf^Hh6(?Qguc_{LI@0HQ zDRE?cJHuksM-VX~C|?)?cxI{jV*et+W-0dV2sIHJ^?GdlMv&5>w84AI(17e;UNm zea4-Ac*~b;UIdG!@=<33(KUMvHCtb}Ck%(qm3_%_o!f_4}vmoPtFqqA&Um;TnNx-0FMD^;|alYhz zly*lW; z3uN0(+Q@3;>Vu7^7uGSRbK8r1_R(IAHu;~W&+~$TOhgK=%9`K~6TL1EEfp6ETjU=v zm%!W9$GN&8$xd>`GMcaes1RrWZ;Rx!Q|oArE$Y0RAeKObklD8ns9%?G4?vz`*c(qz z7tKfkP?p$mp1 z>Cc5{^994nrGk{-rqcS*A-a%cqj9aYUqo^NT<*Hr9>7iT?APuYmmvIk!*#xT#T5Xa zyhj6_!PqZtjK|_vi8YkK*=a2xA^T)}I5ozbDJfZvDBN-GJeWH0W0VKOQnhN;FMkhl zW&gp+tpHpClHts6O}h_H%6hR$WxhVKvfw4}(K^J#MAq@iM-w-$WQ5dL^}Vo&!*_gs9v9yQ@v5VNdK|4z%uM zNv|nh1Ilp>N;ZM;Nl2#LB&pDOQFyMz6yrPNPSY6xwOfxc1tfVnc7ZF~T~#raBx@c6 zTHsy zkg&pW&3SQ!AI4i^gT>tPQL>#f`b->38pIJ#_XGtQ92SuMz%@?R)Nm6UpIb;cs$Arl#2IU2Db6JTX$J)K8O5#5 zk+H2yW#!i}$gx~V@3W8 zOTC-|5ewXdehHAI)Ky$<{R9-m)a|<<*mKVa(wYbrP5D z6RCwoejW9vEw?Szl!)i%_FZ|-DWzMixQTXWraa@9w;-5C)IhWf;IKBKN93 zu6D@J;%mgng{=6gIf`-_#e~eqX`7Kl)7xo~%?S{s+E0iGn3ec8p!GI0B7K-A!*_q) z%B1fHJpv~Ywx|4bop9dJ$=2V8$?gYfvY}J-_^reQ9JKP!%#?t(He>XjgFY)Wh6!jR ze-@e|zkVbC_Z)i<*!A}>ugC0#<%aEV{#qjER#nb|Sp$`>%cZ0(v;#(=^<2SMh{gKRzY7P_36A-p zU)T3aOZwq^{1o`sB+m%$t2UCJ)@MM$KwLV!@-bbMI2Ze%Y4u|}j?M3UNA!I<%(?-x zMjG(7d!2n=GZFhF#|r$a>lyzbBg0C{AX%d+5GMK;m<{UP^|gGi5HGj$D!X*g3j>vs zR7gBeW8-c(-cjAVPJUIRIK2({xe zfRv>!;(TXHQV59xA?#(TEY`!YG>;Mo;n_7Qrg;>a%kQ4qgI5rhTf@MYo0uUqCYeLs zUfWMj;3M0A0|K{Fp zr8X;JPMrG~H52#>W#FW;6q*{mrO+bi9Wzv)S%ceFZLCPNdZ)^Fm}>!{VObl}z9>$Y z=q%o$(SFrm)}_U~2XhPYis-AwS}npMU4^TH+GNx^m~I>{qKyV@ZfNNMZR21YK~*{%p(=NLNRTOF8F?)$wEfLU-uN?k!Lj=*_?~stBbZQ*NAXg9o7t-#w*%e!Bbnd=khT`_ zRB??+{6pkK?B&ILQLzkp#I*A+ZRYe0o=KibLdW?^5?I1zcZ&i)A#5PhAc(L29y*#+ zsq8ODj;y``X0W(4WgNxk1b3^Af4UaZP zgyANG>!m@1h;lwMRw-`a?5D{>yz-WdPH93QX}J~pk$`+3DV28oFZA&AQ3xy^>3qeP z9b3<{7&JAVSGVLCN~AUhe6j8j+9V8#PD>OYvwQ0Oc+=+gP@s3ZVm%c3?#(MeaA1^* zlCaN5EtpAIg3%vm;nGKI+$Y>?V%u@{lOG!%MD^Fj?AVmw*i?u7`_cSc-Vs~-Nfu+h z^dsds{~H#;8u`cRbmUt1N9Tb1+cL4t{A14S1ahCeu@CV~wO`qJ+cRN7?rMQiapIrr zT)FXr;ZdS6(}s`=k13&x?+h2~>{yr&r}2~h}L@%Y@)Mgp?btz{gkQ}x!mpk<9Nx{e3= zLfGsCt4Wy|G%r$0GEYOqWo@=X=tOL11}fR5t&Wc-^)JhLs0wblo!ImfV(}&5QRqy^gu_h^0JQSYXY}R7l`~jTNr-D#M^Pgkfq-uZVt3<)nz4 zvmyImA+^d_b#ev>amia`v<-17ONopns?k6HCWqZIzgUZZr-i+=^_$0^0^ zzig@snR9fwKmWxy4<8K&ei;0r1(Sfwm$zFQYMG3iH3}X8=)r2o-eZ`bD*e|S_zxUm zQfMm}e#Gp*Mg^q5S5Kgu`e=VeH1#Rn1-mr$5stIl(L%vdy{DM`qsoHv(`Q~Adb4Cz zxR$-1W=Cvlr_ZEQBt3%FMYt(tuOrs!f3WvcQNWkOH)gKvc54mvTCzcp2z(AhqHW! zidG#i{gi#N7`u3^7>-rm@R}A>W}GzvAw9d6bkbd{w{tNBJ?V-ZGaA@*0R#~JL!~Jj zx_Qy7;H^gXzP~RAYI%`uW?xC+sBV9yE*+`84G>Dcpk7_LAx&dKiLiE(rxQJiGH$M! z@OeK;x@$u=fuIO)h);!?3tvh7FHy(eK{{Yfarg7xR;t5R;;uDuJDz5qYk}q9vj79@ z`VW|r-_^6-Sm};k5bAcUf|0Y!+M`b!@<<}{{2CwCVptErqN&D*RslSMJz0f%F24mC zOD+HQvPC&OTd6)%(*PXN#@@8&fvvOpND|k8d~0!FQx1x_$Uya}pag@=zK_XvLu@29 z$|B9wf)!Y+P{vx&y$x7l61C%rI+gn*RaC_0trh6AR zgi&!zXKYNMH#trjk^{3l7)vMM02HFGm)02<#sSWRB0_|5lI||&{%~=2SQPD=p`iU3 zU8a%?ril=w=Oe)+%hdxn)$C#Fm?%#YZS)RbXgZ4B>pE!{dl}?4;L470?;ta|R2`6K ztoqLY>AxZ$l%H5WGm}-00?e6f>aRW|==K-8>vVuC7e(GQMZa-WcCYw*P1?%7+@_0& z&)|i2oVMsgip4#Ux_9;OmI+Ovj0#Qh2~#oNN2Nh4m=|sXrI|9jhixLayL=JTTPMkS zWj-|qPwY2rZzbWI&66OC#Nfg8!;MMUxWY3bg zVWx%Pw?aeVLdy-yd}?@0iKEH_Sr3mmrmFIOs>g)g!7#kv75k7bh2)>AQO9%$TJq@J zoDE*35j_mWFe7LRw7}IZm#@KRaKR!k3Z%ed#g}*3{|6BP-?+Cxt&1R7bFv@Y+>|0F z9f-7=I8$Jfx*ZPFFCoEnp&si_VV^1+HStnW!cCZl+AMXIlOCl_i0K@s=^Ql@)Sb>I z6IcJ}EplYy+wFBQvGD?X7cPFZgYXS$TY-EII;|cdZy8u$@gU*Wr>A`&@vefd%V7im;)_>2wYRDj)9AB zU!rtsHJ^=aD@;UK2}%SIp4K0{0E>!-n()UEna#Q&p8LF5QCbl*qCBDWmDjeHq8;%V z!r#0y15&g5@5uLyJ0ezsGp%S}>YOQk+DrmxruM6W_91lwcTI+clctm1SjGQhGtJg7 zH|S{q=0xhonwVuK7iCPmE9~nC^p9t9oQl|Q#;16FU~sdZ!#)~#@0eD zHUf=}4$UdB+j3MEY1)RljPf+U+k2}onpm&3Dy>m<8^x&`o$h#=X2`3X8{|aA-{Gl} zR9^=E=stY*pOYql=xVZnX&-ygUWxeH%{;}Tlz_$mmjqThMbW!C<|Dp0>Nz2Ykes#e z8y1~;xo!dHUE?xP&be>AB4>h0w5E<7#myO2*cvX&p{YgGo9`(W{?jz(ct5`6YJ{HQ zhHHp@*z(yr%y9!zm4I;C`6@!n_;L`sgSRk{0)JP-?#!@J&SX!mW4w5aTCc&`lQVXv z-ANPPZ+KzTuiN4G;uw6gV3%>~*X`vVhDJQ!I?R)O!cIHj_wF%FZKmc(5Q)z?ipz8r z*{@(?{xMP!6j7AelJKqf7P;T1c>f(itl^dB>%B7@mF9n}2gl6&c6pVaKYBk9S#JH0 zQrrDHiVB-u)=`JOv4&&ksDjZIz3vwxlRsoL2QPn?xp&X)#LtppXScM7$I7(Nt@5!i zF&Hv?9nS*`N|7f}d3(*u)PCsjpyK<#K4W|*e)eg%dJ8|7nn&y6>uQ&FP_xgMe7rUuyB*2b?mgYe z4c>j(v5i=CweUWKH#Sw)0+ahV;9*o)M4P}U|+i9V6jqjG*;!>bSq`BgOpat zA;_V%`;5J&%<4Qo3MH~i2|{xE8`4ln!SyvhfDvA&SI)14vH^KZIfya(sf6Zx`+^vg z$uX6FCmYGUyO`b)KUuS5=Xs2Jm$v-$8uNFX%&KMJ-lb`gZT~8>n1=fnd=ffHI4X*Q`8?r^BEROjKP^Y#j{YBuQNLuX)P zI`Z~s@^70_#;{N#y+iYif#8Z3F+naZ+MqasTJ7H3YrjV&Y$NVpX< zj>$|TQg)l5Q+z_Q-Kt+p7YCoY`1VMaiEDJ9b()x^BaqU4!5&!@;wM)a&Z(c>e|&bj zCGWoaT{?c-A-+KKXXX~Z`7^3FFB;(OCC9tpBE{&oAZ`erHkpUb#)IM>9W+ zyBEpbt(qn2d16$^ zmah?1CTfJ3#T_193Y#N(7D7??y4HlJ^siM`{@wzgY`sF}J+NXWfP<$7!XD5}{3X;m zB@JR`oQ>vdT%b9B+CvncmZ-YX8XYGDaD<7*>_bs|NCWVyH56BzlN}w*k>E{!jAJv1 zwBra7oNmYKt%t3uTpx!m{tcv`ss3HH->lqB?CPL=C^~HQ3zm3(AOs&T+}_LS$J<)c zTD`2uh?|+@+|KEB)5yMQ9X$~An$GnH^!c4o_KQ1&4bdPml;63od53M+K%*({jiO{S zkj&5p#}J(SRPi(~2W%H`{3>zhE&Uc6?Nsj~)k8t@XA-!D&H(Pbj6}L29|PT}NXlK= z1}VLi4R-{51bnkor`}PMp?F|pXbrpsl*9lq) z@Bt6qxpl0lC6a)r66?%oU2Ky`HCN`d_;|`G9~C;opNhZIv^E+3j4XBCSY|}%ILL?< zniZJkLVXR!vm2Jx3Lw;%F}7gJ)i(1^3tzDG;60zjNZI0&lkFWO1P{<%onzn#9jwp< zaiug=%Yl)dI@*VQ581?J)*^h9?op1Jak|1Vw>7LKx|()+_L7f{<9!`d{=JM#{7loM z7&CKzoOP)5E7txecR+TF`*nwDFIw{?imaY1%pESm?Fnnv6Tom~AyxkM2OhY?6FUq9 z>*bH-Qj1}Xwr2afm}lVhUkYWUyckM;{ADm@jHJN=IssK>cY2M{?oUeFmjGyQ*)?)BafyXT7d!#*I{0jKWDEP#UhpPbDO{9(B@d!>8J=bz*capuC6AdcfUW4ssXKqMxO zTDFV}`RC%Wcgm6M|NWrUk8bk2=%3-a1HHBUbsll#a&;kjZBwSoEGp^^2fIjA+F6$sqg6Y^N##^+>xp6H82I+N1i&s6@Q80?Rb4#$M1ZYuxz88oQrsw&mM=)xqAn!zXjM z`~-bGN&8xnZ@USs?Mh9idbjqx2rm*K?)xed6qb8^*ckAbBXy49+olvw>fo6_Uo8c~ zl=s)LYb`gd@bVqi|8D=Hz`>)H|6e3)htYrS$NIW5b{HUx$pyd@CvmbA>iTC=qfGCHY5wR? zN1qE+$}fGNo+T3us_qkdtZ{-Q#i}*cPno2%K8+wYQeWh_|ChesKAHE#f;(Ic%YLP> z;aw67O)7u0FrAnMrA;Kr@BxiS_IQ@SxF7%LI7U5$pE48jkYYSe7r9idyaU6b4YA%p ze@{O8b8vvyp+6>nursU?ER>0GTY!^JZcY9D0j}rTnXbWPhE)F&I(qVZq|D;63(_P) zaSyVp5N74yY*S6SVEuqkkoJWREh{>IaoirO17B=~N;86#)yc~dG9fJQ9S^NX&*ebQU!Jadop_!HK*BQ5JYSik zT=?%c-YO_X?l^N0Fl}fXE9d?qf+B)zCBzs;`@_Jn%`e0XfZ4Py9QDpnMC2bOX)++T zMHbThVEEf|`QD|DM)%?4YJQL{lj|cX?ju=Q0*!KDh5X}s|K#a5t>LzPZ1$F=d(!~O z{E=bw?l)<*#T=nsbz6FB+_T=7xQk(Aeq7i^T6+y&-8Wa6E_c8ZNo{sZZ>F^NePTfq ze}TtqQAxq&#Zdw!?PTQ%mTIu!$Pd6&+O#VAHIwog9J9@87vp~+a>MKS zR^nD7v)jn=i9edAZ<^lw5(b3TT@uH`_knyF92;pBNqM>fV^Ix-WpbU#*%+ZePl`+? zHm0LVY7_o?6)^6;mjvDc-++*^YW-~?vCVcM!eED^2{N^Xi&xo4rqB~L10?cdH_#;6aDPH-@D@~Q%xQG$ ziuSesW#l)(!&H==a(PAD>qVpBRzt_FF1=sCSkTytG@NF!Q|F^3NZj8REzOkiKA2Jd zljJ$<+tU%(tl0F+X7SEDc}JzXBFH#tZin+Hq?{0;x{53jdYXaEz>-<)l8_W$S3jAks{y583qGnLlk{sq*K^P8 z7Y=TXC!(iL5@H3bbZoeIWX8fWU5#wg3X!WICsG+noc4Ou!b9B%mW?Zu8Gj!cUh!{d z8E2V`3(Ov}*1h;#9qfJ={@w1c=V#o+#yLp5ln&Co0HrZeq8t-8SrFx!(d7n>s;y_= zL9cqUWfN24PRX?)A$;-Cb`&?+ynK_CsTaJWy9bYbhUEa=$H?QS^h;L-@-WZo-ce~D z3VBi;Mw(V);w0fi++=~wF*^TDy$Mf`fEvbd(WkPxxrM}sWF%fbli)Py%m?yN`Cn-& zP#gCPkRrhpB%Fa8-M|60l4KJxGzM+B)hP7WcDMM1W^;Xtm3EjhQRI zV$cVEUeDPn7;f2uH5K(<%r~_k?~5P*HVI}TEn^%jYI!AgstM{;w{Wu#a+b^f&_bQ` z`FPkjWKzjXah}`C8*!R5-F?@({vVe6|4(uw3H%N;n;>B%VFXAR^QxIqQ)}z3lNfz= zpkVizCrU6y8xBhohQjhZ3H%$mzcpW0Pj$9>BL&ArhE2j}4ce&Y5?OhRZjf~nlG*yO z?@VFo-%n8{8OdM=-(F8XqqYUXV?1U1&EdOiD0)};tIVAGV3->9@F7Yz_nnaINL(Yd z4qeAp_=TT=cK|nEaFaOe#TFxBWQcb-Nx`A78^k@l)p|$G!Z@R&B3dLg<~K+U6l1;9 z!nC?y9(g-ab`F}mW8}1AkHTAer&>hIv1E)on~>Z%yd|x33U$0yX2` zzU(XD9d*g=x`MuI*uk|>3LC0bl0mCluO;n;+=^l&=mLzJ9+U9{H;`uEf6iozosDK1 zXDetgi?f=Ew<2|N9u+Cy)y;&4`|9Gv4~Y=(I!p4xSB9uRo--fy-07f6QBppnoz}IE zuuT$Q6l1XGC?oZqQ~uk7O^+>Xi#)b;_G@PRfnDd&hSwyDy+4+pKCyVkQyZpMrAlRu zYI0ZCcMCK`V4cu0N?dP}N3k4eD}Q5(qJ3v7d|Hn>6YYu#PCJ<-R-6eyXCJFeW+-U$R<#|!mQvi~wO6|Fc@8+!|&C<3? z=7&4<-^rveOvNzty5V!*I3&u2^c@Q@#j+_NY=%*vzZ4BLv{7iv&UrMcMJ7VCt(=r% zO7C&7No0vHTrlro(^&qe=|&*`p=@qucgxRV7CLq7vKt$1!I-z{97SH3g{C;@^hG0# zQXWWSWQg-1Mp_|Mog*y@o(O;ln>LgbA$(iFT%DMW1GU9Qlw;N-dy}~~Mj3*KqT<=W zaac9h;$K$8+-j(qm#JHkB4i!L4TA|f3yNxdTs@lnX5K|k6}@+Iot5Z@5&WGe zN{zJlDzc|viRFd#Qtj~B75E>e;;yGOrYex2M@UXfGNX%n3#ThFvg_W&xXFuI5X(h= zuIF?(%sRvw84R)#ZagMQ;mnQ)lp_8@Q3h`LJm50ObKJGe${*oCmtH}7D)zAC{lwH08JysnVN8EJ-1LT%h@*Z>S{TkzaR_4v>BESvYEGB3{JT$M+?|blWSkB8eEWbzw^#kFYKH-F)4KBp0dqU>RLDaMjteb zshqFqNw;mlHmiO66bW1ZW1qLJ?tH*K+|mu_Shr=GBwjtU9iV@!U$d;9c);DYZK8j> z$z|IxLoRE(@?m|RO<<=z4OYAnzW|iy_yhdl&gApMoSYoPXgBnEHJT20(b5LJ&>ziM z_OW+SS~QCAy!%2^p#raxMYdw1MSltC=}MojM#O#tlv-i`Xl7%n$R-f{2_tbQ19oZC zEV74A43CS|tgX17+*4f23-L-ca>bjY@DbYVAqHp3)BUJ)Zx!gi33)4Z*8%oNK02bq zq`SdCRtt_?E5TccvA=rfeQnj?bd-$_d^OQ@MRtjvKrJqlaZJ$p#VTC#oD;J@5jv}P z!w}W`=yl}FFBdS8+srNJXldiv!fGf<+QhqO;&pAr_tgdrA#asxZ4!!=3tQdjNz?=% zK96Z&Zpv*GBXwU@N%Mtq9~-z;rixpu{KK6yE$2;o5w3p}Bf6$~K~uicbC50k>Kd%? zO5w4KxEVpv3=@9NQ-q~ikn3UJ@>a#A^vI%_sLU$W;2qEB;8XD-S+rtj8_#t32OrqI z%m^L%M-_MSn!IpJUJusm`}Pr(Z!;HPGJLe94WF_zxhPz;4SDmKtvJ zx|SB$Fz|kbA*+X@nQyQR4fDzzp#L03uagG%Ft6lO%)ElTr>-RMIjN3|N4_o5Z&mX zLI!*D&E9}v^Cq~Wn4Syh%td7odAoki&oMfgr>%wkjV*(;=WT47TBU*jJc6^}^imYn zvP4Hv7k##O4|2jHFxl1v^Qx7M50Ow)p|Mj@`a2X~*jMa`$_1!7)+IZ?MB06NLFB-g z=3(8dMIXsWZ-Qd5NcOPhU8r!XXYC$-YFpGFzKoinEz(p}i!QK#6a2I~ENfQj7EEvX za@q>p_4h^+Q6G=>N#MjBkrMP*@ zv(!szhEX~~K}7NK5?x6tEhbZ8ss`_V*O)ervx1^z9C)3W^j`IkQjF>1yc<8@;S6}cSJ(Q-&v%wF;=av%m_lqquPURw#t3T8j( ze%g@Gv<+jTtk_K6%$z6X{N?!H2(ia4zAJ>IS$=&tT{Bpdx7|}`8+Gsbjl2qh;!iIE zO9;~jc~ig)x0VkeM=n|SGX(rC4vOE;1vcO>38=yu=Y5S{C=Jn?KWRbDw*lIL<+Ur2 zNUPoXN^$BzRijl^_Wgq-slnOP?g%`#!OE{`%{xZPyYnyD zp}1dTl!>K^8Ll|4INH0rD0jOG)P85yqyh5hZouG(z^6_xIJx6*w)KgjTVV!W(Hpuq zLA@0E#t3ansHYg_o)jkJCFJGYQ+9XZ-n#0!^iT_}8lnHFvM?1r1oOG{f+NYuV#r!- zZf>4`TWiPLW7_WOYSvhia`T}&k9e_cIBo=%swNxzALyL_T5kbC)*<2{b1w zdnJ1LL|V-zQ$z7RJS%4l^$}Z=&U9Mugr%;ae z73*tC-?Pdip{>Ps=~gLzwWva9`bj`;1)$b;URYs-)2~TEJ=Q;L`)}}<6tVx9dUt5G z$)7~A1>&Qg1=inTbzCvkCeokt#q5y~F8pZoL?eUo@r%=(q>vKkzi>cuNKBJPK`XN0 zuOZ~6*GvA&E?th;U2UZGlGq}MQ~5m7Y~To!-E6Hunk`K5lTvrR8^h_#>>I{5zX7S_ znJc~j;54pTwT=%euWh^u^*(0&5!&hZ=OMZ3-fU@gu^`H9llLLkY;$Q< z7*^iC#zDJ#PQAfM_b6XM<&yQn7@oRx&+?Ykjr#b3L}`MTzTp74smr^Or40h<{J9%S ztK6M3{*&{b)zo2vXh*@X}Q zBu&_Gz+M(!Tg0J)kC$$lAQ*kJrgO(+n} zAN~(cVhOYMXqZDJQ;sz(SofL9xDj=6{ViHSl;ga!Vh6ZGK;ombJB3n`^vl`ce>smw zQFm9ecZR=R>A!{yyxDq|wCJsb`EH+a=wdm-nn7{xqB$aaEz<_{P_8m)KZ48Rbt9IJ{!T7swtVcpNFFe6P z>V(ShhYBuyG`6w{X2gXO8(Ahc?3pw7(7SrGe$dWFeW#82%20}p{fXJ&cGp#nu*;4l z?rv$ny<+^}DL@`OeClSw3au^J8DSgSV4(n~a}i*+lW3HD2-pq!1baZemuf(W&MD^4 z%F8f!O=-|3d-VzItG*My)BHPCImibUn)b)SuU_(pldg>*o;!bE9UxC`XajIlp+;2Knh$_Cw4> z0?K#iQTS^kl;IQ<_J(f^b>UoJB^=r+C>3_&mA-t-;0LBEa_MJ> z2aHv3F3R4EgBgR9q1LbB9V0ToYy={Feb}z(5%>?;J4CAEz{&B6P^PA*&3_Wo=fcruWk8%yXka?6?}tbLHM$T^wnOC?Ot)l4u9-RbiB;0s8!x zmcT<+ez^aVqo7Al)rV^A5?Aa*(9lg@-lu2t^g&UD_5Cn-x#M3Mb05hf0_P%4ra&16 z?KsT2AJO@nuDmb6W4pi%S%2jqGD$WnFwHDQcZEl@z5;DaTpgJ}pQk~XQ;v)S?|@7P z6?wtrYkAH2!u%TQGSgY{VR?bL!;PTD!I{|Sj_;C#UZak$QHY#FC;yDq%z!i!jQJ`V z1=9!<$}$XonY!(s8>)qEZfE|r(>F35jp51uzFl~Kf0`X&S^`Cg>j3maG^U*=erINe z-+#fMVC8Y+ZQh)=7qNt9{d&g=9WV&F*S|D_u(Ki#C@HY+vYOsC7!@9WH4ZH0s=WR5 z3DviWuBoKx2UK#kqz=uWRx_Zl(MUGb!Jgg@-K)%5pga03j6j=5Qm~YBo2cK?aB%oZ zq*t%>5uO1-8nLSQ(He>ZSYGkNkwJnW+xQC63g~it8dxedF6K}enfVs13o^}JOWZgO zBsH#uQd`$^UyDD2@nzS7sub4oqRSQ_+iaQnrg!(5SM@$J08h^iT?$vy`?!l^fQhd-g7T5 zLLze*>BUK?R$)cCaXN0|-My^$e1}fp2a>#4s-j#x?D&XQxbsD9EsO_sb7RE+RGT(? zhef33BPDEKp>uD%3jZEi`e>wKX%fjY(G21P=eu%J%USZ)g=Z7J^*qmQi|>m>fY1Ef zIlH0c6k|4Yw8gmV#%->d+WUN*=L%gp6o7M7IIt{T z^7fS<1YgRB7+924 zNG;)0KH*W~b5ZpdgM^2N@6oh3h*5Pol3ITZ19GBDT5u8^wH|p}xICN&hdE+1rSgZM z@B*l^)8ODNPm?ZXmLbQH%cJh}x|-y!DE0T;4r*Ug3{yj6_Jc?A8&tKe6OPC0I(+hf z&VM!1yt-2B!Azc*Z0MI4V4KX!HMzvrDez(fwdXg4{Rvzx(%fB=;RD!t>G_4P)r$Y4 zAE$kbc)+Yj2TF^;@3mX1$-`(t6h;?0XwC`C9+*^Ks)k*vu1mvphTk$A$o;|$j>r|a z$VHFdT!wYGr?-=}N~MUS%!M)Yk?dM$P-ZN+zP(EbgGQ_mL7i)qKpTAS{i_5*aX>4~ znZFfXUhvue)6-taPpJ@(5JIC+LZp}8H^H5#=8ZGw+n*G|7`gjV{0LDZ{T!&>tC>r8 z@uXMJEG8*Yq3G{9?NgoE%`hdtEMH>w)XTj;DyzL-^eDufct9QwtaIa4cUb%z8@~zq zR~Ng_xub*j*ev-B0hJgw)#!3PK=mkEq-Q&>1{+RSZ0Q;3KI*9urw1-4+FD@uI zAB3c@yyWw8J>WZ3A0()rrL624UA?N@Rr1@;`54j@sa8PR;>Vg<)iu>voUK<5Z_&l` zO)(EqUKw|E+NESB6Znl3TloNA$SN8-EP?}5-?=Bl-}{EDQvPx&)k+!LFAepmdYL+! zTS3~o-OjRlfM(z+WM#!**~&c#-;iTmW1%7_ZPMWTs}9(&JfX+`N(6yP6r-2e<`h3_ zi&1Cao1vC#1iRGx|^BlwmD>!%6bs;YSkJqpQ> zWoH-W+0VxCi~40SYD1C8v8f44-Mh+4_k+o=6k^8TNeOx`&?$4lzN;_q2>CCI`AI#v z$p-F`$P=N%1|F0lbjn%gL-I^% zDcchI9&@~x_yD_`;x0YUO!Hk6!zyPZyOR>=CC_v)a}V=r0kN(3j+TVkCRZc!884iJ zHL>W^V~Hm^%b*=C3Y!hs<;}$C1l}R>STSZLU!l?_RU?zF5g4QFf12GBF7E5WEm(LS zwI1ccmkgfl&wdkc9G18+RaPzhe(;MAsoN{MoJUV=`VHme3MSC$-_ENY+RC5)3XTMf zLK}54&AHAK3}ab8hfyasQ^s6Io`}R%LVU-!P@#;X3CeC6U6nS{MG9ra_f6K1u}FK_ zZ~aYAWJivR@oZZ1nfcFz$~ssVQzl%sHeEs_g?x8nUvR)r*LjhzpPrfDjEqh87M5PT z_3^q%Ow|YJ+|WQ!AT{x6LE@euM=$_iV;DGJ%;E>ccmtjL)Y5`EXnBLxR8g`;d-0OV ze4;+LU$08TXa`=H2kz6gZr2gE&INsrJhDO`?G=R8 z)zQf+6#7JRZhLr)@maVIY;jXPt3i3RnKF40x0bXveU7 zqcma@JQIY=cceQ3CW?YI0bPmLtTj`%Q4|-sbt5K!k6}+^s3{UHg!fl@S+G^8`Gx%U zT=X7W>MGU3uoPQ}s?@55+2oI9&=acQWb|kmTBQ~fL^@O8bK#lGzyA8I1e-cy)HSTF zcBSPy(wOINRznMv-l`;R0EFS?V*|PckDKw9GZb;Xj1A1Yi^?IY4bajlJ`q!~;_zEF zNap7hENLkmgL=%apV9^Vi`~kB*PkR~CzbKyK9a;Y`ttUT74N3WJK0ylH7dEEHb4)x zx2n%r)y(_T$Gp$yk(yB22SY`q)@8$e8lyqZ>~3dwkj!Bb;WP_qYc9kwbO;o=2Us@{ z+4Bgir6MYI*W= z*hl>C@$WE|r)1%LpaAKc2!9jie+WK}@AG$lTdsUt!lC1T*?o%*!{wTQPM~1JB6}83 z30POU4k!n*ke_aE*4dLHP=BWJCRB=s1jE9hA(Im>#pPi8k@bm&?ZI$RI!f|t?$9Fe zLLF+nk##<~zxexjS4DUx_eJ>si1wGz)R{Q&*61{e(SdzkXlXqS=PCOy>&(%VGTOh* zPpiLE${X#G!T9^gdndIytb|O}Mm-Z>+=kU8Aq;rdW_`80p{A*X5ppWEAzbVnWca%v zNHjw}u_XDujf8CFWd4Y+Nvv6BM|}YdDWllM?<-R+KAU)$q{0}E#SaZGJWM3A*fV2% z-C8swtkHJf;3KlpotjD zAPp{XLTIAR%Z;p_nV>8NSl44N+x*fQyf@^wMHZsQP;@kp|E6;@&DuY8fggmunvu(vU)LZjI&mL zahCq^QhY-d8xhcG2xmvE1|oz=sZ7lz3VLIYjG~QLC3{fMFgM$DXpWUS56-oS=4Tno zQMf~`JNxI2C*1&);dg*AIvI4*3=r0r-kKYr@wi>YRUl78;f zLh&bqGDrlzJ;eWzqgCD^Eywr~?1fR78brb2@qAiFH;>lHd6kn2Zwn^(vT!i2DhFSqW~9LxR>BMPs&pWVQYU^-fs2%qfE6D< zBu`>AtgnjD>4HK*69^23>~f3$DHi~Ad{T_bz|&FOxJ=~vA1ow;emTCvKxSw0u2wQV zGUw?Qup@z!kiFoPHVUVp2yy>oHQ)=M8mD^c7CsomRxQ%xXAwtD_qII6RR+#+Nti(h zFmdWo>j1Kki$fYT`>J%a@zfKr*UrEGsQp*t=qdH1-YM}hk!8sgU9cftNH&83>X(I6 zY=N-iE@u{VFkYvkusWxH=2Ojg9}dfj^|#ONAFZz=mf5aq*|w`8o_CyhX~eZm8i257 zR&=~XLhuy_4B2UnC^XXJId6jRl?%i>v+3r-G#JqPHTP2`&W<8n`z^y>B-I;go*IN$ zm5+8pur@zKiXnAOHw-x(!a;yXit!&7;v*IPQc@-F`Vk9J-ZvyXvA)h;qB4QPv@l#q zab~zC@ZGUY|Y50{rnq}v$2cjek(t(YZh~Tf#{;4L*)-q zVl4Nc^H-w1MHiV(;aoYS_AXySRubfcxHAGIH*&5e#D+Lc_ch_@+E7#@Jv!54q1HGV zx5cj^oSuJc$P6>cik&<#j_?2Ot;2+7{DvQ&B%0l#s`khReb}g<&O#rr-mK%BFo)9%5$Sta^f}Q&D?sXCcxC(R6e3#jOR#nBzcgJ z^us)Iu!y!y{=-JDUdz7-Ec&&x8`k}>ZTA$xAnYH&J3C4ut7VO24AAtYt2Rt_uvx;b=*!zNTXb~4 zXko-RO$~`v2!(zgYW955;fkP$GqMB0$+V8Ro2pJy^$blKBK4-1lR&xTB}WjB`BPqKxJ6Hc3r_I4HF8qwj0@vr7ICO=kfV zSJSlZ;BLX)g1fsr1b255T!IHUKyY`06Fj)PySux)yYp|J_xr1>hB>o`U21o!>F&Av zYJ-ctBlc1^D$sty2eX=ZcYbkVb30>W6Ma#A7OP@aJoXIAAj$FHI>p#Xh6|l@c%00Z zq`kamN5G6aO32CaDcr=?3r~wQD6JOCuQUfA5BmH99PSA3 zOc2B`lc-qjJXB3)@&qcq!^>9*`PKX=ssG*F-BVJZC+z87$xNgfqrC0gDNSmXB-&aY z!#3(mGJ9O)**4Zo^QU|E=kZnXW?bzJE4L1~M$YSf$FQTbBiyun(w6NHLvLmLNlJx#uAp2D%CtD1U*_oYGv+g01_v%}O9N6s3xw&)2Mm5%6 z4D2Nf+T;|tjS4w-?}zzN9>5VE+Cn{An+7^7Oal9M3KZ(~_~x+9yQ{m!qU zRq`!;Hh$|yDh9Zj@AU-)oGE2NtHJji;N)jr@M=?B+f=Q?Z?^OaF`7q2 z4|S7cmxYA7A9ls>3l`c4=-2U%?T0x87ZOEqUeYv=xEHTq%OJirKK4R(5{^}>^GeRY zz#$%|h8<_6t$zA27|V17@IAlZRc@8~Gsr1?nt>=Eh3 zK}m%P7_%uT3m<}sN=KrBgGo2Jf^hL9c@TU9JpJIXM8^t4EX#liuX<(X zd9(IBIlSwe1K^Y>*X)sE(qx$FU|UVX*?;~89!eEvxXZWN|Iew1hYIE;CAnoJQ7h`T z;+)9+6bQE{y4=>Fyh2O^B|v{1Be#sG+HNmwWr^JmBD`f22?{=rQiTf0N%8$8miNi| zw!;ZsqGHCPgs4aZeXKGnygJpKaEEMDW}|y*r%G7aCU0+Vy*~_3(e+-B^s*8OB;|Wd z;dI6cP@lIE$H1&yCfJ57`@UR=@CozLmld;RxgIKRySq&`n0n_+|FT+9@2ryIWo=(q zAV=Zd2Bp{gGAt?KwNcGP((}oSRz>!ZY26~qSJ7~~23pDv%_xvLEiv-l**LXNkhk?? zh9K?Ra73g$?iycL+Q8gR`f5B7Oan8jO{VrntUkS}?*q0t-mHT>*6|%`Qr_p36 zl=y8vy$?E&_5>noCTIEp?hlfq zFseFQW1?smX6`V??FhM|BPl;<%=4Um3F@-5%pJlhb3LN)Hzr+-A#kv>%wpphBs>K( z0DG8F=+j&}iIx7Pa_fso$@iU-hg*GAokx6~?4Su|3xAv*p6XB>2o`7)#9kaB1C1@= z2tWLLhn~#7_SJj*dmV&o^Ni6DA6W7?Bywd2)0`?%`cSQF!^H|Gl0e@#+EdN5M)8d$ zt?8$*M#iPju^$R`DS$rVLiV@>_UpnPv466&db$NY^=vTgz^w@XwkkiXY`8-@YSo~f zK5Cg;*7c^cTaH7CLFV+L@((j8`IP^h6TZ;6%2W+m3Q*qF@)O6X4^Np&_8j7|z1AOC zK?4K;#MzTsBO%cr1Tiv5-eWYkrV5Jjo;dFf&o^U;z7_*hGW`IJ7ZLNv7>2g0&c#mH zL2o(~g457}cznL~x|A6eNA0UnZp@He%0Kk!G40ps{s=|xSLxJ0L|Z3Fa_N-OaqoAD zqoiZx@%kVpR1$~@rBM-?Oq_3u@3>n7zHy^XxW+Pw>FI`En>HXUkyw&Y_G-Ojf}^ua zy0`)s2l&yqUEal;1?oIXJ6luANipriFm|f;-aLa6vvETT{~a-$+(el}{bao9P`-Yo z3H|atD*;3*^NK6DY9Sv+kz*L&^1AP)E6vr;(8`W2kkH{;9goG-s(9eC8n0NPj{{Zr z`&17fv?fr1ig084R|?mA;-=S?SL^~Mza9W0g9i;-7v6EnZbjwJDYpXstul01JBkcB=j#8ww7gu!?Sg?hrSWsrnmV5v} z3Uc0%K-X|t=;N zunGelndZ2iPKq7A3kE&c6LOB68XS1un%q+zudd04{h~p~aaxS?{b1apiT05g(c

public string Name { get; set; } - + /// /// The name of the struct in the native library. /// public string NativeName { get; set; } - + /// /// The extension name. /// public string ExtensionName { get; set; } + [JsonIgnore] public string ProfileName { get; set; } [JsonIgnore] public Version ProfileVersion { get; set; } [JsonIgnore] public string[] ClangMetadata { get; set; } - + /// /// A list of fields this struct contains. /// public List Fields { get; set; } = new List(); - + /// /// A list of attributes this struct has. /// public List Attributes { get; set; } = new List(); - + /// /// A list of functions this struct has. /// @@ -51,7 +53,7 @@ public class Struct : IProfileConstituent /// A list of functions contained in the LpVtbl field. ///
public List Vtbl { get; set; } = new List(); - + /// /// A list of interface names which this interface inherits. /// @@ -61,5 +63,34 @@ public class Struct : IProfileConstituent /// This struct's UUID attribute. ///
public Guid? Uuid { get; set; } + + /// + /// Creates an alias of this structure, by cloning it. + /// + /// The alias name. + /// A copy of this instance. + public Struct Clone(string alias = null, string nativeAlias = null) + { + return new Struct + { + Name = alias ?? Name, + // These properties can simply be copied. + NativeName = nativeAlias ?? NativeName, + ExtensionName = ExtensionName, + ProfileName = ProfileName, + ProfileVersion = ProfileVersion, + Uuid = Uuid, + // WARNING these aren't deep clones so modifying any will modify the alias + // This is by design as an alias should not differ in any of these ways, and it means + // that modifying the source or the alias will affect both, which is desirable. + ClangMetadata = ClangMetadata, + Fields = Fields, + Functions = Functions, + Vtbl = Vtbl, + ComBases = ComBases, + // Deep clone, as we often want different attributes on an alias + Attributes = Attributes.Select(a => a.Clone()).ToList() + }; + } } -} \ No newline at end of file +} diff --git a/src/Core/Silk.NET.BuildTools/Converters/Khronos/StructureDefinition.cs b/src/Core/Silk.NET.BuildTools/Converters/Khronos/StructureDefinition.cs index 1de1946f5d..af3f9cae25 100644 --- a/src/Core/Silk.NET.BuildTools/Converters/Khronos/StructureDefinition.cs +++ b/src/Core/Silk.NET.BuildTools/Converters/Khronos/StructureDefinition.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq; using System.Xml.Linq; @@ -7,39 +8,57 @@ namespace Silk.NET.BuildTools.Converters.Khronos public class StructureDefinition { public string Name { get; } + + /// + /// The alias holds the concrete structure definition's name. + /// + public string Alias { get; } public MemberSpec[] Members { get; } + public IReadOnlyList Extends { get; } - public StructureDefinition(string name, MemberSpec[] members) + public StructureDefinition(string name, string alias, MemberSpec[] members, string extends) { Name = name; + Alias = alias; Members = members; + Extends = string.IsNullOrWhiteSpace(extends) + ? Array.Empty() + : extends.Split(',', StringSplitOptions.TrimEntries | StringSplitOptions.RemoveEmptyEntries); } public static StructureDefinition CreateFromXml(XElement xe) { Require.NotNull(xe); + var name = xe.GetNameAttribute(); - if (!(xe.Attribute("alias") is null)) + // Find original definition if this is an alias (this should usually be one step, but we handle gracefully) + var aliases = new HashSet { name }; + string alias = null; + string a; + while ((a = xe.Attribute("alias")?.Value) is not null) { - var ret = CreateFromXml - ( - xe.Document.Element("registry") - .Elements("types") - .Elements("type") - .Where(typex => typex.HasCategoryAttribute("struct")) - .FirstOrDefault(x => x.GetNameAttribute() == xe.Attribute("alias").Value) ?? throw new Exception("wat") - ); - - return new StructureDefinition(xe.GetNameAttribute(), ret.Members); + alias = a; + if (aliases.Contains(alias)) + { + throw new Exception($"A loop of aliases was found as we have seen the '{alias}' alias before."); + } + aliases.Add(alias); + + xe = xe.Document.Element("registry") + .Elements("types") + .Elements("type") + .Where(typex => typex.HasCategoryAttribute("struct")) + .FirstOrDefault(x => x.GetNameAttribute() == alias) ?? + throw new Exception($"Could not find the '{alias}' alias."); } - var name = xe.GetNameAttribute(); var members = xe.Elements ("member") .Where(x => !(x.Element("name") is null)) .Select(memberx => MemberSpec.CreateFromXml(memberx)) .ToArray(); - return new StructureDefinition(name, members); + var extends = xe.Attribute("structextends")?.Value; + return new StructureDefinition(name, alias, members, extends); } public override string ToString() diff --git a/src/Core/Silk.NET.BuildTools/Converters/Readers/VulkanReader.cs b/src/Core/Silk.NET.BuildTools/Converters/Readers/VulkanReader.cs index 8e978d8bbb..289c01b521 100644 --- a/src/Core/Silk.NET.BuildTools/Converters/Readers/VulkanReader.cs +++ b/src/Core/Silk.NET.BuildTools/Converters/Readers/VulkanReader.cs @@ -56,8 +56,79 @@ private Dictionary ConvertStructs(VulkanSpecification spec, Bind var prefix = task.FunctionPrefix; var ret = new Dictionary(); + // Gets all aliases of a struct, no matter where in an alias chain we start + // Note this could be simpler if we just assume we only need to check $VKALIASES, but this + // version is bombproof. + IReadOnlyList GetAllAliasesFromName(string structName) + { + var todo = new Queue(); + todo.Enqueue(structName); + var result = new Dictionary(); + + while (todo.Any()) + { + structName = todo.Dequeue(); + if (!ret.TryGetValue(structName, out var s)) + { + result[structName] = null; + continue; + } + + result[structName] = s; + + // Get any aliases + var aliasOf = s.Attributes + .FirstOrDefault + ( + a => a.Arguments.Count > 1 && a.Name == "BuildToolsIntrinsic" && + a.Arguments[0] == "$VKALIASOF" + ) + ?.Arguments[1]; + if (!string.IsNullOrWhiteSpace(aliasOf) && !result.ContainsKey(aliasOf)) + { + todo.Enqueue(aliasOf); + } + + // Check other way as well + foreach (var a in s.Attributes + .FirstOrDefault + ( + a => a.Arguments.Count > 1 && a.Name == "BuildToolsIntrinsic" && + a.Arguments[0] == "$VKALIASES" + ) + ?.Arguments + .Skip(1) + .Where(a => !string.IsNullOrWhiteSpace(a) && !result.ContainsKey(a)) + .ToArray() + ?? Array.Empty()) + { + todo.Enqueue(a); + } + } + + return result.Values.Where(s => s is not null).ToList(); + } + + // Opposite way round lookup of what aliases exist for this key-struct + // i.e. if VkB is an alias of VkA, and VkC is an alias of VkA, then aliases has [VkA]={VkB,VkC} + var aliases = new Dictionary>(); + // Holds any chain starts for chains we haven't seen yet (should rarely be needed). + var chainExtensions = new List<(Struct, IReadOnlyList)>(); foreach (var s in spec.Structures) { + // Build aliases dictionary + if (!string.IsNullOrWhiteSpace(s.Alias)) + { + if (!aliases.TryGetValue(s.Alias, out var aList)) + { + aList = new(); + aliases[s.Alias] = aList; + } + + aList.Add(s.Name); + continue; + } + var @struct = new Struct { Fields = s.Members.Select @@ -93,9 +164,9 @@ private Dictionary ConvertStructs(VulkanSpecification spec, Bind NativeName = s.Name }; - // Find the STYpe field (and it's position) - var sTypeField = @struct.Fields - .FirstOrDefault(f => f.Name == "SType" && f.Type.Name == "VkStructureType"); + // Find the STYpe field (and it's position, which is required for IChainable + var (sTypeField, sTypeFieldIndex) = @struct.Fields.Select((f, i) => (Field: f, Index: i)) + .FirstOrDefault(f => f.Field.Name == "SType" && f.Field.Type.Name == "VkStructureType"); if (sTypeField is not null) { @struct.Attributes.Add @@ -106,11 +177,124 @@ private Dictionary ConvertStructs(VulkanSpecification spec, Bind Arguments = new() {"$VKSTRUCTUREDTYPE", sTypeField.DefaultAssignment ?? string.Empty} } ); + + // Ensure SType was in position 0, and we have a pointer called PNext in position 1. + Field pNextField; + if (sTypeFieldIndex == 0 && + @struct.Fields.Count > 1 && + (pNextField = @struct.Fields[1]).Name == "PNext" && + pNextField.Type.IsPointer) + { + // The type is at least chainable. + @struct.Attributes.Add + ( + new() + { + Name = "BuildToolsIntrinsic", + Arguments = new() {"$VKCHAINABLE"} + } + ); + + if (s.Extends.Any()) + { + chainExtensions.Add((@struct, s.Extends)); + } + } } ret.Add(s.Name, @struct); } + // Create Aliases + foreach (var (structName, aList) in aliases) + { + if (!ret.TryGetValue(structName, out var @struct)) + { + continue; + } + + foreach (var alias in aList) + { + var aliasStruct = @struct.Clone(Naming.Translate(TrimName(alias, task), prefix), alias); + aliasStruct.Attributes.Add + ( + new() + { + Name = "BuildToolsIntrinsic", + Arguments = new() {"$VKALIASOF", @struct.NativeName} + } + ); + // Create a clone for the alias + ret.Add(alias, aliasStruct); + } + + // Now that we've finished cloning we can add the build intrinsic to the root struct. + @struct.Attributes.Add + ( + new() + { + Name = "BuildToolsIntrinsic", + Arguments = new[] {"$VKALIASES"}.Concat(aList).ToList() + } + ); + } + + // Add chain extensions, we have to do this now to account for aliases, we + if (chainExtensions.Any()) + { + foreach (var (@struct, chainNames) in chainExtensions) + { + // Get all the aliases of this struct (including this one) + var allStructs = GetAllAliasesFromName(@struct.NativeName); + // Get all the chains this struct extends (including their aliases) + var chains = chainNames.SelectMany(n => GetAllAliasesFromName(n)).ToArray(); + + // Add $VKEXTENDSCHAIN build tools intrinsic attribute to all versions of this struct + Attribute attribute = null; + foreach (var s in allStructs) + { + if (attribute is null) + { + // Create $VKEXTENDSCHAIN build tools intrinsic attribute + attribute = new() + { + Name = "BuildToolsIntrinsic", + Arguments = new[] {"$VKEXTENDSCHAIN"}.Concat(chains.Select(c => c.Name)).ToList() + }; + } + else + { + // Clone existing attribute. + attribute = attribute.Clone(); + } + + s.Attributes.Add(attribute); + } + + // Add chain starts to all chains and their aliases + attribute = null; + foreach (var c in chains) + { + if (attribute is null) + { + // Create $VKEXTENDSCHAIN build tools intrinsic attribute + attribute = new() + { + Name = "BuildToolsIntrinsic", + Arguments = new[] {"$VKCHAINSTART"}.Concat(allStructs.Select(s => s.Name)).ToList() + }; + } + else + { + // Clone existing attribute. + attribute = attribute.Clone(); + } + + c.Attributes.Add(attribute); + } + } + } + foreach (var h in spec.Handles) { ret.Add diff --git a/src/Vulkan/Silk.NET.Vulkan/Chain.cs b/src/Vulkan/Silk.NET.Vulkan/Chain.cs new file mode 100644 index 0000000000..9eb07714e8 --- /dev/null +++ b/src/Vulkan/Silk.NET.Vulkan/Chain.cs @@ -0,0 +1,173 @@ +using System.Runtime.CompilerServices; + +namespace Silk.NET.Vulkan; + +public static partial class Chain +{ + /// + /// Replaces a structure in the chain (if present, and is false), or adds it to the end. + /// + /// The current chain + /// A reference to the structure to update + /// Always adds to the end of the chain, even if an equivalent structure is present. + /// The type of the current chain + /// The type of the value + /// A reference to the value value in the chain + /// + /// Note that both the supplied chain, and the supplied value will have their `SType` correctly set. Further, + /// the supplied structure's will be overwritten. + /// To use + /// + /// var indexingFeatures = new PhysicalDeviceDescriptorIndexingFeatures + /// { + /// ShaderInputAttachmentArrayDynamicIndexing = true + /// }; + /// var accelerationStructureFeaturesKhr = new PhysicalDeviceAccelerationStructureFeaturesKhr + /// { + /// AccelerationStructure = true + /// }; + /// + /// PhysicalDeviceFeatures2 + /// .BaseInStructure(out var features2) + /// .SetNext(ref indexingFeatures) + /// .SetNext(ref accelerationStructureFeaturesKhr); + /// + /// + public static unsafe ref TChain SetNext + ( + this ref TChain chain, + ref TNext value, + bool alwaysAdd = false + ) + where TChain : struct, IChainStart + where TNext : struct, IExtendsChain + { + // Ensure structure type of chain and value are set. + chain.StructureType(); + var structureType = value.StructureType(); + + // Find end of chain + var previousPtr = (BaseInStructure*) null; + var currentPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); + var valuePtr = (BaseInStructure*) Unsafe.AsPointer(ref value); + do + { + var nextPtr = currentPtr->PNext; + if (!alwaysAdd && currentPtr->SType == structureType) + { + // We have an existing structure, replace it. + if (previousPtr is not null) + { + previousPtr->PNext = valuePtr; + } + + valuePtr->PNext = nextPtr; + + return ref chain; + } + + previousPtr = currentPtr; + currentPtr = (BaseInStructure*) nextPtr; + } while (currentPtr is not null); + + // Add value to end of chain + previousPtr->PNext = valuePtr; + valuePtr->PNext = null; + + return ref chain; + } + + /// + /// Adds a structure to the end of the chain. + /// + /// The current chain + /// The structure added to the end of the chain + /// The type of the current chain + /// The type of the structure to add + /// The reference to the chain. + /// + /// Note that both the supplied chain, and the added structure will have their `SType` correctly set + /// To use specify the output type required, e.g.: + /// + /// PhysicalDeviceFeatures2 + /// .BaseInStructure(out var features2) + /// .AddNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures) + /// .AddNext(out PhysicalDeviceAccelerationStructureFeaturesKhr accelerationStructureFeaturesKhr); + /// + /// Note, the value is always added, even if an equivalent value is added in the chain already. Use + /// to only add if not already present. + /// + public static unsafe ref TChain AddNext(this ref TChain chain, out TNext next) + where TChain : struct, IChainStart + where TNext : struct, IExtendsChain + { + // Ensure structure type of chain is set. + chain.StructureType(); + + // Find end of chain + var currentPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); + while (currentPtr->PNext is not null) + { + currentPtr = (BaseInStructure*) currentPtr->PNext; + } + + // Create new entry and set it's structure type + next = default; + next.StructureType(); + currentPtr->PNext = (BaseInStructure*) Unsafe.AsPointer(ref next); + return ref chain; + } + + /// + /// Tries to add a structure to the end of the chain. + /// + /// The current chain + /// The structure added to the end of the chain + /// Whether the structure was actually added + /// The type of the current chain + /// The type of the structure to add + /// The reference to the chain. + /// + /// Note that both the supplied chain, and the added structure will have their `SType` correctly set + /// To use specify the output type required, e.g.: + /// + /// PhysicalDeviceFeatures2 + /// .BaseInStructure(out var features2) + /// .TryAddNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures, out var added); + /// + /// + public static unsafe ref TChain TryAddNext(this ref TChain chain, out TNext next, out bool added) + where TChain : struct, IChainStart + where TNext : struct, IExtendsChain + { + // Ensure structure type of chain is set. + chain.StructureType(); + + // Create new entry and get it's structure type + next = default; + var structureType = next.StructureType(); + + // Follow chain + var currentPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); + do + { + if (currentPtr->SType == structureType) + { + added = false; + return ref chain; + } + + var nextPtr = currentPtr->PNext; + if (nextPtr is null) + { + break; + } + + currentPtr = (BaseInStructure*) nextPtr; + } while (true); + + currentPtr->PNext = (BaseInStructure*) Unsafe.AsPointer(ref next); + added = true; + return ref chain; + } +} diff --git a/src/Vulkan/Silk.NET.Vulkan/IChainStart.cs b/src/Vulkan/Silk.NET.Vulkan/IChainStart.cs new file mode 100644 index 0000000000..9ac897e448 --- /dev/null +++ b/src/Vulkan/Silk.NET.Vulkan/IChainStart.cs @@ -0,0 +1,10 @@ +namespace Silk.NET.Vulkan; + +/// +/// Marks a chainable struct as being allowed at the start of a chain. +/// +/// Any will have a corresponding static `BaseInStructure(out var chain)` +/// convenience method. +public interface IChainStart : IChainable +{ +} diff --git a/src/Vulkan/Silk.NET.Vulkan/IChainable.cs b/src/Vulkan/Silk.NET.Vulkan/IChainable.cs new file mode 100644 index 0000000000..03bf0e16ae --- /dev/null +++ b/src/Vulkan/Silk.NET.Vulkan/IChainable.cs @@ -0,0 +1,12 @@ +namespace Silk.NET.Vulkan; + +/// +/// Base interface for any struct that has can set the next value. +/// +/// Note that any structure marked must start with a +/// and a void* field, in that order. This is so that a pointer to it can be coerced +/// to a pointer to a . +public interface IChainable : IStructuredType +{ + unsafe BaseInStructure* PNext { get; set; } +} diff --git a/src/Vulkan/Silk.NET.Vulkan/IExtendsChain.cs b/src/Vulkan/Silk.NET.Vulkan/IExtendsChain.cs new file mode 100644 index 0000000000..306e008327 --- /dev/null +++ b/src/Vulkan/Silk.NET.Vulkan/IExtendsChain.cs @@ -0,0 +1,11 @@ +namespace Silk.NET.Vulkan; + +/// +/// Marks a chainable struct indicating which chain this type +/// extends. +/// +/// A chain start structure. +public interface IExtendsChain : IChainable + where TChain : IChainable +{ +} From ce48c5b0e9612a524454696b4a8a19ad2795d76c Mon Sep 17 00:00:00 2001 From: Craig Dean Date: Tue, 9 Nov 2021 23:17:29 +0000 Subject: [PATCH 33/42] chore: Committing structure changes Commiting just the auto-generated files to not muddy other commits. --- build/cache/vulkan.json.gz | Bin 231590 -> 242839 bytes .../NVRayTracing.gen.cs | 8 +++--- .../NVRayTracingOverloads.gen.cs | 6 ++--- ...rationStructureBuildGeometryInfoKHR.gen.cs | 9 ++++++- ...elerationStructureBuildSizesInfoKHR.gen.cs | 9 ++++++- .../AccelerationStructureCreateInfoKHR.gen.cs | 21 ++++++++++++++- .../AccelerationStructureCreateInfoNV.gen.cs | 9 ++++++- ...rationStructureDeviceAddressInfoKHR.gen.cs | 9 ++++++- ...rationStructureGeometryAabbsDataKHR.gen.cs | 9 ++++++- ...onStructureGeometryInstancesDataKHR.gen.cs | 9 ++++++- .../AccelerationStructureGeometryKHR.gen.cs | 9 ++++++- ...uctureGeometryMotionTrianglesDataNV.gen.cs | 9 ++++++- ...onStructureGeometryTrianglesDataKHR.gen.cs | 21 ++++++++++++++- .../AccelerationStructureInfoNV.gen.cs | 9 ++++++- .../AccelerationStructureInstanceKHR.gen.cs | 1 + .../AccelerationStructureInstanceNV.gen.cs | 1 + ...onStructureMemoryRequirementsInfoNV.gen.cs | 9 ++++++- .../AccelerationStructureMotionInfoNV.gen.cs | 9 ++++++- ...AccelerationStructureVersionInfoKHR.gen.cs | 9 ++++++- .../Structs/AcquireNextImageInfoKHR.gen.cs | 9 ++++++- .../AcquireProfilingLockInfoKHR.gen.cs | 9 ++++++- ...dwareBufferFormatProperties2ANDROID.gen.cs | 9 ++++++- ...rdwareBufferFormatPropertiesANDROID.gen.cs | 9 ++++++- ...roidHardwareBufferPropertiesANDROID.gen.cs | 21 ++++++++++++++- .../AndroidHardwareBufferUsageANDROID.gen.cs | 9 ++++++- .../AndroidSurfaceCreateInfoKHR.gen.cs | 9 ++++++- .../Structs/ApplicationInfo.gen.cs | 9 ++++++- .../Structs/AttachmentDescription2.gen.cs | 22 +++++++++++++++- .../Structs/AttachmentDescription2KHR.gen.cs | 24 ++++++++++++++++-- .../AttachmentDescriptionStencilLayout.gen.cs | 10 +++++++- ...tachmentDescriptionStencilLayoutKHR.gen.cs | 12 +++++++-- .../Structs/AttachmentReference2.gen.cs | 22 +++++++++++++++- .../Structs/AttachmentReference2KHR.gen.cs | 24 ++++++++++++++++-- .../AttachmentReferenceStencilLayout.gen.cs | 10 +++++++- ...AttachmentReferenceStencilLayoutKHR.gen.cs | 12 +++++++-- .../AttachmentSampleCountInfoAMD.gen.cs | 10 +++++++- .../AttachmentSampleCountInfoNV.gen.cs | 10 +++++++- .../Structs/BaseInStructure.gen.cs | 9 ++++++- .../Structs/BaseOutStructure.gen.cs | 9 ++++++- ...ndAccelerationStructureMemoryInfoNV.gen.cs | 9 ++++++- .../BindBufferMemoryDeviceGroupInfo.gen.cs | 10 +++++++- .../BindBufferMemoryDeviceGroupInfoKHR.gen.cs | 12 +++++++-- .../Structs/BindBufferMemoryInfo.gen.cs | 22 +++++++++++++++- .../Structs/BindBufferMemoryInfoKHR.gen.cs | 24 ++++++++++++++++-- .../BindImageMemoryDeviceGroupInfo.gen.cs | 10 +++++++- .../BindImageMemoryDeviceGroupInfoKHR.gen.cs | 12 +++++++-- .../Structs/BindImageMemoryInfo.gen.cs | 22 +++++++++++++++- .../Structs/BindImageMemoryInfoKHR.gen.cs | 24 ++++++++++++++++-- .../BindImageMemorySwapchainInfoKHR.gen.cs | 9 ++++++- .../Structs/BindImagePlaneMemoryInfo.gen.cs | 10 +++++++- .../BindImagePlaneMemoryInfoKHR.gen.cs | 12 +++++++-- .../Structs/BindSparseInfo.gen.cs | 21 ++++++++++++++- .../Structs/BlitImageInfo2KHR.gen.cs | 9 ++++++- ...erCollectionBufferCreateInfoFUCHSIA.gen.cs | 9 ++++++- ...ferCollectionConstraintsInfoFUCHSIA.gen.cs | 9 ++++++- .../BufferCollectionCreateInfoFUCHSIA.gen.cs | 9 ++++++- ...ferCollectionImageCreateInfoFUCHSIA.gen.cs | 9 ++++++- .../BufferCollectionPropertiesFUCHSIA.gen.cs | 9 ++++++- .../BufferConstraintsInfoFUCHSIA.gen.cs | 9 ++++++- .../Structs/BufferCopy2KHR.gen.cs | 9 ++++++- .../Structs/BufferCreateInfo.gen.cs | 21 ++++++++++++++- .../BufferDeviceAddressCreateInfoEXT.gen.cs | 9 ++++++- .../Structs/BufferDeviceAddressInfo.gen.cs | 10 +++++++- .../Structs/BufferDeviceAddressInfoEXT.gen.cs | 12 +++++++-- .../Structs/BufferDeviceAddressInfoKHR.gen.cs | 12 +++++++-- .../Structs/BufferImageCopy2KHR.gen.cs | 21 ++++++++++++++- .../Structs/BufferMemoryBarrier.gen.cs | 9 ++++++- .../Structs/BufferMemoryBarrier2KHR.gen.cs | 9 ++++++- .../BufferMemoryRequirementsInfo2.gen.cs | 10 +++++++- .../BufferMemoryRequirementsInfo2KHR.gen.cs | 12 +++++++-- ...ufferOpaqueCaptureAddressCreateInfo.gen.cs | 10 +++++++- ...erOpaqueCaptureAddressCreateInfoKHR.gen.cs | 12 +++++++-- .../Structs/BufferViewCreateInfo.gen.cs | 9 ++++++- .../Structs/CalibratedTimestampInfoEXT.gen.cs | 9 ++++++- .../Structs/CheckpointData2NV.gen.cs | 9 ++++++- .../Structs/CheckpointDataNV.gen.cs | 9 ++++++- .../Structs/CommandBufferAllocateInfo.gen.cs | 9 ++++++- .../Structs/CommandBufferBeginInfo.gen.cs | 21 ++++++++++++++- ...eritanceConditionalRenderingInfoEXT.gen.cs | 9 ++++++- .../CommandBufferInheritanceInfo.gen.cs | 21 ++++++++++++++- ...eritanceRenderPassTransformInfoQCOM.gen.cs | 9 ++++++- ...ndBufferInheritanceRenderingInfoKHR.gen.cs | 9 ++++++- ...ferInheritanceViewportScissorInfoNV.gen.cs | 9 ++++++- .../Structs/CommandBufferSubmitInfoKHR.gen.cs | 9 ++++++- .../Structs/CommandPoolCreateInfo.gen.cs | 9 ++++++- .../Structs/ComputePipelineCreateInfo.gen.cs | 21 ++++++++++++++- .../ConditionalRenderingBeginInfoEXT.gen.cs | 9 ++++++- .../Structs/ConformanceVersion.gen.cs | 1 + .../Structs/ConformanceVersionKHR.gen.cs | 5 ++-- .../CooperativeMatrixPropertiesNV.gen.cs | 9 ++++++- .../CopyAccelerationStructureInfoKHR.gen.cs | 9 ++++++- ...ccelerationStructureToMemoryInfoKHR.gen.cs | 9 ++++++- .../Structs/CopyBufferInfo2KHR.gen.cs | 9 ++++++- .../Structs/CopyBufferToImageInfo2KHR.gen.cs | 9 ++++++- .../CopyCommandTransformInfoQCOM.gen.cs | 9 ++++++- .../Structs/CopyDescriptorSet.gen.cs | 9 ++++++- .../Structs/CopyImageInfo2KHR.gen.cs | 9 ++++++- .../Structs/CopyImageToBufferInfo2KHR.gen.cs | 9 ++++++- ...emoryToAccelerationStructureInfoKHR.gen.cs | 9 ++++++- .../Structs/CuFunctionCreateInfoNVX.gen.cs | 9 ++++++- .../Structs/CuLaunchInfoNVX.gen.cs | 9 ++++++- .../Structs/CuModuleCreateInfoNVX.gen.cs | 9 ++++++- .../Structs/D3D12FenceSubmitInfoKHR.gen.cs | 9 ++++++- .../Structs/DebugMarkerMarkerInfoEXT.gen.cs | 9 ++++++- .../DebugMarkerObjectNameInfoEXT.gen.cs | 9 ++++++- .../DebugMarkerObjectTagInfoEXT.gen.cs | 9 ++++++- .../DebugReportCallbackCreateInfoEXT.gen.cs | 9 ++++++- .../Structs/DebugUtilsLabelEXT.gen.cs | 9 ++++++- .../DebugUtilsMessengerCallbackDataEXT.gen.cs | 9 ++++++- .../DebugUtilsMessengerCreateInfoEXT.gen.cs | 9 ++++++- .../DebugUtilsObjectNameInfoEXT.gen.cs | 9 ++++++- .../Structs/DebugUtilsObjectTagInfoEXT.gen.cs | 9 ++++++- ...dicatedAllocationBufferCreateInfoNV.gen.cs | 9 ++++++- ...edicatedAllocationImageCreateInfoNV.gen.cs | 9 ++++++- ...catedAllocationMemoryAllocateInfoNV.gen.cs | 9 ++++++- .../Structs/DependencyInfoKHR.gen.cs | 9 ++++++- .../Structs/DescriptorPoolCreateInfo.gen.cs | 21 ++++++++++++++- ...PoolInlineUniformBlockCreateInfoEXT.gen.cs | 9 ++++++- .../Structs/DescriptorSetAllocateInfo.gen.cs | 21 ++++++++++++++- ...ptorSetLayoutBindingFlagsCreateInfo.gen.cs | 10 +++++++- ...rSetLayoutBindingFlagsCreateInfoEXT.gen.cs | 12 +++++++-- .../DescriptorSetLayoutCreateInfo.gen.cs | 21 ++++++++++++++- .../Structs/DescriptorSetLayoutSupport.gen.cs | 22 +++++++++++++++- .../DescriptorSetLayoutSupportKHR.gen.cs | 24 ++++++++++++++++-- ...VariableDescriptorCountAllocateInfo.gen.cs | 10 +++++++- ...iableDescriptorCountAllocateInfoEXT.gen.cs | 12 +++++++-- ...ariableDescriptorCountLayoutSupport.gen.cs | 10 +++++++- ...ableDescriptorCountLayoutSupportEXT.gen.cs | 12 +++++++-- .../DescriptorUpdateTemplateCreateInfo.gen.cs | 10 +++++++- ...scriptorUpdateTemplateCreateInfoKHR.gen.cs | 12 +++++++-- .../DescriptorUpdateTemplateEntry.gen.cs | 1 + .../DescriptorUpdateTemplateEntryKHR.gen.cs | 5 ++-- .../DeviceBufferMemoryRequirementsKHR.gen.cs | 9 ++++++- .../Structs/DeviceCreateInfo.gen.cs | 21 ++++++++++++++- ...viceDeviceMemoryReportCreateInfoEXT.gen.cs | 9 ++++++- ...DeviceDiagnosticsConfigCreateInfoNV.gen.cs | 9 ++++++- .../Structs/DeviceEventInfoEXT.gen.cs | 9 ++++++- .../Structs/DeviceGroupBindSparseInfo.gen.cs | 10 +++++++- .../DeviceGroupBindSparseInfoKHR.gen.cs | 12 +++++++-- .../DeviceGroupCommandBufferBeginInfo.gen.cs | 10 +++++++- ...eviceGroupCommandBufferBeginInfoKHR.gen.cs | 12 +++++++-- .../DeviceGroupDeviceCreateInfo.gen.cs | 10 +++++++- .../DeviceGroupDeviceCreateInfoKHR.gen.cs | 12 +++++++-- .../DeviceGroupPresentCapabilitiesKHR.gen.cs | 9 ++++++- .../Structs/DeviceGroupPresentInfoKHR.gen.cs | 9 ++++++- .../DeviceGroupRenderPassBeginInfo.gen.cs | 10 +++++++- .../DeviceGroupRenderPassBeginInfoKHR.gen.cs | 12 +++++++-- .../Structs/DeviceGroupSubmitInfo.gen.cs | 10 +++++++- .../Structs/DeviceGroupSubmitInfoKHR.gen.cs | 12 +++++++-- .../DeviceGroupSwapchainCreateInfoKHR.gen.cs | 9 ++++++- .../DeviceImageMemoryRequirementsKHR.gen.cs | 9 ++++++- ...eviceMemoryOpaqueCaptureAddressInfo.gen.cs | 10 +++++++- ...ceMemoryOpaqueCaptureAddressInfoKHR.gen.cs | 12 +++++++-- ...ceMemoryOverallocationCreateInfoAMD.gen.cs | 9 ++++++- .../DeviceMemoryReportCallbackDataEXT.gen.cs | 9 ++++++- .../DevicePrivateDataCreateInfoEXT.gen.cs | 9 ++++++- .../Structs/DeviceQueueCreateInfo.gen.cs | 21 ++++++++++++++- ...iceQueueGlobalPriorityCreateInfoEXT.gen.cs | 9 ++++++- .../Structs/DeviceQueueInfo2.gen.cs | 9 ++++++- .../DirectFBSurfaceCreateInfoEXT.gen.cs | 9 ++++++- .../Structs/DisplayEventInfoEXT.gen.cs | 9 ++++++- .../Structs/DisplayModeCreateInfoKHR.gen.cs | 9 ++++++- .../Structs/DisplayModeProperties2KHR.gen.cs | 9 ++++++- ...playNativeHdrSurfaceCapabilitiesAMD.gen.cs | 9 ++++++- .../DisplayPlaneCapabilities2KHR.gen.cs | 9 ++++++- .../Structs/DisplayPlaneInfo2KHR.gen.cs | 9 ++++++- .../Structs/DisplayPlaneProperties2KHR.gen.cs | 9 ++++++- .../Structs/DisplayPowerInfoEXT.gen.cs | 9 ++++++- .../Structs/DisplayPresentInfoKHR.gen.cs | 9 ++++++- .../Structs/DisplayProperties2KHR.gen.cs | 9 ++++++- .../DisplaySurfaceCreateInfoKHR.gen.cs | 9 ++++++- ...DrmFormatModifierPropertiesList2EXT.gen.cs | 9 ++++++- .../DrmFormatModifierPropertiesListEXT.gen.cs | 9 ++++++- .../Structs/EventCreateInfo.gen.cs | 9 ++++++- .../Structs/ExportFenceCreateInfo.gen.cs | 10 +++++++- .../Structs/ExportFenceCreateInfoKHR.gen.cs | 12 +++++++-- .../ExportFenceWin32HandleInfoKHR.gen.cs | 9 ++++++- .../Structs/ExportMemoryAllocateInfo.gen.cs | 10 +++++++- .../ExportMemoryAllocateInfoKHR.gen.cs | 12 +++++++-- .../Structs/ExportMemoryAllocateInfoNV.gen.cs | 9 ++++++- .../ExportMemoryWin32HandleInfoKHR.gen.cs | 9 ++++++- .../ExportMemoryWin32HandleInfoNV.gen.cs | 9 ++++++- .../Structs/ExportSemaphoreCreateInfo.gen.cs | 10 +++++++- .../ExportSemaphoreCreateInfoKHR.gen.cs | 12 +++++++-- .../ExportSemaphoreWin32HandleInfoKHR.gen.cs | 9 ++++++- .../Structs/ExternalBufferProperties.gen.cs | 10 +++++++- .../ExternalBufferPropertiesKHR.gen.cs | 12 +++++++-- .../Structs/ExternalFenceProperties.gen.cs | 10 +++++++- .../Structs/ExternalFencePropertiesKHR.gen.cs | 12 +++++++-- .../Structs/ExternalFormatANDROID.gen.cs | 9 ++++++- .../ExternalImageFormatProperties.gen.cs | 10 +++++++- .../ExternalImageFormatPropertiesKHR.gen.cs | 12 +++++++-- .../ExternalMemoryBufferCreateInfo.gen.cs | 10 +++++++- .../ExternalMemoryBufferCreateInfoKHR.gen.cs | 12 +++++++-- .../ExternalMemoryImageCreateInfo.gen.cs | 10 +++++++- .../ExternalMemoryImageCreateInfoKHR.gen.cs | 12 +++++++-- .../ExternalMemoryImageCreateInfoNV.gen.cs | 9 ++++++- .../Structs/ExternalMemoryProperties.gen.cs | 1 + .../ExternalMemoryPropertiesKHR.gen.cs | 5 ++-- .../ExternalSemaphoreProperties.gen.cs | 10 +++++++- .../ExternalSemaphorePropertiesKHR.gen.cs | 12 +++++++-- .../Structs/FenceCreateInfo.gen.cs | 21 ++++++++++++++- .../Structs/FenceGetFdInfoKHR.gen.cs | 9 ++++++- .../Structs/FenceGetWin32HandleInfoKHR.gen.cs | 9 ++++++- ...icImageViewImageFormatPropertiesEXT.gen.cs | 9 ++++++- .../Structs/FormatProperties2.gen.cs | 22 +++++++++++++++- .../Structs/FormatProperties2KHR.gen.cs | 24 ++++++++++++++++-- .../Structs/FormatProperties3KHR.gen.cs | 9 ++++++- ...ragmentShadingRateAttachmentInfoKHR.gen.cs | 9 ++++++- .../FramebufferAttachmentImageInfo.gen.cs | 10 +++++++- .../FramebufferAttachmentImageInfoKHR.gen.cs | 12 +++++++-- .../FramebufferAttachmentsCreateInfo.gen.cs | 10 +++++++- ...FramebufferAttachmentsCreateInfoKHR.gen.cs | 12 +++++++-- .../Structs/FramebufferCreateInfo.gen.cs | 21 ++++++++++++++- ...ramebufferMixedSamplesCombinationNV.gen.cs | 9 ++++++- .../Structs/GeneratedCommandsInfoNV.gen.cs | 9 ++++++- ...tedCommandsMemoryRequirementsInfoNV.gen.cs | 9 ++++++- .../Structs/GeometryAABBNV.gen.cs | 9 ++++++- .../Silk.NET.Vulkan/Structs/GeometryNV.gen.cs | 9 ++++++- .../Structs/GeometryTrianglesNV.gen.cs | 9 ++++++- .../Structs/GraphicsPipelineCreateInfo.gen.cs | 21 ++++++++++++++- ...icsPipelineShaderGroupsCreateInfoNV.gen.cs | 9 ++++++- .../GraphicsShaderGroupCreateInfoNV.gen.cs | 9 ++++++- .../Structs/HdrMetadataEXT.gen.cs | 9 ++++++- .../HeadlessSurfaceCreateInfoEXT.gen.cs | 9 ++++++- .../Structs/IOSSurfaceCreateInfoMVK.gen.cs | 9 ++++++- .../Structs/ImageBlit2KHR.gen.cs | 21 ++++++++++++++- .../ImageConstraintsInfoFUCHSIA.gen.cs | 9 ++++++- .../Structs/ImageCopy2KHR.gen.cs | 9 ++++++- .../Structs/ImageCreateInfo.gen.cs | 21 ++++++++++++++- ...FormatModifierExplicitCreateInfoEXT.gen.cs | 9 ++++++- ...eDrmFormatModifierListCreateInfoEXT.gen.cs | 9 ++++++- ...ImageDrmFormatModifierPropertiesEXT.gen.cs | 9 ++++++- .../ImageFormatConstraintsInfoFUCHSIA.gen.cs | 9 ++++++- .../Structs/ImageFormatListCreateInfo.gen.cs | 10 +++++++- .../ImageFormatListCreateInfoKHR.gen.cs | 12 +++++++-- .../Structs/ImageFormatProperties2.gen.cs | 22 +++++++++++++++- .../Structs/ImageFormatProperties2KHR.gen.cs | 24 ++++++++++++++++-- .../Structs/ImageMemoryBarrier.gen.cs | 21 ++++++++++++++- .../Structs/ImageMemoryBarrier2KHR.gen.cs | 21 ++++++++++++++- .../ImageMemoryRequirementsInfo2.gen.cs | 22 +++++++++++++++- .../ImageMemoryRequirementsInfo2KHR.gen.cs | 24 ++++++++++++++++-- .../ImagePipeSurfaceCreateInfoFUCHSIA.gen.cs | 9 ++++++- .../ImagePlaneMemoryRequirementsInfo.gen.cs | 10 +++++++- ...ImagePlaneMemoryRequirementsInfoKHR.gen.cs | 12 +++++++-- .../Structs/ImageResolve2KHR.gen.cs | 9 ++++++- .../ImageSparseMemoryRequirementsInfo2.gen.cs | 10 +++++++- ...ageSparseMemoryRequirementsInfo2KHR.gen.cs | 12 +++++++-- .../ImageStencilUsageCreateInfo.gen.cs | 10 +++++++- .../ImageStencilUsageCreateInfoEXT.gen.cs | 12 +++++++-- .../ImageSwapchainCreateInfoKHR.gen.cs | 9 ++++++- .../Structs/ImageViewASTCDecodeModeEXT.gen.cs | 9 ++++++- .../ImageViewAddressPropertiesNVX.gen.cs | 9 ++++++- .../Structs/ImageViewCreateInfo.gen.cs | 21 ++++++++++++++- .../Structs/ImageViewHandleInfoNVX.gen.cs | 9 ++++++- .../Structs/ImageViewUsageCreateInfo.gen.cs | 10 +++++++- .../ImageViewUsageCreateInfoKHR.gen.cs | 12 +++++++-- ...ortAndroidHardwareBufferInfoANDROID.gen.cs | 9 ++++++- .../Structs/ImportFenceFdInfoKHR.gen.cs | 9 ++++++- .../ImportFenceWin32HandleInfoKHR.gen.cs | 9 ++++++- ...ImportMemoryBufferCollectionFUCHSIA.gen.cs | 9 ++++++- .../Structs/ImportMemoryFdInfoKHR.gen.cs | 9 ++++++- .../ImportMemoryHostPointerInfoEXT.gen.cs | 9 ++++++- .../ImportMemoryWin32HandleInfoKHR.gen.cs | 9 ++++++- .../ImportMemoryWin32HandleInfoNV.gen.cs | 9 ++++++- ...ImportMemoryZirconHandleInfoFUCHSIA.gen.cs | 9 ++++++- .../Structs/ImportSemaphoreFdInfoKHR.gen.cs | 9 ++++++- .../ImportSemaphoreWin32HandleInfoKHR.gen.cs | 9 ++++++- ...ortSemaphoreZirconHandleInfoFUCHSIA.gen.cs | 9 ++++++- .../IndirectCommandsLayoutCreateInfoNV.gen.cs | 9 ++++++- .../IndirectCommandsLayoutTokenNV.gen.cs | 9 ++++++- .../InitializePerformanceApiInfoINTEL.gen.cs | 9 ++++++- .../InputAttachmentAspectReference.gen.cs | 1 + .../InputAttachmentAspectReferenceKHR.gen.cs | 5 ++-- .../Structs/InstanceCreateInfo.gen.cs | 21 ++++++++++++++- .../Structs/MacOSSurfaceCreateInfoMVK.gen.cs | 9 ++++++- .../Structs/MappedMemoryRange.gen.cs | 9 ++++++- .../Structs/MemoryAllocateFlagsInfo.gen.cs | 10 +++++++- .../Structs/MemoryAllocateFlagsInfoKHR.gen.cs | 12 +++++++-- .../Structs/MemoryAllocateInfo.gen.cs | 21 ++++++++++++++- .../Structs/MemoryBarrier.gen.cs | 9 ++++++- .../Structs/MemoryBarrier2KHR.gen.cs | 9 ++++++- .../MemoryDedicatedAllocateInfo.gen.cs | 10 +++++++- .../MemoryDedicatedAllocateInfoKHR.gen.cs | 12 +++++++-- .../MemoryDedicatedRequirements.gen.cs | 10 +++++++- .../MemoryDedicatedRequirementsKHR.gen.cs | 12 +++++++-- .../Structs/MemoryFdPropertiesKHR.gen.cs | 9 ++++++- ...GetAndroidHardwareBufferInfoANDROID.gen.cs | 9 ++++++- .../Structs/MemoryGetFdInfoKHR.gen.cs | 9 ++++++- .../MemoryGetRemoteAddressInfoNV.gen.cs | 9 ++++++- .../MemoryGetWin32HandleInfoKHR.gen.cs | 9 ++++++- .../MemoryGetZirconHandleInfoFUCHSIA.gen.cs | 9 ++++++- .../MemoryHostPointerPropertiesEXT.gen.cs | 9 ++++++- ...oryOpaqueCaptureAddressAllocateInfo.gen.cs | 10 +++++++- ...OpaqueCaptureAddressAllocateInfoKHR.gen.cs | 12 +++++++-- .../MemoryPriorityAllocateInfoEXT.gen.cs | 9 ++++++- .../Structs/MemoryRequirements2.gen.cs | 22 +++++++++++++++- .../Structs/MemoryRequirements2KHR.gen.cs | 24 ++++++++++++++++-- .../MemoryWin32HandlePropertiesKHR.gen.cs | 9 ++++++- ...MemoryZirconHandlePropertiesFUCHSIA.gen.cs | 9 ++++++- .../Structs/MetalSurfaceCreateInfoEXT.gen.cs | 9 ++++++- .../Structs/MultisamplePropertiesEXT.gen.cs | 9 ++++++- .../MultiviewPerViewAttributesInfoNVX.gen.cs | 9 ++++++- ...utableDescriptorTypeCreateInfoVALVE.gen.cs | 9 ++++++- .../Structs/NativeBufferANDROID.gen.cs | 9 ++++++- ...rmanceConfigurationAcquireInfoINTEL.gen.cs | 9 ++++++- .../PerformanceCounterDescriptionKHR.gen.cs | 9 ++++++- .../Structs/PerformanceCounterKHR.gen.cs | 9 ++++++- .../Structs/PerformanceMarkerInfoINTEL.gen.cs | 9 ++++++- .../PerformanceOverrideInfoINTEL.gen.cs | 9 ++++++- .../PerformanceQuerySubmitInfoKHR.gen.cs | 9 ++++++- .../PerformanceStreamMarkerInfoINTEL.gen.cs | 9 ++++++- .../PhysicalDevice16BitStorageFeatures.gen.cs | 10 +++++++- ...ysicalDevice16BitStorageFeaturesKHR.gen.cs | 12 +++++++-- ...hysicalDevice4444FormatsFeaturesEXT.gen.cs | 9 ++++++- .../PhysicalDevice8BitStorageFeatures.gen.cs | 10 +++++++- ...hysicalDevice8BitStorageFeaturesKHR.gen.cs | 12 +++++++-- ...PhysicalDeviceASTCDecodeFeaturesEXT.gen.cs | 9 ++++++- ...iceAccelerationStructureFeaturesKHR.gen.cs | 9 ++++++- ...eAccelerationStructurePropertiesKHR.gen.cs | 9 ++++++- ...ceBlendOperationAdvancedFeaturesEXT.gen.cs | 9 ++++++- ...BlendOperationAdvancedPropertiesEXT.gen.cs | 9 ++++++- ...DeviceBorderColorSwizzleFeaturesEXT.gen.cs | 9 ++++++- ...sicalDeviceBufferAddressFeaturesEXT.gen.cs | 12 +++++++-- ...alDeviceBufferDeviceAddressFeatures.gen.cs | 10 +++++++- ...eviceBufferDeviceAddressFeaturesEXT.gen.cs | 10 +++++++- ...eviceBufferDeviceAddressFeaturesKHR.gen.cs | 12 +++++++-- ...icalDeviceCoherentMemoryFeaturesAMD.gen.cs | 9 ++++++- ...alDeviceColorWriteEnableFeaturesEXT.gen.cs | 9 ++++++- ...eComputeShaderDerivativesFeaturesNV.gen.cs | 9 ++++++- ...viceConditionalRenderingFeaturesEXT.gen.cs | 9 ++++++- ...servativeRasterizationPropertiesEXT.gen.cs | 9 ++++++- ...alDeviceCooperativeMatrixFeaturesNV.gen.cs | 9 ++++++- ...DeviceCooperativeMatrixPropertiesNV.gen.cs | 9 ++++++- ...lDeviceCornerSampledImageFeaturesNV.gen.cs | 9 ++++++- ...viceCoverageReductionModeFeaturesNV.gen.cs | 9 ++++++- ...lDeviceCustomBorderColorFeaturesEXT.gen.cs | 9 ++++++- ...eviceCustomBorderColorPropertiesEXT.gen.cs | 9 ++++++- ...edAllocationImageAliasingFeaturesNV.gen.cs | 9 ++++++- ...calDeviceDepthClipEnableFeaturesEXT.gen.cs | 9 ++++++- ...DeviceDepthStencilResolveProperties.gen.cs | 10 +++++++- ...iceDepthStencilResolvePropertiesKHR.gen.cs | 12 +++++++-- ...calDeviceDescriptorIndexingFeatures.gen.cs | 10 +++++++- ...DeviceDescriptorIndexingFeaturesEXT.gen.cs | 12 +++++++-- ...lDeviceDescriptorIndexingProperties.gen.cs | 10 +++++++- ...viceDescriptorIndexingPropertiesEXT.gen.cs | 12 +++++++-- ...ceDeviceGeneratedCommandsFeaturesNV.gen.cs | 9 ++++++- ...DeviceGeneratedCommandsPropertiesNV.gen.cs | 9 ++++++- ...DeviceDeviceMemoryReportFeaturesEXT.gen.cs | 9 ++++++- ...alDeviceDiagnosticsConfigFeaturesNV.gen.cs | 9 ++++++- ...DeviceDiscardRectanglePropertiesEXT.gen.cs | 9 ++++++- .../PhysicalDeviceDriverProperties.gen.cs | 10 +++++++- .../PhysicalDeviceDriverPropertiesKHR.gen.cs | 12 +++++++-- .../PhysicalDeviceDrmPropertiesEXT.gen.cs | 9 ++++++- ...alDeviceDynamicRenderingFeaturesKHR.gen.cs | 9 ++++++- ...calDeviceExclusiveScissorFeaturesNV.gen.cs | 9 ++++++- ...iceExtendedDynamicState2FeaturesEXT.gen.cs | 9 ++++++- ...viceExtendedDynamicStateFeaturesEXT.gen.cs | 9 ++++++- .../PhysicalDeviceExternalBufferInfo.gen.cs | 10 +++++++- ...PhysicalDeviceExternalBufferInfoKHR.gen.cs | 12 +++++++-- .../PhysicalDeviceExternalFenceInfo.gen.cs | 10 +++++++- .../PhysicalDeviceExternalFenceInfoKHR.gen.cs | 12 +++++++-- ...ysicalDeviceExternalImageFormatInfo.gen.cs | 10 +++++++- ...calDeviceExternalImageFormatInfoKHR.gen.cs | 12 +++++++-- ...viceExternalMemoryHostPropertiesEXT.gen.cs | 9 ++++++- ...lDeviceExternalMemoryRDMAFeaturesNV.gen.cs | 9 ++++++- ...PhysicalDeviceExternalSemaphoreInfo.gen.cs | 22 +++++++++++++++- ...sicalDeviceExternalSemaphoreInfoKHR.gen.cs | 24 ++++++++++++++++-- .../Structs/PhysicalDeviceFeatures2.gen.cs | 22 +++++++++++++++- .../Structs/PhysicalDeviceFeatures2KHR.gen.cs | 24 ++++++++++++++++-- ...hysicalDeviceFloat16Int8FeaturesKHR.gen.cs | 12 +++++++-- ...ysicalDeviceFloatControlsProperties.gen.cs | 10 +++++++- ...calDeviceFloatControlsPropertiesKHR.gen.cs | 12 +++++++-- ...eviceFragmentDensityMap2FeaturesEXT.gen.cs | 9 ++++++- ...iceFragmentDensityMap2PropertiesEXT.gen.cs | 9 ++++++- ...DeviceFragmentDensityMapFeaturesEXT.gen.cs | 9 ++++++- ...viceFragmentDensityMapPropertiesEXT.gen.cs | 9 ++++++- ...FragmentShaderBarycentricFeaturesNV.gen.cs | 9 ++++++- ...eFragmentShaderInterlockFeaturesEXT.gen.cs | 9 ++++++- ...eFragmentShadingRateEnumsFeaturesNV.gen.cs | 9 ++++++- ...ragmentShadingRateEnumsPropertiesNV.gen.cs | 9 ++++++- ...eviceFragmentShadingRateFeaturesKHR.gen.cs | 9 ++++++- ...hysicalDeviceFragmentShadingRateKHR.gen.cs | 9 ++++++- ...iceFragmentShadingRatePropertiesKHR.gen.cs | 9 ++++++- ...eviceGlobalPriorityQueryFeaturesEXT.gen.cs | 9 ++++++- .../PhysicalDeviceGroupProperties.gen.cs | 10 +++++++- .../PhysicalDeviceGroupPropertiesKHR.gen.cs | 12 +++++++-- ...hysicalDeviceHostQueryResetFeatures.gen.cs | 10 +++++++- ...icalDeviceHostQueryResetFeaturesEXT.gen.cs | 12 +++++++-- .../Structs/PhysicalDeviceIDProperties.gen.cs | 10 +++++++- .../PhysicalDeviceIDPropertiesKHR.gen.cs | 12 +++++++-- ...DeviceImageDrmFormatModifierInfoEXT.gen.cs | 9 ++++++- .../PhysicalDeviceImageFormatInfo2.gen.cs | 22 +++++++++++++++- .../PhysicalDeviceImageFormatInfo2KHR.gen.cs | 24 ++++++++++++++++-- ...calDeviceImageRobustnessFeaturesEXT.gen.cs | 9 ++++++- ...alDeviceImageViewImageFormatInfoEXT.gen.cs | 9 ++++++- ...lDeviceImagelessFramebufferFeatures.gen.cs | 10 +++++++- ...viceImagelessFramebufferFeaturesKHR.gen.cs | 12 +++++++-- ...icalDeviceIndexTypeUint8FeaturesEXT.gen.cs | 9 ++++++- ...eInheritedViewportScissorFeaturesNV.gen.cs | 9 ++++++- ...DeviceInlineUniformBlockFeaturesEXT.gen.cs | 9 ++++++- ...viceInlineUniformBlockPropertiesEXT.gen.cs | 9 ++++++- ...lDeviceInvocationMaskFeaturesHUAWEI.gen.cs | 9 ++++++- ...lDeviceLineRasterizationFeaturesEXT.gen.cs | 9 ++++++- ...eviceLineRasterizationPropertiesEXT.gen.cs | 9 ++++++- ...hysicalDeviceMaintenance3Properties.gen.cs | 10 +++++++- ...icalDeviceMaintenance3PropertiesKHR.gen.cs | 12 +++++++-- ...ysicalDeviceMaintenance4FeaturesKHR.gen.cs | 9 ++++++- ...icalDeviceMaintenance4PropertiesKHR.gen.cs | 9 ++++++- ...icalDeviceMemoryBudgetPropertiesEXT.gen.cs | 9 ++++++- ...icalDeviceMemoryPriorityFeaturesEXT.gen.cs | 9 ++++++- .../PhysicalDeviceMemoryProperties2.gen.cs | 22 +++++++++++++++- .../PhysicalDeviceMemoryProperties2KHR.gen.cs | 24 ++++++++++++++++-- .../PhysicalDeviceMeshShaderFeaturesNV.gen.cs | 9 ++++++- ...hysicalDeviceMeshShaderPropertiesNV.gen.cs | 9 ++++++- .../PhysicalDeviceMultiDrawFeaturesEXT.gen.cs | 9 ++++++- ...hysicalDeviceMultiDrawPropertiesEXT.gen.cs | 9 ++++++- .../PhysicalDeviceMultiviewFeatures.gen.cs | 10 +++++++- .../PhysicalDeviceMultiviewFeaturesKHR.gen.cs | 12 +++++++-- ...iviewPerViewAttributesPropertiesNVX.gen.cs | 9 ++++++- .../PhysicalDeviceMultiviewProperties.gen.cs | 10 +++++++- ...hysicalDeviceMultiviewPropertiesKHR.gen.cs | 12 +++++++-- ...eMutableDescriptorTypeFeaturesVALVE.gen.cs | 9 ++++++- ...ysicalDevicePCIBusInfoPropertiesEXT.gen.cs | 9 ++++++- ...ageableDeviceLocalMemoryFeaturesEXT.gen.cs | 9 ++++++- ...alDevicePerformanceQueryFeaturesKHR.gen.cs | 9 ++++++- ...DevicePerformanceQueryPropertiesKHR.gen.cs | 9 ++++++- ...lineCreationCacheControlFeaturesEXT.gen.cs | 9 ++++++- ...lineExecutablePropertiesFeaturesKHR.gen.cs | 9 ++++++- ...ysicalDevicePointClippingProperties.gen.cs | 10 +++++++- ...calDevicePointClippingPropertiesKHR.gen.cs | 12 +++++++-- ...lDevicePortabilitySubsetFeaturesKHR.gen.cs | 9 ++++++- ...evicePortabilitySubsetPropertiesKHR.gen.cs | 9 ++++++- .../PhysicalDevicePresentIdFeaturesKHR.gen.cs | 9 ++++++- ...hysicalDevicePresentWaitFeaturesKHR.gen.cs | 9 ++++++- ...DevicePresentationPropertiesANDROID.gen.cs | 9 ++++++- ...itiveTopologyListRestartFeaturesEXT.gen.cs | 9 ++++++- ...hysicalDevicePrivateDataFeaturesEXT.gen.cs | 9 ++++++- .../Structs/PhysicalDeviceProperties2.gen.cs | 22 +++++++++++++++- .../PhysicalDeviceProperties2KHR.gen.cs | 24 ++++++++++++++++-- ...ysicalDeviceProtectedMemoryFeatures.gen.cs | 9 ++++++- ...icalDeviceProtectedMemoryProperties.gen.cs | 9 ++++++- ...calDeviceProvokingVertexFeaturesEXT.gen.cs | 9 ++++++- ...lDeviceProvokingVertexPropertiesEXT.gen.cs | 9 ++++++- ...alDevicePushDescriptorPropertiesKHR.gen.cs | 9 ++++++- ...calDeviceRGBA10X6FormatsFeaturesEXT.gen.cs | 9 ++++++- .../PhysicalDeviceRayQueryFeaturesKHR.gen.cs | 9 ++++++- ...eviceRayTracingMotionBlurFeaturesNV.gen.cs | 9 ++++++- ...DeviceRayTracingPipelineFeaturesKHR.gen.cs | 9 ++++++- ...viceRayTracingPipelinePropertiesKHR.gen.cs | 9 ++++++- ...hysicalDeviceRayTracingPropertiesNV.gen.cs | 9 ++++++- ...epresentativeFragmentTestFeaturesNV.gen.cs | 9 ++++++- ...hysicalDeviceRobustness2FeaturesEXT.gen.cs | 9 ++++++- ...sicalDeviceRobustness2PropertiesEXT.gen.cs | 9 ++++++- ...lDeviceSampleLocationsPropertiesEXT.gen.cs | 9 ++++++- ...DeviceSamplerFilterMinmaxProperties.gen.cs | 10 +++++++- ...iceSamplerFilterMinmaxPropertiesEXT.gen.cs | 12 +++++++-- ...eviceSamplerYcbcrConversionFeatures.gen.cs | 10 +++++++- ...ceSamplerYcbcrConversionFeaturesKHR.gen.cs | 12 +++++++-- ...icalDeviceScalarBlockLayoutFeatures.gen.cs | 10 +++++++- ...lDeviceScalarBlockLayoutFeaturesEXT.gen.cs | 12 +++++++-- ...SeparateDepthStencilLayoutsFeatures.gen.cs | 10 +++++++- ...arateDepthStencilLayoutsFeaturesKHR.gen.cs | 12 +++++++-- ...DeviceShaderAtomicFloat2FeaturesEXT.gen.cs | 9 ++++++- ...lDeviceShaderAtomicFloatFeaturesEXT.gen.cs | 9 ++++++- ...icalDeviceShaderAtomicInt64Features.gen.cs | 10 +++++++- ...lDeviceShaderAtomicInt64FeaturesKHR.gen.cs | 12 +++++++-- ...hysicalDeviceShaderClockFeaturesKHR.gen.cs | 9 ++++++- ...sicalDeviceShaderCoreProperties2AMD.gen.cs | 9 ++++++- ...ysicalDeviceShaderCorePropertiesAMD.gen.cs | 9 ++++++- ...DemoteToHelperInvocationFeaturesEXT.gen.cs | 9 ++++++- ...alDeviceShaderDrawParameterFeatures.gen.cs | 10 +++++++- ...lDeviceShaderDrawParametersFeatures.gen.cs | 10 +++++++- ...icalDeviceShaderFloat16Int8Features.gen.cs | 10 +++++++- ...lDeviceShaderFloat16Int8FeaturesKHR.gen.cs | 12 +++++++-- ...ceShaderImageAtomicInt64FeaturesEXT.gen.cs | 9 ++++++- ...eviceShaderImageFootprintFeaturesNV.gen.cs | 9 ++++++- ...eShaderIntegerDotProductFeaturesKHR.gen.cs | 9 ++++++- ...haderIntegerDotProductPropertiesKHR.gen.cs | 9 ++++++- ...haderIntegerFunctions2FeaturesINTEL.gen.cs | 9 ++++++- ...calDeviceShaderSMBuiltinsFeaturesNV.gen.cs | 9 ++++++- ...lDeviceShaderSMBuiltinsPropertiesNV.gen.cs | 9 ++++++- ...ShaderSubgroupExtendedTypesFeatures.gen.cs | 10 +++++++- ...derSubgroupExtendedTypesFeaturesKHR.gen.cs | 12 +++++++-- ...bgroupUniformControlFlowFeaturesKHR.gen.cs | 9 ++++++- ...haderTerminateInvocationFeaturesKHR.gen.cs | 9 ++++++- ...calDeviceShadingRateImageFeaturesNV.gen.cs | 9 ++++++- ...lDeviceShadingRateImagePropertiesNV.gen.cs | 9 ++++++- ...hysicalDeviceSparseImageFormatInfo2.gen.cs | 10 +++++++- ...icalDeviceSparseImageFormatInfo2KHR.gen.cs | 12 +++++++-- .../PhysicalDeviceSubgroupProperties.gen.cs | 9 ++++++- ...eviceSubgroupSizeControlFeaturesEXT.gen.cs | 9 ++++++- ...iceSubgroupSizeControlPropertiesEXT.gen.cs | 9 ++++++- ...lDeviceSubpassShadingFeaturesHUAWEI.gen.cs | 9 ++++++- ...eviceSubpassShadingPropertiesHUAWEI.gen.cs | 9 ++++++- .../PhysicalDeviceSurfaceInfo2KHR.gen.cs | 21 ++++++++++++++- ...alDeviceSynchronization2FeaturesKHR.gen.cs | 9 ++++++- ...viceTexelBufferAlignmentFeaturesEXT.gen.cs | 9 ++++++- ...ceTexelBufferAlignmentPropertiesEXT.gen.cs | 9 ++++++- ...extureCompressionASTCHDRFeaturesEXT.gen.cs | 9 ++++++- ...icalDeviceTimelineSemaphoreFeatures.gen.cs | 10 +++++++- ...lDeviceTimelineSemaphoreFeaturesKHR.gen.cs | 12 +++++++-- ...alDeviceTimelineSemaphoreProperties.gen.cs | 10 +++++++- ...eviceTimelineSemaphorePropertiesKHR.gen.cs | 12 +++++++-- .../PhysicalDeviceToolPropertiesEXT.gen.cs | 9 ++++++- ...lDeviceTransformFeedbackFeaturesEXT.gen.cs | 9 ++++++- ...eviceTransformFeedbackPropertiesEXT.gen.cs | 9 ++++++- ...UniformBufferStandardLayoutFeatures.gen.cs | 10 +++++++- ...formBufferStandardLayoutFeaturesKHR.gen.cs | 12 +++++++-- ...ysicalDeviceVariablePointerFeatures.gen.cs | 10 +++++++- ...calDeviceVariablePointerFeaturesKHR.gen.cs | 12 +++++++-- ...sicalDeviceVariablePointersFeatures.gen.cs | 10 +++++++- ...alDeviceVariablePointersFeaturesKHR.gen.cs | 12 +++++++-- ...ceVertexAttributeDivisorFeaturesEXT.gen.cs | 9 ++++++- ...VertexAttributeDivisorPropertiesEXT.gen.cs | 9 ++++++- ...eVertexInputDynamicStateFeaturesEXT.gen.cs | 9 ++++++- .../PhysicalDeviceVideoFormatInfoKHR.gen.cs | 9 ++++++- .../PhysicalDeviceVulkan11Features.gen.cs | 9 ++++++- .../PhysicalDeviceVulkan11Properties.gen.cs | 9 ++++++- .../PhysicalDeviceVulkan12Features.gen.cs | 9 ++++++- .../PhysicalDeviceVulkan12Properties.gen.cs | 9 ++++++- ...icalDeviceVulkanMemoryModelFeatures.gen.cs | 10 +++++++- ...lDeviceVulkanMemoryModelFeaturesKHR.gen.cs | 12 +++++++-- ...roupMemoryExplicitLayoutFeaturesKHR.gen.cs | 9 ++++++- ...iceYcbcr2Plane444FormatsFeaturesEXT.gen.cs | 9 ++++++- ...alDeviceYcbcrImageArraysFeaturesEXT.gen.cs | 9 ++++++- ...nitializeWorkgroupMemoryFeaturesKHR.gen.cs | 9 ++++++- .../Structs/PipelineCacheCreateInfo.gen.cs | 9 ++++++- ...olorBlendAdvancedStateCreateInfoEXT.gen.cs | 9 ++++++- .../PipelineColorBlendStateCreateInfo.gen.cs | 21 ++++++++++++++- .../PipelineColorWriteCreateInfoEXT.gen.cs | 9 ++++++- ...ipelineCompilerControlCreateInfoAMD.gen.cs | 9 ++++++- ...CoverageModulationStateCreateInfoNV.gen.cs | 9 ++++++- ...eCoverageReductionStateCreateInfoNV.gen.cs | 9 ++++++- ...ineCoverageToColorStateCreateInfoNV.gen.cs | 9 ++++++- ...pelineCreationFeedbackCreateInfoEXT.gen.cs | 9 ++++++- ...PipelineDepthStencilStateCreateInfo.gen.cs | 9 ++++++- ...eDiscardRectangleStateCreateInfoEXT.gen.cs | 9 ++++++- .../PipelineDynamicStateCreateInfo.gen.cs | 9 ++++++- .../Structs/PipelineExecutableInfoKHR.gen.cs | 9 ++++++- ...ExecutableInternalRepresentationKHR.gen.cs | 9 ++++++- .../PipelineExecutablePropertiesKHR.gen.cs | 9 ++++++- .../PipelineExecutableStatisticKHR.gen.cs | 9 ++++++- ...entShadingRateEnumStateCreateInfoNV.gen.cs | 9 ++++++- ...agmentShadingRateStateCreateInfoKHR.gen.cs | 9 ++++++- .../Structs/PipelineInfoKHR.gen.cs | 9 ++++++- ...ipelineInputAssemblyStateCreateInfo.gen.cs | 9 ++++++- .../Structs/PipelineLayoutCreateInfo.gen.cs | 9 ++++++- .../PipelineLibraryCreateInfoKHR.gen.cs | 9 ++++++- .../PipelineMultisampleStateCreateInfo.gen.cs | 21 ++++++++++++++- ...ationConservativeStateCreateInfoEXT.gen.cs | 9 ++++++- ...rizationDepthClipStateCreateInfoEXT.gen.cs | 9 ++++++- ...RasterizationLineStateCreateInfoEXT.gen.cs | 9 ++++++- ...onProvokingVertexStateCreateInfoEXT.gen.cs | 9 ++++++- ...ipelineRasterizationStateCreateInfo.gen.cs | 21 ++++++++++++++- ...erizationStateRasterizationOrderAMD.gen.cs | 9 ++++++- ...sterizationStateStreamCreateInfoEXT.gen.cs | 9 ++++++- .../PipelineRenderingCreateInfoKHR.gen.cs | 9 ++++++- ...tativeFragmentTestStateCreateInfoNV.gen.cs | 9 ++++++- ...neSampleLocationsStateCreateInfoEXT.gen.cs | 9 ++++++- .../PipelineShaderStageCreateInfo.gen.cs | 21 ++++++++++++++- ...geRequiredSubgroupSizeCreateInfoEXT.gen.cs | 9 ++++++- ...ellationDomainOriginStateCreateInfo.gen.cs | 10 +++++++- ...ationDomainOriginStateCreateInfoKHR.gen.cs | 12 +++++++-- ...PipelineTessellationStateCreateInfo.gen.cs | 21 ++++++++++++++- ...ertexInputDivisorStateCreateInfoEXT.gen.cs | 9 ++++++- .../PipelineVertexInputStateCreateInfo.gen.cs | 21 ++++++++++++++- ...tCoarseSampleOrderStateCreateInfoNV.gen.cs | 9 ++++++- ...rtExclusiveScissorStateCreateInfoNV.gen.cs | 9 ++++++- ...rtShadingRateImageStateCreateInfoNV.gen.cs | 9 ++++++- .../PipelineViewportStateCreateInfo.gen.cs | 21 ++++++++++++++- ...ineViewportSwizzleStateCreateInfoNV.gen.cs | 9 ++++++- ...neViewportWScalingStateCreateInfoNV.gen.cs | 9 ++++++- .../Structs/PresentFrameTokenGGP.gen.cs | 9 ++++++- .../Structs/PresentIdKHR.gen.cs | 9 ++++++- .../Structs/PresentInfoKHR.gen.cs | 21 ++++++++++++++- .../Structs/PresentRegionsKHR.gen.cs | 9 ++++++- .../Structs/PresentTimesInfoGOOGLE.gen.cs | 9 ++++++- .../PrivateDataSlotCreateInfoEXT.gen.cs | 9 ++++++- .../Structs/ProtectedSubmitInfo.gen.cs | 9 ++++++- .../Structs/QueryPoolCreateInfo.gen.cs | 21 ++++++++++++++- .../Structs/QueryPoolCreateInfoINTEL.gen.cs | 12 +++++++-- .../QueryPoolPerformanceCreateInfoKHR.gen.cs | 9 ++++++- ...PoolPerformanceQueryCreateInfoINTEL.gen.cs | 10 +++++++- .../QueueFamilyCheckpointProperties2NV.gen.cs | 9 ++++++- .../QueueFamilyCheckpointPropertiesNV.gen.cs | 9 ++++++- ...ueFamilyGlobalPriorityPropertiesEXT.gen.cs | 9 ++++++- .../Structs/QueueFamilyProperties2.gen.cs | 22 +++++++++++++++- .../Structs/QueueFamilyProperties2KHR.gen.cs | 24 ++++++++++++++++-- .../RayTracingPipelineCreateInfoKHR.gen.cs | 21 ++++++++++++++- .../RayTracingPipelineCreateInfoNV.gen.cs | 21 ++++++++++++++- ...acingPipelineInterfaceCreateInfoKHR.gen.cs | 9 ++++++- .../RayTracingShaderGroupCreateInfoKHR.gen.cs | 9 ++++++- .../RayTracingShaderGroupCreateInfoNV.gen.cs | 9 ++++++- .../RenderPassAttachmentBeginInfo.gen.cs | 10 +++++++- .../RenderPassAttachmentBeginInfoKHR.gen.cs | 12 +++++++-- .../Structs/RenderPassBeginInfo.gen.cs | 21 ++++++++++++++- .../Structs/RenderPassCreateInfo.gen.cs | 21 ++++++++++++++- .../Structs/RenderPassCreateInfo2.gen.cs | 22 +++++++++++++++- .../Structs/RenderPassCreateInfo2KHR.gen.cs | 24 ++++++++++++++++-- ...PassFragmentDensityMapCreateInfoEXT.gen.cs | 9 ++++++- ...PassInputAttachmentAspectCreateInfo.gen.cs | 10 +++++++- ...sInputAttachmentAspectCreateInfoKHR.gen.cs | 12 +++++++-- .../RenderPassMultiviewCreateInfo.gen.cs | 10 +++++++- .../RenderPassMultiviewCreateInfoKHR.gen.cs | 12 +++++++-- ...nderPassSampleLocationsBeginInfoEXT.gen.cs | 9 ++++++- .../RenderPassTransformBeginInfoQCOM.gen.cs | 9 ++++++- .../Structs/RenderingAttachmentInfoKHR.gen.cs | 9 ++++++- ...FragmentDensityMapAttachmentInfoEXT.gen.cs | 9 ++++++- ...ragmentShadingRateAttachmentInfoKHR.gen.cs | 9 ++++++- .../Structs/RenderingInfoKHR.gen.cs | 21 ++++++++++++++- .../Structs/ResolveImageInfo2KHR.gen.cs | 9 ++++++- .../Structs/SampleLocationsInfoEXT.gen.cs | 9 ++++++- ...rColorComponentMappingCreateInfoEXT.gen.cs | 9 ++++++- .../Structs/SamplerCreateInfo.gen.cs | 21 ++++++++++++++- ...mplerCustomBorderColorCreateInfoEXT.gen.cs | 9 ++++++- .../SamplerReductionModeCreateInfo.gen.cs | 10 +++++++- .../SamplerReductionModeCreateInfoEXT.gen.cs | 12 +++++++-- .../SamplerYcbcrConversionCreateInfo.gen.cs | 22 +++++++++++++++- ...SamplerYcbcrConversionCreateInfoKHR.gen.cs | 24 ++++++++++++++++-- ...cbcrConversionImageFormatProperties.gen.cs | 10 +++++++- ...rConversionImageFormatPropertiesKHR.gen.cs | 12 +++++++-- .../Structs/SamplerYcbcrConversionInfo.gen.cs | 10 +++++++- .../SamplerYcbcrConversionInfoKHR.gen.cs | 12 +++++++-- .../Structs/ScreenSurfaceCreateInfoQNX.gen.cs | 9 ++++++- .../Structs/SemaphoreCreateInfo.gen.cs | 21 ++++++++++++++- .../Structs/SemaphoreGetFdInfoKHR.gen.cs | 9 ++++++- .../SemaphoreGetWin32HandleInfoKHR.gen.cs | 9 ++++++- ...SemaphoreGetZirconHandleInfoFUCHSIA.gen.cs | 9 ++++++- .../Structs/SemaphoreSignalInfo.gen.cs | 10 +++++++- .../Structs/SemaphoreSignalInfoKHR.gen.cs | 12 +++++++-- .../Structs/SemaphoreSubmitInfoKHR.gen.cs | 9 ++++++- .../Structs/SemaphoreTypeCreateInfo.gen.cs | 10 +++++++- .../Structs/SemaphoreTypeCreateInfoKHR.gen.cs | 12 +++++++-- .../Structs/SemaphoreWaitInfo.gen.cs | 10 +++++++- .../Structs/SemaphoreWaitInfoKHR.gen.cs | 12 +++++++-- .../Structs/ShaderModuleCreateInfo.gen.cs | 21 ++++++++++++++- ...rModuleValidationCacheCreateInfoEXT.gen.cs | 9 ++++++- ...SharedPresentSurfaceCapabilitiesKHR.gen.cs | 9 ++++++- .../SparseImageFormatProperties2.gen.cs | 10 +++++++- .../SparseImageFormatProperties2KHR.gen.cs | 12 +++++++-- .../SparseImageMemoryRequirements2.gen.cs | 10 +++++++- .../SparseImageMemoryRequirements2KHR.gen.cs | 12 +++++++-- ...treamDescriptorSurfaceCreateInfoGGP.gen.cs | 9 ++++++- .../Silk.NET.Vulkan/Structs/SubmitInfo.gen.cs | 21 ++++++++++++++- .../Structs/SubmitInfo2KHR.gen.cs | 21 ++++++++++++++- .../Structs/SubpassBeginInfo.gen.cs | 10 +++++++- .../Structs/SubpassBeginInfoKHR.gen.cs | 12 +++++++-- .../Structs/SubpassDependency2.gen.cs | 22 +++++++++++++++- .../Structs/SubpassDependency2KHR.gen.cs | 24 ++++++++++++++++-- .../Structs/SubpassDescription2.gen.cs | 22 +++++++++++++++- .../Structs/SubpassDescription2KHR.gen.cs | 24 ++++++++++++++++-- ...bpassDescriptionDepthStencilResolve.gen.cs | 10 +++++++- ...ssDescriptionDepthStencilResolveKHR.gen.cs | 12 +++++++-- .../Structs/SubpassEndInfo.gen.cs | 10 +++++++- .../Structs/SubpassEndInfoKHR.gen.cs | 12 +++++++-- ...passShadingPipelineCreateInfoHUAWEI.gen.cs | 9 ++++++- .../Structs/SurfaceCapabilities2EXT.gen.cs | 9 ++++++- .../Structs/SurfaceCapabilities2KHR.gen.cs | 21 ++++++++++++++- ...eCapabilitiesFullScreenExclusiveEXT.gen.cs | 9 ++++++- .../Structs/SurfaceFormat2KHR.gen.cs | 9 ++++++- .../SurfaceFullScreenExclusiveInfoEXT.gen.cs | 9 ++++++- ...faceFullScreenExclusiveWin32InfoEXT.gen.cs | 9 ++++++- .../SurfaceProtectedCapabilitiesKHR.gen.cs | 9 ++++++- .../SwapchainCounterCreateInfoEXT.gen.cs | 9 ++++++- .../Structs/SwapchainCreateInfoKHR.gen.cs | 21 ++++++++++++++- ...pchainDisplayNativeHdrCreateInfoAMD.gen.cs | 9 ++++++- .../SwapchainImageCreateInfoANDROID.gen.cs | 9 ++++++- .../Structs/SysmemColorSpaceFUCHSIA.gen.cs | 9 ++++++- ...TextureLODGatherFormatPropertiesAMD.gen.cs | 9 ++++++- .../TimelineSemaphoreSubmitInfo.gen.cs | 10 +++++++- .../TimelineSemaphoreSubmitInfoKHR.gen.cs | 12 +++++++-- .../Structs/TransformMatrixKHR.gen.cs | 1 + .../Structs/TransformMatrixNV.gen.cs | 1 + .../ValidationCacheCreateInfoEXT.gen.cs | 9 ++++++- .../Structs/ValidationFeaturesEXT.gen.cs | 9 ++++++- .../Structs/ValidationFlagsEXT.gen.cs | 9 ++++++- ...VertexInputAttributeDescription2EXT.gen.cs | 9 ++++++- .../VertexInputBindingDescription2EXT.gen.cs | 9 ++++++- .../Structs/ViSurfaceCreateInfoNN.gen.cs | 9 ++++++- .../Structs/VideoBeginCodingInfoKHR.gen.cs | 9 ++++++- .../Structs/VideoBindMemoryKHR.gen.cs | 9 ++++++- .../Structs/VideoCapabilitiesKHR.gen.cs | 21 ++++++++++++++- .../Structs/VideoCodingControlInfoKHR.gen.cs | 21 ++++++++++++++- .../VideoDecodeH264CapabilitiesEXT.gen.cs | 9 ++++++- .../VideoDecodeH264DpbSlotInfoEXT.gen.cs | 9 ++++++- .../Structs/VideoDecodeH264MvcEXT.gen.cs | 9 ++++++- .../VideoDecodeH264PictureInfoEXT.gen.cs | 21 ++++++++++++++- .../Structs/VideoDecodeH264ProfileEXT.gen.cs | 9 ++++++- ...VideoDecodeH264SessionCreateInfoEXT.gen.cs | 9 ++++++- ...codeH264SessionParametersAddInfoEXT.gen.cs | 9 ++++++- ...eH264SessionParametersCreateInfoEXT.gen.cs | 9 ++++++- .../VideoDecodeH265CapabilitiesEXT.gen.cs | 9 ++++++- .../VideoDecodeH265DpbSlotInfoEXT.gen.cs | 9 ++++++- .../VideoDecodeH265PictureInfoEXT.gen.cs | 9 ++++++- .../Structs/VideoDecodeH265ProfileEXT.gen.cs | 9 ++++++- ...VideoDecodeH265SessionCreateInfoEXT.gen.cs | 9 ++++++- ...codeH265SessionParametersAddInfoEXT.gen.cs | 9 ++++++- ...eH265SessionParametersCreateInfoEXT.gen.cs | 9 ++++++- .../Structs/VideoDecodeInfoKHR.gen.cs | 21 ++++++++++++++- .../VideoEncodeH264CapabilitiesEXT.gen.cs | 9 ++++++- .../VideoEncodeH264DpbSlotInfoEXT.gen.cs | 9 ++++++- ...oEncodeH264EmitPictureParametersEXT.gen.cs | 9 ++++++- .../VideoEncodeH264NaluSliceEXT.gen.cs | 9 ++++++- .../Structs/VideoEncodeH264ProfileEXT.gen.cs | 9 ++++++- ...VideoEncodeH264SessionCreateInfoEXT.gen.cs | 9 ++++++- ...codeH264SessionParametersAddInfoEXT.gen.cs | 9 ++++++- ...eH264SessionParametersCreateInfoEXT.gen.cs | 9 ++++++- .../VideoEncodeH264VclFrameInfoEXT.gen.cs | 9 ++++++- .../VideoEncodeH265CapabilitiesEXT.gen.cs | 9 ++++++- .../VideoEncodeH265DpbSlotInfoEXT.gen.cs | 9 ++++++- ...oEncodeH265EmitPictureParametersEXT.gen.cs | 9 ++++++- .../VideoEncodeH265NaluSliceEXT.gen.cs | 9 ++++++- .../Structs/VideoEncodeH265ProfileEXT.gen.cs | 9 ++++++- .../VideoEncodeH265ReferenceListsEXT.gen.cs | 9 ++++++- ...VideoEncodeH265SessionCreateInfoEXT.gen.cs | 9 ++++++- ...codeH265SessionParametersAddInfoEXT.gen.cs | 9 ++++++- ...eH265SessionParametersCreateInfoEXT.gen.cs | 9 ++++++- .../VideoEncodeH265VclFrameInfoEXT.gen.cs | 9 ++++++- .../Structs/VideoEncodeInfoKHR.gen.cs | 21 ++++++++++++++- .../VideoEncodeRateControlInfoKHR.gen.cs | 9 ++++++- .../Structs/VideoEndCodingInfoKHR.gen.cs | 9 ++++++- .../Structs/VideoFormatPropertiesKHR.gen.cs | 9 ++++++- .../VideoGetMemoryPropertiesKHR.gen.cs | 9 ++++++- .../Structs/VideoPictureResourceKHR.gen.cs | 9 ++++++- .../Structs/VideoProfileKHR.gen.cs | 21 ++++++++++++++- .../Structs/VideoProfilesKHR.gen.cs | 9 ++++++- .../VideoQueueFamilyProperties2KHR.gen.cs | 9 ++++++- .../Structs/VideoReferenceSlotKHR.gen.cs | 21 ++++++++++++++- .../Structs/VideoSessionCreateInfoKHR.gen.cs | 21 ++++++++++++++- ...VideoSessionParametersCreateInfoKHR.gen.cs | 21 ++++++++++++++- ...VideoSessionParametersUpdateInfoKHR.gen.cs | 21 ++++++++++++++- .../WaylandSurfaceCreateInfoKHR.gen.cs | 9 ++++++- ...in32KeyedMutexAcquireReleaseInfoKHR.gen.cs | 9 ++++++- ...Win32KeyedMutexAcquireReleaseInfoNV.gen.cs | 9 ++++++- .../Structs/Win32SurfaceCreateInfoKHR.gen.cs | 9 ++++++- .../Structs/WriteDescriptorSet.gen.cs | 21 ++++++++++++++- ...scriptorSetAccelerationStructureKHR.gen.cs | 9 ++++++- ...escriptorSetAccelerationStructureNV.gen.cs | 9 ++++++- ...eDescriptorSetInlineUniformBlockEXT.gen.cs | 9 ++++++- .../Structs/XcbSurfaceCreateInfoKHR.gen.cs | 9 ++++++- .../Structs/XlibSurfaceCreateInfoKHR.gen.cs | 9 ++++++- 742 files changed, 7315 insertions(+), 852 deletions(-) diff --git a/build/cache/vulkan.json.gz b/build/cache/vulkan.json.gz index c7fe1f78229e2c50b77c59dec2cda7e03277220e..e336240b73c74938b2feef04d67efc6b23500e6d 100644 GIT binary patch delta 215062 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%0Dk|Us>WFS!d&y1ywNFvR^=p1G+Rl< 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 z
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 be documented. [NativeApi(EntryPoint = "vkGetAccelerationStructureMemoryRequirementsNV")] - public unsafe partial void GetAccelerationStructureMemoryRequirements([Count(Count = 0)] Device device, [Count(Count = 0), Flow(FlowDirection.In)] AccelerationStructureMemoryRequirementsInfoNV* pInfo, [Count(Count = 0), Flow(FlowDirection.Out)] MemoryRequirements2KHR* pMemoryRequirements); + public unsafe partial void GetAccelerationStructureMemoryRequirements([Count(Count = 0)] Device device, [Count(Count = 0), Flow(FlowDirection.In)] AccelerationStructureMemoryRequirementsInfoNV* pInfo, [Count(Count = 0), Flow(FlowDirection.Out)] MemoryRequirements2Khr* pMemoryRequirements); /// To be documented. [Inject(SilkTouchStage.Begin, "pMemoryRequirements = new(StructureType.MemoryRequirements2);")] [NativeApi(EntryPoint = "vkGetAccelerationStructureMemoryRequirementsNV")] - public unsafe partial void GetAccelerationStructureMemoryRequirements([Count(Count = 0)] Device device, [Count(Count = 0), Flow(FlowDirection.In)] AccelerationStructureMemoryRequirementsInfoNV* pInfo, [Count(Count = 0), Flow(FlowDirection.Out)] out MemoryRequirements2KHR pMemoryRequirements); + public unsafe partial void GetAccelerationStructureMemoryRequirements([Count(Count = 0)] Device device, [Count(Count = 0), Flow(FlowDirection.In)] AccelerationStructureMemoryRequirementsInfoNV* pInfo, [Count(Count = 0), Flow(FlowDirection.Out)] out MemoryRequirements2Khr pMemoryRequirements); /// To be documented. [NativeApi(EntryPoint = "vkGetAccelerationStructureMemoryRequirementsNV")] - public unsafe partial void GetAccelerationStructureMemoryRequirements([Count(Count = 0)] Device device, [Count(Count = 0), Flow(FlowDirection.In)] in AccelerationStructureMemoryRequirementsInfoNV pInfo, [Count(Count = 0), Flow(FlowDirection.Out)] MemoryRequirements2KHR* pMemoryRequirements); + public unsafe partial void GetAccelerationStructureMemoryRequirements([Count(Count = 0)] Device device, [Count(Count = 0), Flow(FlowDirection.In)] in AccelerationStructureMemoryRequirementsInfoNV pInfo, [Count(Count = 0), Flow(FlowDirection.Out)] MemoryRequirements2Khr* pMemoryRequirements); /// To be documented. [Inject(SilkTouchStage.Begin, "pMemoryRequirements = new(StructureType.MemoryRequirements2);")] [NativeApi(EntryPoint = "vkGetAccelerationStructureMemoryRequirementsNV")] - public partial void GetAccelerationStructureMemoryRequirements([Count(Count = 0)] Device device, [Count(Count = 0), Flow(FlowDirection.In)] in AccelerationStructureMemoryRequirementsInfoNV pInfo, [Count(Count = 0), Flow(FlowDirection.Out)] out MemoryRequirements2KHR pMemoryRequirements); + public partial void GetAccelerationStructureMemoryRequirements([Count(Count = 0)] Device device, [Count(Count = 0), Flow(FlowDirection.In)] in AccelerationStructureMemoryRequirementsInfoNV pInfo, [Count(Count = 0), Flow(FlowDirection.Out)] out MemoryRequirements2Khr pMemoryRequirements); /// To be documented. [NativeApi(EntryPoint = "vkGetRayTracingShaderGroupHandlesNV")] diff --git a/src/Vulkan/Extensions/Silk.NET.Vulkan.Extensions.NV/NVRayTracingOverloads.gen.cs b/src/Vulkan/Extensions/Silk.NET.Vulkan.Extensions.NV/NVRayTracingOverloads.gen.cs index 92ea160235..0fbc0c5637 100644 --- a/src/Vulkan/Extensions/Silk.NET.Vulkan.Extensions.NV/NVRayTracingOverloads.gen.cs +++ b/src/Vulkan/Extensions/Silk.NET.Vulkan.Extensions.NV/NVRayTracingOverloads.gen.cs @@ -151,14 +151,14 @@ public static unsafe Result GetAccelerationStructureHandle(this NVRayTracing /// To be documented. [Inject(SilkTouchStage.Begin, "pMemoryRequirements = new(StructureType.MemoryRequirements2);")] - public static unsafe void GetAccelerationStructureMemoryRequirements(this NVRayTracing thisApi, [Count(Count = 0)] Device device, [Count(Count = 0), Flow(FlowDirection.In)] AccelerationStructureMemoryRequirementsInfoNV* pInfo, [Count(Count = 0), Flow(FlowDirection.Out)] Span pMemoryRequirements) + public static unsafe void GetAccelerationStructureMemoryRequirements(this NVRayTracing thisApi, [Count(Count = 0)] Device device, [Count(Count = 0), Flow(FlowDirection.In)] AccelerationStructureMemoryRequirementsInfoNV* pInfo, [Count(Count = 0), Flow(FlowDirection.Out)] Span pMemoryRequirements) { // SpanOverloader thisApi.GetAccelerationStructureMemoryRequirements(device, pInfo, out pMemoryRequirements.GetPinnableReference()); } /// To be documented. - public static unsafe void GetAccelerationStructureMemoryRequirements(this NVRayTracing thisApi, [Count(Count = 0)] Device device, [Count(Count = 0), Flow(FlowDirection.In)] ReadOnlySpan pInfo, [Count(Count = 0), Flow(FlowDirection.Out)] MemoryRequirements2KHR* pMemoryRequirements) + public static unsafe void GetAccelerationStructureMemoryRequirements(this NVRayTracing thisApi, [Count(Count = 0)] Device device, [Count(Count = 0), Flow(FlowDirection.In)] ReadOnlySpan pInfo, [Count(Count = 0), Flow(FlowDirection.Out)] MemoryRequirements2Khr* pMemoryRequirements) { // SpanOverloader thisApi.GetAccelerationStructureMemoryRequirements(device, in pInfo.GetPinnableReference(), pMemoryRequirements); @@ -166,7 +166,7 @@ public static unsafe void GetAccelerationStructureMemoryRequirements(this NVRayT /// To be documented. [Inject(SilkTouchStage.Begin, "pMemoryRequirements = new(StructureType.MemoryRequirements2);")] - public static unsafe void GetAccelerationStructureMemoryRequirements(this NVRayTracing thisApi, [Count(Count = 0)] Device device, [Count(Count = 0), Flow(FlowDirection.In)] ReadOnlySpan pInfo, [Count(Count = 0), Flow(FlowDirection.Out)] Span pMemoryRequirements) + public static unsafe void GetAccelerationStructureMemoryRequirements(this NVRayTracing thisApi, [Count(Count = 0)] Device device, [Count(Count = 0), Flow(FlowDirection.In)] ReadOnlySpan pInfo, [Count(Count = 0), Flow(FlowDirection.Out)] Span pMemoryRequirements) { // SpanOverloader thisApi.GetAccelerationStructureMemoryRequirements(device, in pInfo.GetPinnableReference(), out pMemoryRequirements.GetPinnableReference()); diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureBuildGeometryInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureBuildGeometryInfoKHR.gen.cs index 9f5c6b4dad..9748cd4fec 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureBuildGeometryInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureBuildGeometryInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAccelerationStructureBuildGeometryInfoKHR")] - public unsafe partial struct AccelerationStructureBuildGeometryInfoKHR : IStructuredType + public unsafe partial struct AccelerationStructureBuildGeometryInfoKHR : IChainable { public AccelerationStructureBuildGeometryInfoKHR ( @@ -151,5 +151,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.AccelerationStructureBuildGeometryInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureBuildSizesInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureBuildSizesInfoKHR.gen.cs index 23531a9d36..9efc522c44 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureBuildSizesInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureBuildSizesInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAccelerationStructureBuildSizesInfoKHR")] - public unsafe partial struct AccelerationStructureBuildSizesInfoKHR : IStructuredType + public unsafe partial struct AccelerationStructureBuildSizesInfoKHR : IChainable { public AccelerationStructureBuildSizesInfoKHR ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.AccelerationStructureBuildSizesInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureCreateInfoKHR.gen.cs index 8bf202c6c6..76959b03a5 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAccelerationStructureCreateInfoKHR")] - public unsafe partial struct AccelerationStructureCreateInfoKHR : IStructuredType + public unsafe partial struct AccelerationStructureCreateInfoKHR : IChainStart { public AccelerationStructureCreateInfoKHR ( @@ -118,5 +118,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.AccelerationStructureCreateInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref AccelerationStructureCreateInfoKHR Chain( + out AccelerationStructureCreateInfoKHR capture) + { + capture = new AccelerationStructureCreateInfoKHR(StructureType.AccelerationStructureCreateInfoKhr); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureCreateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureCreateInfoNV.gen.cs index 22222a3a69..dfaa45f954 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureCreateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureCreateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAccelerationStructureCreateInfoNV")] - public unsafe partial struct AccelerationStructureCreateInfoNV : IStructuredType + public unsafe partial struct AccelerationStructureCreateInfoNV : IChainable { public AccelerationStructureCreateInfoNV ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.AccelerationStructureCreateInfoNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureDeviceAddressInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureDeviceAddressInfoKHR.gen.cs index ebbff97e7c..bae174f9dd 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureDeviceAddressInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureDeviceAddressInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAccelerationStructureDeviceAddressInfoKHR")] - public unsafe partial struct AccelerationStructureDeviceAddressInfoKHR : IStructuredType + public unsafe partial struct AccelerationStructureDeviceAddressInfoKHR : IChainable { public AccelerationStructureDeviceAddressInfoKHR ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.AccelerationStructureDeviceAddressInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureGeometryAabbsDataKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureGeometryAabbsDataKHR.gen.cs index 0b802df2f1..b3a73b0fd9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureGeometryAabbsDataKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureGeometryAabbsDataKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAccelerationStructureGeometryAabbsDataKHR")] - public unsafe partial struct AccelerationStructureGeometryAabbsDataKHR : IStructuredType + public unsafe partial struct AccelerationStructureGeometryAabbsDataKHR : IChainable { public AccelerationStructureGeometryAabbsDataKHR ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.AccelerationStructureGeometryAabbsDataKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureGeometryInstancesDataKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureGeometryInstancesDataKHR.gen.cs index 5ae2414117..e066c011d0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureGeometryInstancesDataKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureGeometryInstancesDataKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAccelerationStructureGeometryInstancesDataKHR")] - public unsafe partial struct AccelerationStructureGeometryInstancesDataKHR : IStructuredType + public unsafe partial struct AccelerationStructureGeometryInstancesDataKHR : IChainable { public AccelerationStructureGeometryInstancesDataKHR ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.AccelerationStructureGeometryInstancesDataKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureGeometryKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureGeometryKHR.gen.cs index 33a1c5e632..9916a92110 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureGeometryKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureGeometryKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAccelerationStructureGeometryKHR")] - public unsafe partial struct AccelerationStructureGeometryKHR : IStructuredType + public unsafe partial struct AccelerationStructureGeometryKHR : IChainable { public AccelerationStructureGeometryKHR ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.AccelerationStructureGeometryKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureGeometryMotionTrianglesDataNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureGeometryMotionTrianglesDataNV.gen.cs index 035b8f9a1a..05312ac34e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureGeometryMotionTrianglesDataNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureGeometryMotionTrianglesDataNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAccelerationStructureGeometryMotionTrianglesDataNV")] - public unsafe partial struct AccelerationStructureGeometryMotionTrianglesDataNV : IStructuredType + public unsafe partial struct AccelerationStructureGeometryMotionTrianglesDataNV : IExtendsChain { public AccelerationStructureGeometryMotionTrianglesDataNV ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.AccelerationStructureGeometryMotionTrianglesDataNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureGeometryTrianglesDataKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureGeometryTrianglesDataKHR.gen.cs index 4c2f9357f2..23d7d25d35 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureGeometryTrianglesDataKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureGeometryTrianglesDataKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAccelerationStructureGeometryTrianglesDataKHR")] - public unsafe partial struct AccelerationStructureGeometryTrianglesDataKHR : IStructuredType + public unsafe partial struct AccelerationStructureGeometryTrianglesDataKHR : IChainStart { public AccelerationStructureGeometryTrianglesDataKHR ( @@ -129,5 +129,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.AccelerationStructureGeometryTrianglesDataKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref AccelerationStructureGeometryTrianglesDataKHR Chain( + out AccelerationStructureGeometryTrianglesDataKHR capture) + { + capture = new AccelerationStructureGeometryTrianglesDataKHR(StructureType.AccelerationStructureGeometryTrianglesDataKhr); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureInfoNV.gen.cs index 1b850db80f..9c688242c5 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAccelerationStructureInfoNV")] - public unsafe partial struct AccelerationStructureInfoNV : IStructuredType + public unsafe partial struct AccelerationStructureInfoNV : IChainable { public AccelerationStructureInfoNV ( @@ -107,5 +107,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.AccelerationStructureInfoNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureInstanceKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureInstanceKHR.gen.cs index 8be3285c85..b32568108e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureInstanceKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureInstanceKHR.gen.cs @@ -17,6 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAccelerationStructureInstanceKHR")] + [NativeName("Aliases", "VkAccelerationStructureInstanceNV")] public unsafe partial struct AccelerationStructureInstanceKHR { public AccelerationStructureInstanceKHR diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureInstanceNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureInstanceNV.gen.cs index 1816b8afd4..685e76d9ec 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureInstanceNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureInstanceNV.gen.cs @@ -17,6 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAccelerationStructureInstanceNV")] + [NativeName("AliasOf", "VkAccelerationStructureInstanceKHR")] public unsafe partial struct AccelerationStructureInstanceNV { public AccelerationStructureInstanceNV diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureMemoryRequirementsInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureMemoryRequirementsInfoNV.gen.cs index 7cced3d302..0e4cac38c1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureMemoryRequirementsInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureMemoryRequirementsInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAccelerationStructureMemoryRequirementsInfoNV")] - public unsafe partial struct AccelerationStructureMemoryRequirementsInfoNV : IStructuredType + public unsafe partial struct AccelerationStructureMemoryRequirementsInfoNV : IChainable { public AccelerationStructureMemoryRequirementsInfoNV ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.AccelerationStructureMemoryRequirementsInfoNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureMotionInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureMotionInfoNV.gen.cs index d5b6aa34ca..9c11e36cd9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureMotionInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureMotionInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAccelerationStructureMotionInfoNV")] - public unsafe partial struct AccelerationStructureMotionInfoNV : IStructuredType + public unsafe partial struct AccelerationStructureMotionInfoNV : IExtendsChain { public AccelerationStructureMotionInfoNV ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.AccelerationStructureMotionInfoNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureVersionInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureVersionInfoKHR.gen.cs index 41c96a1368..875122ec67 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureVersionInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AccelerationStructureVersionInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAccelerationStructureVersionInfoKHR")] - public unsafe partial struct AccelerationStructureVersionInfoKHR : IStructuredType + public unsafe partial struct AccelerationStructureVersionInfoKHR : IChainable { public AccelerationStructureVersionInfoKHR ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.AccelerationStructureVersionInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AcquireNextImageInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AcquireNextImageInfoKHR.gen.cs index df643d3f90..3bee4435a3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AcquireNextImageInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AcquireNextImageInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAcquireNextImageInfoKHR")] - public unsafe partial struct AcquireNextImageInfoKHR : IStructuredType + public unsafe partial struct AcquireNextImageInfoKHR : IChainable { public AcquireNextImageInfoKHR ( @@ -107,5 +107,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.AcquireNextImageInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AcquireProfilingLockInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AcquireProfilingLockInfoKHR.gen.cs index dccdfde16a..aabbd31384 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AcquireProfilingLockInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AcquireProfilingLockInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAcquireProfilingLockInfoKHR")] - public unsafe partial struct AcquireProfilingLockInfoKHR : IStructuredType + public unsafe partial struct AcquireProfilingLockInfoKHR : IChainable { public AcquireProfilingLockInfoKHR ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.AcquireProfilingLockInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidHardwareBufferFormatProperties2ANDROID.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidHardwareBufferFormatProperties2ANDROID.gen.cs index 8d33250ac7..9d82ddd841 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidHardwareBufferFormatProperties2ANDROID.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidHardwareBufferFormatProperties2ANDROID.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAndroidHardwareBufferFormatProperties2ANDROID")] - public unsafe partial struct AndroidHardwareBufferFormatProperties2ANDROID : IStructuredType + public unsafe partial struct AndroidHardwareBufferFormatProperties2ANDROID : IExtendsChain { public AndroidHardwareBufferFormatProperties2ANDROID ( @@ -140,5 +140,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.AndroidHardwareBufferFormatProperties2Android; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidHardwareBufferFormatPropertiesANDROID.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidHardwareBufferFormatPropertiesANDROID.gen.cs index 3eb4e077d9..bd7f99d388 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidHardwareBufferFormatPropertiesANDROID.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidHardwareBufferFormatPropertiesANDROID.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAndroidHardwareBufferFormatPropertiesANDROID")] - public unsafe partial struct AndroidHardwareBufferFormatPropertiesANDROID : IStructuredType + public unsafe partial struct AndroidHardwareBufferFormatPropertiesANDROID : IExtendsChain { public AndroidHardwareBufferFormatPropertiesANDROID ( @@ -140,5 +140,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.AndroidHardwareBufferFormatPropertiesAndroid; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidHardwareBufferPropertiesANDROID.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidHardwareBufferPropertiesANDROID.gen.cs index 97ee72708d..6d7a2e7838 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidHardwareBufferPropertiesANDROID.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidHardwareBufferPropertiesANDROID.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAndroidHardwareBufferPropertiesANDROID")] - public unsafe partial struct AndroidHardwareBufferPropertiesANDROID : IStructuredType + public unsafe partial struct AndroidHardwareBufferPropertiesANDROID : IChainStart { public AndroidHardwareBufferPropertiesANDROID ( @@ -74,5 +74,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.AndroidHardwareBufferPropertiesAndroid; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref AndroidHardwareBufferPropertiesANDROID Chain( + out AndroidHardwareBufferPropertiesANDROID capture) + { + capture = new AndroidHardwareBufferPropertiesANDROID(StructureType.AndroidHardwareBufferPropertiesAndroid); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidHardwareBufferUsageANDROID.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidHardwareBufferUsageANDROID.gen.cs index 9ff1f87355..6cadc86244 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidHardwareBufferUsageANDROID.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidHardwareBufferUsageANDROID.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAndroidHardwareBufferUsageANDROID")] - public unsafe partial struct AndroidHardwareBufferUsageANDROID : IStructuredType + public unsafe partial struct AndroidHardwareBufferUsageANDROID : IExtendsChain, IExtendsChain { public AndroidHardwareBufferUsageANDROID ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.AndroidHardwareBufferUsageAndroid; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidSurfaceCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidSurfaceCreateInfoKHR.gen.cs index 1715ee95b6..546ba8a4d1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidSurfaceCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidSurfaceCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAndroidSurfaceCreateInfoKHR")] - public unsafe partial struct AndroidSurfaceCreateInfoKHR : IStructuredType + public unsafe partial struct AndroidSurfaceCreateInfoKHR : IChainable { public AndroidSurfaceCreateInfoKHR ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.AndroidSurfaceCreateInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ApplicationInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ApplicationInfo.gen.cs index 7d1a792f29..cc4a1f3b56 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ApplicationInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ApplicationInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkApplicationInfo")] - public unsafe partial struct ApplicationInfo : IStructuredType + public unsafe partial struct ApplicationInfo : IChainable { public ApplicationInfo ( @@ -107,5 +107,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ApplicationInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescription2.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescription2.gen.cs index 063910ebb6..4583f76ce4 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescription2.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescription2.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAttachmentDescription2")] - public unsafe partial struct AttachmentDescription2 : IStructuredType + [NativeName("Aliases", "VkAttachmentDescription2KHR")] + public unsafe partial struct AttachmentDescription2 : IChainStart { public AttachmentDescription2 ( @@ -151,5 +152,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.AttachmentDescription2; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref AttachmentDescription2 Chain( + out AttachmentDescription2 capture) + { + capture = new AttachmentDescription2(StructureType.AttachmentDescription2); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescription2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescription2KHR.gen.cs index 6cb0050d40..5333c73452 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescription2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescription2KHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAttachmentDescription2KHR")] - public unsafe partial struct AttachmentDescription2KHR : IStructuredType + [NativeName("AliasOf", "VkAttachmentDescription2")] + public unsafe partial struct AttachmentDescription2Khr : IChainStart { - public AttachmentDescription2KHR + public AttachmentDescription2Khr ( StructureType? sType = StructureType.AttachmentDescription2, void* pNext = null, @@ -151,5 +152,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.AttachmentDescription2; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref AttachmentDescription2Khr Chain( + out AttachmentDescription2Khr capture) + { + capture = new AttachmentDescription2Khr(StructureType.AttachmentDescription2); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescriptionStencilLayout.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescriptionStencilLayout.gen.cs index b3e2871c7a..6216ade17e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescriptionStencilLayout.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescriptionStencilLayout.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAttachmentDescriptionStencilLayout")] - public unsafe partial struct AttachmentDescriptionStencilLayout : IStructuredType + [NativeName("Aliases", "VkAttachmentDescriptionStencilLayoutKHR")] + public unsafe partial struct AttachmentDescriptionStencilLayout : IExtendsChain, IExtendsChain { public AttachmentDescriptionStencilLayout ( @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.AttachmentDescriptionStencilLayout; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescriptionStencilLayoutKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescriptionStencilLayoutKHR.gen.cs index db39063d32..393d95f59e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescriptionStencilLayoutKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescriptionStencilLayoutKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAttachmentDescriptionStencilLayoutKHR")] - public unsafe partial struct AttachmentDescriptionStencilLayoutKHR : IStructuredType + [NativeName("AliasOf", "VkAttachmentDescriptionStencilLayout")] + public unsafe partial struct AttachmentDescriptionStencilLayoutKhr : IExtendsChain, IExtendsChain { - public AttachmentDescriptionStencilLayoutKHR + public AttachmentDescriptionStencilLayoutKhr ( StructureType? sType = StructureType.AttachmentDescriptionStencilLayout, void* pNext = null, @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.AttachmentDescriptionStencilLayout; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReference2.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReference2.gen.cs index 43ff853905..3cc0871f7b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReference2.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReference2.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAttachmentReference2")] - public unsafe partial struct AttachmentReference2 : IStructuredType + [NativeName("Aliases", "VkAttachmentReference2KHR")] + public unsafe partial struct AttachmentReference2 : IChainStart { public AttachmentReference2 ( @@ -85,5 +86,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.AttachmentReference2; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref AttachmentReference2 Chain( + out AttachmentReference2 capture) + { + capture = new AttachmentReference2(StructureType.AttachmentReference2); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReference2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReference2KHR.gen.cs index dccdf86a1b..ecf7b094ce 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReference2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReference2KHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAttachmentReference2KHR")] - public unsafe partial struct AttachmentReference2KHR : IStructuredType + [NativeName("AliasOf", "VkAttachmentReference2")] + public unsafe partial struct AttachmentReference2Khr : IChainStart { - public AttachmentReference2KHR + public AttachmentReference2Khr ( StructureType? sType = StructureType.AttachmentReference2, void* pNext = null, @@ -85,5 +86,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.AttachmentReference2; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref AttachmentReference2Khr Chain( + out AttachmentReference2Khr capture) + { + capture = new AttachmentReference2Khr(StructureType.AttachmentReference2); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReferenceStencilLayout.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReferenceStencilLayout.gen.cs index a5ed805ee2..89d7984680 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReferenceStencilLayout.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReferenceStencilLayout.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAttachmentReferenceStencilLayout")] - public unsafe partial struct AttachmentReferenceStencilLayout : IStructuredType + [NativeName("Aliases", "VkAttachmentReferenceStencilLayoutKHR")] + public unsafe partial struct AttachmentReferenceStencilLayout : IExtendsChain, IExtendsChain { public AttachmentReferenceStencilLayout ( @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.AttachmentReferenceStencilLayout; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReferenceStencilLayoutKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReferenceStencilLayoutKHR.gen.cs index da45d23170..41a94f8bb6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReferenceStencilLayoutKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReferenceStencilLayoutKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAttachmentReferenceStencilLayoutKHR")] - public unsafe partial struct AttachmentReferenceStencilLayoutKHR : IStructuredType + [NativeName("AliasOf", "VkAttachmentReferenceStencilLayout")] + public unsafe partial struct AttachmentReferenceStencilLayoutKhr : IExtendsChain, IExtendsChain { - public AttachmentReferenceStencilLayoutKHR + public AttachmentReferenceStencilLayoutKhr ( StructureType? sType = StructureType.AttachmentReferenceStencilLayout, void* pNext = null, @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.AttachmentReferenceStencilLayout; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentSampleCountInfoAMD.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentSampleCountInfoAMD.gen.cs index 462f2005dd..edb6523d19 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentSampleCountInfoAMD.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentSampleCountInfoAMD.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAttachmentSampleCountInfoAMD")] - public unsafe partial struct AttachmentSampleCountInfoAMD : IStructuredType + [NativeName("Aliases", "VkAttachmentSampleCountInfoNV")] + public unsafe partial struct AttachmentSampleCountInfoAMD : IExtendsChain, IExtendsChain { public AttachmentSampleCountInfoAMD ( @@ -85,5 +86,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.AttachmentSampleCountInfoAmd; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentSampleCountInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentSampleCountInfoNV.gen.cs index 7cf8049dc7..afd20e57c1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentSampleCountInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentSampleCountInfoNV.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAttachmentSampleCountInfoNV")] - public unsafe partial struct AttachmentSampleCountInfoNV : IStructuredType + [NativeName("AliasOf", "VkAttachmentSampleCountInfoAMD")] + public unsafe partial struct AttachmentSampleCountInfoNV : IExtendsChain, IExtendsChain { public AttachmentSampleCountInfoNV ( @@ -85,5 +86,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.AttachmentSampleCountInfoAmd; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BaseInStructure.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BaseInStructure.gen.cs index 3ee5fe7e18..a48ab10a0a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BaseInStructure.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BaseInStructure.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBaseInStructure")] - public unsafe partial struct BaseInStructure : IStructuredType + public unsafe partial struct BaseInStructure : IChainable { public BaseInStructure ( @@ -53,5 +53,12 @@ StructureType IStructuredType.StructureType() { return SType; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BaseOutStructure.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BaseOutStructure.gen.cs index 3606a04f3e..73c20482bb 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BaseOutStructure.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BaseOutStructure.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBaseOutStructure")] - public unsafe partial struct BaseOutStructure : IStructuredType + public unsafe partial struct BaseOutStructure : IChainable { public BaseOutStructure ( @@ -53,5 +53,12 @@ StructureType IStructuredType.StructureType() { return SType; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = (BaseOutStructure*) value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BindAccelerationStructureMemoryInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BindAccelerationStructureMemoryInfoNV.gen.cs index d90126fd7e..9e5087c759 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BindAccelerationStructureMemoryInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BindAccelerationStructureMemoryInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBindAccelerationStructureMemoryInfoNV")] - public unsafe partial struct BindAccelerationStructureMemoryInfoNV : IStructuredType + public unsafe partial struct BindAccelerationStructureMemoryInfoNV : IChainable { public BindAccelerationStructureMemoryInfoNV ( @@ -107,5 +107,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.BindAccelerationStructureMemoryInfoNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryDeviceGroupInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryDeviceGroupInfo.gen.cs index d3238749a2..5a41f07339 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryDeviceGroupInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryDeviceGroupInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBindBufferMemoryDeviceGroupInfo")] - public unsafe partial struct BindBufferMemoryDeviceGroupInfo : IStructuredType + [NativeName("Aliases", "VkBindBufferMemoryDeviceGroupInfoKHR")] + public unsafe partial struct BindBufferMemoryDeviceGroupInfo : IExtendsChain, IExtendsChain { public BindBufferMemoryDeviceGroupInfo ( @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.BindBufferMemoryDeviceGroupInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryDeviceGroupInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryDeviceGroupInfoKHR.gen.cs index 41e7116608..be02f1c693 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryDeviceGroupInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryDeviceGroupInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBindBufferMemoryDeviceGroupInfoKHR")] - public unsafe partial struct BindBufferMemoryDeviceGroupInfoKHR : IStructuredType + [NativeName("AliasOf", "VkBindBufferMemoryDeviceGroupInfo")] + public unsafe partial struct BindBufferMemoryDeviceGroupInfoKhr : IExtendsChain, IExtendsChain { - public BindBufferMemoryDeviceGroupInfoKHR + public BindBufferMemoryDeviceGroupInfoKhr ( StructureType? sType = StructureType.BindBufferMemoryDeviceGroupInfo, void* pNext = null, @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.BindBufferMemoryDeviceGroupInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryInfo.gen.cs index 310bdf0494..3b2080b9d6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBindBufferMemoryInfo")] - public unsafe partial struct BindBufferMemoryInfo : IStructuredType + [NativeName("Aliases", "VkBindBufferMemoryInfoKHR")] + public unsafe partial struct BindBufferMemoryInfo : IChainStart { public BindBufferMemoryInfo ( @@ -85,5 +86,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.BindBufferMemoryInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref BindBufferMemoryInfo Chain( + out BindBufferMemoryInfo capture) + { + capture = new BindBufferMemoryInfo(StructureType.BindBufferMemoryInfo); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryInfoKHR.gen.cs index 16a96e1bfe..09e9cad388 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBindBufferMemoryInfoKHR")] - public unsafe partial struct BindBufferMemoryInfoKHR : IStructuredType + [NativeName("AliasOf", "VkBindBufferMemoryInfo")] + public unsafe partial struct BindBufferMemoryInfoKhr : IChainStart { - public BindBufferMemoryInfoKHR + public BindBufferMemoryInfoKhr ( StructureType? sType = StructureType.BindBufferMemoryInfo, void* pNext = null, @@ -85,5 +86,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.BindBufferMemoryInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref BindBufferMemoryInfoKhr Chain( + out BindBufferMemoryInfoKhr capture) + { + capture = new BindBufferMemoryInfoKhr(StructureType.BindBufferMemoryInfo); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryDeviceGroupInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryDeviceGroupInfo.gen.cs index 8f5ed82ddb..d492c29649 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryDeviceGroupInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryDeviceGroupInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBindImageMemoryDeviceGroupInfo")] - public unsafe partial struct BindImageMemoryDeviceGroupInfo : IStructuredType + [NativeName("Aliases", "VkBindImageMemoryDeviceGroupInfoKHR")] + public unsafe partial struct BindImageMemoryDeviceGroupInfo : IExtendsChain, IExtendsChain { public BindImageMemoryDeviceGroupInfo ( @@ -96,5 +97,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.BindImageMemoryDeviceGroupInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryDeviceGroupInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryDeviceGroupInfoKHR.gen.cs index 28602e2cab..8dea0be7c9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryDeviceGroupInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryDeviceGroupInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBindImageMemoryDeviceGroupInfoKHR")] - public unsafe partial struct BindImageMemoryDeviceGroupInfoKHR : IStructuredType + [NativeName("AliasOf", "VkBindImageMemoryDeviceGroupInfo")] + public unsafe partial struct BindImageMemoryDeviceGroupInfoKhr : IExtendsChain, IExtendsChain { - public BindImageMemoryDeviceGroupInfoKHR + public BindImageMemoryDeviceGroupInfoKhr ( StructureType? sType = StructureType.BindImageMemoryDeviceGroupInfo, void* pNext = null, @@ -96,5 +97,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.BindImageMemoryDeviceGroupInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryInfo.gen.cs index c4e5d4317c..59c451dfe8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBindImageMemoryInfo")] - public unsafe partial struct BindImageMemoryInfo : IStructuredType + [NativeName("Aliases", "VkBindImageMemoryInfoKHR")] + public unsafe partial struct BindImageMemoryInfo : IChainStart { public BindImageMemoryInfo ( @@ -85,5 +86,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.BindImageMemoryInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref BindImageMemoryInfo Chain( + out BindImageMemoryInfo capture) + { + capture = new BindImageMemoryInfo(StructureType.BindImageMemoryInfo); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryInfoKHR.gen.cs index f7fc97577b..ec2a250a69 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBindImageMemoryInfoKHR")] - public unsafe partial struct BindImageMemoryInfoKHR : IStructuredType + [NativeName("AliasOf", "VkBindImageMemoryInfo")] + public unsafe partial struct BindImageMemoryInfoKhr : IChainStart { - public BindImageMemoryInfoKHR + public BindImageMemoryInfoKhr ( StructureType? sType = StructureType.BindImageMemoryInfo, void* pNext = null, @@ -85,5 +86,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.BindImageMemoryInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref BindImageMemoryInfoKhr Chain( + out BindImageMemoryInfoKhr capture) + { + capture = new BindImageMemoryInfoKhr(StructureType.BindImageMemoryInfo); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemorySwapchainInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemorySwapchainInfoKHR.gen.cs index 8b9b277708..d88322768c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemorySwapchainInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemorySwapchainInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBindImageMemorySwapchainInfoKHR")] - public unsafe partial struct BindImageMemorySwapchainInfoKHR : IStructuredType + public unsafe partial struct BindImageMemorySwapchainInfoKHR : IExtendsChain, IExtendsChain { public BindImageMemorySwapchainInfoKHR ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.BindImageMemorySwapchainInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BindImagePlaneMemoryInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BindImagePlaneMemoryInfo.gen.cs index 08821b21ac..11436ab7e6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BindImagePlaneMemoryInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BindImagePlaneMemoryInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBindImagePlaneMemoryInfo")] - public unsafe partial struct BindImagePlaneMemoryInfo : IStructuredType + [NativeName("Aliases", "VkBindImagePlaneMemoryInfoKHR")] + public unsafe partial struct BindImagePlaneMemoryInfo : IExtendsChain, IExtendsChain { public BindImagePlaneMemoryInfo ( @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.BindImagePlaneMemoryInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BindImagePlaneMemoryInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BindImagePlaneMemoryInfoKHR.gen.cs index 7421eb72c5..e1abc9df95 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BindImagePlaneMemoryInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BindImagePlaneMemoryInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBindImagePlaneMemoryInfoKHR")] - public unsafe partial struct BindImagePlaneMemoryInfoKHR : IStructuredType + [NativeName("AliasOf", "VkBindImagePlaneMemoryInfo")] + public unsafe partial struct BindImagePlaneMemoryInfoKhr : IExtendsChain, IExtendsChain { - public BindImagePlaneMemoryInfoKHR + public BindImagePlaneMemoryInfoKhr ( StructureType? sType = StructureType.BindImagePlaneMemoryInfo, void* pNext = null, @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.BindImagePlaneMemoryInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BindSparseInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BindSparseInfo.gen.cs index 66596a1e78..d7f4decf79 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BindSparseInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BindSparseInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBindSparseInfo")] - public unsafe partial struct BindSparseInfo : IStructuredType + public unsafe partial struct BindSparseInfo : IChainStart { public BindSparseInfo ( @@ -162,5 +162,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.BindSparseInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref BindSparseInfo Chain( + out BindSparseInfo capture) + { + capture = new BindSparseInfo(StructureType.BindSparseInfo); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BlitImageInfo2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BlitImageInfo2KHR.gen.cs index e28272ffb3..c2da810faf 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BlitImageInfo2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BlitImageInfo2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBlitImageInfo2KHR")] - public unsafe partial struct BlitImageInfo2KHR : IStructuredType + public unsafe partial struct BlitImageInfo2KHR : IChainable { public BlitImageInfo2KHR ( @@ -129,5 +129,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.BlitImageInfo2Khr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCollectionBufferCreateInfoFUCHSIA.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCollectionBufferCreateInfoFUCHSIA.gen.cs index 6111ac03a3..ef05b43626 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCollectionBufferCreateInfoFUCHSIA.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCollectionBufferCreateInfoFUCHSIA.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferCollectionBufferCreateInfoFUCHSIA")] - public unsafe partial struct BufferCollectionBufferCreateInfoFUCHSIA : IStructuredType + public unsafe partial struct BufferCollectionBufferCreateInfoFUCHSIA : IExtendsChain { public BufferCollectionBufferCreateInfoFUCHSIA ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.BufferCollectionBufferCreateInfoFuchsia; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCollectionConstraintsInfoFUCHSIA.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCollectionConstraintsInfoFUCHSIA.gen.cs index c1a9ff1655..fa3b8ebdee 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCollectionConstraintsInfoFUCHSIA.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCollectionConstraintsInfoFUCHSIA.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferCollectionConstraintsInfoFUCHSIA")] - public unsafe partial struct BufferCollectionConstraintsInfoFUCHSIA : IStructuredType + public unsafe partial struct BufferCollectionConstraintsInfoFUCHSIA : IChainable { public BufferCollectionConstraintsInfoFUCHSIA ( @@ -107,5 +107,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.BufferCollectionConstraintsInfoFuchsia; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCollectionCreateInfoFUCHSIA.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCollectionCreateInfoFUCHSIA.gen.cs index 1fe7b01676..3d56d25659 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCollectionCreateInfoFUCHSIA.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCollectionCreateInfoFUCHSIA.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferCollectionCreateInfoFUCHSIA")] - public unsafe partial struct BufferCollectionCreateInfoFUCHSIA : IStructuredType + public unsafe partial struct BufferCollectionCreateInfoFUCHSIA : IChainable { public BufferCollectionCreateInfoFUCHSIA ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.BufferCollectionCreateInfoFuchsia; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCollectionImageCreateInfoFUCHSIA.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCollectionImageCreateInfoFUCHSIA.gen.cs index 76355da39c..fbc4de818f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCollectionImageCreateInfoFUCHSIA.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCollectionImageCreateInfoFUCHSIA.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferCollectionImageCreateInfoFUCHSIA")] - public unsafe partial struct BufferCollectionImageCreateInfoFUCHSIA : IStructuredType + public unsafe partial struct BufferCollectionImageCreateInfoFUCHSIA : IExtendsChain { public BufferCollectionImageCreateInfoFUCHSIA ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.BufferCollectionImageCreateInfoFuchsia; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCollectionPropertiesFUCHSIA.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCollectionPropertiesFUCHSIA.gen.cs index 49d7b0f13d..536f8594b3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCollectionPropertiesFUCHSIA.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCollectionPropertiesFUCHSIA.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferCollectionPropertiesFUCHSIA")] - public unsafe partial struct BufferCollectionPropertiesFUCHSIA : IStructuredType + public unsafe partial struct BufferCollectionPropertiesFUCHSIA : IChainable { public BufferCollectionPropertiesFUCHSIA ( @@ -173,5 +173,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.BufferCollectionPropertiesFuchsia; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferConstraintsInfoFUCHSIA.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferConstraintsInfoFUCHSIA.gen.cs index 875f604350..768c039b44 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferConstraintsInfoFUCHSIA.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferConstraintsInfoFUCHSIA.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferConstraintsInfoFUCHSIA")] - public unsafe partial struct BufferConstraintsInfoFUCHSIA : IStructuredType + public unsafe partial struct BufferConstraintsInfoFUCHSIA : IChainable { public BufferConstraintsInfoFUCHSIA ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.BufferConstraintsInfoFuchsia; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCopy2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCopy2KHR.gen.cs index 7a1bb6a2fd..d73b9c88c4 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCopy2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCopy2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferCopy2KHR")] - public unsafe partial struct BufferCopy2KHR : IStructuredType + public unsafe partial struct BufferCopy2KHR : IChainable { public BufferCopy2KHR ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.BufferCopy2Khr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCreateInfo.gen.cs index 620bffeb7d..072d88a1a7 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferCreateInfo")] - public unsafe partial struct BufferCreateInfo : IStructuredType + public unsafe partial struct BufferCreateInfo : IChainStart { public BufferCreateInfo ( @@ -118,5 +118,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.BufferCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref BufferCreateInfo Chain( + out BufferCreateInfo capture) + { + capture = new BufferCreateInfo(StructureType.BufferCreateInfo); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferDeviceAddressCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferDeviceAddressCreateInfoEXT.gen.cs index 0241cfce00..590b6564e0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferDeviceAddressCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferDeviceAddressCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferDeviceAddressCreateInfoEXT")] - public unsafe partial struct BufferDeviceAddressCreateInfoEXT : IStructuredType + public unsafe partial struct BufferDeviceAddressCreateInfoEXT : IExtendsChain { public BufferDeviceAddressCreateInfoEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.BufferDeviceAddressCreateInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferDeviceAddressInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferDeviceAddressInfo.gen.cs index 1aa3733b03..d14f31b206 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferDeviceAddressInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferDeviceAddressInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferDeviceAddressInfo")] - public unsafe partial struct BufferDeviceAddressInfo : IStructuredType + [NativeName("Aliases", "VkBufferDeviceAddressInfoKHR, VkBufferDeviceAddressInfoEXT")] + public unsafe partial struct BufferDeviceAddressInfo : IChainable { public BufferDeviceAddressInfo ( @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.BufferDeviceAddressInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferDeviceAddressInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferDeviceAddressInfoEXT.gen.cs index 28b009e642..3ab954d50a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferDeviceAddressInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferDeviceAddressInfoEXT.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferDeviceAddressInfoEXT")] - public unsafe partial struct BufferDeviceAddressInfoEXT : IStructuredType + [NativeName("AliasOf", "VkBufferDeviceAddressInfo")] + public unsafe partial struct BufferDeviceAddressInfoExt : IChainable { - public BufferDeviceAddressInfoEXT + public BufferDeviceAddressInfoExt ( StructureType? sType = StructureType.BufferDeviceAddressInfo, void* pNext = null, @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.BufferDeviceAddressInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferDeviceAddressInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferDeviceAddressInfoKHR.gen.cs index ce1d3b841d..2a47af03e9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferDeviceAddressInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferDeviceAddressInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferDeviceAddressInfoKHR")] - public unsafe partial struct BufferDeviceAddressInfoKHR : IStructuredType + [NativeName("AliasOf", "VkBufferDeviceAddressInfo")] + public unsafe partial struct BufferDeviceAddressInfoKhr : IChainable { - public BufferDeviceAddressInfoKHR + public BufferDeviceAddressInfoKhr ( StructureType? sType = StructureType.BufferDeviceAddressInfo, void* pNext = null, @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.BufferDeviceAddressInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferImageCopy2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferImageCopy2KHR.gen.cs index ecaf4b3ba7..37fb9eec75 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferImageCopy2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferImageCopy2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferImageCopy2KHR")] - public unsafe partial struct BufferImageCopy2KHR : IStructuredType + public unsafe partial struct BufferImageCopy2KHR : IChainStart { public BufferImageCopy2KHR ( @@ -118,5 +118,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.BufferImageCopy2Khr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref BufferImageCopy2KHR Chain( + out BufferImageCopy2KHR capture) + { + capture = new BufferImageCopy2KHR(StructureType.BufferImageCopy2Khr); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferMemoryBarrier.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferMemoryBarrier.gen.cs index 455f04d295..b5913ba316 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferMemoryBarrier.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferMemoryBarrier.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferMemoryBarrier")] - public unsafe partial struct BufferMemoryBarrier : IStructuredType + public unsafe partial struct BufferMemoryBarrier : IChainable { public BufferMemoryBarrier ( @@ -129,5 +129,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.BufferMemoryBarrier; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferMemoryBarrier2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferMemoryBarrier2KHR.gen.cs index 8684363192..8c9e20f586 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferMemoryBarrier2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferMemoryBarrier2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferMemoryBarrier2KHR")] - public unsafe partial struct BufferMemoryBarrier2KHR : IStructuredType + public unsafe partial struct BufferMemoryBarrier2KHR : IChainable { public BufferMemoryBarrier2KHR ( @@ -151,5 +151,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.BufferMemoryBarrier2Khr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferMemoryRequirementsInfo2.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferMemoryRequirementsInfo2.gen.cs index 5b1e416492..20599243ba 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferMemoryRequirementsInfo2.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferMemoryRequirementsInfo2.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferMemoryRequirementsInfo2")] - public unsafe partial struct BufferMemoryRequirementsInfo2 : IStructuredType + [NativeName("Aliases", "VkBufferMemoryRequirementsInfo2KHR")] + public unsafe partial struct BufferMemoryRequirementsInfo2 : IChainable { public BufferMemoryRequirementsInfo2 ( @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.BufferMemoryRequirementsInfo2; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferMemoryRequirementsInfo2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferMemoryRequirementsInfo2KHR.gen.cs index 98fb577b17..c9197e6189 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferMemoryRequirementsInfo2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferMemoryRequirementsInfo2KHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferMemoryRequirementsInfo2KHR")] - public unsafe partial struct BufferMemoryRequirementsInfo2KHR : IStructuredType + [NativeName("AliasOf", "VkBufferMemoryRequirementsInfo2")] + public unsafe partial struct BufferMemoryRequirementsInfo2Khr : IChainable { - public BufferMemoryRequirementsInfo2KHR + public BufferMemoryRequirementsInfo2Khr ( StructureType? sType = StructureType.BufferMemoryRequirementsInfo2, void* pNext = null, @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.BufferMemoryRequirementsInfo2; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferOpaqueCaptureAddressCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferOpaqueCaptureAddressCreateInfo.gen.cs index e382cf7352..25485751a8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferOpaqueCaptureAddressCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferOpaqueCaptureAddressCreateInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferOpaqueCaptureAddressCreateInfo")] - public unsafe partial struct BufferOpaqueCaptureAddressCreateInfo : IStructuredType + [NativeName("Aliases", "VkBufferOpaqueCaptureAddressCreateInfoKHR")] + public unsafe partial struct BufferOpaqueCaptureAddressCreateInfo : IExtendsChain { public BufferOpaqueCaptureAddressCreateInfo ( @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.BufferOpaqueCaptureAddressCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferOpaqueCaptureAddressCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferOpaqueCaptureAddressCreateInfoKHR.gen.cs index 44d075233f..42c2693bcb 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferOpaqueCaptureAddressCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferOpaqueCaptureAddressCreateInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferOpaqueCaptureAddressCreateInfoKHR")] - public unsafe partial struct BufferOpaqueCaptureAddressCreateInfoKHR : IStructuredType + [NativeName("AliasOf", "VkBufferOpaqueCaptureAddressCreateInfo")] + public unsafe partial struct BufferOpaqueCaptureAddressCreateInfoKhr : IExtendsChain { - public BufferOpaqueCaptureAddressCreateInfoKHR + public BufferOpaqueCaptureAddressCreateInfoKhr ( StructureType? sType = StructureType.BufferOpaqueCaptureAddressCreateInfo, void* pNext = null, @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.BufferOpaqueCaptureAddressCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferViewCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferViewCreateInfo.gen.cs index fbf8022c7b..fa3c12a533 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferViewCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferViewCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferViewCreateInfo")] - public unsafe partial struct BufferViewCreateInfo : IStructuredType + public unsafe partial struct BufferViewCreateInfo : IChainable { public BufferViewCreateInfo ( @@ -107,5 +107,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.BufferViewCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CalibratedTimestampInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CalibratedTimestampInfoEXT.gen.cs index e2c9cace4c..5e6c2acb41 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CalibratedTimestampInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CalibratedTimestampInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCalibratedTimestampInfoEXT")] - public unsafe partial struct CalibratedTimestampInfoEXT : IStructuredType + public unsafe partial struct CalibratedTimestampInfoEXT : IChainable { public CalibratedTimestampInfoEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.CalibratedTimestampInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CheckpointData2NV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CheckpointData2NV.gen.cs index c64d8d448f..6e191a01bb 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CheckpointData2NV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CheckpointData2NV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCheckpointData2NV")] - public unsafe partial struct CheckpointData2NV : IStructuredType + public unsafe partial struct CheckpointData2NV : IChainable { public CheckpointData2NV ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.CheckpointData2NV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CheckpointDataNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CheckpointDataNV.gen.cs index 041210ebed..53ef1eecdf 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CheckpointDataNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CheckpointDataNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCheckpointDataNV")] - public unsafe partial struct CheckpointDataNV : IStructuredType + public unsafe partial struct CheckpointDataNV : IChainable { public CheckpointDataNV ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.CheckpointDataNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferAllocateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferAllocateInfo.gen.cs index ef4b0ded37..5554e02dd0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferAllocateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferAllocateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCommandBufferAllocateInfo")] - public unsafe partial struct CommandBufferAllocateInfo : IStructuredType + public unsafe partial struct CommandBufferAllocateInfo : IChainable { public CommandBufferAllocateInfo ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.CommandBufferAllocateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferBeginInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferBeginInfo.gen.cs index 0b2472c22a..298221368e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferBeginInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferBeginInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCommandBufferBeginInfo")] - public unsafe partial struct CommandBufferBeginInfo : IStructuredType + public unsafe partial struct CommandBufferBeginInfo : IChainStart { public CommandBufferBeginInfo ( @@ -74,5 +74,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.CommandBufferBeginInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref CommandBufferBeginInfo Chain( + out CommandBufferBeginInfo capture) + { + capture = new CommandBufferBeginInfo(StructureType.CommandBufferBeginInfo); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferInheritanceConditionalRenderingInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferInheritanceConditionalRenderingInfoEXT.gen.cs index 6c1d62b11c..4bd91f83ca 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferInheritanceConditionalRenderingInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferInheritanceConditionalRenderingInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCommandBufferInheritanceConditionalRenderingInfoEXT")] - public unsafe partial struct CommandBufferInheritanceConditionalRenderingInfoEXT : IStructuredType + public unsafe partial struct CommandBufferInheritanceConditionalRenderingInfoEXT : IExtendsChain { public CommandBufferInheritanceConditionalRenderingInfoEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.CommandBufferInheritanceConditionalRenderingInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferInheritanceInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferInheritanceInfo.gen.cs index 1be5678943..ba365fc0a3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferInheritanceInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferInheritanceInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCommandBufferInheritanceInfo")] - public unsafe partial struct CommandBufferInheritanceInfo : IStructuredType + public unsafe partial struct CommandBufferInheritanceInfo : IChainStart { public CommandBufferInheritanceInfo ( @@ -118,5 +118,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.CommandBufferInheritanceInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref CommandBufferInheritanceInfo Chain( + out CommandBufferInheritanceInfo capture) + { + capture = new CommandBufferInheritanceInfo(StructureType.CommandBufferInheritanceInfo); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferInheritanceRenderPassTransformInfoQCOM.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferInheritanceRenderPassTransformInfoQCOM.gen.cs index 249d1e4877..821c594f26 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferInheritanceRenderPassTransformInfoQCOM.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferInheritanceRenderPassTransformInfoQCOM.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCommandBufferInheritanceRenderPassTransformInfoQCOM")] - public unsafe partial struct CommandBufferInheritanceRenderPassTransformInfoQCOM : IStructuredType + public unsafe partial struct CommandBufferInheritanceRenderPassTransformInfoQCOM : IExtendsChain { public CommandBufferInheritanceRenderPassTransformInfoQCOM ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.CommandBufferInheritanceRenderPassTransformInfoQCom; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferInheritanceRenderingInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferInheritanceRenderingInfoKHR.gen.cs index 8b512d7156..b72176b4ca 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferInheritanceRenderingInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferInheritanceRenderingInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCommandBufferInheritanceRenderingInfoKHR")] - public unsafe partial struct CommandBufferInheritanceRenderingInfoKHR : IStructuredType + public unsafe partial struct CommandBufferInheritanceRenderingInfoKHR : IExtendsChain { public CommandBufferInheritanceRenderingInfoKHR ( @@ -129,5 +129,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.CommandBufferInheritanceRenderingInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferInheritanceViewportScissorInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferInheritanceViewportScissorInfoNV.gen.cs index 4909be1448..c4fe64929d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferInheritanceViewportScissorInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferInheritanceViewportScissorInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCommandBufferInheritanceViewportScissorInfoNV")] - public unsafe partial struct CommandBufferInheritanceViewportScissorInfoNV : IStructuredType + public unsafe partial struct CommandBufferInheritanceViewportScissorInfoNV : IExtendsChain { public CommandBufferInheritanceViewportScissorInfoNV ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.CommandBufferInheritanceViewportScissorInfoNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferSubmitInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferSubmitInfoKHR.gen.cs index c49eedcf1c..74a3b2f2b5 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferSubmitInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CommandBufferSubmitInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCommandBufferSubmitInfoKHR")] - public unsafe partial struct CommandBufferSubmitInfoKHR : IStructuredType + public unsafe partial struct CommandBufferSubmitInfoKHR : IChainable { public CommandBufferSubmitInfoKHR ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.CommandBufferSubmitInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CommandPoolCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CommandPoolCreateInfo.gen.cs index 06c39d6a34..27bfe416a5 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CommandPoolCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CommandPoolCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCommandPoolCreateInfo")] - public unsafe partial struct CommandPoolCreateInfo : IStructuredType + public unsafe partial struct CommandPoolCreateInfo : IChainable { public CommandPoolCreateInfo ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.CommandPoolCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ComputePipelineCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ComputePipelineCreateInfo.gen.cs index 2f753ea301..37f7f8f51c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ComputePipelineCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ComputePipelineCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkComputePipelineCreateInfo")] - public unsafe partial struct ComputePipelineCreateInfo : IStructuredType + public unsafe partial struct ComputePipelineCreateInfo : IChainStart { public ComputePipelineCreateInfo ( @@ -107,5 +107,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ComputePipelineCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref ComputePipelineCreateInfo Chain( + out ComputePipelineCreateInfo capture) + { + capture = new ComputePipelineCreateInfo(StructureType.ComputePipelineCreateInfo); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ConditionalRenderingBeginInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ConditionalRenderingBeginInfoEXT.gen.cs index c7501e77b2..013d699a72 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ConditionalRenderingBeginInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ConditionalRenderingBeginInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkConditionalRenderingBeginInfoEXT")] - public unsafe partial struct ConditionalRenderingBeginInfoEXT : IStructuredType + public unsafe partial struct ConditionalRenderingBeginInfoEXT : IChainable { public ConditionalRenderingBeginInfoEXT ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ConditionalRenderingBeginInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ConformanceVersion.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ConformanceVersion.gen.cs index e22008845c..30995ef0d2 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ConformanceVersion.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ConformanceVersion.gen.cs @@ -17,6 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkConformanceVersion")] + [NativeName("Aliases", "VkConformanceVersionKHR")] public unsafe partial struct ConformanceVersion { public ConformanceVersion diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ConformanceVersionKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ConformanceVersionKHR.gen.cs index 162dedddb0..63edb69dfd 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ConformanceVersionKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ConformanceVersionKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkConformanceVersionKHR")] - public unsafe partial struct ConformanceVersionKHR + [NativeName("AliasOf", "VkConformanceVersion")] + public unsafe partial struct ConformanceVersionKhr { - public ConformanceVersionKHR + public ConformanceVersionKhr ( byte? major = null, byte? minor = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CooperativeMatrixPropertiesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CooperativeMatrixPropertiesNV.gen.cs index 2c6b289703..564b4f0fe0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CooperativeMatrixPropertiesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CooperativeMatrixPropertiesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCooperativeMatrixPropertiesNV")] - public unsafe partial struct CooperativeMatrixPropertiesNV : IStructuredType + public unsafe partial struct CooperativeMatrixPropertiesNV : IChainable { public CooperativeMatrixPropertiesNV ( @@ -140,5 +140,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.CooperativeMatrixPropertiesNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CopyAccelerationStructureInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CopyAccelerationStructureInfoKHR.gen.cs index e45a7b368d..f6b403eb79 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CopyAccelerationStructureInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CopyAccelerationStructureInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCopyAccelerationStructureInfoKHR")] - public unsafe partial struct CopyAccelerationStructureInfoKHR : IStructuredType + public unsafe partial struct CopyAccelerationStructureInfoKHR : IChainable { public CopyAccelerationStructureInfoKHR ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.CopyAccelerationStructureInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CopyAccelerationStructureToMemoryInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CopyAccelerationStructureToMemoryInfoKHR.gen.cs index 1fe1441ccd..97368db731 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CopyAccelerationStructureToMemoryInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CopyAccelerationStructureToMemoryInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCopyAccelerationStructureToMemoryInfoKHR")] - public unsafe partial struct CopyAccelerationStructureToMemoryInfoKHR : IStructuredType + public unsafe partial struct CopyAccelerationStructureToMemoryInfoKHR : IChainable { public CopyAccelerationStructureToMemoryInfoKHR ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.CopyAccelerationStructureToMemoryInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CopyBufferInfo2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CopyBufferInfo2KHR.gen.cs index 9f8334fce9..9808153651 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CopyBufferInfo2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CopyBufferInfo2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCopyBufferInfo2KHR")] - public unsafe partial struct CopyBufferInfo2KHR : IStructuredType + public unsafe partial struct CopyBufferInfo2KHR : IChainable { public CopyBufferInfo2KHR ( @@ -96,5 +96,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.CopyBufferInfo2Khr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CopyBufferToImageInfo2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CopyBufferToImageInfo2KHR.gen.cs index 68ed5b8223..a3aa6452eb 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CopyBufferToImageInfo2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CopyBufferToImageInfo2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCopyBufferToImageInfo2KHR")] - public unsafe partial struct CopyBufferToImageInfo2KHR : IStructuredType + public unsafe partial struct CopyBufferToImageInfo2KHR : IChainable { public CopyBufferToImageInfo2KHR ( @@ -107,5 +107,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.CopyBufferToImageInfo2Khr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CopyCommandTransformInfoQCOM.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CopyCommandTransformInfoQCOM.gen.cs index 541eb88f7c..d348a3d5ca 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CopyCommandTransformInfoQCOM.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CopyCommandTransformInfoQCOM.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCopyCommandTransformInfoQCOM")] - public unsafe partial struct CopyCommandTransformInfoQCOM : IStructuredType + public unsafe partial struct CopyCommandTransformInfoQCOM : IExtendsChain, IExtendsChain { public CopyCommandTransformInfoQCOM ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.CopyCommandTransformInfoQCom; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CopyDescriptorSet.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CopyDescriptorSet.gen.cs index 01a9e290fe..a61c47a1d9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CopyDescriptorSet.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CopyDescriptorSet.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCopyDescriptorSet")] - public unsafe partial struct CopyDescriptorSet : IStructuredType + public unsafe partial struct CopyDescriptorSet : IChainable { public CopyDescriptorSet ( @@ -129,5 +129,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.CopyDescriptorSet; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CopyImageInfo2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CopyImageInfo2KHR.gen.cs index 094b0e4ecd..2efa19a9b2 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CopyImageInfo2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CopyImageInfo2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCopyImageInfo2KHR")] - public unsafe partial struct CopyImageInfo2KHR : IStructuredType + public unsafe partial struct CopyImageInfo2KHR : IChainable { public CopyImageInfo2KHR ( @@ -118,5 +118,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.CopyImageInfo2Khr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CopyImageToBufferInfo2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CopyImageToBufferInfo2KHR.gen.cs index 3a6511756e..f11912d644 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CopyImageToBufferInfo2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CopyImageToBufferInfo2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCopyImageToBufferInfo2KHR")] - public unsafe partial struct CopyImageToBufferInfo2KHR : IStructuredType + public unsafe partial struct CopyImageToBufferInfo2KHR : IChainable { public CopyImageToBufferInfo2KHR ( @@ -107,5 +107,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.CopyImageToBufferInfo2Khr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CopyMemoryToAccelerationStructureInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CopyMemoryToAccelerationStructureInfoKHR.gen.cs index b10445fce3..1d8595eff1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CopyMemoryToAccelerationStructureInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CopyMemoryToAccelerationStructureInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCopyMemoryToAccelerationStructureInfoKHR")] - public unsafe partial struct CopyMemoryToAccelerationStructureInfoKHR : IStructuredType + public unsafe partial struct CopyMemoryToAccelerationStructureInfoKHR : IChainable { public CopyMemoryToAccelerationStructureInfoKHR ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.CopyMemoryToAccelerationStructureInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CuFunctionCreateInfoNVX.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CuFunctionCreateInfoNVX.gen.cs index 37e7b142a3..8f4ddc824f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CuFunctionCreateInfoNVX.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CuFunctionCreateInfoNVX.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCuFunctionCreateInfoNVX")] - public unsafe partial struct CuFunctionCreateInfoNVX : IStructuredType + public unsafe partial struct CuFunctionCreateInfoNVX : IChainable { public CuFunctionCreateInfoNVX ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.CUFunctionCreateInfoNvx; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CuLaunchInfoNVX.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CuLaunchInfoNVX.gen.cs index 674ba2bd0a..c1fe8838a2 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CuLaunchInfoNVX.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CuLaunchInfoNVX.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCuLaunchInfoNVX")] - public unsafe partial struct CuLaunchInfoNVX : IStructuredType + public unsafe partial struct CuLaunchInfoNVX : IChainable { public CuLaunchInfoNVX ( @@ -184,5 +184,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.CULaunchInfoNvx; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/CuModuleCreateInfoNVX.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/CuModuleCreateInfoNVX.gen.cs index 7ae74cd36f..ab6fba734c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/CuModuleCreateInfoNVX.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/CuModuleCreateInfoNVX.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkCuModuleCreateInfoNVX")] - public unsafe partial struct CuModuleCreateInfoNVX : IStructuredType + public unsafe partial struct CuModuleCreateInfoNVX : IChainable { public CuModuleCreateInfoNVX ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.CUModuleCreateInfoNvx; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/D3D12FenceSubmitInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/D3D12FenceSubmitInfoKHR.gen.cs index 4a63ceaf7d..660cd6f37f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/D3D12FenceSubmitInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/D3D12FenceSubmitInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkD3D12FenceSubmitInfoKHR")] - public unsafe partial struct D3D12FenceSubmitInfoKHR : IStructuredType + public unsafe partial struct D3D12FenceSubmitInfoKHR : IExtendsChain { public D3D12FenceSubmitInfoKHR ( @@ -96,5 +96,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.D3D12FenceSubmitInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DebugMarkerMarkerInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DebugMarkerMarkerInfoEXT.gen.cs index b1f7bd8ade..ab10b34b9f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DebugMarkerMarkerInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DebugMarkerMarkerInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDebugMarkerMarkerInfoEXT")] - public unsafe partial struct DebugMarkerMarkerInfoEXT : IStructuredType + public unsafe partial struct DebugMarkerMarkerInfoEXT : IChainable { public DebugMarkerMarkerInfoEXT ( @@ -68,5 +68,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DebugMarkerMarkerInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DebugMarkerObjectNameInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DebugMarkerObjectNameInfoEXT.gen.cs index 0e84eee9e3..17734109fe 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DebugMarkerObjectNameInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DebugMarkerObjectNameInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDebugMarkerObjectNameInfoEXT")] - public unsafe partial struct DebugMarkerObjectNameInfoEXT : IStructuredType + public unsafe partial struct DebugMarkerObjectNameInfoEXT : IChainable { public DebugMarkerObjectNameInfoEXT ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DebugMarkerObjectNameInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DebugMarkerObjectTagInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DebugMarkerObjectTagInfoEXT.gen.cs index e797c168cf..01633e8a8a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DebugMarkerObjectTagInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DebugMarkerObjectTagInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDebugMarkerObjectTagInfoEXT")] - public unsafe partial struct DebugMarkerObjectTagInfoEXT : IStructuredType + public unsafe partial struct DebugMarkerObjectTagInfoEXT : IChainable { public DebugMarkerObjectTagInfoEXT ( @@ -107,5 +107,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DebugMarkerObjectTagInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DebugReportCallbackCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DebugReportCallbackCreateInfoEXT.gen.cs index 5111b48974..107598258b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DebugReportCallbackCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DebugReportCallbackCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDebugReportCallbackCreateInfoEXT")] - public unsafe partial struct DebugReportCallbackCreateInfoEXT : IStructuredType + public unsafe partial struct DebugReportCallbackCreateInfoEXT : IExtendsChain { public DebugReportCallbackCreateInfoEXT ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DebugReportCallbackCreateInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DebugUtilsLabelEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DebugUtilsLabelEXT.gen.cs index 2a8f4c608e..648b8a1efd 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DebugUtilsLabelEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DebugUtilsLabelEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDebugUtilsLabelEXT")] - public unsafe partial struct DebugUtilsLabelEXT : IStructuredType + public unsafe partial struct DebugUtilsLabelEXT : IChainable { public DebugUtilsLabelEXT ( @@ -68,5 +68,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DebugUtilsLabelExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DebugUtilsMessengerCallbackDataEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DebugUtilsMessengerCallbackDataEXT.gen.cs index c53840406b..ecb88892b7 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DebugUtilsMessengerCallbackDataEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DebugUtilsMessengerCallbackDataEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDebugUtilsMessengerCallbackDataEXT")] - public unsafe partial struct DebugUtilsMessengerCallbackDataEXT : IStructuredType + public unsafe partial struct DebugUtilsMessengerCallbackDataEXT : IChainable { public DebugUtilsMessengerCallbackDataEXT ( @@ -162,5 +162,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DebugUtilsMessengerCallbackDataExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DebugUtilsMessengerCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DebugUtilsMessengerCreateInfoEXT.gen.cs index 6d1cffdd1f..4393beb677 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DebugUtilsMessengerCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DebugUtilsMessengerCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDebugUtilsMessengerCreateInfoEXT")] - public unsafe partial struct DebugUtilsMessengerCreateInfoEXT : IStructuredType + public unsafe partial struct DebugUtilsMessengerCreateInfoEXT : IExtendsChain { public DebugUtilsMessengerCreateInfoEXT ( @@ -107,5 +107,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DebugUtilsMessengerCreateInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DebugUtilsObjectNameInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DebugUtilsObjectNameInfoEXT.gen.cs index 37da585358..f051151fdf 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DebugUtilsObjectNameInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DebugUtilsObjectNameInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDebugUtilsObjectNameInfoEXT")] - public unsafe partial struct DebugUtilsObjectNameInfoEXT : IStructuredType + public unsafe partial struct DebugUtilsObjectNameInfoEXT : IChainable { public DebugUtilsObjectNameInfoEXT ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DebugUtilsObjectNameInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DebugUtilsObjectTagInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DebugUtilsObjectTagInfoEXT.gen.cs index a7653a1573..43269adf89 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DebugUtilsObjectTagInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DebugUtilsObjectTagInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDebugUtilsObjectTagInfoEXT")] - public unsafe partial struct DebugUtilsObjectTagInfoEXT : IStructuredType + public unsafe partial struct DebugUtilsObjectTagInfoEXT : IChainable { public DebugUtilsObjectTagInfoEXT ( @@ -107,5 +107,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DebugUtilsObjectTagInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DedicatedAllocationBufferCreateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DedicatedAllocationBufferCreateInfoNV.gen.cs index 9a521f4f0d..03fbf55dff 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DedicatedAllocationBufferCreateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DedicatedAllocationBufferCreateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDedicatedAllocationBufferCreateInfoNV")] - public unsafe partial struct DedicatedAllocationBufferCreateInfoNV : IStructuredType + public unsafe partial struct DedicatedAllocationBufferCreateInfoNV : IExtendsChain { public DedicatedAllocationBufferCreateInfoNV ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DedicatedAllocationBufferCreateInfoNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DedicatedAllocationImageCreateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DedicatedAllocationImageCreateInfoNV.gen.cs index 39f24998fd..42f8f44177 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DedicatedAllocationImageCreateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DedicatedAllocationImageCreateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDedicatedAllocationImageCreateInfoNV")] - public unsafe partial struct DedicatedAllocationImageCreateInfoNV : IStructuredType + public unsafe partial struct DedicatedAllocationImageCreateInfoNV : IExtendsChain { public DedicatedAllocationImageCreateInfoNV ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DedicatedAllocationImageCreateInfoNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DedicatedAllocationMemoryAllocateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DedicatedAllocationMemoryAllocateInfoNV.gen.cs index edd889b7fe..b3408e50d4 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DedicatedAllocationMemoryAllocateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DedicatedAllocationMemoryAllocateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDedicatedAllocationMemoryAllocateInfoNV")] - public unsafe partial struct DedicatedAllocationMemoryAllocateInfoNV : IStructuredType + public unsafe partial struct DedicatedAllocationMemoryAllocateInfoNV : IExtendsChain { public DedicatedAllocationMemoryAllocateInfoNV ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DedicatedAllocationMemoryAllocateInfoNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DependencyInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DependencyInfoKHR.gen.cs index 3ea601900b..0bc35c5911 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DependencyInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DependencyInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDependencyInfoKHR")] - public unsafe partial struct DependencyInfoKHR : IStructuredType + public unsafe partial struct DependencyInfoKHR : IChainable { public DependencyInfoKHR ( @@ -129,5 +129,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DependencyInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorPoolCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorPoolCreateInfo.gen.cs index 1b4af4209f..7f6a61f0be 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorPoolCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorPoolCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDescriptorPoolCreateInfo")] - public unsafe partial struct DescriptorPoolCreateInfo : IStructuredType + public unsafe partial struct DescriptorPoolCreateInfo : IChainStart { public DescriptorPoolCreateInfo ( @@ -96,5 +96,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DescriptorPoolCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref DescriptorPoolCreateInfo Chain( + out DescriptorPoolCreateInfo capture) + { + capture = new DescriptorPoolCreateInfo(StructureType.DescriptorPoolCreateInfo); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorPoolInlineUniformBlockCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorPoolInlineUniformBlockCreateInfoEXT.gen.cs index 797d87cb34..4b8362f429 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorPoolInlineUniformBlockCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorPoolInlineUniformBlockCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDescriptorPoolInlineUniformBlockCreateInfoEXT")] - public unsafe partial struct DescriptorPoolInlineUniformBlockCreateInfoEXT : IStructuredType + public unsafe partial struct DescriptorPoolInlineUniformBlockCreateInfoEXT : IExtendsChain { public DescriptorPoolInlineUniformBlockCreateInfoEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DescriptorPoolInlineUniformBlockCreateInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetAllocateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetAllocateInfo.gen.cs index cbcc15e1e2..4aca83f350 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetAllocateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetAllocateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDescriptorSetAllocateInfo")] - public unsafe partial struct DescriptorSetAllocateInfo : IStructuredType + public unsafe partial struct DescriptorSetAllocateInfo : IChainStart { public DescriptorSetAllocateInfo ( @@ -85,5 +85,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DescriptorSetAllocateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref DescriptorSetAllocateInfo Chain( + out DescriptorSetAllocateInfo capture) + { + capture = new DescriptorSetAllocateInfo(StructureType.DescriptorSetAllocateInfo); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutBindingFlagsCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutBindingFlagsCreateInfo.gen.cs index cc2daea791..558c869f27 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutBindingFlagsCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutBindingFlagsCreateInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDescriptorSetLayoutBindingFlagsCreateInfo")] - public unsafe partial struct DescriptorSetLayoutBindingFlagsCreateInfo : IStructuredType + [NativeName("Aliases", "VkDescriptorSetLayoutBindingFlagsCreateInfoEXT")] + public unsafe partial struct DescriptorSetLayoutBindingFlagsCreateInfo : IExtendsChain { public DescriptorSetLayoutBindingFlagsCreateInfo ( @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DescriptorSetLayoutBindingFlagsCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutBindingFlagsCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutBindingFlagsCreateInfoEXT.gen.cs index 5ce235f224..c4c66a31d6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutBindingFlagsCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutBindingFlagsCreateInfoEXT.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDescriptorSetLayoutBindingFlagsCreateInfoEXT")] - public unsafe partial struct DescriptorSetLayoutBindingFlagsCreateInfoEXT : IStructuredType + [NativeName("AliasOf", "VkDescriptorSetLayoutBindingFlagsCreateInfo")] + public unsafe partial struct DescriptorSetLayoutBindingFlagsCreateInfoExt : IExtendsChain { - public DescriptorSetLayoutBindingFlagsCreateInfoEXT + public DescriptorSetLayoutBindingFlagsCreateInfoExt ( StructureType? sType = StructureType.DescriptorSetLayoutBindingFlagsCreateInfo, void* pNext = null, @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DescriptorSetLayoutBindingFlagsCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutCreateInfo.gen.cs index 87ba88504c..6d3291fb2a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDescriptorSetLayoutCreateInfo")] - public unsafe partial struct DescriptorSetLayoutCreateInfo : IStructuredType + public unsafe partial struct DescriptorSetLayoutCreateInfo : IChainStart { public DescriptorSetLayoutCreateInfo ( @@ -85,5 +85,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DescriptorSetLayoutCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref DescriptorSetLayoutCreateInfo Chain( + out DescriptorSetLayoutCreateInfo capture) + { + capture = new DescriptorSetLayoutCreateInfo(StructureType.DescriptorSetLayoutCreateInfo); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutSupport.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutSupport.gen.cs index 3012b7035a..9642324580 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutSupport.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutSupport.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDescriptorSetLayoutSupport")] - public unsafe partial struct DescriptorSetLayoutSupport : IStructuredType + [NativeName("Aliases", "VkDescriptorSetLayoutSupportKHR")] + public unsafe partial struct DescriptorSetLayoutSupport : IChainStart { public DescriptorSetLayoutSupport ( @@ -63,5 +64,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DescriptorSetLayoutSupport; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref DescriptorSetLayoutSupport Chain( + out DescriptorSetLayoutSupport capture) + { + capture = new DescriptorSetLayoutSupport(StructureType.DescriptorSetLayoutSupport); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutSupportKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutSupportKHR.gen.cs index f099eefcc1..b1327d311d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutSupportKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutSupportKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDescriptorSetLayoutSupportKHR")] - public unsafe partial struct DescriptorSetLayoutSupportKHR : IStructuredType + [NativeName("AliasOf", "VkDescriptorSetLayoutSupport")] + public unsafe partial struct DescriptorSetLayoutSupportKhr : IChainStart { - public DescriptorSetLayoutSupportKHR + public DescriptorSetLayoutSupportKhr ( StructureType? sType = StructureType.DescriptorSetLayoutSupport, void* pNext = null, @@ -63,5 +64,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DescriptorSetLayoutSupport; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref DescriptorSetLayoutSupportKhr Chain( + out DescriptorSetLayoutSupportKhr capture) + { + capture = new DescriptorSetLayoutSupportKhr(StructureType.DescriptorSetLayoutSupport); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountAllocateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountAllocateInfo.gen.cs index 74ab1965aa..296e80b1d1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountAllocateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountAllocateInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDescriptorSetVariableDescriptorCountAllocateInfo")] - public unsafe partial struct DescriptorSetVariableDescriptorCountAllocateInfo : IStructuredType + [NativeName("Aliases", "VkDescriptorSetVariableDescriptorCountAllocateInfoEXT")] + public unsafe partial struct DescriptorSetVariableDescriptorCountAllocateInfo : IExtendsChain { public DescriptorSetVariableDescriptorCountAllocateInfo ( @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DescriptorSetVariableDescriptorCountAllocateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountAllocateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountAllocateInfoEXT.gen.cs index 37bf89dd70..789ff5ed93 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountAllocateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountAllocateInfoEXT.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDescriptorSetVariableDescriptorCountAllocateInfoEXT")] - public unsafe partial struct DescriptorSetVariableDescriptorCountAllocateInfoEXT : IStructuredType + [NativeName("AliasOf", "VkDescriptorSetVariableDescriptorCountAllocateInfo")] + public unsafe partial struct DescriptorSetVariableDescriptorCountAllocateInfoExt : IExtendsChain { - public DescriptorSetVariableDescriptorCountAllocateInfoEXT + public DescriptorSetVariableDescriptorCountAllocateInfoExt ( StructureType? sType = StructureType.DescriptorSetVariableDescriptorCountAllocateInfo, void* pNext = null, @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DescriptorSetVariableDescriptorCountAllocateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountLayoutSupport.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountLayoutSupport.gen.cs index 2eaedb875f..766397e765 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountLayoutSupport.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountLayoutSupport.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDescriptorSetVariableDescriptorCountLayoutSupport")] - public unsafe partial struct DescriptorSetVariableDescriptorCountLayoutSupport : IStructuredType + [NativeName("Aliases", "VkDescriptorSetVariableDescriptorCountLayoutSupportEXT")] + public unsafe partial struct DescriptorSetVariableDescriptorCountLayoutSupport : IExtendsChain, IExtendsChain { public DescriptorSetVariableDescriptorCountLayoutSupport ( @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DescriptorSetVariableDescriptorCountLayoutSupport; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountLayoutSupportEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountLayoutSupportEXT.gen.cs index 2ffd6155b3..a70120e26a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountLayoutSupportEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountLayoutSupportEXT.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDescriptorSetVariableDescriptorCountLayoutSupportEXT")] - public unsafe partial struct DescriptorSetVariableDescriptorCountLayoutSupportEXT : IStructuredType + [NativeName("AliasOf", "VkDescriptorSetVariableDescriptorCountLayoutSupport")] + public unsafe partial struct DescriptorSetVariableDescriptorCountLayoutSupportExt : IExtendsChain, IExtendsChain { - public DescriptorSetVariableDescriptorCountLayoutSupportEXT + public DescriptorSetVariableDescriptorCountLayoutSupportExt ( StructureType? sType = StructureType.DescriptorSetVariableDescriptorCountLayoutSupport, void* pNext = null, @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DescriptorSetVariableDescriptorCountLayoutSupport; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorUpdateTemplateCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorUpdateTemplateCreateInfo.gen.cs index 4731848715..f7340a9b70 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorUpdateTemplateCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorUpdateTemplateCreateInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDescriptorUpdateTemplateCreateInfo")] - public unsafe partial struct DescriptorUpdateTemplateCreateInfo : IStructuredType + [NativeName("Aliases", "VkDescriptorUpdateTemplateCreateInfoKHR")] + public unsafe partial struct DescriptorUpdateTemplateCreateInfo : IChainable { public DescriptorUpdateTemplateCreateInfo ( @@ -140,5 +141,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DescriptorUpdateTemplateCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorUpdateTemplateCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorUpdateTemplateCreateInfoKHR.gen.cs index 876db9a45e..1515efeaeb 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorUpdateTemplateCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorUpdateTemplateCreateInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDescriptorUpdateTemplateCreateInfoKHR")] - public unsafe partial struct DescriptorUpdateTemplateCreateInfoKHR : IStructuredType + [NativeName("AliasOf", "VkDescriptorUpdateTemplateCreateInfo")] + public unsafe partial struct DescriptorUpdateTemplateCreateInfoKhr : IChainable { - public DescriptorUpdateTemplateCreateInfoKHR + public DescriptorUpdateTemplateCreateInfoKhr ( StructureType? sType = StructureType.DescriptorUpdateTemplateCreateInfo, void* pNext = null, @@ -140,5 +141,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DescriptorUpdateTemplateCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorUpdateTemplateEntry.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorUpdateTemplateEntry.gen.cs index 95fc39a566..29325d645e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorUpdateTemplateEntry.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorUpdateTemplateEntry.gen.cs @@ -17,6 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDescriptorUpdateTemplateEntry")] + [NativeName("Aliases", "VkDescriptorUpdateTemplateEntryKHR")] public unsafe partial struct DescriptorUpdateTemplateEntry { public DescriptorUpdateTemplateEntry diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorUpdateTemplateEntryKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorUpdateTemplateEntryKHR.gen.cs index 4cdfce864e..83262e6381 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorUpdateTemplateEntryKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorUpdateTemplateEntryKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDescriptorUpdateTemplateEntryKHR")] - public unsafe partial struct DescriptorUpdateTemplateEntryKHR + [NativeName("AliasOf", "VkDescriptorUpdateTemplateEntry")] + public unsafe partial struct DescriptorUpdateTemplateEntryKhr { - public DescriptorUpdateTemplateEntryKHR + public DescriptorUpdateTemplateEntryKhr ( uint? dstBinding = null, uint? dstArrayElement = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceBufferMemoryRequirementsKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceBufferMemoryRequirementsKHR.gen.cs index 91c5f6b521..8d50a42b9d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceBufferMemoryRequirementsKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceBufferMemoryRequirementsKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceBufferMemoryRequirementsKHR")] - public unsafe partial struct DeviceBufferMemoryRequirementsKHR : IStructuredType + public unsafe partial struct DeviceBufferMemoryRequirementsKHR : IChainable { public DeviceBufferMemoryRequirementsKHR ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DeviceBufferMemoryRequirementsKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceCreateInfo.gen.cs index a45ce23282..1c3fcbdc3f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceCreateInfo")] - public unsafe partial struct DeviceCreateInfo : IStructuredType + public unsafe partial struct DeviceCreateInfo : IChainStart { public DeviceCreateInfo ( @@ -140,5 +140,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DeviceCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref DeviceCreateInfo Chain( + out DeviceCreateInfo capture) + { + capture = new DeviceCreateInfo(StructureType.DeviceCreateInfo); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceDeviceMemoryReportCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceDeviceMemoryReportCreateInfoEXT.gen.cs index 517a0d20b7..eb4652fdb7 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceDeviceMemoryReportCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceDeviceMemoryReportCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceDeviceMemoryReportCreateInfoEXT")] - public unsafe partial struct DeviceDeviceMemoryReportCreateInfoEXT : IStructuredType + public unsafe partial struct DeviceDeviceMemoryReportCreateInfoEXT : IExtendsChain { public DeviceDeviceMemoryReportCreateInfoEXT ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DeviceDeviceMemoryReportCreateInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceDiagnosticsConfigCreateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceDiagnosticsConfigCreateInfoNV.gen.cs index d7bad36f2d..bd08f5cbfb 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceDiagnosticsConfigCreateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceDiagnosticsConfigCreateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceDiagnosticsConfigCreateInfoNV")] - public unsafe partial struct DeviceDiagnosticsConfigCreateInfoNV : IStructuredType + public unsafe partial struct DeviceDiagnosticsConfigCreateInfoNV : IExtendsChain { public DeviceDiagnosticsConfigCreateInfoNV ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DeviceDiagnosticsConfigCreateInfoNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceEventInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceEventInfoEXT.gen.cs index 3fef4bce44..24af9a9a9f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceEventInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceEventInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceEventInfoEXT")] - public unsafe partial struct DeviceEventInfoEXT : IStructuredType + public unsafe partial struct DeviceEventInfoEXT : IChainable { public DeviceEventInfoEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DeviceEventInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupBindSparseInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupBindSparseInfo.gen.cs index f39eade066..c89cf01ec0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupBindSparseInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupBindSparseInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceGroupBindSparseInfo")] - public unsafe partial struct DeviceGroupBindSparseInfo : IStructuredType + [NativeName("Aliases", "VkDeviceGroupBindSparseInfoKHR")] + public unsafe partial struct DeviceGroupBindSparseInfo : IExtendsChain { public DeviceGroupBindSparseInfo ( @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DeviceGroupBindSparseInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupBindSparseInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupBindSparseInfoKHR.gen.cs index c7baa62265..64c6f1f025 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupBindSparseInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupBindSparseInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceGroupBindSparseInfoKHR")] - public unsafe partial struct DeviceGroupBindSparseInfoKHR : IStructuredType + [NativeName("AliasOf", "VkDeviceGroupBindSparseInfo")] + public unsafe partial struct DeviceGroupBindSparseInfoKhr : IExtendsChain { - public DeviceGroupBindSparseInfoKHR + public DeviceGroupBindSparseInfoKhr ( StructureType? sType = StructureType.DeviceGroupBindSparseInfo, void* pNext = null, @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DeviceGroupBindSparseInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupCommandBufferBeginInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupCommandBufferBeginInfo.gen.cs index 16b9be0e00..4fbbb74978 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupCommandBufferBeginInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupCommandBufferBeginInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceGroupCommandBufferBeginInfo")] - public unsafe partial struct DeviceGroupCommandBufferBeginInfo : IStructuredType + [NativeName("Aliases", "VkDeviceGroupCommandBufferBeginInfoKHR")] + public unsafe partial struct DeviceGroupCommandBufferBeginInfo : IExtendsChain { public DeviceGroupCommandBufferBeginInfo ( @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DeviceGroupCommandBufferBeginInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupCommandBufferBeginInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupCommandBufferBeginInfoKHR.gen.cs index 021bd01103..d0361d26a2 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupCommandBufferBeginInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupCommandBufferBeginInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceGroupCommandBufferBeginInfoKHR")] - public unsafe partial struct DeviceGroupCommandBufferBeginInfoKHR : IStructuredType + [NativeName("AliasOf", "VkDeviceGroupCommandBufferBeginInfo")] + public unsafe partial struct DeviceGroupCommandBufferBeginInfoKhr : IExtendsChain { - public DeviceGroupCommandBufferBeginInfoKHR + public DeviceGroupCommandBufferBeginInfoKhr ( StructureType? sType = StructureType.DeviceGroupCommandBufferBeginInfo, void* pNext = null, @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DeviceGroupCommandBufferBeginInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupDeviceCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupDeviceCreateInfo.gen.cs index 9463c390cd..f3ddda990a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupDeviceCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupDeviceCreateInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceGroupDeviceCreateInfo")] - public unsafe partial struct DeviceGroupDeviceCreateInfo : IStructuredType + [NativeName("Aliases", "VkDeviceGroupDeviceCreateInfoKHR")] + public unsafe partial struct DeviceGroupDeviceCreateInfo : IExtendsChain { public DeviceGroupDeviceCreateInfo ( @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DeviceGroupDeviceCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupDeviceCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupDeviceCreateInfoKHR.gen.cs index 91184270ad..a7f3c6b68a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupDeviceCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupDeviceCreateInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceGroupDeviceCreateInfoKHR")] - public unsafe partial struct DeviceGroupDeviceCreateInfoKHR : IStructuredType + [NativeName("AliasOf", "VkDeviceGroupDeviceCreateInfo")] + public unsafe partial struct DeviceGroupDeviceCreateInfoKhr : IExtendsChain { - public DeviceGroupDeviceCreateInfoKHR + public DeviceGroupDeviceCreateInfoKhr ( StructureType? sType = StructureType.DeviceGroupDeviceCreateInfo, void* pNext = null, @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DeviceGroupDeviceCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupPresentCapabilitiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupPresentCapabilitiesKHR.gen.cs index d7afc34c6b..1abeafaea8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupPresentCapabilitiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupPresentCapabilitiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceGroupPresentCapabilitiesKHR")] - public unsafe partial struct DeviceGroupPresentCapabilitiesKHR : IStructuredType + public unsafe partial struct DeviceGroupPresentCapabilitiesKHR : IChainable { public DeviceGroupPresentCapabilitiesKHR ( @@ -68,5 +68,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DeviceGroupPresentCapabilitiesKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupPresentInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupPresentInfoKHR.gen.cs index fc17c18b74..f769c4af18 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupPresentInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupPresentInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceGroupPresentInfoKHR")] - public unsafe partial struct DeviceGroupPresentInfoKHR : IStructuredType + public unsafe partial struct DeviceGroupPresentInfoKHR : IExtendsChain { public DeviceGroupPresentInfoKHR ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DeviceGroupPresentInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupRenderPassBeginInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupRenderPassBeginInfo.gen.cs index 1f4fe52f44..8ff8a48f9a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupRenderPassBeginInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupRenderPassBeginInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceGroupRenderPassBeginInfo")] - public unsafe partial struct DeviceGroupRenderPassBeginInfo : IStructuredType + [NativeName("Aliases", "VkDeviceGroupRenderPassBeginInfoKHR")] + public unsafe partial struct DeviceGroupRenderPassBeginInfo : IExtendsChain, IExtendsChain { public DeviceGroupRenderPassBeginInfo ( @@ -85,5 +86,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DeviceGroupRenderPassBeginInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupRenderPassBeginInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupRenderPassBeginInfoKHR.gen.cs index 7739ce3f8e..8a1f576a58 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupRenderPassBeginInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupRenderPassBeginInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceGroupRenderPassBeginInfoKHR")] - public unsafe partial struct DeviceGroupRenderPassBeginInfoKHR : IStructuredType + [NativeName("AliasOf", "VkDeviceGroupRenderPassBeginInfo")] + public unsafe partial struct DeviceGroupRenderPassBeginInfoKhr : IExtendsChain, IExtendsChain { - public DeviceGroupRenderPassBeginInfoKHR + public DeviceGroupRenderPassBeginInfoKhr ( StructureType? sType = StructureType.DeviceGroupRenderPassBeginInfo, void* pNext = null, @@ -85,5 +86,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DeviceGroupRenderPassBeginInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupSubmitInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupSubmitInfo.gen.cs index a6af28bb69..58a1f9d298 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupSubmitInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupSubmitInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceGroupSubmitInfo")] - public unsafe partial struct DeviceGroupSubmitInfo : IStructuredType + [NativeName("Aliases", "VkDeviceGroupSubmitInfoKHR")] + public unsafe partial struct DeviceGroupSubmitInfo : IExtendsChain { public DeviceGroupSubmitInfo ( @@ -118,5 +119,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DeviceGroupSubmitInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupSubmitInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupSubmitInfoKHR.gen.cs index 21da7826ff..6a60dc995b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupSubmitInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupSubmitInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceGroupSubmitInfoKHR")] - public unsafe partial struct DeviceGroupSubmitInfoKHR : IStructuredType + [NativeName("AliasOf", "VkDeviceGroupSubmitInfo")] + public unsafe partial struct DeviceGroupSubmitInfoKhr : IExtendsChain { - public DeviceGroupSubmitInfoKHR + public DeviceGroupSubmitInfoKhr ( StructureType? sType = StructureType.DeviceGroupSubmitInfo, void* pNext = null, @@ -118,5 +119,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DeviceGroupSubmitInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupSwapchainCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupSwapchainCreateInfoKHR.gen.cs index 99717ec378..17ec5246c3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupSwapchainCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupSwapchainCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceGroupSwapchainCreateInfoKHR")] - public unsafe partial struct DeviceGroupSwapchainCreateInfoKHR : IStructuredType + public unsafe partial struct DeviceGroupSwapchainCreateInfoKHR : IExtendsChain { public DeviceGroupSwapchainCreateInfoKHR ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DeviceGroupSwapchainCreateInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceImageMemoryRequirementsKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceImageMemoryRequirementsKHR.gen.cs index e0d90ce398..bd92cd9e5e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceImageMemoryRequirementsKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceImageMemoryRequirementsKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceImageMemoryRequirementsKHR")] - public unsafe partial struct DeviceImageMemoryRequirementsKHR : IStructuredType + public unsafe partial struct DeviceImageMemoryRequirementsKHR : IChainable { public DeviceImageMemoryRequirementsKHR ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DeviceImageMemoryRequirementsKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceMemoryOpaqueCaptureAddressInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceMemoryOpaqueCaptureAddressInfo.gen.cs index 856b4a9ec8..56fb284f96 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceMemoryOpaqueCaptureAddressInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceMemoryOpaqueCaptureAddressInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceMemoryOpaqueCaptureAddressInfo")] - public unsafe partial struct DeviceMemoryOpaqueCaptureAddressInfo : IStructuredType + [NativeName("Aliases", "VkDeviceMemoryOpaqueCaptureAddressInfoKHR")] + public unsafe partial struct DeviceMemoryOpaqueCaptureAddressInfo : IChainable { public DeviceMemoryOpaqueCaptureAddressInfo ( @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DeviceMemoryOpaqueCaptureAddressInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceMemoryOpaqueCaptureAddressInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceMemoryOpaqueCaptureAddressInfoKHR.gen.cs index 337475de0b..d09151385e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceMemoryOpaqueCaptureAddressInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceMemoryOpaqueCaptureAddressInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceMemoryOpaqueCaptureAddressInfoKHR")] - public unsafe partial struct DeviceMemoryOpaqueCaptureAddressInfoKHR : IStructuredType + [NativeName("AliasOf", "VkDeviceMemoryOpaqueCaptureAddressInfo")] + public unsafe partial struct DeviceMemoryOpaqueCaptureAddressInfoKhr : IChainable { - public DeviceMemoryOpaqueCaptureAddressInfoKHR + public DeviceMemoryOpaqueCaptureAddressInfoKhr ( StructureType? sType = StructureType.DeviceMemoryOpaqueCaptureAddressInfo, void* pNext = null, @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DeviceMemoryOpaqueCaptureAddressInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceMemoryOverallocationCreateInfoAMD.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceMemoryOverallocationCreateInfoAMD.gen.cs index 1a611d3110..9fbfde43de 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceMemoryOverallocationCreateInfoAMD.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceMemoryOverallocationCreateInfoAMD.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceMemoryOverallocationCreateInfoAMD")] - public unsafe partial struct DeviceMemoryOverallocationCreateInfoAMD : IStructuredType + public unsafe partial struct DeviceMemoryOverallocationCreateInfoAMD : IExtendsChain { public DeviceMemoryOverallocationCreateInfoAMD ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DeviceMemoryOverallocationCreateInfoAmd; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceMemoryReportCallbackDataEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceMemoryReportCallbackDataEXT.gen.cs index 0bd3911fdf..b9f4aa0d0d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceMemoryReportCallbackDataEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceMemoryReportCallbackDataEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceMemoryReportCallbackDataEXT")] - public unsafe partial struct DeviceMemoryReportCallbackDataEXT : IStructuredType + public unsafe partial struct DeviceMemoryReportCallbackDataEXT : IChainable { public DeviceMemoryReportCallbackDataEXT ( @@ -129,5 +129,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DeviceMemoryReportCallbackDataExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DevicePrivateDataCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DevicePrivateDataCreateInfoEXT.gen.cs index 8ba97324e0..ddfed90599 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DevicePrivateDataCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DevicePrivateDataCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDevicePrivateDataCreateInfoEXT")] - public unsafe partial struct DevicePrivateDataCreateInfoEXT : IStructuredType + public unsafe partial struct DevicePrivateDataCreateInfoEXT : IExtendsChain { public DevicePrivateDataCreateInfoEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DevicePrivateDataCreateInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceQueueCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceQueueCreateInfo.gen.cs index 19e09761c3..39f8507dfb 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceQueueCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceQueueCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceQueueCreateInfo")] - public unsafe partial struct DeviceQueueCreateInfo : IStructuredType + public unsafe partial struct DeviceQueueCreateInfo : IChainStart { public DeviceQueueCreateInfo ( @@ -96,5 +96,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DeviceQueueCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref DeviceQueueCreateInfo Chain( + out DeviceQueueCreateInfo capture) + { + capture = new DeviceQueueCreateInfo(StructureType.DeviceQueueCreateInfo); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceQueueGlobalPriorityCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceQueueGlobalPriorityCreateInfoEXT.gen.cs index 5e04e5ced9..7086c388d6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceQueueGlobalPriorityCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceQueueGlobalPriorityCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceQueueGlobalPriorityCreateInfoEXT")] - public unsafe partial struct DeviceQueueGlobalPriorityCreateInfoEXT : IStructuredType + public unsafe partial struct DeviceQueueGlobalPriorityCreateInfoEXT : IExtendsChain { public DeviceQueueGlobalPriorityCreateInfoEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DeviceQueueGlobalPriorityCreateInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceQueueInfo2.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceQueueInfo2.gen.cs index 65befac25f..b1b82554b4 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceQueueInfo2.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceQueueInfo2.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceQueueInfo2")] - public unsafe partial struct DeviceQueueInfo2 : IStructuredType + public unsafe partial struct DeviceQueueInfo2 : IChainable { public DeviceQueueInfo2 ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DeviceQueueInfo2; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DirectFBSurfaceCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DirectFBSurfaceCreateInfoEXT.gen.cs index c024c0e558..fe51cd1f6a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DirectFBSurfaceCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DirectFBSurfaceCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDirectFBSurfaceCreateInfoEXT")] - public unsafe partial struct DirectFBSurfaceCreateInfoEXT : IStructuredType + public unsafe partial struct DirectFBSurfaceCreateInfoEXT : IChainable { public DirectFBSurfaceCreateInfoEXT ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DirectfbSurfaceCreateInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayEventInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayEventInfoEXT.gen.cs index e04e6e3a75..36f40cb5e9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayEventInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayEventInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDisplayEventInfoEXT")] - public unsafe partial struct DisplayEventInfoEXT : IStructuredType + public unsafe partial struct DisplayEventInfoEXT : IChainable { public DisplayEventInfoEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DisplayEventInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayModeCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayModeCreateInfoKHR.gen.cs index 170aef6da4..5e319bfa78 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayModeCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayModeCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDisplayModeCreateInfoKHR")] - public unsafe partial struct DisplayModeCreateInfoKHR : IStructuredType + public unsafe partial struct DisplayModeCreateInfoKHR : IChainable { public DisplayModeCreateInfoKHR ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DisplayModeCreateInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayModeProperties2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayModeProperties2KHR.gen.cs index 6a05c6213c..ac3bce58d4 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayModeProperties2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayModeProperties2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDisplayModeProperties2KHR")] - public unsafe partial struct DisplayModeProperties2KHR : IStructuredType + public unsafe partial struct DisplayModeProperties2KHR : IChainable { public DisplayModeProperties2KHR ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DisplayModeProperties2Khr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayNativeHdrSurfaceCapabilitiesAMD.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayNativeHdrSurfaceCapabilitiesAMD.gen.cs index 186d43b541..f39766f857 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayNativeHdrSurfaceCapabilitiesAMD.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayNativeHdrSurfaceCapabilitiesAMD.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDisplayNativeHdrSurfaceCapabilitiesAMD")] - public unsafe partial struct DisplayNativeHdrSurfaceCapabilitiesAMD : IStructuredType + public unsafe partial struct DisplayNativeHdrSurfaceCapabilitiesAMD : IExtendsChain { public DisplayNativeHdrSurfaceCapabilitiesAMD ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DisplayNativeHdrSurfaceCapabilitiesAmd; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayPlaneCapabilities2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayPlaneCapabilities2KHR.gen.cs index e7616eb301..f4655bf2d3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayPlaneCapabilities2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayPlaneCapabilities2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDisplayPlaneCapabilities2KHR")] - public unsafe partial struct DisplayPlaneCapabilities2KHR : IStructuredType + public unsafe partial struct DisplayPlaneCapabilities2KHR : IChainable { public DisplayPlaneCapabilities2KHR ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DisplayPlaneCapabilities2Khr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayPlaneInfo2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayPlaneInfo2KHR.gen.cs index d92784bf9f..b08cc5611e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayPlaneInfo2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayPlaneInfo2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDisplayPlaneInfo2KHR")] - public unsafe partial struct DisplayPlaneInfo2KHR : IStructuredType + public unsafe partial struct DisplayPlaneInfo2KHR : IChainable { public DisplayPlaneInfo2KHR ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DisplayPlaneInfo2Khr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayPlaneProperties2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayPlaneProperties2KHR.gen.cs index 08dcaead08..c28aab5719 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayPlaneProperties2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayPlaneProperties2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDisplayPlaneProperties2KHR")] - public unsafe partial struct DisplayPlaneProperties2KHR : IStructuredType + public unsafe partial struct DisplayPlaneProperties2KHR : IChainable { public DisplayPlaneProperties2KHR ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DisplayPlaneProperties2Khr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayPowerInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayPowerInfoEXT.gen.cs index afb807d81c..d0d4dce048 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayPowerInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayPowerInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDisplayPowerInfoEXT")] - public unsafe partial struct DisplayPowerInfoEXT : IStructuredType + public unsafe partial struct DisplayPowerInfoEXT : IChainable { public DisplayPowerInfoEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DisplayPowerInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayPresentInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayPresentInfoKHR.gen.cs index 44601495b5..aa1e11b8d8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayPresentInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayPresentInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDisplayPresentInfoKHR")] - public unsafe partial struct DisplayPresentInfoKHR : IStructuredType + public unsafe partial struct DisplayPresentInfoKHR : IExtendsChain { public DisplayPresentInfoKHR ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DisplayPresentInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayProperties2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayProperties2KHR.gen.cs index 91bfde46b0..946e5711d2 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayProperties2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplayProperties2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDisplayProperties2KHR")] - public unsafe partial struct DisplayProperties2KHR : IStructuredType + public unsafe partial struct DisplayProperties2KHR : IChainable { public DisplayProperties2KHR ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DisplayProperties2Khr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplaySurfaceCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplaySurfaceCreateInfoKHR.gen.cs index 050fdc4476..764f4c7178 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DisplaySurfaceCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DisplaySurfaceCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDisplaySurfaceCreateInfoKHR")] - public unsafe partial struct DisplaySurfaceCreateInfoKHR : IStructuredType + public unsafe partial struct DisplaySurfaceCreateInfoKHR : IChainable { public DisplaySurfaceCreateInfoKHR ( @@ -140,5 +140,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DisplaySurfaceCreateInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DrmFormatModifierPropertiesList2EXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DrmFormatModifierPropertiesList2EXT.gen.cs index c4ab795ea4..b85e4e2dae 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DrmFormatModifierPropertiesList2EXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DrmFormatModifierPropertiesList2EXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDrmFormatModifierPropertiesList2EXT")] - public unsafe partial struct DrmFormatModifierPropertiesList2EXT : IStructuredType + public unsafe partial struct DrmFormatModifierPropertiesList2EXT : IExtendsChain, IExtendsChain { public DrmFormatModifierPropertiesList2EXT ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DrmFormatModifierPropertiesList2Ext; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DrmFormatModifierPropertiesListEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DrmFormatModifierPropertiesListEXT.gen.cs index 4faa1a0c90..f6698312a8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DrmFormatModifierPropertiesListEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DrmFormatModifierPropertiesListEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDrmFormatModifierPropertiesListEXT")] - public unsafe partial struct DrmFormatModifierPropertiesListEXT : IStructuredType + public unsafe partial struct DrmFormatModifierPropertiesListEXT : IExtendsChain, IExtendsChain { public DrmFormatModifierPropertiesListEXT ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.DrmFormatModifierPropertiesListExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/EventCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/EventCreateInfo.gen.cs index 237369e99b..bcff06c209 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/EventCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/EventCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkEventCreateInfo")] - public unsafe partial struct EventCreateInfo : IStructuredType + public unsafe partial struct EventCreateInfo : IChainable { public EventCreateInfo ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.EventCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportFenceCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportFenceCreateInfo.gen.cs index 539c7b7761..4b2997d733 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportFenceCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportFenceCreateInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExportFenceCreateInfo")] - public unsafe partial struct ExportFenceCreateInfo : IStructuredType + [NativeName("Aliases", "VkExportFenceCreateInfoKHR")] + public unsafe partial struct ExportFenceCreateInfo : IExtendsChain { public ExportFenceCreateInfo ( @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ExportFenceCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportFenceCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportFenceCreateInfoKHR.gen.cs index d9771c7ebd..2f26ee1b7d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportFenceCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportFenceCreateInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExportFenceCreateInfoKHR")] - public unsafe partial struct ExportFenceCreateInfoKHR : IStructuredType + [NativeName("AliasOf", "VkExportFenceCreateInfo")] + public unsafe partial struct ExportFenceCreateInfoKhr : IExtendsChain { - public ExportFenceCreateInfoKHR + public ExportFenceCreateInfoKhr ( StructureType? sType = StructureType.ExportFenceCreateInfo, void* pNext = null, @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ExportFenceCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportFenceWin32HandleInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportFenceWin32HandleInfoKHR.gen.cs index ca1a8acd93..195dd649d8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportFenceWin32HandleInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportFenceWin32HandleInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExportFenceWin32HandleInfoKHR")] - public unsafe partial struct ExportFenceWin32HandleInfoKHR : IStructuredType + public unsafe partial struct ExportFenceWin32HandleInfoKHR : IExtendsChain { public ExportFenceWin32HandleInfoKHR ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ExportFenceWin32HandleInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryAllocateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryAllocateInfo.gen.cs index d526cdca89..2d361571c4 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryAllocateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryAllocateInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExportMemoryAllocateInfo")] - public unsafe partial struct ExportMemoryAllocateInfo : IStructuredType + [NativeName("Aliases", "VkExportMemoryAllocateInfoKHR")] + public unsafe partial struct ExportMemoryAllocateInfo : IExtendsChain { public ExportMemoryAllocateInfo ( @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ExportMemoryAllocateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryAllocateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryAllocateInfoKHR.gen.cs index bc0d101b8b..8b81b3cc9b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryAllocateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryAllocateInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExportMemoryAllocateInfoKHR")] - public unsafe partial struct ExportMemoryAllocateInfoKHR : IStructuredType + [NativeName("AliasOf", "VkExportMemoryAllocateInfo")] + public unsafe partial struct ExportMemoryAllocateInfoKhr : IExtendsChain { - public ExportMemoryAllocateInfoKHR + public ExportMemoryAllocateInfoKhr ( StructureType? sType = StructureType.ExportMemoryAllocateInfo, void* pNext = null, @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ExportMemoryAllocateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryAllocateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryAllocateInfoNV.gen.cs index c35c95aeb4..ad1f737d35 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryAllocateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryAllocateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExportMemoryAllocateInfoNV")] - public unsafe partial struct ExportMemoryAllocateInfoNV : IStructuredType + public unsafe partial struct ExportMemoryAllocateInfoNV : IExtendsChain { public ExportMemoryAllocateInfoNV ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ExportMemoryAllocateInfoNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryWin32HandleInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryWin32HandleInfoKHR.gen.cs index 3496bd33af..056ad8f3c3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryWin32HandleInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryWin32HandleInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExportMemoryWin32HandleInfoKHR")] - public unsafe partial struct ExportMemoryWin32HandleInfoKHR : IStructuredType + public unsafe partial struct ExportMemoryWin32HandleInfoKHR : IExtendsChain { public ExportMemoryWin32HandleInfoKHR ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ExportMemoryWin32HandleInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryWin32HandleInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryWin32HandleInfoNV.gen.cs index cf4884c606..d4e63c5daf 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryWin32HandleInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryWin32HandleInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExportMemoryWin32HandleInfoNV")] - public unsafe partial struct ExportMemoryWin32HandleInfoNV : IStructuredType + public unsafe partial struct ExportMemoryWin32HandleInfoNV : IExtendsChain { public ExportMemoryWin32HandleInfoNV ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ExportMemoryWin32HandleInfoNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportSemaphoreCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportSemaphoreCreateInfo.gen.cs index c3123d360c..d58a3cf6c5 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportSemaphoreCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportSemaphoreCreateInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExportSemaphoreCreateInfo")] - public unsafe partial struct ExportSemaphoreCreateInfo : IStructuredType + [NativeName("Aliases", "VkExportSemaphoreCreateInfoKHR")] + public unsafe partial struct ExportSemaphoreCreateInfo : IExtendsChain { public ExportSemaphoreCreateInfo ( @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ExportSemaphoreCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportSemaphoreCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportSemaphoreCreateInfoKHR.gen.cs index 53e2e7e0c7..cde8a0b420 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportSemaphoreCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportSemaphoreCreateInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExportSemaphoreCreateInfoKHR")] - public unsafe partial struct ExportSemaphoreCreateInfoKHR : IStructuredType + [NativeName("AliasOf", "VkExportSemaphoreCreateInfo")] + public unsafe partial struct ExportSemaphoreCreateInfoKhr : IExtendsChain { - public ExportSemaphoreCreateInfoKHR + public ExportSemaphoreCreateInfoKhr ( StructureType? sType = StructureType.ExportSemaphoreCreateInfo, void* pNext = null, @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ExportSemaphoreCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportSemaphoreWin32HandleInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportSemaphoreWin32HandleInfoKHR.gen.cs index 533721fe71..b8760d74bf 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportSemaphoreWin32HandleInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportSemaphoreWin32HandleInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExportSemaphoreWin32HandleInfoKHR")] - public unsafe partial struct ExportSemaphoreWin32HandleInfoKHR : IStructuredType + public unsafe partial struct ExportSemaphoreWin32HandleInfoKHR : IExtendsChain { public ExportSemaphoreWin32HandleInfoKHR ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ExportSemaphoreWin32HandleInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalBufferProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalBufferProperties.gen.cs index 0d34beeea3..b783fd727e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalBufferProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalBufferProperties.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExternalBufferProperties")] - public unsafe partial struct ExternalBufferProperties : IStructuredType + [NativeName("Aliases", "VkExternalBufferPropertiesKHR")] + public unsafe partial struct ExternalBufferProperties : IChainable { public ExternalBufferProperties ( @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ExternalBufferProperties; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalBufferPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalBufferPropertiesKHR.gen.cs index 4cab0a5f1e..dac75e7c80 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalBufferPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalBufferPropertiesKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExternalBufferPropertiesKHR")] - public unsafe partial struct ExternalBufferPropertiesKHR : IStructuredType + [NativeName("AliasOf", "VkExternalBufferProperties")] + public unsafe partial struct ExternalBufferPropertiesKhr : IChainable { - public ExternalBufferPropertiesKHR + public ExternalBufferPropertiesKhr ( StructureType? sType = StructureType.ExternalBufferProperties, void* pNext = null, @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ExternalBufferProperties; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalFenceProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalFenceProperties.gen.cs index 38c85a5a4b..e21e048474 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalFenceProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalFenceProperties.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExternalFenceProperties")] - public unsafe partial struct ExternalFenceProperties : IStructuredType + [NativeName("Aliases", "VkExternalFencePropertiesKHR")] + public unsafe partial struct ExternalFenceProperties : IChainable { public ExternalFenceProperties ( @@ -85,5 +86,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ExternalFenceProperties; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalFencePropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalFencePropertiesKHR.gen.cs index 0ef91dbc54..597c0941e8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalFencePropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalFencePropertiesKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExternalFencePropertiesKHR")] - public unsafe partial struct ExternalFencePropertiesKHR : IStructuredType + [NativeName("AliasOf", "VkExternalFenceProperties")] + public unsafe partial struct ExternalFencePropertiesKhr : IChainable { - public ExternalFencePropertiesKHR + public ExternalFencePropertiesKhr ( StructureType? sType = StructureType.ExternalFenceProperties, void* pNext = null, @@ -85,5 +86,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ExternalFenceProperties; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalFormatANDROID.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalFormatANDROID.gen.cs index 21c10e13a6..177030a1aa 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalFormatANDROID.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalFormatANDROID.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExternalFormatANDROID")] - public unsafe partial struct ExternalFormatANDROID : IStructuredType + public unsafe partial struct ExternalFormatANDROID : IExtendsChain, IExtendsChain, IExtendsChain { public ExternalFormatANDROID ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ExternalFormatAndroid; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalImageFormatProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalImageFormatProperties.gen.cs index ccee07f599..894f5c57cc 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalImageFormatProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalImageFormatProperties.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExternalImageFormatProperties")] - public unsafe partial struct ExternalImageFormatProperties : IStructuredType + [NativeName("Aliases", "VkExternalImageFormatPropertiesKHR")] + public unsafe partial struct ExternalImageFormatProperties : IExtendsChain, IExtendsChain { public ExternalImageFormatProperties ( @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ExternalImageFormatProperties; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalImageFormatPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalImageFormatPropertiesKHR.gen.cs index ddf7c3a87a..e19cfbc8e8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalImageFormatPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalImageFormatPropertiesKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExternalImageFormatPropertiesKHR")] - public unsafe partial struct ExternalImageFormatPropertiesKHR : IStructuredType + [NativeName("AliasOf", "VkExternalImageFormatProperties")] + public unsafe partial struct ExternalImageFormatPropertiesKhr : IExtendsChain, IExtendsChain { - public ExternalImageFormatPropertiesKHR + public ExternalImageFormatPropertiesKhr ( StructureType? sType = StructureType.ExternalImageFormatProperties, void* pNext = null, @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ExternalImageFormatProperties; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryBufferCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryBufferCreateInfo.gen.cs index 264744ce4f..46e3707306 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryBufferCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryBufferCreateInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExternalMemoryBufferCreateInfo")] - public unsafe partial struct ExternalMemoryBufferCreateInfo : IStructuredType + [NativeName("Aliases", "VkExternalMemoryBufferCreateInfoKHR")] + public unsafe partial struct ExternalMemoryBufferCreateInfo : IExtendsChain { public ExternalMemoryBufferCreateInfo ( @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ExternalMemoryBufferCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryBufferCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryBufferCreateInfoKHR.gen.cs index bdb874fa32..7a29f079ea 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryBufferCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryBufferCreateInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExternalMemoryBufferCreateInfoKHR")] - public unsafe partial struct ExternalMemoryBufferCreateInfoKHR : IStructuredType + [NativeName("AliasOf", "VkExternalMemoryBufferCreateInfo")] + public unsafe partial struct ExternalMemoryBufferCreateInfoKhr : IExtendsChain { - public ExternalMemoryBufferCreateInfoKHR + public ExternalMemoryBufferCreateInfoKhr ( StructureType? sType = StructureType.ExternalMemoryBufferCreateInfo, void* pNext = null, @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ExternalMemoryBufferCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryImageCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryImageCreateInfo.gen.cs index 4aa7897590..2422ddca20 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryImageCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryImageCreateInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExternalMemoryImageCreateInfo")] - public unsafe partial struct ExternalMemoryImageCreateInfo : IStructuredType + [NativeName("Aliases", "VkExternalMemoryImageCreateInfoKHR")] + public unsafe partial struct ExternalMemoryImageCreateInfo : IExtendsChain { public ExternalMemoryImageCreateInfo ( @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ExternalMemoryImageCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryImageCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryImageCreateInfoKHR.gen.cs index 73240d0ed9..148434eddd 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryImageCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryImageCreateInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExternalMemoryImageCreateInfoKHR")] - public unsafe partial struct ExternalMemoryImageCreateInfoKHR : IStructuredType + [NativeName("AliasOf", "VkExternalMemoryImageCreateInfo")] + public unsafe partial struct ExternalMemoryImageCreateInfoKhr : IExtendsChain { - public ExternalMemoryImageCreateInfoKHR + public ExternalMemoryImageCreateInfoKhr ( StructureType? sType = StructureType.ExternalMemoryImageCreateInfo, void* pNext = null, @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ExternalMemoryImageCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryImageCreateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryImageCreateInfoNV.gen.cs index 4fbb4540af..fa97179aab 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryImageCreateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryImageCreateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExternalMemoryImageCreateInfoNV")] - public unsafe partial struct ExternalMemoryImageCreateInfoNV : IStructuredType + public unsafe partial struct ExternalMemoryImageCreateInfoNV : IExtendsChain { public ExternalMemoryImageCreateInfoNV ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ExternalMemoryImageCreateInfoNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryProperties.gen.cs index a72837efcc..8f62cb1b5a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryProperties.gen.cs @@ -17,6 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExternalMemoryProperties")] + [NativeName("Aliases", "VkExternalMemoryPropertiesKHR")] public unsafe partial struct ExternalMemoryProperties { public ExternalMemoryProperties diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryPropertiesKHR.gen.cs index 72d4dbec90..70726a6941 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryPropertiesKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExternalMemoryPropertiesKHR")] - public unsafe partial struct ExternalMemoryPropertiesKHR + [NativeName("AliasOf", "VkExternalMemoryProperties")] + public unsafe partial struct ExternalMemoryPropertiesKhr { - public ExternalMemoryPropertiesKHR + public ExternalMemoryPropertiesKhr ( ExternalMemoryFeatureFlags? externalMemoryFeatures = null, ExternalMemoryHandleTypeFlags? exportFromImportedHandleTypes = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalSemaphoreProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalSemaphoreProperties.gen.cs index 30d9e5d4aa..05d9a82b3b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalSemaphoreProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalSemaphoreProperties.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExternalSemaphoreProperties")] - public unsafe partial struct ExternalSemaphoreProperties : IStructuredType + [NativeName("Aliases", "VkExternalSemaphorePropertiesKHR")] + public unsafe partial struct ExternalSemaphoreProperties : IChainable { public ExternalSemaphoreProperties ( @@ -85,5 +86,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ExternalSemaphoreProperties; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalSemaphorePropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalSemaphorePropertiesKHR.gen.cs index e013dde505..9c19cb3ac8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalSemaphorePropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalSemaphorePropertiesKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExternalSemaphorePropertiesKHR")] - public unsafe partial struct ExternalSemaphorePropertiesKHR : IStructuredType + [NativeName("AliasOf", "VkExternalSemaphoreProperties")] + public unsafe partial struct ExternalSemaphorePropertiesKhr : IChainable { - public ExternalSemaphorePropertiesKHR + public ExternalSemaphorePropertiesKhr ( StructureType? sType = StructureType.ExternalSemaphoreProperties, void* pNext = null, @@ -85,5 +86,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ExternalSemaphoreProperties; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/FenceCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/FenceCreateInfo.gen.cs index faa4fbeb82..51b361f40b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/FenceCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/FenceCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkFenceCreateInfo")] - public unsafe partial struct FenceCreateInfo : IStructuredType + public unsafe partial struct FenceCreateInfo : IChainStart { public FenceCreateInfo ( @@ -63,5 +63,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.FenceCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref FenceCreateInfo Chain( + out FenceCreateInfo capture) + { + capture = new FenceCreateInfo(StructureType.FenceCreateInfo); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/FenceGetFdInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/FenceGetFdInfoKHR.gen.cs index d13ab18867..c4f6e74534 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/FenceGetFdInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/FenceGetFdInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkFenceGetFdInfoKHR")] - public unsafe partial struct FenceGetFdInfoKHR : IStructuredType + public unsafe partial struct FenceGetFdInfoKHR : IChainable { public FenceGetFdInfoKHR ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.FenceGetFDInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/FenceGetWin32HandleInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/FenceGetWin32HandleInfoKHR.gen.cs index a1fd8a0ae6..e4e3f81288 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/FenceGetWin32HandleInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/FenceGetWin32HandleInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkFenceGetWin32HandleInfoKHR")] - public unsafe partial struct FenceGetWin32HandleInfoKHR : IStructuredType + public unsafe partial struct FenceGetWin32HandleInfoKHR : IChainable { public FenceGetWin32HandleInfoKHR ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.FenceGetWin32HandleInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/FilterCubicImageViewImageFormatPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/FilterCubicImageViewImageFormatPropertiesEXT.gen.cs index 1732aeffce..6a7f2fa671 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/FilterCubicImageViewImageFormatPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/FilterCubicImageViewImageFormatPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkFilterCubicImageViewImageFormatPropertiesEXT")] - public unsafe partial struct FilterCubicImageViewImageFormatPropertiesEXT : IStructuredType + public unsafe partial struct FilterCubicImageViewImageFormatPropertiesEXT : IExtendsChain, IExtendsChain { public FilterCubicImageViewImageFormatPropertiesEXT ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.FilterCubicImageViewImageFormatPropertiesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/FormatProperties2.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/FormatProperties2.gen.cs index 9d9cd0d0fd..0eb337dc04 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/FormatProperties2.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/FormatProperties2.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkFormatProperties2")] - public unsafe partial struct FormatProperties2 : IStructuredType + [NativeName("Aliases", "VkFormatProperties2KHR")] + public unsafe partial struct FormatProperties2 : IChainStart { public FormatProperties2 ( @@ -63,5 +64,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.FormatProperties2; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref FormatProperties2 Chain( + out FormatProperties2 capture) + { + capture = new FormatProperties2(StructureType.FormatProperties2); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/FormatProperties2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/FormatProperties2KHR.gen.cs index 9a6e276c05..2c51ec8d79 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/FormatProperties2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/FormatProperties2KHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkFormatProperties2KHR")] - public unsafe partial struct FormatProperties2KHR : IStructuredType + [NativeName("AliasOf", "VkFormatProperties2")] + public unsafe partial struct FormatProperties2Khr : IChainStart { - public FormatProperties2KHR + public FormatProperties2Khr ( StructureType? sType = StructureType.FormatProperties2, void* pNext = null, @@ -63,5 +64,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.FormatProperties2; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref FormatProperties2Khr Chain( + out FormatProperties2Khr capture) + { + capture = new FormatProperties2Khr(StructureType.FormatProperties2); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/FormatProperties3KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/FormatProperties3KHR.gen.cs index 558a424503..8847787ca9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/FormatProperties3KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/FormatProperties3KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkFormatProperties3KHR")] - public unsafe partial struct FormatProperties3KHR : IStructuredType + public unsafe partial struct FormatProperties3KHR : IExtendsChain, IExtendsChain { public FormatProperties3KHR ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.FormatProperties3Khr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/FragmentShadingRateAttachmentInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/FragmentShadingRateAttachmentInfoKHR.gen.cs index d6495595ca..38281026f1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/FragmentShadingRateAttachmentInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/FragmentShadingRateAttachmentInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkFragmentShadingRateAttachmentInfoKHR")] - public unsafe partial struct FragmentShadingRateAttachmentInfoKHR : IStructuredType + public unsafe partial struct FragmentShadingRateAttachmentInfoKHR : IExtendsChain, IExtendsChain { public FragmentShadingRateAttachmentInfoKHR ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.FragmentShadingRateAttachmentInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferAttachmentImageInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferAttachmentImageInfo.gen.cs index 8e7a02abdc..74e5b0b42a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferAttachmentImageInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferAttachmentImageInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkFramebufferAttachmentImageInfo")] - public unsafe partial struct FramebufferAttachmentImageInfo : IStructuredType + [NativeName("Aliases", "VkFramebufferAttachmentImageInfoKHR")] + public unsafe partial struct FramebufferAttachmentImageInfo : IChainable { public FramebufferAttachmentImageInfo ( @@ -129,5 +130,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.FramebufferAttachmentImageInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferAttachmentImageInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferAttachmentImageInfoKHR.gen.cs index b439251b17..c4145d072f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferAttachmentImageInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferAttachmentImageInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkFramebufferAttachmentImageInfoKHR")] - public unsafe partial struct FramebufferAttachmentImageInfoKHR : IStructuredType + [NativeName("AliasOf", "VkFramebufferAttachmentImageInfo")] + public unsafe partial struct FramebufferAttachmentImageInfoKhr : IChainable { - public FramebufferAttachmentImageInfoKHR + public FramebufferAttachmentImageInfoKhr ( StructureType? sType = StructureType.FramebufferAttachmentImageInfo, void* pNext = null, @@ -129,5 +130,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.FramebufferAttachmentImageInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferAttachmentsCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferAttachmentsCreateInfo.gen.cs index fc46df2edc..4fd7c1c1fc 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferAttachmentsCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferAttachmentsCreateInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkFramebufferAttachmentsCreateInfo")] - public unsafe partial struct FramebufferAttachmentsCreateInfo : IStructuredType + [NativeName("Aliases", "VkFramebufferAttachmentsCreateInfoKHR")] + public unsafe partial struct FramebufferAttachmentsCreateInfo : IExtendsChain { public FramebufferAttachmentsCreateInfo ( @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.FramebufferAttachmentsCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferAttachmentsCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferAttachmentsCreateInfoKHR.gen.cs index ae02f5b67f..275f3f0c00 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferAttachmentsCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferAttachmentsCreateInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkFramebufferAttachmentsCreateInfoKHR")] - public unsafe partial struct FramebufferAttachmentsCreateInfoKHR : IStructuredType + [NativeName("AliasOf", "VkFramebufferAttachmentsCreateInfo")] + public unsafe partial struct FramebufferAttachmentsCreateInfoKhr : IExtendsChain { - public FramebufferAttachmentsCreateInfoKHR + public FramebufferAttachmentsCreateInfoKhr ( StructureType? sType = StructureType.FramebufferAttachmentsCreateInfo, void* pNext = null, @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.FramebufferAttachmentsCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferCreateInfo.gen.cs index 50df07b41d..68403aaf16 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkFramebufferCreateInfo")] - public unsafe partial struct FramebufferCreateInfo : IStructuredType + public unsafe partial struct FramebufferCreateInfo : IChainStart { public FramebufferCreateInfo ( @@ -129,5 +129,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.FramebufferCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref FramebufferCreateInfo Chain( + out FramebufferCreateInfo capture) + { + capture = new FramebufferCreateInfo(StructureType.FramebufferCreateInfo); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferMixedSamplesCombinationNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferMixedSamplesCombinationNV.gen.cs index d7a3d9134f..a1ee71500b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferMixedSamplesCombinationNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferMixedSamplesCombinationNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkFramebufferMixedSamplesCombinationNV")] - public unsafe partial struct FramebufferMixedSamplesCombinationNV : IStructuredType + public unsafe partial struct FramebufferMixedSamplesCombinationNV : IChainable { public FramebufferMixedSamplesCombinationNV ( @@ -96,5 +96,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.FramebufferMixedSamplesCombinationNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/GeneratedCommandsInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/GeneratedCommandsInfoNV.gen.cs index 6f68889009..112593fdc2 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/GeneratedCommandsInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/GeneratedCommandsInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkGeneratedCommandsInfoNV")] - public unsafe partial struct GeneratedCommandsInfoNV : IStructuredType + public unsafe partial struct GeneratedCommandsInfoNV : IChainable { public GeneratedCommandsInfoNV ( @@ -195,5 +195,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.GeneratedCommandsInfoNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/GeneratedCommandsMemoryRequirementsInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/GeneratedCommandsMemoryRequirementsInfoNV.gen.cs index 524d793425..9b8d9bddc6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/GeneratedCommandsMemoryRequirementsInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/GeneratedCommandsMemoryRequirementsInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkGeneratedCommandsMemoryRequirementsInfoNV")] - public unsafe partial struct GeneratedCommandsMemoryRequirementsInfoNV : IStructuredType + public unsafe partial struct GeneratedCommandsMemoryRequirementsInfoNV : IChainable { public GeneratedCommandsMemoryRequirementsInfoNV ( @@ -96,5 +96,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.GeneratedCommandsMemoryRequirementsInfoNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/GeometryAABBNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/GeometryAABBNV.gen.cs index 7c89e4f514..f5eacdda19 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/GeometryAABBNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/GeometryAABBNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkGeometryAABBNV")] - public unsafe partial struct GeometryAABBNV : IStructuredType + public unsafe partial struct GeometryAABBNV : IChainable { public GeometryAABBNV ( @@ -96,5 +96,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.GeometryAabbNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/GeometryNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/GeometryNV.gen.cs index 32993023d8..25ada0431e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/GeometryNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/GeometryNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkGeometryNV")] - public unsafe partial struct GeometryNV : IStructuredType + public unsafe partial struct GeometryNV : IChainable { public GeometryNV ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.GeometryNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/GeometryTrianglesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/GeometryTrianglesNV.gen.cs index 86e154db99..12c885d654 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/GeometryTrianglesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/GeometryTrianglesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkGeometryTrianglesNV")] - public unsafe partial struct GeometryTrianglesNV : IStructuredType + public unsafe partial struct GeometryTrianglesNV : IChainable { public GeometryTrianglesNV ( @@ -173,5 +173,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.GeometryTrianglesNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/GraphicsPipelineCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/GraphicsPipelineCreateInfo.gen.cs index 0ad7770200..ceb21ebd03 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/GraphicsPipelineCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/GraphicsPipelineCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkGraphicsPipelineCreateInfo")] - public unsafe partial struct GraphicsPipelineCreateInfo : IStructuredType + public unsafe partial struct GraphicsPipelineCreateInfo : IChainStart { public GraphicsPipelineCreateInfo ( @@ -239,5 +239,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.GraphicsPipelineCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref GraphicsPipelineCreateInfo Chain( + out GraphicsPipelineCreateInfo capture) + { + capture = new GraphicsPipelineCreateInfo(StructureType.GraphicsPipelineCreateInfo); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/GraphicsPipelineShaderGroupsCreateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/GraphicsPipelineShaderGroupsCreateInfoNV.gen.cs index 1551d5b26c..6a3d761091 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/GraphicsPipelineShaderGroupsCreateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/GraphicsPipelineShaderGroupsCreateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkGraphicsPipelineShaderGroupsCreateInfoNV")] - public unsafe partial struct GraphicsPipelineShaderGroupsCreateInfoNV : IStructuredType + public unsafe partial struct GraphicsPipelineShaderGroupsCreateInfoNV : IExtendsChain { public GraphicsPipelineShaderGroupsCreateInfoNV ( @@ -96,5 +96,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.GraphicsPipelineShaderGroupsCreateInfoNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/GraphicsShaderGroupCreateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/GraphicsShaderGroupCreateInfoNV.gen.cs index ea50a6f064..2e17280866 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/GraphicsShaderGroupCreateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/GraphicsShaderGroupCreateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkGraphicsShaderGroupCreateInfoNV")] - public unsafe partial struct GraphicsShaderGroupCreateInfoNV : IStructuredType + public unsafe partial struct GraphicsShaderGroupCreateInfoNV : IChainable { public GraphicsShaderGroupCreateInfoNV ( @@ -96,5 +96,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.GraphicsShaderGroupCreateInfoNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/HdrMetadataEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/HdrMetadataEXT.gen.cs index 048accdeae..a0ad5234d5 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/HdrMetadataEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/HdrMetadataEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkHdrMetadataEXT")] - public unsafe partial struct HdrMetadataEXT : IStructuredType + public unsafe partial struct HdrMetadataEXT : IChainable { public HdrMetadataEXT ( @@ -140,5 +140,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.HdrMetadataExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/HeadlessSurfaceCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/HeadlessSurfaceCreateInfoEXT.gen.cs index d7f4786aa4..9e61728e3e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/HeadlessSurfaceCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/HeadlessSurfaceCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkHeadlessSurfaceCreateInfoEXT")] - public unsafe partial struct HeadlessSurfaceCreateInfoEXT : IStructuredType + public unsafe partial struct HeadlessSurfaceCreateInfoEXT : IChainable { public HeadlessSurfaceCreateInfoEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.HeadlessSurfaceCreateInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/IOSSurfaceCreateInfoMVK.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/IOSSurfaceCreateInfoMVK.gen.cs index 08aca2cba3..e8ac6adfe1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/IOSSurfaceCreateInfoMVK.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/IOSSurfaceCreateInfoMVK.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkIOSSurfaceCreateInfoMVK")] - public unsafe partial struct IOSSurfaceCreateInfoMVK : IStructuredType + public unsafe partial struct IOSSurfaceCreateInfoMVK : IChainable { public IOSSurfaceCreateInfoMVK ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.IosSurfaceCreateInfoMvk; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageBlit2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageBlit2KHR.gen.cs index bfcc734a02..4a3fb8b0c5 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageBlit2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageBlit2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageBlit2KHR")] - public unsafe partial struct ImageBlit2KHR : IStructuredType + public unsafe partial struct ImageBlit2KHR : IChainStart { public ImageBlit2KHR ( @@ -138,5 +138,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImageBlit2Khr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref ImageBlit2KHR Chain( + out ImageBlit2KHR capture) + { + capture = new ImageBlit2KHR(StructureType.ImageBlit2Khr); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageConstraintsInfoFUCHSIA.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageConstraintsInfoFUCHSIA.gen.cs index e1f8147677..293f40a1e4 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageConstraintsInfoFUCHSIA.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageConstraintsInfoFUCHSIA.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageConstraintsInfoFUCHSIA")] - public unsafe partial struct ImageConstraintsInfoFUCHSIA : IStructuredType + public unsafe partial struct ImageConstraintsInfoFUCHSIA : IChainable { public ImageConstraintsInfoFUCHSIA ( @@ -96,5 +96,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImageConstraintsInfoFuchsia; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageCopy2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageCopy2KHR.gen.cs index 43d3e4e8ba..7c5757d644 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageCopy2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageCopy2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageCopy2KHR")] - public unsafe partial struct ImageCopy2KHR : IStructuredType + public unsafe partial struct ImageCopy2KHR : IChainable { public ImageCopy2KHR ( @@ -107,5 +107,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImageCopy2Khr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageCreateInfo.gen.cs index 29c60d65ce..fc429b3d7f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageCreateInfo")] - public unsafe partial struct ImageCreateInfo : IStructuredType + public unsafe partial struct ImageCreateInfo : IChainStart { public ImageCreateInfo ( @@ -195,5 +195,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImageCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref ImageCreateInfo Chain( + out ImageCreateInfo capture) + { + capture = new ImageCreateInfo(StructureType.ImageCreateInfo); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageDrmFormatModifierExplicitCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageDrmFormatModifierExplicitCreateInfoEXT.gen.cs index a23316d218..f22e03e0fd 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageDrmFormatModifierExplicitCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageDrmFormatModifierExplicitCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageDrmFormatModifierExplicitCreateInfoEXT")] - public unsafe partial struct ImageDrmFormatModifierExplicitCreateInfoEXT : IStructuredType + public unsafe partial struct ImageDrmFormatModifierExplicitCreateInfoEXT : IExtendsChain { public ImageDrmFormatModifierExplicitCreateInfoEXT ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImageDrmFormatModifierExplicitCreateInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageDrmFormatModifierListCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageDrmFormatModifierListCreateInfoEXT.gen.cs index 530e3322ad..cc6cc6b50d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageDrmFormatModifierListCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageDrmFormatModifierListCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageDrmFormatModifierListCreateInfoEXT")] - public unsafe partial struct ImageDrmFormatModifierListCreateInfoEXT : IStructuredType + public unsafe partial struct ImageDrmFormatModifierListCreateInfoEXT : IExtendsChain { public ImageDrmFormatModifierListCreateInfoEXT ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImageDrmFormatModifierListCreateInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageDrmFormatModifierPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageDrmFormatModifierPropertiesEXT.gen.cs index 5ec4113f3b..0e3af5ce1e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageDrmFormatModifierPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageDrmFormatModifierPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageDrmFormatModifierPropertiesEXT")] - public unsafe partial struct ImageDrmFormatModifierPropertiesEXT : IStructuredType + public unsafe partial struct ImageDrmFormatModifierPropertiesEXT : IChainable { public ImageDrmFormatModifierPropertiesEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImageDrmFormatModifierPropertiesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatConstraintsInfoFUCHSIA.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatConstraintsInfoFUCHSIA.gen.cs index b91b097793..ad52981c50 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatConstraintsInfoFUCHSIA.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatConstraintsInfoFUCHSIA.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageFormatConstraintsInfoFUCHSIA")] - public unsafe partial struct ImageFormatConstraintsInfoFUCHSIA : IStructuredType + public unsafe partial struct ImageFormatConstraintsInfoFUCHSIA : IChainable { public ImageFormatConstraintsInfoFUCHSIA ( @@ -118,5 +118,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImageFormatConstraintsInfoFuchsia; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatListCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatListCreateInfo.gen.cs index 0c663ce8db..92637e188a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatListCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatListCreateInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageFormatListCreateInfo")] - public unsafe partial struct ImageFormatListCreateInfo : IStructuredType + [NativeName("Aliases", "VkImageFormatListCreateInfoKHR")] + public unsafe partial struct ImageFormatListCreateInfo : IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain { public ImageFormatListCreateInfo ( @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImageFormatListCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatListCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatListCreateInfoKHR.gen.cs index caf642efbc..7687990573 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatListCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatListCreateInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageFormatListCreateInfoKHR")] - public unsafe partial struct ImageFormatListCreateInfoKHR : IStructuredType + [NativeName("AliasOf", "VkImageFormatListCreateInfo")] + public unsafe partial struct ImageFormatListCreateInfoKhr : IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain { - public ImageFormatListCreateInfoKHR + public ImageFormatListCreateInfoKhr ( StructureType? sType = StructureType.ImageFormatListCreateInfo, void* pNext = null, @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImageFormatListCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatProperties2.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatProperties2.gen.cs index b7bce57b6f..bdc52a598e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatProperties2.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatProperties2.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageFormatProperties2")] - public unsafe partial struct ImageFormatProperties2 : IStructuredType + [NativeName("Aliases", "VkImageFormatProperties2KHR")] + public unsafe partial struct ImageFormatProperties2 : IChainStart { public ImageFormatProperties2 ( @@ -63,5 +64,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImageFormatProperties2; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref ImageFormatProperties2 Chain( + out ImageFormatProperties2 capture) + { + capture = new ImageFormatProperties2(StructureType.ImageFormatProperties2); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatProperties2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatProperties2KHR.gen.cs index 737db07ac7..8da20351e4 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatProperties2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatProperties2KHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageFormatProperties2KHR")] - public unsafe partial struct ImageFormatProperties2KHR : IStructuredType + [NativeName("AliasOf", "VkImageFormatProperties2")] + public unsafe partial struct ImageFormatProperties2Khr : IChainStart { - public ImageFormatProperties2KHR + public ImageFormatProperties2Khr ( StructureType? sType = StructureType.ImageFormatProperties2, void* pNext = null, @@ -63,5 +64,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImageFormatProperties2; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref ImageFormatProperties2Khr Chain( + out ImageFormatProperties2Khr capture) + { + capture = new ImageFormatProperties2Khr(StructureType.ImageFormatProperties2); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageMemoryBarrier.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageMemoryBarrier.gen.cs index 292c451d63..817aecab51 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageMemoryBarrier.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageMemoryBarrier.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageMemoryBarrier")] - public unsafe partial struct ImageMemoryBarrier : IStructuredType + public unsafe partial struct ImageMemoryBarrier : IChainStart { public ImageMemoryBarrier ( @@ -140,5 +140,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImageMemoryBarrier; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref ImageMemoryBarrier Chain( + out ImageMemoryBarrier capture) + { + capture = new ImageMemoryBarrier(StructureType.ImageMemoryBarrier); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageMemoryBarrier2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageMemoryBarrier2KHR.gen.cs index ae6f7f621e..89ea69654a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageMemoryBarrier2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageMemoryBarrier2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageMemoryBarrier2KHR")] - public unsafe partial struct ImageMemoryBarrier2KHR : IStructuredType + public unsafe partial struct ImageMemoryBarrier2KHR : IChainStart { public ImageMemoryBarrier2KHR ( @@ -162,5 +162,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImageMemoryBarrier2Khr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref ImageMemoryBarrier2KHR Chain( + out ImageMemoryBarrier2KHR capture) + { + capture = new ImageMemoryBarrier2KHR(StructureType.ImageMemoryBarrier2Khr); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageMemoryRequirementsInfo2.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageMemoryRequirementsInfo2.gen.cs index 2491eebec5..0c9698fe8d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageMemoryRequirementsInfo2.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageMemoryRequirementsInfo2.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageMemoryRequirementsInfo2")] - public unsafe partial struct ImageMemoryRequirementsInfo2 : IStructuredType + [NativeName("Aliases", "VkImageMemoryRequirementsInfo2KHR")] + public unsafe partial struct ImageMemoryRequirementsInfo2 : IChainStart { public ImageMemoryRequirementsInfo2 ( @@ -63,5 +64,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImageMemoryRequirementsInfo2; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref ImageMemoryRequirementsInfo2 Chain( + out ImageMemoryRequirementsInfo2 capture) + { + capture = new ImageMemoryRequirementsInfo2(StructureType.ImageMemoryRequirementsInfo2); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageMemoryRequirementsInfo2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageMemoryRequirementsInfo2KHR.gen.cs index 0bfd7edac0..8702d7f70c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageMemoryRequirementsInfo2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageMemoryRequirementsInfo2KHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageMemoryRequirementsInfo2KHR")] - public unsafe partial struct ImageMemoryRequirementsInfo2KHR : IStructuredType + [NativeName("AliasOf", "VkImageMemoryRequirementsInfo2")] + public unsafe partial struct ImageMemoryRequirementsInfo2Khr : IChainStart { - public ImageMemoryRequirementsInfo2KHR + public ImageMemoryRequirementsInfo2Khr ( StructureType? sType = StructureType.ImageMemoryRequirementsInfo2, void* pNext = null, @@ -63,5 +64,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImageMemoryRequirementsInfo2; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref ImageMemoryRequirementsInfo2Khr Chain( + out ImageMemoryRequirementsInfo2Khr capture) + { + capture = new ImageMemoryRequirementsInfo2Khr(StructureType.ImageMemoryRequirementsInfo2); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImagePipeSurfaceCreateInfoFUCHSIA.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImagePipeSurfaceCreateInfoFUCHSIA.gen.cs index d68ea72320..8b5e26153b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImagePipeSurfaceCreateInfoFUCHSIA.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImagePipeSurfaceCreateInfoFUCHSIA.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImagePipeSurfaceCreateInfoFUCHSIA")] - public unsafe partial struct ImagePipeSurfaceCreateInfoFUCHSIA : IStructuredType + public unsafe partial struct ImagePipeSurfaceCreateInfoFUCHSIA : IChainable { public ImagePipeSurfaceCreateInfoFUCHSIA ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImagepipeSurfaceCreateInfoFuchsia; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImagePlaneMemoryRequirementsInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImagePlaneMemoryRequirementsInfo.gen.cs index 8033aa109b..8a310c4e26 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImagePlaneMemoryRequirementsInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImagePlaneMemoryRequirementsInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImagePlaneMemoryRequirementsInfo")] - public unsafe partial struct ImagePlaneMemoryRequirementsInfo : IStructuredType + [NativeName("Aliases", "VkImagePlaneMemoryRequirementsInfoKHR")] + public unsafe partial struct ImagePlaneMemoryRequirementsInfo : IExtendsChain, IExtendsChain { public ImagePlaneMemoryRequirementsInfo ( @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImagePlaneMemoryRequirementsInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImagePlaneMemoryRequirementsInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImagePlaneMemoryRequirementsInfoKHR.gen.cs index 3f99929336..d10e028237 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImagePlaneMemoryRequirementsInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImagePlaneMemoryRequirementsInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImagePlaneMemoryRequirementsInfoKHR")] - public unsafe partial struct ImagePlaneMemoryRequirementsInfoKHR : IStructuredType + [NativeName("AliasOf", "VkImagePlaneMemoryRequirementsInfo")] + public unsafe partial struct ImagePlaneMemoryRequirementsInfoKhr : IExtendsChain, IExtendsChain { - public ImagePlaneMemoryRequirementsInfoKHR + public ImagePlaneMemoryRequirementsInfoKhr ( StructureType? sType = StructureType.ImagePlaneMemoryRequirementsInfo, void* pNext = null, @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImagePlaneMemoryRequirementsInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageResolve2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageResolve2KHR.gen.cs index 6adb871a6e..0e84799b9d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageResolve2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageResolve2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageResolve2KHR")] - public unsafe partial struct ImageResolve2KHR : IStructuredType + public unsafe partial struct ImageResolve2KHR : IChainable { public ImageResolve2KHR ( @@ -107,5 +107,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImageResolve2Khr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageSparseMemoryRequirementsInfo2.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageSparseMemoryRequirementsInfo2.gen.cs index 0eb85c8b15..bc638fca4d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageSparseMemoryRequirementsInfo2.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageSparseMemoryRequirementsInfo2.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageSparseMemoryRequirementsInfo2")] - public unsafe partial struct ImageSparseMemoryRequirementsInfo2 : IStructuredType + [NativeName("Aliases", "VkImageSparseMemoryRequirementsInfo2KHR")] + public unsafe partial struct ImageSparseMemoryRequirementsInfo2 : IChainable { public ImageSparseMemoryRequirementsInfo2 ( @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImageSparseMemoryRequirementsInfo2; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageSparseMemoryRequirementsInfo2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageSparseMemoryRequirementsInfo2KHR.gen.cs index 16b7f624c9..c8dffc9c38 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageSparseMemoryRequirementsInfo2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageSparseMemoryRequirementsInfo2KHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageSparseMemoryRequirementsInfo2KHR")] - public unsafe partial struct ImageSparseMemoryRequirementsInfo2KHR : IStructuredType + [NativeName("AliasOf", "VkImageSparseMemoryRequirementsInfo2")] + public unsafe partial struct ImageSparseMemoryRequirementsInfo2Khr : IChainable { - public ImageSparseMemoryRequirementsInfo2KHR + public ImageSparseMemoryRequirementsInfo2Khr ( StructureType? sType = StructureType.ImageSparseMemoryRequirementsInfo2, void* pNext = null, @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImageSparseMemoryRequirementsInfo2; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageStencilUsageCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageStencilUsageCreateInfo.gen.cs index b70d8ef20a..dabe4b7a13 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageStencilUsageCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageStencilUsageCreateInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageStencilUsageCreateInfo")] - public unsafe partial struct ImageStencilUsageCreateInfo : IStructuredType + [NativeName("Aliases", "VkImageStencilUsageCreateInfoEXT")] + public unsafe partial struct ImageStencilUsageCreateInfo : IExtendsChain, IExtendsChain, IExtendsChain { public ImageStencilUsageCreateInfo ( @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImageStencilUsageCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageStencilUsageCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageStencilUsageCreateInfoEXT.gen.cs index 449fddbebc..b08429a6f9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageStencilUsageCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageStencilUsageCreateInfoEXT.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageStencilUsageCreateInfoEXT")] - public unsafe partial struct ImageStencilUsageCreateInfoEXT : IStructuredType + [NativeName("AliasOf", "VkImageStencilUsageCreateInfo")] + public unsafe partial struct ImageStencilUsageCreateInfoExt : IExtendsChain, IExtendsChain, IExtendsChain { - public ImageStencilUsageCreateInfoEXT + public ImageStencilUsageCreateInfoExt ( StructureType? sType = StructureType.ImageStencilUsageCreateInfo, void* pNext = null, @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImageStencilUsageCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageSwapchainCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageSwapchainCreateInfoKHR.gen.cs index c51cd29a50..a04c7e0810 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageSwapchainCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageSwapchainCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageSwapchainCreateInfoKHR")] - public unsafe partial struct ImageSwapchainCreateInfoKHR : IStructuredType + public unsafe partial struct ImageSwapchainCreateInfoKHR : IExtendsChain { public ImageSwapchainCreateInfoKHR ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImageSwapchainCreateInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewASTCDecodeModeEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewASTCDecodeModeEXT.gen.cs index 7d8515e41d..d68176475e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewASTCDecodeModeEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewASTCDecodeModeEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageViewASTCDecodeModeEXT")] - public unsafe partial struct ImageViewASTCDecodeModeEXT : IStructuredType + public unsafe partial struct ImageViewASTCDecodeModeEXT : IExtendsChain { public ImageViewASTCDecodeModeEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImageViewAstcDecodeModeExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewAddressPropertiesNVX.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewAddressPropertiesNVX.gen.cs index 188411ff05..909b96b660 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewAddressPropertiesNVX.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewAddressPropertiesNVX.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageViewAddressPropertiesNVX")] - public unsafe partial struct ImageViewAddressPropertiesNVX : IStructuredType + public unsafe partial struct ImageViewAddressPropertiesNVX : IChainable { public ImageViewAddressPropertiesNVX ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImageViewAddressPropertiesNvx; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewCreateInfo.gen.cs index 1dfc2b0726..e80bb1c913 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageViewCreateInfo")] - public unsafe partial struct ImageViewCreateInfo : IStructuredType + public unsafe partial struct ImageViewCreateInfo : IChainStart { public ImageViewCreateInfo ( @@ -118,5 +118,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImageViewCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref ImageViewCreateInfo Chain( + out ImageViewCreateInfo capture) + { + capture = new ImageViewCreateInfo(StructureType.ImageViewCreateInfo); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewHandleInfoNVX.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewHandleInfoNVX.gen.cs index 9bd62f9333..a922d33a36 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewHandleInfoNVX.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewHandleInfoNVX.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageViewHandleInfoNVX")] - public unsafe partial struct ImageViewHandleInfoNVX : IStructuredType + public unsafe partial struct ImageViewHandleInfoNVX : IChainable { public ImageViewHandleInfoNVX ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImageViewHandleInfoNvx; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewUsageCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewUsageCreateInfo.gen.cs index a3dd0ac294..4cf9df5e28 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewUsageCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewUsageCreateInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageViewUsageCreateInfo")] - public unsafe partial struct ImageViewUsageCreateInfo : IStructuredType + [NativeName("Aliases", "VkImageViewUsageCreateInfoKHR")] + public unsafe partial struct ImageViewUsageCreateInfo : IExtendsChain { public ImageViewUsageCreateInfo ( @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImageViewUsageCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewUsageCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewUsageCreateInfoKHR.gen.cs index 2b7e3e93f3..826159a09c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewUsageCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewUsageCreateInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageViewUsageCreateInfoKHR")] - public unsafe partial struct ImageViewUsageCreateInfoKHR : IStructuredType + [NativeName("AliasOf", "VkImageViewUsageCreateInfo")] + public unsafe partial struct ImageViewUsageCreateInfoKhr : IExtendsChain { - public ImageViewUsageCreateInfoKHR + public ImageViewUsageCreateInfoKhr ( StructureType? sType = StructureType.ImageViewUsageCreateInfo, void* pNext = null, @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImageViewUsageCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportAndroidHardwareBufferInfoANDROID.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportAndroidHardwareBufferInfoANDROID.gen.cs index 85b4cd21b1..30425fe38f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportAndroidHardwareBufferInfoANDROID.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportAndroidHardwareBufferInfoANDROID.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImportAndroidHardwareBufferInfoANDROID")] - public unsafe partial struct ImportAndroidHardwareBufferInfoANDROID : IStructuredType + public unsafe partial struct ImportAndroidHardwareBufferInfoANDROID : IExtendsChain { public ImportAndroidHardwareBufferInfoANDROID ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImportAndroidHardwareBufferInfoAndroid; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportFenceFdInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportFenceFdInfoKHR.gen.cs index 04bdda066a..33c345a5a4 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportFenceFdInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportFenceFdInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImportFenceFdInfoKHR")] - public unsafe partial struct ImportFenceFdInfoKHR : IStructuredType + public unsafe partial struct ImportFenceFdInfoKHR : IChainable { public ImportFenceFdInfoKHR ( @@ -96,5 +96,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImportFenceFDInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportFenceWin32HandleInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportFenceWin32HandleInfoKHR.gen.cs index f730c0d3f2..032a5662c4 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportFenceWin32HandleInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportFenceWin32HandleInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImportFenceWin32HandleInfoKHR")] - public unsafe partial struct ImportFenceWin32HandleInfoKHR : IStructuredType + public unsafe partial struct ImportFenceWin32HandleInfoKHR : IChainable { public ImportFenceWin32HandleInfoKHR ( @@ -107,5 +107,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImportFenceWin32HandleInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryBufferCollectionFUCHSIA.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryBufferCollectionFUCHSIA.gen.cs index 78b6776548..f5c9b667f7 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryBufferCollectionFUCHSIA.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryBufferCollectionFUCHSIA.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImportMemoryBufferCollectionFUCHSIA")] - public unsafe partial struct ImportMemoryBufferCollectionFUCHSIA : IStructuredType + public unsafe partial struct ImportMemoryBufferCollectionFUCHSIA : IExtendsChain { public ImportMemoryBufferCollectionFUCHSIA ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImportMemoryBufferCollectionFuchsia; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryFdInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryFdInfoKHR.gen.cs index 2d08965aa0..d107b755d9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryFdInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryFdInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImportMemoryFdInfoKHR")] - public unsafe partial struct ImportMemoryFdInfoKHR : IStructuredType + public unsafe partial struct ImportMemoryFdInfoKHR : IExtendsChain { public ImportMemoryFdInfoKHR ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImportMemoryFDInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryHostPointerInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryHostPointerInfoEXT.gen.cs index f33e9b66a8..523ced75e0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryHostPointerInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryHostPointerInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImportMemoryHostPointerInfoEXT")] - public unsafe partial struct ImportMemoryHostPointerInfoEXT : IStructuredType + public unsafe partial struct ImportMemoryHostPointerInfoEXT : IExtendsChain { public ImportMemoryHostPointerInfoEXT ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImportMemoryHostPointerInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryWin32HandleInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryWin32HandleInfoKHR.gen.cs index eb66f18e80..5c80dfa4da 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryWin32HandleInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryWin32HandleInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImportMemoryWin32HandleInfoKHR")] - public unsafe partial struct ImportMemoryWin32HandleInfoKHR : IStructuredType + public unsafe partial struct ImportMemoryWin32HandleInfoKHR : IExtendsChain { public ImportMemoryWin32HandleInfoKHR ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImportMemoryWin32HandleInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryWin32HandleInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryWin32HandleInfoNV.gen.cs index 22fb605f4a..ff5ace4ae0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryWin32HandleInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryWin32HandleInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImportMemoryWin32HandleInfoNV")] - public unsafe partial struct ImportMemoryWin32HandleInfoNV : IStructuredType + public unsafe partial struct ImportMemoryWin32HandleInfoNV : IExtendsChain { public ImportMemoryWin32HandleInfoNV ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImportMemoryWin32HandleInfoNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryZirconHandleInfoFUCHSIA.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryZirconHandleInfoFUCHSIA.gen.cs index 94fb320f56..2938dd1b5c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryZirconHandleInfoFUCHSIA.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportMemoryZirconHandleInfoFUCHSIA.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImportMemoryZirconHandleInfoFUCHSIA")] - public unsafe partial struct ImportMemoryZirconHandleInfoFUCHSIA : IStructuredType + public unsafe partial struct ImportMemoryZirconHandleInfoFUCHSIA : IExtendsChain { public ImportMemoryZirconHandleInfoFUCHSIA ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImportMemoryZirconHandleInfoFuchsia; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportSemaphoreFdInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportSemaphoreFdInfoKHR.gen.cs index 63bc003152..7e9e5e16fc 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportSemaphoreFdInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportSemaphoreFdInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImportSemaphoreFdInfoKHR")] - public unsafe partial struct ImportSemaphoreFdInfoKHR : IStructuredType + public unsafe partial struct ImportSemaphoreFdInfoKHR : IChainable { public ImportSemaphoreFdInfoKHR ( @@ -96,5 +96,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImportSemaphoreFDInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportSemaphoreWin32HandleInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportSemaphoreWin32HandleInfoKHR.gen.cs index ef3591a6b6..6b742902fd 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportSemaphoreWin32HandleInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportSemaphoreWin32HandleInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImportSemaphoreWin32HandleInfoKHR")] - public unsafe partial struct ImportSemaphoreWin32HandleInfoKHR : IStructuredType + public unsafe partial struct ImportSemaphoreWin32HandleInfoKHR : IChainable { public ImportSemaphoreWin32HandleInfoKHR ( @@ -107,5 +107,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImportSemaphoreWin32HandleInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportSemaphoreZirconHandleInfoFUCHSIA.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportSemaphoreZirconHandleInfoFUCHSIA.gen.cs index cfdeebadf7..b76e26324c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImportSemaphoreZirconHandleInfoFUCHSIA.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImportSemaphoreZirconHandleInfoFUCHSIA.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImportSemaphoreZirconHandleInfoFUCHSIA")] - public unsafe partial struct ImportSemaphoreZirconHandleInfoFUCHSIA : IStructuredType + public unsafe partial struct ImportSemaphoreZirconHandleInfoFUCHSIA : IChainable { public ImportSemaphoreZirconHandleInfoFUCHSIA ( @@ -96,5 +96,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ImportSemaphoreZirconHandleInfoFuchsia; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/IndirectCommandsLayoutCreateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/IndirectCommandsLayoutCreateInfoNV.gen.cs index dea1b4e56d..65963ecf99 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/IndirectCommandsLayoutCreateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/IndirectCommandsLayoutCreateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkIndirectCommandsLayoutCreateInfoNV")] - public unsafe partial struct IndirectCommandsLayoutCreateInfoNV : IStructuredType + public unsafe partial struct IndirectCommandsLayoutCreateInfoNV : IChainable { public IndirectCommandsLayoutCreateInfoNV ( @@ -118,5 +118,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.IndirectCommandsLayoutCreateInfoNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/IndirectCommandsLayoutTokenNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/IndirectCommandsLayoutTokenNV.gen.cs index d877eb546c..1f2b7bd5c7 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/IndirectCommandsLayoutTokenNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/IndirectCommandsLayoutTokenNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkIndirectCommandsLayoutTokenNV")] - public unsafe partial struct IndirectCommandsLayoutTokenNV : IStructuredType + public unsafe partial struct IndirectCommandsLayoutTokenNV : IChainable { public IndirectCommandsLayoutTokenNV ( @@ -195,5 +195,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.IndirectCommandsLayoutTokenNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/InitializePerformanceApiInfoINTEL.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/InitializePerformanceApiInfoINTEL.gen.cs index f172a9cf56..bf32981596 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/InitializePerformanceApiInfoINTEL.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/InitializePerformanceApiInfoINTEL.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkInitializePerformanceApiInfoINTEL")] - public unsafe partial struct InitializePerformanceApiInfoINTEL : IStructuredType + public unsafe partial struct InitializePerformanceApiInfoINTEL : IChainable { public InitializePerformanceApiInfoINTEL ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.InitializePerformanceApiInfoIntel; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/InputAttachmentAspectReference.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/InputAttachmentAspectReference.gen.cs index 89202a59cf..f228fe6bf6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/InputAttachmentAspectReference.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/InputAttachmentAspectReference.gen.cs @@ -17,6 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkInputAttachmentAspectReference")] + [NativeName("Aliases", "VkInputAttachmentAspectReferenceKHR")] public unsafe partial struct InputAttachmentAspectReference { public InputAttachmentAspectReference diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/InputAttachmentAspectReferenceKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/InputAttachmentAspectReferenceKHR.gen.cs index c955cd3646..afed50ac24 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/InputAttachmentAspectReferenceKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/InputAttachmentAspectReferenceKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkInputAttachmentAspectReferenceKHR")] - public unsafe partial struct InputAttachmentAspectReferenceKHR + [NativeName("AliasOf", "VkInputAttachmentAspectReference")] + public unsafe partial struct InputAttachmentAspectReferenceKhr { - public InputAttachmentAspectReferenceKHR + public InputAttachmentAspectReferenceKhr ( uint? subpass = null, uint? inputAttachmentIndex = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/InstanceCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/InstanceCreateInfo.gen.cs index 57492e135c..0734f12f5d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/InstanceCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/InstanceCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkInstanceCreateInfo")] - public unsafe partial struct InstanceCreateInfo : IStructuredType + public unsafe partial struct InstanceCreateInfo : IChainStart { public InstanceCreateInfo ( @@ -118,5 +118,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.InstanceCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref InstanceCreateInfo Chain( + out InstanceCreateInfo capture) + { + capture = new InstanceCreateInfo(StructureType.InstanceCreateInfo); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MacOSSurfaceCreateInfoMVK.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MacOSSurfaceCreateInfoMVK.gen.cs index 97c2766cce..dfc6d089c1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MacOSSurfaceCreateInfoMVK.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MacOSSurfaceCreateInfoMVK.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMacOSSurfaceCreateInfoMVK")] - public unsafe partial struct MacOSSurfaceCreateInfoMVK : IStructuredType + public unsafe partial struct MacOSSurfaceCreateInfoMVK : IChainable { public MacOSSurfaceCreateInfoMVK ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.MacosSurfaceCreateInfoMvk; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MappedMemoryRange.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MappedMemoryRange.gen.cs index 8213fc4749..2503402f50 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MappedMemoryRange.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MappedMemoryRange.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMappedMemoryRange")] - public unsafe partial struct MappedMemoryRange : IStructuredType + public unsafe partial struct MappedMemoryRange : IChainable { public MappedMemoryRange ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.MappedMemoryRange; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryAllocateFlagsInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryAllocateFlagsInfo.gen.cs index 05a665ad17..09f8f4190d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryAllocateFlagsInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryAllocateFlagsInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryAllocateFlagsInfo")] - public unsafe partial struct MemoryAllocateFlagsInfo : IStructuredType + [NativeName("Aliases", "VkMemoryAllocateFlagsInfoKHR")] + public unsafe partial struct MemoryAllocateFlagsInfo : IExtendsChain { public MemoryAllocateFlagsInfo ( @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.MemoryAllocateFlagsInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryAllocateFlagsInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryAllocateFlagsInfoKHR.gen.cs index 0e0e043a91..0c7ff7f8a5 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryAllocateFlagsInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryAllocateFlagsInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryAllocateFlagsInfoKHR")] - public unsafe partial struct MemoryAllocateFlagsInfoKHR : IStructuredType + [NativeName("AliasOf", "VkMemoryAllocateFlagsInfo")] + public unsafe partial struct MemoryAllocateFlagsInfoKhr : IExtendsChain { - public MemoryAllocateFlagsInfoKHR + public MemoryAllocateFlagsInfoKhr ( StructureType? sType = StructureType.MemoryAllocateFlagsInfo, void* pNext = null, @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.MemoryAllocateFlagsInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryAllocateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryAllocateInfo.gen.cs index 32641aa11b..ed87eb27e6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryAllocateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryAllocateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryAllocateInfo")] - public unsafe partial struct MemoryAllocateInfo : IStructuredType + public unsafe partial struct MemoryAllocateInfo : IChainStart { public MemoryAllocateInfo ( @@ -74,5 +74,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.MemoryAllocateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref MemoryAllocateInfo Chain( + out MemoryAllocateInfo capture) + { + capture = new MemoryAllocateInfo(StructureType.MemoryAllocateInfo); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryBarrier.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryBarrier.gen.cs index 8a081b669a..f4edf1deef 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryBarrier.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryBarrier.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryBarrier")] - public unsafe partial struct MemoryBarrier : IStructuredType + public unsafe partial struct MemoryBarrier : IChainable { public MemoryBarrier ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.MemoryBarrier; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryBarrier2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryBarrier2KHR.gen.cs index ec182469f5..ae22032dcf 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryBarrier2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryBarrier2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryBarrier2KHR")] - public unsafe partial struct MemoryBarrier2KHR : IStructuredType + public unsafe partial struct MemoryBarrier2KHR : IExtendsChain, IExtendsChain { public MemoryBarrier2KHR ( @@ -96,5 +96,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.MemoryBarrier2Khr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedAllocateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedAllocateInfo.gen.cs index e32d25f6d9..61883a7652 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedAllocateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedAllocateInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryDedicatedAllocateInfo")] - public unsafe partial struct MemoryDedicatedAllocateInfo : IStructuredType + [NativeName("Aliases", "VkMemoryDedicatedAllocateInfoKHR")] + public unsafe partial struct MemoryDedicatedAllocateInfo : IExtendsChain { public MemoryDedicatedAllocateInfo ( @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.MemoryDedicatedAllocateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedAllocateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedAllocateInfoKHR.gen.cs index a419054ba4..2def34b0d1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedAllocateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedAllocateInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryDedicatedAllocateInfoKHR")] - public unsafe partial struct MemoryDedicatedAllocateInfoKHR : IStructuredType + [NativeName("AliasOf", "VkMemoryDedicatedAllocateInfo")] + public unsafe partial struct MemoryDedicatedAllocateInfoKhr : IExtendsChain { - public MemoryDedicatedAllocateInfoKHR + public MemoryDedicatedAllocateInfoKhr ( StructureType? sType = StructureType.MemoryDedicatedAllocateInfo, void* pNext = null, @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.MemoryDedicatedAllocateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedRequirements.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedRequirements.gen.cs index 270a5f4a0f..8940b76003 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedRequirements.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedRequirements.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryDedicatedRequirements")] - public unsafe partial struct MemoryDedicatedRequirements : IStructuredType + [NativeName("Aliases", "VkMemoryDedicatedRequirementsKHR")] + public unsafe partial struct MemoryDedicatedRequirements : IExtendsChain, IExtendsChain { public MemoryDedicatedRequirements ( @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.MemoryDedicatedRequirements; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedRequirementsKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedRequirementsKHR.gen.cs index cf26dac9b5..1ff3cadd70 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedRequirementsKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedRequirementsKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryDedicatedRequirementsKHR")] - public unsafe partial struct MemoryDedicatedRequirementsKHR : IStructuredType + [NativeName("AliasOf", "VkMemoryDedicatedRequirements")] + public unsafe partial struct MemoryDedicatedRequirementsKhr : IExtendsChain, IExtendsChain { - public MemoryDedicatedRequirementsKHR + public MemoryDedicatedRequirementsKhr ( StructureType? sType = StructureType.MemoryDedicatedRequirements, void* pNext = null, @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.MemoryDedicatedRequirements; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryFdPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryFdPropertiesKHR.gen.cs index d2870b7c63..4bcfde07db 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryFdPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryFdPropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryFdPropertiesKHR")] - public unsafe partial struct MemoryFdPropertiesKHR : IStructuredType + public unsafe partial struct MemoryFdPropertiesKHR : IChainable { public MemoryFdPropertiesKHR ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.MemoryFDPropertiesKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryGetAndroidHardwareBufferInfoANDROID.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryGetAndroidHardwareBufferInfoANDROID.gen.cs index 2c4390be8d..692d5af61a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryGetAndroidHardwareBufferInfoANDROID.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryGetAndroidHardwareBufferInfoANDROID.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryGetAndroidHardwareBufferInfoANDROID")] - public unsafe partial struct MemoryGetAndroidHardwareBufferInfoANDROID : IStructuredType + public unsafe partial struct MemoryGetAndroidHardwareBufferInfoANDROID : IChainable { public MemoryGetAndroidHardwareBufferInfoANDROID ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.MemoryGetAndroidHardwareBufferInfoAndroid; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryGetFdInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryGetFdInfoKHR.gen.cs index 948876235c..3d391739d3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryGetFdInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryGetFdInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryGetFdInfoKHR")] - public unsafe partial struct MemoryGetFdInfoKHR : IStructuredType + public unsafe partial struct MemoryGetFdInfoKHR : IChainable { public MemoryGetFdInfoKHR ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.MemoryGetFDInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryGetRemoteAddressInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryGetRemoteAddressInfoNV.gen.cs index fd088f6783..92553ca9bc 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryGetRemoteAddressInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryGetRemoteAddressInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryGetRemoteAddressInfoNV")] - public unsafe partial struct MemoryGetRemoteAddressInfoNV : IStructuredType + public unsafe partial struct MemoryGetRemoteAddressInfoNV : IChainable { public MemoryGetRemoteAddressInfoNV ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.MemoryGetRemoteAddressInfoNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryGetWin32HandleInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryGetWin32HandleInfoKHR.gen.cs index 85e2baa723..8234fcbe8d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryGetWin32HandleInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryGetWin32HandleInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryGetWin32HandleInfoKHR")] - public unsafe partial struct MemoryGetWin32HandleInfoKHR : IStructuredType + public unsafe partial struct MemoryGetWin32HandleInfoKHR : IChainable { public MemoryGetWin32HandleInfoKHR ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.MemoryGetWin32HandleInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryGetZirconHandleInfoFUCHSIA.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryGetZirconHandleInfoFUCHSIA.gen.cs index 92bb737a0d..5793983341 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryGetZirconHandleInfoFUCHSIA.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryGetZirconHandleInfoFUCHSIA.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryGetZirconHandleInfoFUCHSIA")] - public unsafe partial struct MemoryGetZirconHandleInfoFUCHSIA : IStructuredType + public unsafe partial struct MemoryGetZirconHandleInfoFUCHSIA : IChainable { public MemoryGetZirconHandleInfoFUCHSIA ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.MemoryGetZirconHandleInfoFuchsia; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryHostPointerPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryHostPointerPropertiesEXT.gen.cs index 835250d523..603c2802a6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryHostPointerPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryHostPointerPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryHostPointerPropertiesEXT")] - public unsafe partial struct MemoryHostPointerPropertiesEXT : IStructuredType + public unsafe partial struct MemoryHostPointerPropertiesEXT : IChainable { public MemoryHostPointerPropertiesEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.MemoryHostPointerPropertiesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryOpaqueCaptureAddressAllocateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryOpaqueCaptureAddressAllocateInfo.gen.cs index 4f8b5d7068..7809439d96 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryOpaqueCaptureAddressAllocateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryOpaqueCaptureAddressAllocateInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryOpaqueCaptureAddressAllocateInfo")] - public unsafe partial struct MemoryOpaqueCaptureAddressAllocateInfo : IStructuredType + [NativeName("Aliases", "VkMemoryOpaqueCaptureAddressAllocateInfoKHR")] + public unsafe partial struct MemoryOpaqueCaptureAddressAllocateInfo : IExtendsChain { public MemoryOpaqueCaptureAddressAllocateInfo ( @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.MemoryOpaqueCaptureAddressAllocateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryOpaqueCaptureAddressAllocateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryOpaqueCaptureAddressAllocateInfoKHR.gen.cs index 42253d3372..73259508c1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryOpaqueCaptureAddressAllocateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryOpaqueCaptureAddressAllocateInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryOpaqueCaptureAddressAllocateInfoKHR")] - public unsafe partial struct MemoryOpaqueCaptureAddressAllocateInfoKHR : IStructuredType + [NativeName("AliasOf", "VkMemoryOpaqueCaptureAddressAllocateInfo")] + public unsafe partial struct MemoryOpaqueCaptureAddressAllocateInfoKhr : IExtendsChain { - public MemoryOpaqueCaptureAddressAllocateInfoKHR + public MemoryOpaqueCaptureAddressAllocateInfoKhr ( StructureType? sType = StructureType.MemoryOpaqueCaptureAddressAllocateInfo, void* pNext = null, @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.MemoryOpaqueCaptureAddressAllocateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryPriorityAllocateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryPriorityAllocateInfoEXT.gen.cs index 469f8b22a8..2ba48bfaf0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryPriorityAllocateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryPriorityAllocateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryPriorityAllocateInfoEXT")] - public unsafe partial struct MemoryPriorityAllocateInfoEXT : IStructuredType + public unsafe partial struct MemoryPriorityAllocateInfoEXT : IExtendsChain { public MemoryPriorityAllocateInfoEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.MemoryPriorityAllocateInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryRequirements2.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryRequirements2.gen.cs index 2a911cb912..5947666128 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryRequirements2.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryRequirements2.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryRequirements2")] - public unsafe partial struct MemoryRequirements2 : IStructuredType + [NativeName("Aliases", "VkMemoryRequirements2KHR")] + public unsafe partial struct MemoryRequirements2 : IChainStart { public MemoryRequirements2 ( @@ -63,5 +64,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.MemoryRequirements2; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref MemoryRequirements2 Chain( + out MemoryRequirements2 capture) + { + capture = new MemoryRequirements2(StructureType.MemoryRequirements2); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryRequirements2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryRequirements2KHR.gen.cs index a93d516d47..dad8d022e3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryRequirements2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryRequirements2KHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryRequirements2KHR")] - public unsafe partial struct MemoryRequirements2KHR : IStructuredType + [NativeName("AliasOf", "VkMemoryRequirements2")] + public unsafe partial struct MemoryRequirements2Khr : IChainStart { - public MemoryRequirements2KHR + public MemoryRequirements2Khr ( StructureType? sType = StructureType.MemoryRequirements2, void* pNext = null, @@ -63,5 +64,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.MemoryRequirements2; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref MemoryRequirements2Khr Chain( + out MemoryRequirements2Khr capture) + { + capture = new MemoryRequirements2Khr(StructureType.MemoryRequirements2); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryWin32HandlePropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryWin32HandlePropertiesKHR.gen.cs index cef120c0a7..26a003fb60 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryWin32HandlePropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryWin32HandlePropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryWin32HandlePropertiesKHR")] - public unsafe partial struct MemoryWin32HandlePropertiesKHR : IStructuredType + public unsafe partial struct MemoryWin32HandlePropertiesKHR : IChainable { public MemoryWin32HandlePropertiesKHR ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.MemoryWin32HandlePropertiesKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryZirconHandlePropertiesFUCHSIA.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryZirconHandlePropertiesFUCHSIA.gen.cs index 29c8c58058..472528c962 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryZirconHandlePropertiesFUCHSIA.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryZirconHandlePropertiesFUCHSIA.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryZirconHandlePropertiesFUCHSIA")] - public unsafe partial struct MemoryZirconHandlePropertiesFUCHSIA : IStructuredType + public unsafe partial struct MemoryZirconHandlePropertiesFUCHSIA : IChainable { public MemoryZirconHandlePropertiesFUCHSIA ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.MemoryZirconHandlePropertiesFuchsia; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MetalSurfaceCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MetalSurfaceCreateInfoEXT.gen.cs index 28649a21ca..849fbc02c4 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MetalSurfaceCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MetalSurfaceCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMetalSurfaceCreateInfoEXT")] - public unsafe partial struct MetalSurfaceCreateInfoEXT : IStructuredType + public unsafe partial struct MetalSurfaceCreateInfoEXT : IChainable { public MetalSurfaceCreateInfoEXT ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.MetalSurfaceCreateInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MultisamplePropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MultisamplePropertiesEXT.gen.cs index 596f134ff5..f1c1601e80 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MultisamplePropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MultisamplePropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMultisamplePropertiesEXT")] - public unsafe partial struct MultisamplePropertiesEXT : IStructuredType + public unsafe partial struct MultisamplePropertiesEXT : IChainable { public MultisamplePropertiesEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.MultisamplePropertiesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MultiviewPerViewAttributesInfoNVX.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MultiviewPerViewAttributesInfoNVX.gen.cs index 1c55eebcd3..c434910779 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MultiviewPerViewAttributesInfoNVX.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MultiviewPerViewAttributesInfoNVX.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMultiviewPerViewAttributesInfoNVX")] - public unsafe partial struct MultiviewPerViewAttributesInfoNVX : IStructuredType + public unsafe partial struct MultiviewPerViewAttributesInfoNVX : IExtendsChain, IExtendsChain, IExtendsChain { public MultiviewPerViewAttributesInfoNVX ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.MultiviewPerViewAttributesInfoNvx; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MutableDescriptorTypeCreateInfoVALVE.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MutableDescriptorTypeCreateInfoVALVE.gen.cs index 2ada2d394b..b8ca0b3ebf 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MutableDescriptorTypeCreateInfoVALVE.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MutableDescriptorTypeCreateInfoVALVE.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMutableDescriptorTypeCreateInfoVALVE")] - public unsafe partial struct MutableDescriptorTypeCreateInfoVALVE : IStructuredType + public unsafe partial struct MutableDescriptorTypeCreateInfoVALVE : IExtendsChain, IExtendsChain { public MutableDescriptorTypeCreateInfoVALVE ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.MutableDescriptorTypeCreateInfoValve; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/NativeBufferANDROID.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/NativeBufferANDROID.gen.cs index c8c1bcad2e..29424b8632 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/NativeBufferANDROID.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/NativeBufferANDROID.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkNativeBufferANDROID")] - public unsafe partial struct NativeBufferANDROID : IStructuredType + public unsafe partial struct NativeBufferANDROID : IChainable { public NativeBufferANDROID ( @@ -107,5 +107,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.NativeBufferAndroid; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceConfigurationAcquireInfoINTEL.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceConfigurationAcquireInfoINTEL.gen.cs index 22ba22520f..70d78cebbe 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceConfigurationAcquireInfoINTEL.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceConfigurationAcquireInfoINTEL.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPerformanceConfigurationAcquireInfoINTEL")] - public unsafe partial struct PerformanceConfigurationAcquireInfoINTEL : IStructuredType + public unsafe partial struct PerformanceConfigurationAcquireInfoINTEL : IChainable { public PerformanceConfigurationAcquireInfoINTEL ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PerformanceConfigurationAcquireInfoIntel; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceCounterDescriptionKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceCounterDescriptionKHR.gen.cs index 5c187ead43..b644fdbe95 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceCounterDescriptionKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceCounterDescriptionKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPerformanceCounterDescriptionKHR")] - public unsafe partial struct PerformanceCounterDescriptionKHR : IStructuredType + public unsafe partial struct PerformanceCounterDescriptionKHR : IChainable { public PerformanceCounterDescriptionKHR ( @@ -78,5 +78,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PerformanceCounterDescriptionKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceCounterKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceCounterKHR.gen.cs index c63758be75..bf361b42e6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceCounterKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceCounterKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPerformanceCounterKHR")] - public unsafe partial struct PerformanceCounterKHR : IStructuredType + public unsafe partial struct PerformanceCounterKHR : IChainable { public PerformanceCounterKHR ( @@ -90,5 +90,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PerformanceCounterKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceMarkerInfoINTEL.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceMarkerInfoINTEL.gen.cs index 6d46131002..8d633b873b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceMarkerInfoINTEL.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceMarkerInfoINTEL.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPerformanceMarkerInfoINTEL")] - public unsafe partial struct PerformanceMarkerInfoINTEL : IStructuredType + public unsafe partial struct PerformanceMarkerInfoINTEL : IChainable { public PerformanceMarkerInfoINTEL ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PerformanceMarkerInfoIntel; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceOverrideInfoINTEL.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceOverrideInfoINTEL.gen.cs index 70cd90fe8d..313898b413 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceOverrideInfoINTEL.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceOverrideInfoINTEL.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPerformanceOverrideInfoINTEL")] - public unsafe partial struct PerformanceOverrideInfoINTEL : IStructuredType + public unsafe partial struct PerformanceOverrideInfoINTEL : IChainable { public PerformanceOverrideInfoINTEL ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PerformanceOverrideInfoIntel; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceQuerySubmitInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceQuerySubmitInfoKHR.gen.cs index 106abed712..2f37cdbd74 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceQuerySubmitInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceQuerySubmitInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPerformanceQuerySubmitInfoKHR")] - public unsafe partial struct PerformanceQuerySubmitInfoKHR : IStructuredType + public unsafe partial struct PerformanceQuerySubmitInfoKHR : IExtendsChain, IExtendsChain { public PerformanceQuerySubmitInfoKHR ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PerformanceQuerySubmitInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceStreamMarkerInfoINTEL.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceStreamMarkerInfoINTEL.gen.cs index e6b2006a46..104ec26323 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceStreamMarkerInfoINTEL.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PerformanceStreamMarkerInfoINTEL.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPerformanceStreamMarkerInfoINTEL")] - public unsafe partial struct PerformanceStreamMarkerInfoINTEL : IStructuredType + public unsafe partial struct PerformanceStreamMarkerInfoINTEL : IChainable { public PerformanceStreamMarkerInfoINTEL ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PerformanceStreamMarkerInfoIntel; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice16BitStorageFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice16BitStorageFeatures.gen.cs index 906fe6a0aa..4bdc41826f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice16BitStorageFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice16BitStorageFeatures.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevice16BitStorageFeatures")] - public unsafe partial struct PhysicalDevice16BitStorageFeatures : IStructuredType + [NativeName("Aliases", "VkPhysicalDevice16BitStorageFeaturesKHR")] + public unsafe partial struct PhysicalDevice16BitStorageFeatures : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDevice16BitStorageFeatures ( @@ -96,5 +97,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDevice16BitStorageFeatures; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice16BitStorageFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice16BitStorageFeaturesKHR.gen.cs index 140d0d1630..d2de6062d5 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice16BitStorageFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice16BitStorageFeaturesKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevice16BitStorageFeaturesKHR")] - public unsafe partial struct PhysicalDevice16BitStorageFeaturesKHR : IStructuredType + [NativeName("AliasOf", "VkPhysicalDevice16BitStorageFeatures")] + public unsafe partial struct PhysicalDevice16BitStorageFeaturesKhr : IExtendsChain, IExtendsChain, IExtendsChain { - public PhysicalDevice16BitStorageFeaturesKHR + public PhysicalDevice16BitStorageFeaturesKhr ( StructureType? sType = StructureType.PhysicalDevice16BitStorageFeatures, void* pNext = null, @@ -96,5 +97,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDevice16BitStorageFeatures; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice4444FormatsFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice4444FormatsFeaturesEXT.gen.cs index 313913bf43..843a42ba6a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice4444FormatsFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice4444FormatsFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevice4444FormatsFeaturesEXT")] - public unsafe partial struct PhysicalDevice4444FormatsFeaturesEXT : IStructuredType + public unsafe partial struct PhysicalDevice4444FormatsFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDevice4444FormatsFeaturesEXT ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDevice4444FormatsFeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice8BitStorageFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice8BitStorageFeatures.gen.cs index 7d7d8d42de..d519eef2f2 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice8BitStorageFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice8BitStorageFeatures.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevice8BitStorageFeatures")] - public unsafe partial struct PhysicalDevice8BitStorageFeatures : IStructuredType + [NativeName("Aliases", "VkPhysicalDevice8BitStorageFeaturesKHR")] + public unsafe partial struct PhysicalDevice8BitStorageFeatures : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDevice8BitStorageFeatures ( @@ -85,5 +86,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDevice8BitStorageFeatures; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice8BitStorageFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice8BitStorageFeaturesKHR.gen.cs index 133f6814f8..e59af27358 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice8BitStorageFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice8BitStorageFeaturesKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevice8BitStorageFeaturesKHR")] - public unsafe partial struct PhysicalDevice8BitStorageFeaturesKHR : IStructuredType + [NativeName("AliasOf", "VkPhysicalDevice8BitStorageFeatures")] + public unsafe partial struct PhysicalDevice8BitStorageFeaturesKhr : IExtendsChain, IExtendsChain, IExtendsChain { - public PhysicalDevice8BitStorageFeaturesKHR + public PhysicalDevice8BitStorageFeaturesKhr ( StructureType? sType = StructureType.PhysicalDevice8BitStorageFeatures, void* pNext = null, @@ -85,5 +86,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDevice8BitStorageFeatures; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceASTCDecodeFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceASTCDecodeFeaturesEXT.gen.cs index 536e75cf77..dd59ab1c34 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceASTCDecodeFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceASTCDecodeFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceASTCDecodeFeaturesEXT")] - public unsafe partial struct PhysicalDeviceASTCDecodeFeaturesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceASTCDecodeFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceASTCDecodeFeaturesEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceAstcDecodeFeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceAccelerationStructureFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceAccelerationStructureFeaturesKHR.gen.cs index b92c8e78af..fbaf2f3c93 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceAccelerationStructureFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceAccelerationStructureFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceAccelerationStructureFeaturesKHR")] - public unsafe partial struct PhysicalDeviceAccelerationStructureFeaturesKHR : IStructuredType + public unsafe partial struct PhysicalDeviceAccelerationStructureFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceAccelerationStructureFeaturesKHR ( @@ -107,5 +107,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceAccelerationStructurePropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceAccelerationStructurePropertiesKHR.gen.cs index 4774a28bc3..82bd701cb6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceAccelerationStructurePropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceAccelerationStructurePropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceAccelerationStructurePropertiesKHR")] - public unsafe partial struct PhysicalDeviceAccelerationStructurePropertiesKHR : IStructuredType + public unsafe partial struct PhysicalDeviceAccelerationStructurePropertiesKHR : IExtendsChain, IExtendsChain { public PhysicalDeviceAccelerationStructurePropertiesKHR ( @@ -140,5 +140,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceAccelerationStructurePropertiesKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBlendOperationAdvancedFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBlendOperationAdvancedFeaturesEXT.gen.cs index 66c53ef0d1..713b6c5b12 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBlendOperationAdvancedFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBlendOperationAdvancedFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT")] - public unsafe partial struct PhysicalDeviceBlendOperationAdvancedFeaturesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceBlendOperationAdvancedFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceBlendOperationAdvancedFeaturesEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceBlendOperationAdvancedFeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBlendOperationAdvancedPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBlendOperationAdvancedPropertiesEXT.gen.cs index ba6d1b32d6..abb5409223 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBlendOperationAdvancedPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBlendOperationAdvancedPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT")] - public unsafe partial struct PhysicalDeviceBlendOperationAdvancedPropertiesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceBlendOperationAdvancedPropertiesEXT : IExtendsChain, IExtendsChain { public PhysicalDeviceBlendOperationAdvancedPropertiesEXT ( @@ -118,5 +118,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceBlendOperationAdvancedPropertiesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBorderColorSwizzleFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBorderColorSwizzleFeaturesEXT.gen.cs index d4baaa9651..8b9968f2ee 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBorderColorSwizzleFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBorderColorSwizzleFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceBorderColorSwizzleFeaturesEXT")] - public unsafe partial struct PhysicalDeviceBorderColorSwizzleFeaturesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceBorderColorSwizzleFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceBorderColorSwizzleFeaturesEXT ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceBorderColorSwizzleFeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferAddressFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferAddressFeaturesEXT.gen.cs index ca5b3b8d9f..6ea45ca099 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferAddressFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferAddressFeaturesEXT.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceBufferAddressFeaturesEXT")] - public unsafe partial struct PhysicalDeviceBufferAddressFeaturesEXT : IStructuredType + [NativeName("AliasOf", "VkPhysicalDeviceBufferDeviceAddressFeaturesEXT")] + public unsafe partial struct PhysicalDeviceBufferAddressFeaturesExt : IExtendsChain, IExtendsChain, IExtendsChain { - public PhysicalDeviceBufferAddressFeaturesEXT + public PhysicalDeviceBufferAddressFeaturesExt ( StructureType? sType = StructureType.PhysicalDeviceBufferDeviceAddressFeaturesExt, void* pNext = null, @@ -85,5 +86,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceBufferDeviceAddressFeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferDeviceAddressFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferDeviceAddressFeatures.gen.cs index de87068cf4..ae83213e43 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferDeviceAddressFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferDeviceAddressFeatures.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceBufferDeviceAddressFeatures")] - public unsafe partial struct PhysicalDeviceBufferDeviceAddressFeatures : IStructuredType + [NativeName("Aliases", "VkPhysicalDeviceBufferDeviceAddressFeaturesKHR")] + public unsafe partial struct PhysicalDeviceBufferDeviceAddressFeatures : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceBufferDeviceAddressFeatures ( @@ -85,5 +86,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceBufferDeviceAddressFeatures; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferDeviceAddressFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferDeviceAddressFeaturesEXT.gen.cs index b01b9b45f8..f4da6ca8a2 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferDeviceAddressFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferDeviceAddressFeaturesEXT.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceBufferDeviceAddressFeaturesEXT")] - public unsafe partial struct PhysicalDeviceBufferDeviceAddressFeaturesEXT : IStructuredType + [NativeName("Aliases", "VkPhysicalDeviceBufferAddressFeaturesEXT")] + public unsafe partial struct PhysicalDeviceBufferDeviceAddressFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceBufferDeviceAddressFeaturesEXT ( @@ -85,5 +86,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceBufferDeviceAddressFeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferDeviceAddressFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferDeviceAddressFeaturesKHR.gen.cs index 8c60bd7970..237b7e6245 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferDeviceAddressFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferDeviceAddressFeaturesKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceBufferDeviceAddressFeaturesKHR")] - public unsafe partial struct PhysicalDeviceBufferDeviceAddressFeaturesKHR : IStructuredType + [NativeName("AliasOf", "VkPhysicalDeviceBufferDeviceAddressFeatures")] + public unsafe partial struct PhysicalDeviceBufferDeviceAddressFeaturesKhr : IExtendsChain, IExtendsChain, IExtendsChain { - public PhysicalDeviceBufferDeviceAddressFeaturesKHR + public PhysicalDeviceBufferDeviceAddressFeaturesKhr ( StructureType? sType = StructureType.PhysicalDeviceBufferDeviceAddressFeatures, void* pNext = null, @@ -85,5 +86,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceBufferDeviceAddressFeatures; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCoherentMemoryFeaturesAMD.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCoherentMemoryFeaturesAMD.gen.cs index e611384787..2a6bd1e4a9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCoherentMemoryFeaturesAMD.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCoherentMemoryFeaturesAMD.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceCoherentMemoryFeaturesAMD")] - public unsafe partial struct PhysicalDeviceCoherentMemoryFeaturesAMD : IStructuredType + public unsafe partial struct PhysicalDeviceCoherentMemoryFeaturesAMD : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceCoherentMemoryFeaturesAMD ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceCoherentMemoryFeaturesAmd; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceColorWriteEnableFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceColorWriteEnableFeaturesEXT.gen.cs index 8c0de08813..08e1151da0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceColorWriteEnableFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceColorWriteEnableFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceColorWriteEnableFeaturesEXT")] - public unsafe partial struct PhysicalDeviceColorWriteEnableFeaturesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceColorWriteEnableFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceColorWriteEnableFeaturesEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceColorWriteEnableFeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceComputeShaderDerivativesFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceComputeShaderDerivativesFeaturesNV.gen.cs index bad29ff616..a957fdb9a1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceComputeShaderDerivativesFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceComputeShaderDerivativesFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceComputeShaderDerivativesFeaturesNV")] - public unsafe partial struct PhysicalDeviceComputeShaderDerivativesFeaturesNV : IStructuredType + public unsafe partial struct PhysicalDeviceComputeShaderDerivativesFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceComputeShaderDerivativesFeaturesNV ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceComputeShaderDerivativesFeaturesNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceConditionalRenderingFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceConditionalRenderingFeaturesEXT.gen.cs index 16152959cb..6e1237fd44 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceConditionalRenderingFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceConditionalRenderingFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceConditionalRenderingFeaturesEXT")] - public unsafe partial struct PhysicalDeviceConditionalRenderingFeaturesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceConditionalRenderingFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceConditionalRenderingFeaturesEXT ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceConditionalRenderingFeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceConservativeRasterizationPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceConservativeRasterizationPropertiesEXT.gen.cs index bd8729e216..f84359c0a7 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceConservativeRasterizationPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceConservativeRasterizationPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceConservativeRasterizationPropertiesEXT")] - public unsafe partial struct PhysicalDeviceConservativeRasterizationPropertiesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceConservativeRasterizationPropertiesEXT : IExtendsChain, IExtendsChain { public PhysicalDeviceConservativeRasterizationPropertiesEXT ( @@ -151,5 +151,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceConservativeRasterizationPropertiesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCooperativeMatrixFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCooperativeMatrixFeaturesNV.gen.cs index b96f9b0b88..074fb15797 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCooperativeMatrixFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCooperativeMatrixFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceCooperativeMatrixFeaturesNV")] - public unsafe partial struct PhysicalDeviceCooperativeMatrixFeaturesNV : IStructuredType + public unsafe partial struct PhysicalDeviceCooperativeMatrixFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceCooperativeMatrixFeaturesNV ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceCooperativeMatrixFeaturesNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCooperativeMatrixPropertiesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCooperativeMatrixPropertiesNV.gen.cs index 56dfd47271..58e2e6d5b9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCooperativeMatrixPropertiesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCooperativeMatrixPropertiesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceCooperativeMatrixPropertiesNV")] - public unsafe partial struct PhysicalDeviceCooperativeMatrixPropertiesNV : IStructuredType + public unsafe partial struct PhysicalDeviceCooperativeMatrixPropertiesNV : IExtendsChain, IExtendsChain { public PhysicalDeviceCooperativeMatrixPropertiesNV ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceCooperativeMatrixPropertiesNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCornerSampledImageFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCornerSampledImageFeaturesNV.gen.cs index 77698258ca..6a77b7225d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCornerSampledImageFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCornerSampledImageFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceCornerSampledImageFeaturesNV")] - public unsafe partial struct PhysicalDeviceCornerSampledImageFeaturesNV : IStructuredType + public unsafe partial struct PhysicalDeviceCornerSampledImageFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceCornerSampledImageFeaturesNV ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceCornerSampledImageFeaturesNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCoverageReductionModeFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCoverageReductionModeFeaturesNV.gen.cs index 8f023f094e..972ca55075 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCoverageReductionModeFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCoverageReductionModeFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceCoverageReductionModeFeaturesNV")] - public unsafe partial struct PhysicalDeviceCoverageReductionModeFeaturesNV : IStructuredType + public unsafe partial struct PhysicalDeviceCoverageReductionModeFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceCoverageReductionModeFeaturesNV ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceCoverageReductionModeFeaturesNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCustomBorderColorFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCustomBorderColorFeaturesEXT.gen.cs index 25f6949d57..18157f33b9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCustomBorderColorFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCustomBorderColorFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceCustomBorderColorFeaturesEXT")] - public unsafe partial struct PhysicalDeviceCustomBorderColorFeaturesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceCustomBorderColorFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceCustomBorderColorFeaturesEXT ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceCustomBorderColorFeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCustomBorderColorPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCustomBorderColorPropertiesEXT.gen.cs index b1e11427fb..3cb006b28c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCustomBorderColorPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCustomBorderColorPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceCustomBorderColorPropertiesEXT")] - public unsafe partial struct PhysicalDeviceCustomBorderColorPropertiesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceCustomBorderColorPropertiesEXT : IExtendsChain, IExtendsChain { public PhysicalDeviceCustomBorderColorPropertiesEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceCustomBorderColorPropertiesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV.gen.cs index f18be92a8d..ce62369355 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV")] - public unsafe partial struct PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV : IStructuredType + public unsafe partial struct PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDepthClipEnableFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDepthClipEnableFeaturesEXT.gen.cs index a41a97fc3d..576fb75a5f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDepthClipEnableFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDepthClipEnableFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDepthClipEnableFeaturesEXT")] - public unsafe partial struct PhysicalDeviceDepthClipEnableFeaturesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceDepthClipEnableFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceDepthClipEnableFeaturesEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceDepthClipEnableFeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDepthStencilResolveProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDepthStencilResolveProperties.gen.cs index 0cf48d5642..b565f7b44b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDepthStencilResolveProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDepthStencilResolveProperties.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDepthStencilResolveProperties")] - public unsafe partial struct PhysicalDeviceDepthStencilResolveProperties : IStructuredType + [NativeName("Aliases", "VkPhysicalDeviceDepthStencilResolvePropertiesKHR")] + public unsafe partial struct PhysicalDeviceDepthStencilResolveProperties : IExtendsChain, IExtendsChain { public PhysicalDeviceDepthStencilResolveProperties ( @@ -96,5 +97,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceDepthStencilResolveProperties; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDepthStencilResolvePropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDepthStencilResolvePropertiesKHR.gen.cs index 7765cdc09a..aefa2b5534 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDepthStencilResolvePropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDepthStencilResolvePropertiesKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDepthStencilResolvePropertiesKHR")] - public unsafe partial struct PhysicalDeviceDepthStencilResolvePropertiesKHR : IStructuredType + [NativeName("AliasOf", "VkPhysicalDeviceDepthStencilResolveProperties")] + public unsafe partial struct PhysicalDeviceDepthStencilResolvePropertiesKhr : IExtendsChain, IExtendsChain { - public PhysicalDeviceDepthStencilResolvePropertiesKHR + public PhysicalDeviceDepthStencilResolvePropertiesKhr ( StructureType? sType = StructureType.PhysicalDeviceDepthStencilResolveProperties, void* pNext = null, @@ -96,5 +97,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceDepthStencilResolveProperties; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingFeatures.gen.cs index da7550b54b..14a5b40e13 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingFeatures.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDescriptorIndexingFeatures")] - public unsafe partial struct PhysicalDeviceDescriptorIndexingFeatures : IStructuredType + [NativeName("Aliases", "VkPhysicalDeviceDescriptorIndexingFeaturesEXT")] + public unsafe partial struct PhysicalDeviceDescriptorIndexingFeatures : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceDescriptorIndexingFeatures ( @@ -272,5 +273,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceDescriptorIndexingFeatures; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingFeaturesEXT.gen.cs index 9cc2214006..77daccaecc 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingFeaturesEXT.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDescriptorIndexingFeaturesEXT")] - public unsafe partial struct PhysicalDeviceDescriptorIndexingFeaturesEXT : IStructuredType + [NativeName("AliasOf", "VkPhysicalDeviceDescriptorIndexingFeatures")] + public unsafe partial struct PhysicalDeviceDescriptorIndexingFeaturesExt : IExtendsChain, IExtendsChain, IExtendsChain { - public PhysicalDeviceDescriptorIndexingFeaturesEXT + public PhysicalDeviceDescriptorIndexingFeaturesExt ( StructureType? sType = StructureType.PhysicalDeviceDescriptorIndexingFeatures, void* pNext = null, @@ -272,5 +273,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceDescriptorIndexingFeatures; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingProperties.gen.cs index cc68572727..195c9d368a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingProperties.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDescriptorIndexingProperties")] - public unsafe partial struct PhysicalDeviceDescriptorIndexingProperties : IStructuredType + [NativeName("Aliases", "VkPhysicalDeviceDescriptorIndexingPropertiesEXT")] + public unsafe partial struct PhysicalDeviceDescriptorIndexingProperties : IExtendsChain, IExtendsChain { public PhysicalDeviceDescriptorIndexingProperties ( @@ -305,5 +306,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceDescriptorIndexingProperties; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingPropertiesEXT.gen.cs index e51d4292a0..36dadabc11 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingPropertiesEXT.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDescriptorIndexingPropertiesEXT")] - public unsafe partial struct PhysicalDeviceDescriptorIndexingPropertiesEXT : IStructuredType + [NativeName("AliasOf", "VkPhysicalDeviceDescriptorIndexingProperties")] + public unsafe partial struct PhysicalDeviceDescriptorIndexingPropertiesExt : IExtendsChain, IExtendsChain { - public PhysicalDeviceDescriptorIndexingPropertiesEXT + public PhysicalDeviceDescriptorIndexingPropertiesExt ( StructureType? sType = StructureType.PhysicalDeviceDescriptorIndexingProperties, void* pNext = null, @@ -305,5 +306,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceDescriptorIndexingProperties; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDeviceGeneratedCommandsFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDeviceGeneratedCommandsFeaturesNV.gen.cs index 11ec074639..9be7146554 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDeviceGeneratedCommandsFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDeviceGeneratedCommandsFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV")] - public unsafe partial struct PhysicalDeviceDeviceGeneratedCommandsFeaturesNV : IStructuredType + public unsafe partial struct PhysicalDeviceDeviceGeneratedCommandsFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceDeviceGeneratedCommandsFeaturesNV ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceDeviceGeneratedCommandsFeaturesNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDeviceGeneratedCommandsPropertiesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDeviceGeneratedCommandsPropertiesNV.gen.cs index 2351e0f0b5..1cd776f905 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDeviceGeneratedCommandsPropertiesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDeviceGeneratedCommandsPropertiesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV")] - public unsafe partial struct PhysicalDeviceDeviceGeneratedCommandsPropertiesNV : IStructuredType + public unsafe partial struct PhysicalDeviceDeviceGeneratedCommandsPropertiesNV : IExtendsChain, IExtendsChain { public PhysicalDeviceDeviceGeneratedCommandsPropertiesNV ( @@ -151,5 +151,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceDeviceGeneratedCommandsPropertiesNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDeviceMemoryReportFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDeviceMemoryReportFeaturesEXT.gen.cs index 99fe04a72a..1c27835c8c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDeviceMemoryReportFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDeviceMemoryReportFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDeviceMemoryReportFeaturesEXT")] - public unsafe partial struct PhysicalDeviceDeviceMemoryReportFeaturesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceDeviceMemoryReportFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceDeviceMemoryReportFeaturesEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceDeviceMemoryReportFeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDiagnosticsConfigFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDiagnosticsConfigFeaturesNV.gen.cs index 6d9d418577..8280028fd1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDiagnosticsConfigFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDiagnosticsConfigFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDiagnosticsConfigFeaturesNV")] - public unsafe partial struct PhysicalDeviceDiagnosticsConfigFeaturesNV : IStructuredType + public unsafe partial struct PhysicalDeviceDiagnosticsConfigFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceDiagnosticsConfigFeaturesNV ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceDiagnosticsConfigFeaturesNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDiscardRectanglePropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDiscardRectanglePropertiesEXT.gen.cs index 1407f4de99..3037dd278b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDiscardRectanglePropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDiscardRectanglePropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDiscardRectanglePropertiesEXT")] - public unsafe partial struct PhysicalDeviceDiscardRectanglePropertiesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceDiscardRectanglePropertiesEXT : IExtendsChain, IExtendsChain { public PhysicalDeviceDiscardRectanglePropertiesEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceDiscardRectanglePropertiesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDriverProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDriverProperties.gen.cs index c4d50423bb..1a950da34b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDriverProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDriverProperties.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDriverProperties")] - public unsafe partial struct PhysicalDeviceDriverProperties : IStructuredType + [NativeName("Aliases", "VkPhysicalDeviceDriverPropertiesKHR")] + public unsafe partial struct PhysicalDeviceDriverProperties : IExtendsChain, IExtendsChain { public PhysicalDeviceDriverProperties ( @@ -84,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceDriverProperties; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDriverPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDriverPropertiesKHR.gen.cs index 6a4bf68086..09ef0af31a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDriverPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDriverPropertiesKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDriverPropertiesKHR")] - public unsafe partial struct PhysicalDeviceDriverPropertiesKHR : IStructuredType + [NativeName("AliasOf", "VkPhysicalDeviceDriverProperties")] + public unsafe partial struct PhysicalDeviceDriverPropertiesKhr : IExtendsChain, IExtendsChain { - public PhysicalDeviceDriverPropertiesKHR + public PhysicalDeviceDriverPropertiesKhr ( StructureType? sType = StructureType.PhysicalDeviceDriverProperties, void* pNext = null, @@ -84,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceDriverProperties; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDrmPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDrmPropertiesEXT.gen.cs index 09b299c2da..d5d960aaf0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDrmPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDrmPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDrmPropertiesEXT")] - public unsafe partial struct PhysicalDeviceDrmPropertiesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceDrmPropertiesEXT : IExtendsChain, IExtendsChain { public PhysicalDeviceDrmPropertiesEXT ( @@ -118,5 +118,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceDrmPropertiesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDynamicRenderingFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDynamicRenderingFeaturesKHR.gen.cs index a4dc03bed3..0bfc0c3333 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDynamicRenderingFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDynamicRenderingFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDynamicRenderingFeaturesKHR")] - public unsafe partial struct PhysicalDeviceDynamicRenderingFeaturesKHR : IStructuredType + public unsafe partial struct PhysicalDeviceDynamicRenderingFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceDynamicRenderingFeaturesKHR ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceDynamicRenderingFeaturesKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExclusiveScissorFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExclusiveScissorFeaturesNV.gen.cs index f94deea93b..841341393c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExclusiveScissorFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExclusiveScissorFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceExclusiveScissorFeaturesNV")] - public unsafe partial struct PhysicalDeviceExclusiveScissorFeaturesNV : IStructuredType + public unsafe partial struct PhysicalDeviceExclusiveScissorFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceExclusiveScissorFeaturesNV ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceExclusiveScissorFeaturesNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExtendedDynamicState2FeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExtendedDynamicState2FeaturesEXT.gen.cs index 284a3d3364..b71e41ae7e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExtendedDynamicState2FeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExtendedDynamicState2FeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceExtendedDynamicState2FeaturesEXT")] - public unsafe partial struct PhysicalDeviceExtendedDynamicState2FeaturesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceExtendedDynamicState2FeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceExtendedDynamicState2FeaturesEXT ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceExtendedDynamicState2FeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExtendedDynamicStateFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExtendedDynamicStateFeaturesEXT.gen.cs index 52f12fead2..10874293d7 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExtendedDynamicStateFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExtendedDynamicStateFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceExtendedDynamicStateFeaturesEXT")] - public unsafe partial struct PhysicalDeviceExtendedDynamicStateFeaturesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceExtendedDynamicStateFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceExtendedDynamicStateFeaturesEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceExtendedDynamicStateFeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalBufferInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalBufferInfo.gen.cs index 55b8eb2373..e98ccdc257 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalBufferInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalBufferInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceExternalBufferInfo")] - public unsafe partial struct PhysicalDeviceExternalBufferInfo : IStructuredType + [NativeName("Aliases", "VkPhysicalDeviceExternalBufferInfoKHR")] + public unsafe partial struct PhysicalDeviceExternalBufferInfo : IChainable { public PhysicalDeviceExternalBufferInfo ( @@ -85,5 +86,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceExternalBufferInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalBufferInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalBufferInfoKHR.gen.cs index c5adac3db6..ad39fc2055 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalBufferInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalBufferInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceExternalBufferInfoKHR")] - public unsafe partial struct PhysicalDeviceExternalBufferInfoKHR : IStructuredType + [NativeName("AliasOf", "VkPhysicalDeviceExternalBufferInfo")] + public unsafe partial struct PhysicalDeviceExternalBufferInfoKhr : IChainable { - public PhysicalDeviceExternalBufferInfoKHR + public PhysicalDeviceExternalBufferInfoKhr ( StructureType? sType = StructureType.PhysicalDeviceExternalBufferInfo, void* pNext = null, @@ -85,5 +86,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceExternalBufferInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalFenceInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalFenceInfo.gen.cs index cdac0fad52..c8214ffd81 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalFenceInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalFenceInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceExternalFenceInfo")] - public unsafe partial struct PhysicalDeviceExternalFenceInfo : IStructuredType + [NativeName("Aliases", "VkPhysicalDeviceExternalFenceInfoKHR")] + public unsafe partial struct PhysicalDeviceExternalFenceInfo : IChainable { public PhysicalDeviceExternalFenceInfo ( @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceExternalFenceInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalFenceInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalFenceInfoKHR.gen.cs index 42035e9142..f9dc43e7bf 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalFenceInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalFenceInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceExternalFenceInfoKHR")] - public unsafe partial struct PhysicalDeviceExternalFenceInfoKHR : IStructuredType + [NativeName("AliasOf", "VkPhysicalDeviceExternalFenceInfo")] + public unsafe partial struct PhysicalDeviceExternalFenceInfoKhr : IChainable { - public PhysicalDeviceExternalFenceInfoKHR + public PhysicalDeviceExternalFenceInfoKhr ( StructureType? sType = StructureType.PhysicalDeviceExternalFenceInfo, void* pNext = null, @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceExternalFenceInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalImageFormatInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalImageFormatInfo.gen.cs index e2076c6221..3cd9e018e7 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalImageFormatInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalImageFormatInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceExternalImageFormatInfo")] - public unsafe partial struct PhysicalDeviceExternalImageFormatInfo : IStructuredType + [NativeName("Aliases", "VkPhysicalDeviceExternalImageFormatInfoKHR")] + public unsafe partial struct PhysicalDeviceExternalImageFormatInfo : IExtendsChain, IExtendsChain { public PhysicalDeviceExternalImageFormatInfo ( @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceExternalImageFormatInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalImageFormatInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalImageFormatInfoKHR.gen.cs index 95c93f4234..fb952c887a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalImageFormatInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalImageFormatInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceExternalImageFormatInfoKHR")] - public unsafe partial struct PhysicalDeviceExternalImageFormatInfoKHR : IStructuredType + [NativeName("AliasOf", "VkPhysicalDeviceExternalImageFormatInfo")] + public unsafe partial struct PhysicalDeviceExternalImageFormatInfoKhr : IExtendsChain, IExtendsChain { - public PhysicalDeviceExternalImageFormatInfoKHR + public PhysicalDeviceExternalImageFormatInfoKhr ( StructureType? sType = StructureType.PhysicalDeviceExternalImageFormatInfo, void* pNext = null, @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceExternalImageFormatInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalMemoryHostPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalMemoryHostPropertiesEXT.gen.cs index 0e855946d0..a8595fa9bf 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalMemoryHostPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalMemoryHostPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceExternalMemoryHostPropertiesEXT")] - public unsafe partial struct PhysicalDeviceExternalMemoryHostPropertiesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceExternalMemoryHostPropertiesEXT : IExtendsChain, IExtendsChain { public PhysicalDeviceExternalMemoryHostPropertiesEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceExternalMemoryHostPropertiesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalMemoryRDMAFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalMemoryRDMAFeaturesNV.gen.cs index fac627303e..8ed5ca8910 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalMemoryRDMAFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalMemoryRDMAFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceExternalMemoryRDMAFeaturesNV")] - public unsafe partial struct PhysicalDeviceExternalMemoryRDMAFeaturesNV : IStructuredType + public unsafe partial struct PhysicalDeviceExternalMemoryRDMAFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceExternalMemoryRDMAFeaturesNV ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceExternalMemoryRdmaFeaturesNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalSemaphoreInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalSemaphoreInfo.gen.cs index bbaae33036..a36c7692c3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalSemaphoreInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalSemaphoreInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceExternalSemaphoreInfo")] - public unsafe partial struct PhysicalDeviceExternalSemaphoreInfo : IStructuredType + [NativeName("Aliases", "VkPhysicalDeviceExternalSemaphoreInfoKHR")] + public unsafe partial struct PhysicalDeviceExternalSemaphoreInfo : IChainStart { public PhysicalDeviceExternalSemaphoreInfo ( @@ -63,5 +64,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceExternalSemaphoreInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref PhysicalDeviceExternalSemaphoreInfo Chain( + out PhysicalDeviceExternalSemaphoreInfo capture) + { + capture = new PhysicalDeviceExternalSemaphoreInfo(StructureType.PhysicalDeviceExternalSemaphoreInfo); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalSemaphoreInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalSemaphoreInfoKHR.gen.cs index 3139dd2a17..00d458b902 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalSemaphoreInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalSemaphoreInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceExternalSemaphoreInfoKHR")] - public unsafe partial struct PhysicalDeviceExternalSemaphoreInfoKHR : IStructuredType + [NativeName("AliasOf", "VkPhysicalDeviceExternalSemaphoreInfo")] + public unsafe partial struct PhysicalDeviceExternalSemaphoreInfoKhr : IChainStart { - public PhysicalDeviceExternalSemaphoreInfoKHR + public PhysicalDeviceExternalSemaphoreInfoKhr ( StructureType? sType = StructureType.PhysicalDeviceExternalSemaphoreInfo, void* pNext = null, @@ -63,5 +64,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceExternalSemaphoreInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref PhysicalDeviceExternalSemaphoreInfoKhr Chain( + out PhysicalDeviceExternalSemaphoreInfoKhr capture) + { + capture = new PhysicalDeviceExternalSemaphoreInfoKhr(StructureType.PhysicalDeviceExternalSemaphoreInfo); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFeatures2.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFeatures2.gen.cs index c6895c8970..d8b8af4ace 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFeatures2.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFeatures2.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFeatures2")] - public unsafe partial struct PhysicalDeviceFeatures2 : IStructuredType + [NativeName("Aliases", "VkPhysicalDeviceFeatures2KHR")] + public unsafe partial struct PhysicalDeviceFeatures2 : IChainStart, IExtendsChain { public PhysicalDeviceFeatures2 ( @@ -63,5 +64,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceFeatures2; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref PhysicalDeviceFeatures2 Chain( + out PhysicalDeviceFeatures2 capture) + { + capture = new PhysicalDeviceFeatures2(StructureType.PhysicalDeviceFeatures2); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFeatures2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFeatures2KHR.gen.cs index e9b533a8c6..6453f4e592 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFeatures2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFeatures2KHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFeatures2KHR")] - public unsafe partial struct PhysicalDeviceFeatures2KHR : IStructuredType + [NativeName("AliasOf", "VkPhysicalDeviceFeatures2")] + public unsafe partial struct PhysicalDeviceFeatures2Khr : IChainStart, IExtendsChain { - public PhysicalDeviceFeatures2KHR + public PhysicalDeviceFeatures2Khr ( StructureType? sType = StructureType.PhysicalDeviceFeatures2, void* pNext = null, @@ -63,5 +64,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceFeatures2; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref PhysicalDeviceFeatures2Khr Chain( + out PhysicalDeviceFeatures2Khr capture) + { + capture = new PhysicalDeviceFeatures2Khr(StructureType.PhysicalDeviceFeatures2); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFloat16Int8FeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFloat16Int8FeaturesKHR.gen.cs index 5ec777c2a9..e57adb91e6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFloat16Int8FeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFloat16Int8FeaturesKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFloat16Int8FeaturesKHR")] - public unsafe partial struct PhysicalDeviceFloat16Int8FeaturesKHR : IStructuredType + [NativeName("AliasOf", "VkPhysicalDeviceShaderFloat16Int8Features")] + public unsafe partial struct PhysicalDeviceFloat16int8featuresKhr : IExtendsChain, IExtendsChain, IExtendsChain { - public PhysicalDeviceFloat16Int8FeaturesKHR + public PhysicalDeviceFloat16int8featuresKhr ( StructureType? sType = StructureType.PhysicalDeviceShaderFloat16Int8Features, void* pNext = null, @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceShaderFloat16Int8Features; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFloatControlsProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFloatControlsProperties.gen.cs index c47a13f5b0..7615b7b0e1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFloatControlsProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFloatControlsProperties.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFloatControlsProperties")] - public unsafe partial struct PhysicalDeviceFloatControlsProperties : IStructuredType + [NativeName("Aliases", "VkPhysicalDeviceFloatControlsPropertiesKHR")] + public unsafe partial struct PhysicalDeviceFloatControlsProperties : IExtendsChain, IExtendsChain { public PhysicalDeviceFloatControlsProperties ( @@ -239,5 +240,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceFloatControlsProperties; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFloatControlsPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFloatControlsPropertiesKHR.gen.cs index f18918d405..dece5b0ba4 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFloatControlsPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFloatControlsPropertiesKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFloatControlsPropertiesKHR")] - public unsafe partial struct PhysicalDeviceFloatControlsPropertiesKHR : IStructuredType + [NativeName("AliasOf", "VkPhysicalDeviceFloatControlsProperties")] + public unsafe partial struct PhysicalDeviceFloatControlsPropertiesKhr : IExtendsChain, IExtendsChain { - public PhysicalDeviceFloatControlsPropertiesKHR + public PhysicalDeviceFloatControlsPropertiesKhr ( StructureType? sType = StructureType.PhysicalDeviceFloatControlsProperties, void* pNext = null, @@ -239,5 +240,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceFloatControlsProperties; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMap2FeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMap2FeaturesEXT.gen.cs index ba02f9bcd6..024c533367 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMap2FeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMap2FeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFragmentDensityMap2FeaturesEXT")] - public unsafe partial struct PhysicalDeviceFragmentDensityMap2FeaturesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceFragmentDensityMap2FeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceFragmentDensityMap2FeaturesEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceFragmentDensityMap2FeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMap2PropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMap2PropertiesEXT.gen.cs index c5fb8d408f..4a46f13504 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMap2PropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMap2PropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFragmentDensityMap2PropertiesEXT")] - public unsafe partial struct PhysicalDeviceFragmentDensityMap2PropertiesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceFragmentDensityMap2PropertiesEXT : IExtendsChain, IExtendsChain { public PhysicalDeviceFragmentDensityMap2PropertiesEXT ( @@ -96,5 +96,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceFragmentDensityMap2PropertiesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMapFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMapFeaturesEXT.gen.cs index a1ae607627..1e8758886e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMapFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMapFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFragmentDensityMapFeaturesEXT")] - public unsafe partial struct PhysicalDeviceFragmentDensityMapFeaturesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceFragmentDensityMapFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceFragmentDensityMapFeaturesEXT ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceFragmentDensityMapFeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMapPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMapPropertiesEXT.gen.cs index f0faa36b0a..20ed1945be 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMapPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMapPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFragmentDensityMapPropertiesEXT")] - public unsafe partial struct PhysicalDeviceFragmentDensityMapPropertiesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceFragmentDensityMapPropertiesEXT : IExtendsChain, IExtendsChain { public PhysicalDeviceFragmentDensityMapPropertiesEXT ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceFragmentDensityMapPropertiesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShaderBarycentricFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShaderBarycentricFeaturesNV.gen.cs index 382a1558fc..4076ddc5cc 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShaderBarycentricFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShaderBarycentricFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV")] - public unsafe partial struct PhysicalDeviceFragmentShaderBarycentricFeaturesNV : IStructuredType + public unsafe partial struct PhysicalDeviceFragmentShaderBarycentricFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceFragmentShaderBarycentricFeaturesNV ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceFragmentShaderBarycentricFeaturesNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShaderInterlockFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShaderInterlockFeaturesEXT.gen.cs index 75e9f7648e..15e32935c1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShaderInterlockFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShaderInterlockFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT")] - public unsafe partial struct PhysicalDeviceFragmentShaderInterlockFeaturesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceFragmentShaderInterlockFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceFragmentShaderInterlockFeaturesEXT ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceFragmentShaderInterlockFeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateEnumsFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateEnumsFeaturesNV.gen.cs index f5dbc107bf..5c056a3f7a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateEnumsFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateEnumsFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV")] - public unsafe partial struct PhysicalDeviceFragmentShadingRateEnumsFeaturesNV : IStructuredType + public unsafe partial struct PhysicalDeviceFragmentShadingRateEnumsFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceFragmentShadingRateEnumsFeaturesNV ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceFragmentShadingRateEnumsFeaturesNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateEnumsPropertiesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateEnumsPropertiesNV.gen.cs index 3c3dd01a56..a4a2d8b048 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateEnumsPropertiesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateEnumsPropertiesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV")] - public unsafe partial struct PhysicalDeviceFragmentShadingRateEnumsPropertiesNV : IStructuredType + public unsafe partial struct PhysicalDeviceFragmentShadingRateEnumsPropertiesNV : IExtendsChain, IExtendsChain { public PhysicalDeviceFragmentShadingRateEnumsPropertiesNV ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceFragmentShadingRateEnumsPropertiesNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateFeaturesKHR.gen.cs index e737f96961..0ef8cef974 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFragmentShadingRateFeaturesKHR")] - public unsafe partial struct PhysicalDeviceFragmentShadingRateFeaturesKHR : IStructuredType + public unsafe partial struct PhysicalDeviceFragmentShadingRateFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceFragmentShadingRateFeaturesKHR ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceFragmentShadingRateFeaturesKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateKHR.gen.cs index eb7ce16026..3a66f062db 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFragmentShadingRateKHR")] - public unsafe partial struct PhysicalDeviceFragmentShadingRateKHR : IStructuredType + public unsafe partial struct PhysicalDeviceFragmentShadingRateKHR : IChainable { public PhysicalDeviceFragmentShadingRateKHR ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceFragmentShadingRateKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRatePropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRatePropertiesKHR.gen.cs index 6afe9ccee1..a39bd97e58 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRatePropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRatePropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFragmentShadingRatePropertiesKHR")] - public unsafe partial struct PhysicalDeviceFragmentShadingRatePropertiesKHR : IStructuredType + public unsafe partial struct PhysicalDeviceFragmentShadingRatePropertiesKHR : IExtendsChain, IExtendsChain { public PhysicalDeviceFragmentShadingRatePropertiesKHR ( @@ -239,5 +239,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceFragmentShadingRatePropertiesKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceGlobalPriorityQueryFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceGlobalPriorityQueryFeaturesEXT.gen.cs index 7ca2aa8191..3b907bb005 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceGlobalPriorityQueryFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceGlobalPriorityQueryFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT")] - public unsafe partial struct PhysicalDeviceGlobalPriorityQueryFeaturesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceGlobalPriorityQueryFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceGlobalPriorityQueryFeaturesEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceGlobalPriorityQueryFeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceGroupProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceGroupProperties.gen.cs index 48e6771e79..6325c27c20 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceGroupProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceGroupProperties.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceGroupProperties")] - public unsafe partial struct PhysicalDeviceGroupProperties : IStructuredType + [NativeName("Aliases", "VkPhysicalDeviceGroupPropertiesKHR")] + public unsafe partial struct PhysicalDeviceGroupProperties : IChainable { public PhysicalDeviceGroupProperties ( @@ -136,5 +137,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceGroupProperties; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceGroupPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceGroupPropertiesKHR.gen.cs index cde07ae165..25a9fa6bac 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceGroupPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceGroupPropertiesKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceGroupPropertiesKHR")] - public unsafe partial struct PhysicalDeviceGroupPropertiesKHR : IStructuredType + [NativeName("AliasOf", "VkPhysicalDeviceGroupProperties")] + public unsafe partial struct PhysicalDeviceGroupPropertiesKhr : IChainable { - public PhysicalDeviceGroupPropertiesKHR + public PhysicalDeviceGroupPropertiesKhr ( StructureType? sType = StructureType.PhysicalDeviceGroupProperties, void* pNext = null, @@ -136,5 +137,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceGroupProperties; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceHostQueryResetFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceHostQueryResetFeatures.gen.cs index 3a67e01491..946e68137f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceHostQueryResetFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceHostQueryResetFeatures.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceHostQueryResetFeatures")] - public unsafe partial struct PhysicalDeviceHostQueryResetFeatures : IStructuredType + [NativeName("Aliases", "VkPhysicalDeviceHostQueryResetFeaturesEXT")] + public unsafe partial struct PhysicalDeviceHostQueryResetFeatures : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceHostQueryResetFeatures ( @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceHostQueryResetFeatures; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceHostQueryResetFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceHostQueryResetFeaturesEXT.gen.cs index 6ed8435072..a4299a86d8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceHostQueryResetFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceHostQueryResetFeaturesEXT.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceHostQueryResetFeaturesEXT")] - public unsafe partial struct PhysicalDeviceHostQueryResetFeaturesEXT : IStructuredType + [NativeName("AliasOf", "VkPhysicalDeviceHostQueryResetFeatures")] + public unsafe partial struct PhysicalDeviceHostQueryResetFeaturesExt : IExtendsChain, IExtendsChain, IExtendsChain { - public PhysicalDeviceHostQueryResetFeaturesEXT + public PhysicalDeviceHostQueryResetFeaturesExt ( StructureType? sType = StructureType.PhysicalDeviceHostQueryResetFeatures, void* pNext = null, @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceHostQueryResetFeatures; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceIDProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceIDProperties.gen.cs index 113e0e526d..088f8e562c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceIDProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceIDProperties.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceIDProperties")] - public unsafe partial struct PhysicalDeviceIDProperties : IStructuredType + [NativeName("Aliases", "VkPhysicalDeviceIDPropertiesKHR")] + public unsafe partial struct PhysicalDeviceIDProperties : IExtendsChain, IExtendsChain { public PhysicalDeviceIDProperties ( @@ -89,5 +90,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceIDProperties; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceIDPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceIDPropertiesKHR.gen.cs index baa4c17ebc..c18e87b552 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceIDPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceIDPropertiesKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceIDPropertiesKHR")] - public unsafe partial struct PhysicalDeviceIDPropertiesKHR : IStructuredType + [NativeName("AliasOf", "VkPhysicalDeviceIDProperties")] + public unsafe partial struct PhysicalDeviceIdpropertiesKhr : IExtendsChain, IExtendsChain { - public PhysicalDeviceIDPropertiesKHR + public PhysicalDeviceIdpropertiesKhr ( StructureType? sType = StructureType.PhysicalDeviceIDProperties, void* pNext = null, @@ -89,5 +90,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceIDProperties; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageDrmFormatModifierInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageDrmFormatModifierInfoEXT.gen.cs index a10801860e..22387262c7 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageDrmFormatModifierInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageDrmFormatModifierInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceImageDrmFormatModifierInfoEXT")] - public unsafe partial struct PhysicalDeviceImageDrmFormatModifierInfoEXT : IStructuredType + public unsafe partial struct PhysicalDeviceImageDrmFormatModifierInfoEXT : IExtendsChain, IExtendsChain { public PhysicalDeviceImageDrmFormatModifierInfoEXT ( @@ -96,5 +96,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceImageDrmFormatModifierInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageFormatInfo2.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageFormatInfo2.gen.cs index 1e6843fc39..ad467815e8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageFormatInfo2.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageFormatInfo2.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceImageFormatInfo2")] - public unsafe partial struct PhysicalDeviceImageFormatInfo2 : IStructuredType + [NativeName("Aliases", "VkPhysicalDeviceImageFormatInfo2KHR")] + public unsafe partial struct PhysicalDeviceImageFormatInfo2 : IChainStart { public PhysicalDeviceImageFormatInfo2 ( @@ -107,5 +108,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceImageFormatInfo2; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref PhysicalDeviceImageFormatInfo2 Chain( + out PhysicalDeviceImageFormatInfo2 capture) + { + capture = new PhysicalDeviceImageFormatInfo2(StructureType.PhysicalDeviceImageFormatInfo2); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageFormatInfo2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageFormatInfo2KHR.gen.cs index 57893d6c46..cc0272dff2 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageFormatInfo2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageFormatInfo2KHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceImageFormatInfo2KHR")] - public unsafe partial struct PhysicalDeviceImageFormatInfo2KHR : IStructuredType + [NativeName("AliasOf", "VkPhysicalDeviceImageFormatInfo2")] + public unsafe partial struct PhysicalDeviceImageFormatInfo2Khr : IChainStart { - public PhysicalDeviceImageFormatInfo2KHR + public PhysicalDeviceImageFormatInfo2Khr ( StructureType? sType = StructureType.PhysicalDeviceImageFormatInfo2, void* pNext = null, @@ -107,5 +108,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceImageFormatInfo2; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref PhysicalDeviceImageFormatInfo2Khr Chain( + out PhysicalDeviceImageFormatInfo2Khr capture) + { + capture = new PhysicalDeviceImageFormatInfo2Khr(StructureType.PhysicalDeviceImageFormatInfo2); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageRobustnessFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageRobustnessFeaturesEXT.gen.cs index aa85d9a378..0053eed7c4 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageRobustnessFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageRobustnessFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceImageRobustnessFeaturesEXT")] - public unsafe partial struct PhysicalDeviceImageRobustnessFeaturesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceImageRobustnessFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceImageRobustnessFeaturesEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceImageRobustnessFeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageViewImageFormatInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageViewImageFormatInfoEXT.gen.cs index c9be9e5a9e..b0c15478f9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageViewImageFormatInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageViewImageFormatInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceImageViewImageFormatInfoEXT")] - public unsafe partial struct PhysicalDeviceImageViewImageFormatInfoEXT : IStructuredType + public unsafe partial struct PhysicalDeviceImageViewImageFormatInfoEXT : IExtendsChain, IExtendsChain { public PhysicalDeviceImageViewImageFormatInfoEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceImageViewImageFormatInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImagelessFramebufferFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImagelessFramebufferFeatures.gen.cs index a57f5764cb..86f40b6bc7 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImagelessFramebufferFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImagelessFramebufferFeatures.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceImagelessFramebufferFeatures")] - public unsafe partial struct PhysicalDeviceImagelessFramebufferFeatures : IStructuredType + [NativeName("Aliases", "VkPhysicalDeviceImagelessFramebufferFeaturesKHR")] + public unsafe partial struct PhysicalDeviceImagelessFramebufferFeatures : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceImagelessFramebufferFeatures ( @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceImagelessFramebufferFeatures; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImagelessFramebufferFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImagelessFramebufferFeaturesKHR.gen.cs index 0363b7648c..343670940c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImagelessFramebufferFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImagelessFramebufferFeaturesKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceImagelessFramebufferFeaturesKHR")] - public unsafe partial struct PhysicalDeviceImagelessFramebufferFeaturesKHR : IStructuredType + [NativeName("AliasOf", "VkPhysicalDeviceImagelessFramebufferFeatures")] + public unsafe partial struct PhysicalDeviceImagelessFramebufferFeaturesKhr : IExtendsChain, IExtendsChain, IExtendsChain { - public PhysicalDeviceImagelessFramebufferFeaturesKHR + public PhysicalDeviceImagelessFramebufferFeaturesKhr ( StructureType? sType = StructureType.PhysicalDeviceImagelessFramebufferFeatures, void* pNext = null, @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceImagelessFramebufferFeatures; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceIndexTypeUint8FeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceIndexTypeUint8FeaturesEXT.gen.cs index 6d80108f1b..28f0955029 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceIndexTypeUint8FeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceIndexTypeUint8FeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceIndexTypeUint8FeaturesEXT")] - public unsafe partial struct PhysicalDeviceIndexTypeUint8FeaturesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceIndexTypeUint8FeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceIndexTypeUint8FeaturesEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceIndexTypeUint8FeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInheritedViewportScissorFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInheritedViewportScissorFeaturesNV.gen.cs index 6f58774867..c4ad4be476 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInheritedViewportScissorFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInheritedViewportScissorFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceInheritedViewportScissorFeaturesNV")] - public unsafe partial struct PhysicalDeviceInheritedViewportScissorFeaturesNV : IStructuredType + public unsafe partial struct PhysicalDeviceInheritedViewportScissorFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceInheritedViewportScissorFeaturesNV ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceInheritedViewportScissorFeaturesNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInlineUniformBlockFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInlineUniformBlockFeaturesEXT.gen.cs index 0cde16f292..3d37b48e24 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInlineUniformBlockFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInlineUniformBlockFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceInlineUniformBlockFeaturesEXT")] - public unsafe partial struct PhysicalDeviceInlineUniformBlockFeaturesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceInlineUniformBlockFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceInlineUniformBlockFeaturesEXT ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceInlineUniformBlockFeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInlineUniformBlockPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInlineUniformBlockPropertiesEXT.gen.cs index 293c21c6d1..b9a7ba3ecd 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInlineUniformBlockPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInlineUniformBlockPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceInlineUniformBlockPropertiesEXT")] - public unsafe partial struct PhysicalDeviceInlineUniformBlockPropertiesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceInlineUniformBlockPropertiesEXT : IExtendsChain, IExtendsChain { public PhysicalDeviceInlineUniformBlockPropertiesEXT ( @@ -107,5 +107,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceInlineUniformBlockPropertiesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInvocationMaskFeaturesHUAWEI.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInvocationMaskFeaturesHUAWEI.gen.cs index b2cc56dfb3..ac9074b480 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInvocationMaskFeaturesHUAWEI.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInvocationMaskFeaturesHUAWEI.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceInvocationMaskFeaturesHUAWEI")] - public unsafe partial struct PhysicalDeviceInvocationMaskFeaturesHUAWEI : IStructuredType + public unsafe partial struct PhysicalDeviceInvocationMaskFeaturesHUAWEI : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceInvocationMaskFeaturesHUAWEI ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceInvocationMaskFeaturesHuawei; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceLineRasterizationFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceLineRasterizationFeaturesEXT.gen.cs index a265078266..9e0c8bc53c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceLineRasterizationFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceLineRasterizationFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceLineRasterizationFeaturesEXT")] - public unsafe partial struct PhysicalDeviceLineRasterizationFeaturesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceLineRasterizationFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceLineRasterizationFeaturesEXT ( @@ -118,5 +118,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceLineRasterizationFeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceLineRasterizationPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceLineRasterizationPropertiesEXT.gen.cs index 906ec6b114..c106fa5447 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceLineRasterizationPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceLineRasterizationPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceLineRasterizationPropertiesEXT")] - public unsafe partial struct PhysicalDeviceLineRasterizationPropertiesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceLineRasterizationPropertiesEXT : IExtendsChain, IExtendsChain { public PhysicalDeviceLineRasterizationPropertiesEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceLineRasterizationPropertiesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance3Properties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance3Properties.gen.cs index 0e134f4b6e..d48dd728fa 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance3Properties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance3Properties.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMaintenance3Properties")] - public unsafe partial struct PhysicalDeviceMaintenance3Properties : IStructuredType + [NativeName("Aliases", "VkPhysicalDeviceMaintenance3PropertiesKHR")] + public unsafe partial struct PhysicalDeviceMaintenance3Properties : IExtendsChain, IExtendsChain { public PhysicalDeviceMaintenance3Properties ( @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceMaintenance3Properties; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance3PropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance3PropertiesKHR.gen.cs index fcd00923ce..53ab907377 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance3PropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance3PropertiesKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMaintenance3PropertiesKHR")] - public unsafe partial struct PhysicalDeviceMaintenance3PropertiesKHR : IStructuredType + [NativeName("AliasOf", "VkPhysicalDeviceMaintenance3Properties")] + public unsafe partial struct PhysicalDeviceMaintenance3PropertiesKhr : IExtendsChain, IExtendsChain { - public PhysicalDeviceMaintenance3PropertiesKHR + public PhysicalDeviceMaintenance3PropertiesKhr ( StructureType? sType = StructureType.PhysicalDeviceMaintenance3Properties, void* pNext = null, @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceMaintenance3Properties; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance4FeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance4FeaturesKHR.gen.cs index aa18d0ff4f..19252a0bba 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance4FeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance4FeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMaintenance4FeaturesKHR")] - public unsafe partial struct PhysicalDeviceMaintenance4FeaturesKHR : IStructuredType + public unsafe partial struct PhysicalDeviceMaintenance4FeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceMaintenance4FeaturesKHR ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceMaintenance4FeaturesKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance4PropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance4PropertiesKHR.gen.cs index ae21ca3ea6..b210855c04 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance4PropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance4PropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMaintenance4PropertiesKHR")] - public unsafe partial struct PhysicalDeviceMaintenance4PropertiesKHR : IStructuredType + public unsafe partial struct PhysicalDeviceMaintenance4PropertiesKHR : IExtendsChain, IExtendsChain { public PhysicalDeviceMaintenance4PropertiesKHR ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceMaintenance4PropertiesKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryBudgetPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryBudgetPropertiesEXT.gen.cs index 6880f7abfd..bd0b635d4d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryBudgetPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryBudgetPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMemoryBudgetPropertiesEXT")] - public unsafe partial struct PhysicalDeviceMemoryBudgetPropertiesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceMemoryBudgetPropertiesEXT : IExtendsChain, IExtendsChain { public PhysicalDeviceMemoryBudgetPropertiesEXT ( @@ -62,5 +62,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceMemoryBudgetPropertiesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryPriorityFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryPriorityFeaturesEXT.gen.cs index 669b7d155d..16eb99069b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryPriorityFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryPriorityFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMemoryPriorityFeaturesEXT")] - public unsafe partial struct PhysicalDeviceMemoryPriorityFeaturesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceMemoryPriorityFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceMemoryPriorityFeaturesEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceMemoryPriorityFeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryProperties2.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryProperties2.gen.cs index b007956dc9..c67bd53872 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryProperties2.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryProperties2.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMemoryProperties2")] - public unsafe partial struct PhysicalDeviceMemoryProperties2 : IStructuredType + [NativeName("Aliases", "VkPhysicalDeviceMemoryProperties2KHR")] + public unsafe partial struct PhysicalDeviceMemoryProperties2 : IChainStart { public PhysicalDeviceMemoryProperties2 ( @@ -63,5 +64,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceMemoryProperties2; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref PhysicalDeviceMemoryProperties2 Chain( + out PhysicalDeviceMemoryProperties2 capture) + { + capture = new PhysicalDeviceMemoryProperties2(StructureType.PhysicalDeviceMemoryProperties2); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryProperties2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryProperties2KHR.gen.cs index 82e137ea78..b30bb36b5e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryProperties2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryProperties2KHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMemoryProperties2KHR")] - public unsafe partial struct PhysicalDeviceMemoryProperties2KHR : IStructuredType + [NativeName("AliasOf", "VkPhysicalDeviceMemoryProperties2")] + public unsafe partial struct PhysicalDeviceMemoryProperties2Khr : IChainStart { - public PhysicalDeviceMemoryProperties2KHR + public PhysicalDeviceMemoryProperties2Khr ( StructureType? sType = StructureType.PhysicalDeviceMemoryProperties2, void* pNext = null, @@ -63,5 +64,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceMemoryProperties2; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref PhysicalDeviceMemoryProperties2Khr Chain( + out PhysicalDeviceMemoryProperties2Khr capture) + { + capture = new PhysicalDeviceMemoryProperties2Khr(StructureType.PhysicalDeviceMemoryProperties2); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMeshShaderFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMeshShaderFeaturesNV.gen.cs index 89c5f330d1..5d98dbe77d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMeshShaderFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMeshShaderFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMeshShaderFeaturesNV")] - public unsafe partial struct PhysicalDeviceMeshShaderFeaturesNV : IStructuredType + public unsafe partial struct PhysicalDeviceMeshShaderFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceMeshShaderFeaturesNV ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceMeshShaderFeaturesNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMeshShaderPropertiesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMeshShaderPropertiesNV.gen.cs index 5b28c3f134..9b9e714ec5 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMeshShaderPropertiesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMeshShaderPropertiesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMeshShaderPropertiesNV")] - public unsafe partial struct PhysicalDeviceMeshShaderPropertiesNV : IStructuredType + public unsafe partial struct PhysicalDeviceMeshShaderPropertiesNV : IExtendsChain, IExtendsChain { public PhysicalDeviceMeshShaderPropertiesNV ( @@ -183,5 +183,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceMeshShaderPropertiesNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiDrawFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiDrawFeaturesEXT.gen.cs index 17db550569..29c6e0a0b4 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiDrawFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiDrawFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMultiDrawFeaturesEXT")] - public unsafe partial struct PhysicalDeviceMultiDrawFeaturesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceMultiDrawFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceMultiDrawFeaturesEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceMultiDrawFeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiDrawPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiDrawPropertiesEXT.gen.cs index acc976fbc9..8166d3501f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiDrawPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiDrawPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMultiDrawPropertiesEXT")] - public unsafe partial struct PhysicalDeviceMultiDrawPropertiesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceMultiDrawPropertiesEXT : IExtendsChain, IExtendsChain { public PhysicalDeviceMultiDrawPropertiesEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceMultiDrawPropertiesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewFeatures.gen.cs index 3b03e978e1..5c058db301 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewFeatures.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMultiviewFeatures")] - public unsafe partial struct PhysicalDeviceMultiviewFeatures : IStructuredType + [NativeName("Aliases", "VkPhysicalDeviceMultiviewFeaturesKHR")] + public unsafe partial struct PhysicalDeviceMultiviewFeatures : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceMultiviewFeatures ( @@ -85,5 +86,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceMultiviewFeatures; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewFeaturesKHR.gen.cs index 3ee0e76707..f5cee5e27d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewFeaturesKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMultiviewFeaturesKHR")] - public unsafe partial struct PhysicalDeviceMultiviewFeaturesKHR : IStructuredType + [NativeName("AliasOf", "VkPhysicalDeviceMultiviewFeatures")] + public unsafe partial struct PhysicalDeviceMultiviewFeaturesKhr : IExtendsChain, IExtendsChain, IExtendsChain { - public PhysicalDeviceMultiviewFeaturesKHR + public PhysicalDeviceMultiviewFeaturesKhr ( StructureType? sType = StructureType.PhysicalDeviceMultiviewFeatures, void* pNext = null, @@ -85,5 +86,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceMultiviewFeatures; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX.gen.cs index 22bc883349..55a4a82100 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX")] - public unsafe partial struct PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX : IStructuredType + public unsafe partial struct PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX : IExtendsChain, IExtendsChain { public PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceMultiviewPerViewAttributesPropertiesNvx; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewProperties.gen.cs index f6a58f7cd6..f25642e2a9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewProperties.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMultiviewProperties")] - public unsafe partial struct PhysicalDeviceMultiviewProperties : IStructuredType + [NativeName("Aliases", "VkPhysicalDeviceMultiviewPropertiesKHR")] + public unsafe partial struct PhysicalDeviceMultiviewProperties : IExtendsChain, IExtendsChain { public PhysicalDeviceMultiviewProperties ( @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceMultiviewProperties; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewPropertiesKHR.gen.cs index 8f90b6616f..b704691851 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewPropertiesKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMultiviewPropertiesKHR")] - public unsafe partial struct PhysicalDeviceMultiviewPropertiesKHR : IStructuredType + [NativeName("AliasOf", "VkPhysicalDeviceMultiviewProperties")] + public unsafe partial struct PhysicalDeviceMultiviewPropertiesKhr : IExtendsChain, IExtendsChain { - public PhysicalDeviceMultiviewPropertiesKHR + public PhysicalDeviceMultiviewPropertiesKhr ( StructureType? sType = StructureType.PhysicalDeviceMultiviewProperties, void* pNext = null, @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceMultiviewProperties; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMutableDescriptorTypeFeaturesVALVE.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMutableDescriptorTypeFeaturesVALVE.gen.cs index ad1cd9dbc9..f0a80d1b04 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMutableDescriptorTypeFeaturesVALVE.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMutableDescriptorTypeFeaturesVALVE.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE")] - public unsafe partial struct PhysicalDeviceMutableDescriptorTypeFeaturesVALVE : IStructuredType + public unsafe partial struct PhysicalDeviceMutableDescriptorTypeFeaturesVALVE : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceMutableDescriptorTypeFeaturesVALVE ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceMutableDescriptorTypeFeaturesValve; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePCIBusInfoPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePCIBusInfoPropertiesEXT.gen.cs index a3823c1a2c..3732d469ae 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePCIBusInfoPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePCIBusInfoPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePCIBusInfoPropertiesEXT")] - public unsafe partial struct PhysicalDevicePCIBusInfoPropertiesEXT : IStructuredType + public unsafe partial struct PhysicalDevicePCIBusInfoPropertiesEXT : IExtendsChain, IExtendsChain { public PhysicalDevicePCIBusInfoPropertiesEXT ( @@ -96,5 +96,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDevicePciBusInfoPropertiesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT.gen.cs index 77cc037fd1..bb967e5355 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT")] - public unsafe partial struct PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT : IStructuredType + public unsafe partial struct PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDevicePageableDeviceLocalMemoryFeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePerformanceQueryFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePerformanceQueryFeaturesKHR.gen.cs index 9467cc6d62..b4e34e6ae6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePerformanceQueryFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePerformanceQueryFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePerformanceQueryFeaturesKHR")] - public unsafe partial struct PhysicalDevicePerformanceQueryFeaturesKHR : IStructuredType + public unsafe partial struct PhysicalDevicePerformanceQueryFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDevicePerformanceQueryFeaturesKHR ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDevicePerformanceQueryFeaturesKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePerformanceQueryPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePerformanceQueryPropertiesKHR.gen.cs index d1b1d4633e..948889e87a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePerformanceQueryPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePerformanceQueryPropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePerformanceQueryPropertiesKHR")] - public unsafe partial struct PhysicalDevicePerformanceQueryPropertiesKHR : IStructuredType + public unsafe partial struct PhysicalDevicePerformanceQueryPropertiesKHR : IExtendsChain, IExtendsChain { public PhysicalDevicePerformanceQueryPropertiesKHR ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDevicePerformanceQueryPropertiesKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePipelineCreationCacheControlFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePipelineCreationCacheControlFeaturesEXT.gen.cs index 2b9feb4a19..b4ccf82143 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePipelineCreationCacheControlFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePipelineCreationCacheControlFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT")] - public unsafe partial struct PhysicalDevicePipelineCreationCacheControlFeaturesEXT : IStructuredType + public unsafe partial struct PhysicalDevicePipelineCreationCacheControlFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDevicePipelineCreationCacheControlFeaturesEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDevicePipelineCreationCacheControlFeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePipelineExecutablePropertiesFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePipelineExecutablePropertiesFeaturesKHR.gen.cs index d8587751b0..319f6822ab 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePipelineExecutablePropertiesFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePipelineExecutablePropertiesFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR")] - public unsafe partial struct PhysicalDevicePipelineExecutablePropertiesFeaturesKHR : IStructuredType + public unsafe partial struct PhysicalDevicePipelineExecutablePropertiesFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDevicePipelineExecutablePropertiesFeaturesKHR ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDevicePipelineExecutablePropertiesFeaturesKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePointClippingProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePointClippingProperties.gen.cs index 21fe04b79e..09b6f4a155 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePointClippingProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePointClippingProperties.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePointClippingProperties")] - public unsafe partial struct PhysicalDevicePointClippingProperties : IStructuredType + [NativeName("Aliases", "VkPhysicalDevicePointClippingPropertiesKHR")] + public unsafe partial struct PhysicalDevicePointClippingProperties : IExtendsChain, IExtendsChain { public PhysicalDevicePointClippingProperties ( @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDevicePointClippingProperties; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePointClippingPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePointClippingPropertiesKHR.gen.cs index 2f61d1d2dd..3cebde8e3e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePointClippingPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePointClippingPropertiesKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePointClippingPropertiesKHR")] - public unsafe partial struct PhysicalDevicePointClippingPropertiesKHR : IStructuredType + [NativeName("AliasOf", "VkPhysicalDevicePointClippingProperties")] + public unsafe partial struct PhysicalDevicePointClippingPropertiesKhr : IExtendsChain, IExtendsChain { - public PhysicalDevicePointClippingPropertiesKHR + public PhysicalDevicePointClippingPropertiesKhr ( StructureType? sType = StructureType.PhysicalDevicePointClippingProperties, void* pNext = null, @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDevicePointClippingProperties; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePortabilitySubsetFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePortabilitySubsetFeaturesKHR.gen.cs index 916436d42a..70b2b90885 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePortabilitySubsetFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePortabilitySubsetFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePortabilitySubsetFeaturesKHR")] - public unsafe partial struct PhysicalDevicePortabilitySubsetFeaturesKHR : IStructuredType + public unsafe partial struct PhysicalDevicePortabilitySubsetFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDevicePortabilitySubsetFeaturesKHR ( @@ -217,5 +217,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDevicePortabilitySubsetFeaturesKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePortabilitySubsetPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePortabilitySubsetPropertiesKHR.gen.cs index f33df74c2f..94f6393ac3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePortabilitySubsetPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePortabilitySubsetPropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePortabilitySubsetPropertiesKHR")] - public unsafe partial struct PhysicalDevicePortabilitySubsetPropertiesKHR : IStructuredType + public unsafe partial struct PhysicalDevicePortabilitySubsetPropertiesKHR : IExtendsChain, IExtendsChain { public PhysicalDevicePortabilitySubsetPropertiesKHR ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDevicePortabilitySubsetPropertiesKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePresentIdFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePresentIdFeaturesKHR.gen.cs index 5f411dbb82..933d1b1db6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePresentIdFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePresentIdFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePresentIdFeaturesKHR")] - public unsafe partial struct PhysicalDevicePresentIdFeaturesKHR : IStructuredType + public unsafe partial struct PhysicalDevicePresentIdFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDevicePresentIdFeaturesKHR ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDevicePresentIDFeaturesKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePresentWaitFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePresentWaitFeaturesKHR.gen.cs index b0c4f9b833..62912f83c7 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePresentWaitFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePresentWaitFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePresentWaitFeaturesKHR")] - public unsafe partial struct PhysicalDevicePresentWaitFeaturesKHR : IStructuredType + public unsafe partial struct PhysicalDevicePresentWaitFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDevicePresentWaitFeaturesKHR ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDevicePresentWaitFeaturesKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePresentationPropertiesANDROID.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePresentationPropertiesANDROID.gen.cs index 27999a343d..3a2800399e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePresentationPropertiesANDROID.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePresentationPropertiesANDROID.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePresentationPropertiesANDROID")] - public unsafe partial struct PhysicalDevicePresentationPropertiesANDROID : IStructuredType + public unsafe partial struct PhysicalDevicePresentationPropertiesANDROID : IChainable { public PhysicalDevicePresentationPropertiesANDROID ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDevicePresentationPropertiesAndroid; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT.gen.cs index a633de2d10..d0426f9b2d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT")] - public unsafe partial struct PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT : IStructuredType + public unsafe partial struct PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDevicePrimitiveTopologyListRestartFeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePrivateDataFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePrivateDataFeaturesEXT.gen.cs index c822834358..6c0e75e00e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePrivateDataFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePrivateDataFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePrivateDataFeaturesEXT")] - public unsafe partial struct PhysicalDevicePrivateDataFeaturesEXT : IStructuredType + public unsafe partial struct PhysicalDevicePrivateDataFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDevicePrivateDataFeaturesEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDevicePrivateDataFeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProperties2.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProperties2.gen.cs index 15cd90eb44..a78352c241 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProperties2.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProperties2.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceProperties2")] - public unsafe partial struct PhysicalDeviceProperties2 : IStructuredType + [NativeName("Aliases", "VkPhysicalDeviceProperties2KHR")] + public unsafe partial struct PhysicalDeviceProperties2 : IChainStart { public PhysicalDeviceProperties2 ( @@ -63,5 +64,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceProperties2; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref PhysicalDeviceProperties2 Chain( + out PhysicalDeviceProperties2 capture) + { + capture = new PhysicalDeviceProperties2(StructureType.PhysicalDeviceProperties2); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProperties2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProperties2KHR.gen.cs index 57c85576bc..6525de1511 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProperties2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProperties2KHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceProperties2KHR")] - public unsafe partial struct PhysicalDeviceProperties2KHR : IStructuredType + [NativeName("AliasOf", "VkPhysicalDeviceProperties2")] + public unsafe partial struct PhysicalDeviceProperties2Khr : IChainStart { - public PhysicalDeviceProperties2KHR + public PhysicalDeviceProperties2Khr ( StructureType? sType = StructureType.PhysicalDeviceProperties2, void* pNext = null, @@ -63,5 +64,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceProperties2; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref PhysicalDeviceProperties2Khr Chain( + out PhysicalDeviceProperties2Khr capture) + { + capture = new PhysicalDeviceProperties2Khr(StructureType.PhysicalDeviceProperties2); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProtectedMemoryFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProtectedMemoryFeatures.gen.cs index b23d391e94..8b19109e21 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProtectedMemoryFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProtectedMemoryFeatures.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceProtectedMemoryFeatures")] - public unsafe partial struct PhysicalDeviceProtectedMemoryFeatures : IStructuredType + public unsafe partial struct PhysicalDeviceProtectedMemoryFeatures : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceProtectedMemoryFeatures ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceProtectedMemoryFeatures; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProtectedMemoryProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProtectedMemoryProperties.gen.cs index 66d2cfccec..4a04083a30 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProtectedMemoryProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProtectedMemoryProperties.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceProtectedMemoryProperties")] - public unsafe partial struct PhysicalDeviceProtectedMemoryProperties : IStructuredType + public unsafe partial struct PhysicalDeviceProtectedMemoryProperties : IExtendsChain, IExtendsChain { public PhysicalDeviceProtectedMemoryProperties ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceProtectedMemoryProperties; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProvokingVertexFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProvokingVertexFeaturesEXT.gen.cs index 748453bed8..7f192ff618 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProvokingVertexFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProvokingVertexFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceProvokingVertexFeaturesEXT")] - public unsafe partial struct PhysicalDeviceProvokingVertexFeaturesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceProvokingVertexFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceProvokingVertexFeaturesEXT ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceProvokingVertexFeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProvokingVertexPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProvokingVertexPropertiesEXT.gen.cs index 64c453018a..03dc5f94d9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProvokingVertexPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProvokingVertexPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceProvokingVertexPropertiesEXT")] - public unsafe partial struct PhysicalDeviceProvokingVertexPropertiesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceProvokingVertexPropertiesEXT : IExtendsChain, IExtendsChain { public PhysicalDeviceProvokingVertexPropertiesEXT ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceProvokingVertexPropertiesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePushDescriptorPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePushDescriptorPropertiesKHR.gen.cs index d1cb21f1c6..922273f09a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePushDescriptorPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePushDescriptorPropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePushDescriptorPropertiesKHR")] - public unsafe partial struct PhysicalDevicePushDescriptorPropertiesKHR : IStructuredType + public unsafe partial struct PhysicalDevicePushDescriptorPropertiesKHR : IExtendsChain, IExtendsChain { public PhysicalDevicePushDescriptorPropertiesKHR ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDevicePushDescriptorPropertiesKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRGBA10X6FormatsFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRGBA10X6FormatsFeaturesEXT.gen.cs index 0b12309b83..79b26827ab 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRGBA10X6FormatsFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRGBA10X6FormatsFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT")] - public unsafe partial struct PhysicalDeviceRGBA10X6FormatsFeaturesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceRGBA10X6FormatsFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceRGBA10X6FormatsFeaturesEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceRgba10X6FormatsFeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayQueryFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayQueryFeaturesKHR.gen.cs index d3f82fce26..f5c2f9bc97 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayQueryFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayQueryFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceRayQueryFeaturesKHR")] - public unsafe partial struct PhysicalDeviceRayQueryFeaturesKHR : IStructuredType + public unsafe partial struct PhysicalDeviceRayQueryFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceRayQueryFeaturesKHR ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceRayQueryFeaturesKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingMotionBlurFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingMotionBlurFeaturesNV.gen.cs index acdf09e149..28fa626503 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingMotionBlurFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingMotionBlurFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceRayTracingMotionBlurFeaturesNV")] - public unsafe partial struct PhysicalDeviceRayTracingMotionBlurFeaturesNV : IStructuredType + public unsafe partial struct PhysicalDeviceRayTracingMotionBlurFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceRayTracingMotionBlurFeaturesNV ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceRayTracingMotionBlurFeaturesNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingPipelineFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingPipelineFeaturesKHR.gen.cs index 01bd6835d0..68f68697b6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingPipelineFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingPipelineFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceRayTracingPipelineFeaturesKHR")] - public unsafe partial struct PhysicalDeviceRayTracingPipelineFeaturesKHR : IStructuredType + public unsafe partial struct PhysicalDeviceRayTracingPipelineFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceRayTracingPipelineFeaturesKHR ( @@ -107,5 +107,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceRayTracingPipelineFeaturesKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingPipelinePropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingPipelinePropertiesKHR.gen.cs index 8d3101e9f7..8fb4ca69d7 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingPipelinePropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingPipelinePropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceRayTracingPipelinePropertiesKHR")] - public unsafe partial struct PhysicalDeviceRayTracingPipelinePropertiesKHR : IStructuredType + public unsafe partial struct PhysicalDeviceRayTracingPipelinePropertiesKHR : IExtendsChain, IExtendsChain { public PhysicalDeviceRayTracingPipelinePropertiesKHR ( @@ -140,5 +140,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceRayTracingPipelinePropertiesKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingPropertiesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingPropertiesNV.gen.cs index 33b28eede3..bc14867d16 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingPropertiesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingPropertiesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceRayTracingPropertiesNV")] - public unsafe partial struct PhysicalDeviceRayTracingPropertiesNV : IStructuredType + public unsafe partial struct PhysicalDeviceRayTracingPropertiesNV : IExtendsChain, IExtendsChain { public PhysicalDeviceRayTracingPropertiesNV ( @@ -140,5 +140,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceRayTracingPropertiesNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRepresentativeFragmentTestFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRepresentativeFragmentTestFeaturesNV.gen.cs index 4a78dbebe9..e5d27481fc 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRepresentativeFragmentTestFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRepresentativeFragmentTestFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV")] - public unsafe partial struct PhysicalDeviceRepresentativeFragmentTestFeaturesNV : IStructuredType + public unsafe partial struct PhysicalDeviceRepresentativeFragmentTestFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceRepresentativeFragmentTestFeaturesNV ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceRepresentativeFragmentTestFeaturesNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRobustness2FeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRobustness2FeaturesEXT.gen.cs index 8f2cafd1eb..f11e2a52e8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRobustness2FeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRobustness2FeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceRobustness2FeaturesEXT")] - public unsafe partial struct PhysicalDeviceRobustness2FeaturesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceRobustness2FeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceRobustness2FeaturesEXT ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceRobustness2FeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRobustness2PropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRobustness2PropertiesEXT.gen.cs index c6046f7af9..3fa94e1bf9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRobustness2PropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRobustness2PropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceRobustness2PropertiesEXT")] - public unsafe partial struct PhysicalDeviceRobustness2PropertiesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceRobustness2PropertiesEXT : IExtendsChain, IExtendsChain { public PhysicalDeviceRobustness2PropertiesEXT ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceRobustness2PropertiesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSampleLocationsPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSampleLocationsPropertiesEXT.gen.cs index 31b33f1060..72bffe1334 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSampleLocationsPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSampleLocationsPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSampleLocationsPropertiesEXT")] - public unsafe partial struct PhysicalDeviceSampleLocationsPropertiesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceSampleLocationsPropertiesEXT : IExtendsChain, IExtendsChain { public PhysicalDeviceSampleLocationsPropertiesEXT ( @@ -101,5 +101,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceSampleLocationsPropertiesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerFilterMinmaxProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerFilterMinmaxProperties.gen.cs index cc320a2e08..4c971ae108 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerFilterMinmaxProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerFilterMinmaxProperties.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSamplerFilterMinmaxProperties")] - public unsafe partial struct PhysicalDeviceSamplerFilterMinmaxProperties : IStructuredType + [NativeName("Aliases", "VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT")] + public unsafe partial struct PhysicalDeviceSamplerFilterMinmaxProperties : IExtendsChain, IExtendsChain { public PhysicalDeviceSamplerFilterMinmaxProperties ( @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceSamplerFilterMinmaxProperties; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerFilterMinmaxPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerFilterMinmaxPropertiesEXT.gen.cs index 0b4146943d..da1b6a8851 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerFilterMinmaxPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerFilterMinmaxPropertiesEXT.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT")] - public unsafe partial struct PhysicalDeviceSamplerFilterMinmaxPropertiesEXT : IStructuredType + [NativeName("AliasOf", "VkPhysicalDeviceSamplerFilterMinmaxProperties")] + public unsafe partial struct PhysicalDeviceSamplerFilterMinmaxPropertiesExt : IExtendsChain, IExtendsChain { - public PhysicalDeviceSamplerFilterMinmaxPropertiesEXT + public PhysicalDeviceSamplerFilterMinmaxPropertiesExt ( StructureType? sType = StructureType.PhysicalDeviceSamplerFilterMinmaxProperties, void* pNext = null, @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceSamplerFilterMinmaxProperties; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerYcbcrConversionFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerYcbcrConversionFeatures.gen.cs index 0e52ad4f8f..a1bae1506f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerYcbcrConversionFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerYcbcrConversionFeatures.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSamplerYcbcrConversionFeatures")] - public unsafe partial struct PhysicalDeviceSamplerYcbcrConversionFeatures : IStructuredType + [NativeName("Aliases", "VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR")] + public unsafe partial struct PhysicalDeviceSamplerYcbcrConversionFeatures : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceSamplerYcbcrConversionFeatures ( @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceSamplerYcbcrConversionFeatures; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerYcbcrConversionFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerYcbcrConversionFeaturesKHR.gen.cs index db7f9ac22c..8b96d77a91 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerYcbcrConversionFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerYcbcrConversionFeaturesKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR")] - public unsafe partial struct PhysicalDeviceSamplerYcbcrConversionFeaturesKHR : IStructuredType + [NativeName("AliasOf", "VkPhysicalDeviceSamplerYcbcrConversionFeatures")] + public unsafe partial struct PhysicalDeviceSamplerYcbcrConversionFeaturesKhr : IExtendsChain, IExtendsChain, IExtendsChain { - public PhysicalDeviceSamplerYcbcrConversionFeaturesKHR + public PhysicalDeviceSamplerYcbcrConversionFeaturesKhr ( StructureType? sType = StructureType.PhysicalDeviceSamplerYcbcrConversionFeatures, void* pNext = null, @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceSamplerYcbcrConversionFeatures; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceScalarBlockLayoutFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceScalarBlockLayoutFeatures.gen.cs index 9d2e71f673..b4d5b7e297 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceScalarBlockLayoutFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceScalarBlockLayoutFeatures.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceScalarBlockLayoutFeatures")] - public unsafe partial struct PhysicalDeviceScalarBlockLayoutFeatures : IStructuredType + [NativeName("Aliases", "VkPhysicalDeviceScalarBlockLayoutFeaturesEXT")] + public unsafe partial struct PhysicalDeviceScalarBlockLayoutFeatures : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceScalarBlockLayoutFeatures ( @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceScalarBlockLayoutFeatures; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceScalarBlockLayoutFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceScalarBlockLayoutFeaturesEXT.gen.cs index 3246d25044..9ac69534fb 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceScalarBlockLayoutFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceScalarBlockLayoutFeaturesEXT.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceScalarBlockLayoutFeaturesEXT")] - public unsafe partial struct PhysicalDeviceScalarBlockLayoutFeaturesEXT : IStructuredType + [NativeName("AliasOf", "VkPhysicalDeviceScalarBlockLayoutFeatures")] + public unsafe partial struct PhysicalDeviceScalarBlockLayoutFeaturesExt : IExtendsChain, IExtendsChain, IExtendsChain { - public PhysicalDeviceScalarBlockLayoutFeaturesEXT + public PhysicalDeviceScalarBlockLayoutFeaturesExt ( StructureType? sType = StructureType.PhysicalDeviceScalarBlockLayoutFeatures, void* pNext = null, @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceScalarBlockLayoutFeatures; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSeparateDepthStencilLayoutsFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSeparateDepthStencilLayoutsFeatures.gen.cs index e571ddd82a..b544f91b0c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSeparateDepthStencilLayoutsFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSeparateDepthStencilLayoutsFeatures.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures")] - public unsafe partial struct PhysicalDeviceSeparateDepthStencilLayoutsFeatures : IStructuredType + [NativeName("Aliases", "VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR")] + public unsafe partial struct PhysicalDeviceSeparateDepthStencilLayoutsFeatures : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceSeparateDepthStencilLayoutsFeatures ( @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceSeparateDepthStencilLayoutsFeatures; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR.gen.cs index d2694f5c8a..ca22d1c79b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR")] - public unsafe partial struct PhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR : IStructuredType + [NativeName("AliasOf", "VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures")] + public unsafe partial struct PhysicalDeviceSeparateDepthStencilLayoutsFeaturesKhr : IExtendsChain, IExtendsChain, IExtendsChain { - public PhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR + public PhysicalDeviceSeparateDepthStencilLayoutsFeaturesKhr ( StructureType? sType = StructureType.PhysicalDeviceSeparateDepthStencilLayoutsFeatures, void* pNext = null, @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceSeparateDepthStencilLayoutsFeatures; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicFloat2FeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicFloat2FeaturesEXT.gen.cs index 12cbf4cae2..2ac8ce590a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicFloat2FeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicFloat2FeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT")] - public unsafe partial struct PhysicalDeviceShaderAtomicFloat2FeaturesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceShaderAtomicFloat2FeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceShaderAtomicFloat2FeaturesEXT ( @@ -184,5 +184,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceShaderAtomicFloat2FeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicFloatFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicFloatFeaturesEXT.gen.cs index 8d99c7433d..84eb1b957a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicFloatFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicFloatFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderAtomicFloatFeaturesEXT")] - public unsafe partial struct PhysicalDeviceShaderAtomicFloatFeaturesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceShaderAtomicFloatFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceShaderAtomicFloatFeaturesEXT ( @@ -184,5 +184,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceShaderAtomicFloatFeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicInt64Features.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicInt64Features.gen.cs index 26d6453e3e..12a0bc72a4 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicInt64Features.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicInt64Features.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderAtomicInt64Features")] - public unsafe partial struct PhysicalDeviceShaderAtomicInt64Features : IStructuredType + [NativeName("Aliases", "VkPhysicalDeviceShaderAtomicInt64FeaturesKHR")] + public unsafe partial struct PhysicalDeviceShaderAtomicInt64Features : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceShaderAtomicInt64Features ( @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceShaderAtomicInt64Features; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicInt64FeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicInt64FeaturesKHR.gen.cs index 44c91c5524..41dd8e5870 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicInt64FeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicInt64FeaturesKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderAtomicInt64FeaturesKHR")] - public unsafe partial struct PhysicalDeviceShaderAtomicInt64FeaturesKHR : IStructuredType + [NativeName("AliasOf", "VkPhysicalDeviceShaderAtomicInt64Features")] + public unsafe partial struct PhysicalDeviceShaderAtomicInt64featuresKhr : IExtendsChain, IExtendsChain, IExtendsChain { - public PhysicalDeviceShaderAtomicInt64FeaturesKHR + public PhysicalDeviceShaderAtomicInt64featuresKhr ( StructureType? sType = StructureType.PhysicalDeviceShaderAtomicInt64Features, void* pNext = null, @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceShaderAtomicInt64Features; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderClockFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderClockFeaturesKHR.gen.cs index 4f92e63b2b..4c79a49894 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderClockFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderClockFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderClockFeaturesKHR")] - public unsafe partial struct PhysicalDeviceShaderClockFeaturesKHR : IStructuredType + public unsafe partial struct PhysicalDeviceShaderClockFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceShaderClockFeaturesKHR ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceShaderClockFeaturesKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderCoreProperties2AMD.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderCoreProperties2AMD.gen.cs index 8d188d0d6a..01720c8143 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderCoreProperties2AMD.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderCoreProperties2AMD.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderCoreProperties2AMD")] - public unsafe partial struct PhysicalDeviceShaderCoreProperties2AMD : IStructuredType + public unsafe partial struct PhysicalDeviceShaderCoreProperties2AMD : IExtendsChain, IExtendsChain { public PhysicalDeviceShaderCoreProperties2AMD ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceShaderCoreProperties2Amd; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderCorePropertiesAMD.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderCorePropertiesAMD.gen.cs index 15ed2960f2..8ab354dc46 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderCorePropertiesAMD.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderCorePropertiesAMD.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderCorePropertiesAMD")] - public unsafe partial struct PhysicalDeviceShaderCorePropertiesAMD : IStructuredType + public unsafe partial struct PhysicalDeviceShaderCorePropertiesAMD : IExtendsChain, IExtendsChain { public PhysicalDeviceShaderCorePropertiesAMD ( @@ -206,5 +206,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceShaderCorePropertiesAmd; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT.gen.cs index ecc2253404..5bceb56d30 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT")] - public unsafe partial struct PhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceShaderDemoteToHelperInvocationFeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderDrawParameterFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderDrawParameterFeatures.gen.cs index 2766ed71d9..91836be25e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderDrawParameterFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderDrawParameterFeatures.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderDrawParameterFeatures")] - public unsafe partial struct PhysicalDeviceShaderDrawParameterFeatures : IStructuredType + [NativeName("AliasOf", "VkPhysicalDeviceShaderDrawParametersFeatures")] + public unsafe partial struct PhysicalDeviceShaderDrawParameterFeatures : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceShaderDrawParameterFeatures ( @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceShaderDrawParametersFeatures; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderDrawParametersFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderDrawParametersFeatures.gen.cs index 81c13df85b..92bbe06b3c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderDrawParametersFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderDrawParametersFeatures.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderDrawParametersFeatures")] - public unsafe partial struct PhysicalDeviceShaderDrawParametersFeatures : IStructuredType + [NativeName("Aliases", "VkPhysicalDeviceShaderDrawParameterFeatures")] + public unsafe partial struct PhysicalDeviceShaderDrawParametersFeatures : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceShaderDrawParametersFeatures ( @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceShaderDrawParametersFeatures; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderFloat16Int8Features.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderFloat16Int8Features.gen.cs index 90685d55fa..1deccfd0ec 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderFloat16Int8Features.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderFloat16Int8Features.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderFloat16Int8Features")] - public unsafe partial struct PhysicalDeviceShaderFloat16Int8Features : IStructuredType + [NativeName("Aliases", "VkPhysicalDeviceShaderFloat16Int8FeaturesKHR, VkPhysicalDeviceFloat16Int8FeaturesKHR")] + public unsafe partial struct PhysicalDeviceShaderFloat16Int8Features : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceShaderFloat16Int8Features ( @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceShaderFloat16Int8Features; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderFloat16Int8FeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderFloat16Int8FeaturesKHR.gen.cs index 7e3714b6d8..c4a3cd8946 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderFloat16Int8FeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderFloat16Int8FeaturesKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderFloat16Int8FeaturesKHR")] - public unsafe partial struct PhysicalDeviceShaderFloat16Int8FeaturesKHR : IStructuredType + [NativeName("AliasOf", "VkPhysicalDeviceShaderFloat16Int8Features")] + public unsafe partial struct PhysicalDeviceShaderFloat16int8featuresKhr : IExtendsChain, IExtendsChain, IExtendsChain { - public PhysicalDeviceShaderFloat16Int8FeaturesKHR + public PhysicalDeviceShaderFloat16int8featuresKhr ( StructureType? sType = StructureType.PhysicalDeviceShaderFloat16Int8Features, void* pNext = null, @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceShaderFloat16Int8Features; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderImageAtomicInt64FeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderImageAtomicInt64FeaturesEXT.gen.cs index 58aee61c9e..24dfdcb17f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderImageAtomicInt64FeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderImageAtomicInt64FeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT")] - public unsafe partial struct PhysicalDeviceShaderImageAtomicInt64FeaturesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceShaderImageAtomicInt64FeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceShaderImageAtomicInt64FeaturesEXT ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceShaderImageAtomicInt64FeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderImageFootprintFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderImageFootprintFeaturesNV.gen.cs index 4b0970bc9e..ad3b07dd1e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderImageFootprintFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderImageFootprintFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderImageFootprintFeaturesNV")] - public unsafe partial struct PhysicalDeviceShaderImageFootprintFeaturesNV : IStructuredType + public unsafe partial struct PhysicalDeviceShaderImageFootprintFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceShaderImageFootprintFeaturesNV ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceShaderImageFootprintFeaturesNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderIntegerDotProductFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderIntegerDotProductFeaturesKHR.gen.cs index b3642a20fd..1275559d71 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderIntegerDotProductFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderIntegerDotProductFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR")] - public unsafe partial struct PhysicalDeviceShaderIntegerDotProductFeaturesKHR : IStructuredType + public unsafe partial struct PhysicalDeviceShaderIntegerDotProductFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceShaderIntegerDotProductFeaturesKHR ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceShaderIntegerDotProductFeaturesKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderIntegerDotProductPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderIntegerDotProductPropertiesKHR.gen.cs index 5a62d7518e..288068dede 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderIntegerDotProductPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderIntegerDotProductPropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR")] - public unsafe partial struct PhysicalDeviceShaderIntegerDotProductPropertiesKHR : IStructuredType + public unsafe partial struct PhysicalDeviceShaderIntegerDotProductPropertiesKHR : IExtendsChain, IExtendsChain { public PhysicalDeviceShaderIntegerDotProductPropertiesKHR ( @@ -382,5 +382,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceShaderIntegerDotProductPropertiesKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL.gen.cs index 2e7bd91ae2..a9b4483cf7 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL")] - public unsafe partial struct PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL : IStructuredType + public unsafe partial struct PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceShaderIntegerFunctions2FeaturesIntel; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSMBuiltinsFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSMBuiltinsFeaturesNV.gen.cs index 46e9f6cf2b..7c924711eb 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSMBuiltinsFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSMBuiltinsFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderSMBuiltinsFeaturesNV")] - public unsafe partial struct PhysicalDeviceShaderSMBuiltinsFeaturesNV : IStructuredType + public unsafe partial struct PhysicalDeviceShaderSMBuiltinsFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceShaderSMBuiltinsFeaturesNV ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceShaderSMBuiltinsFeaturesNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSMBuiltinsPropertiesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSMBuiltinsPropertiesNV.gen.cs index 0358bf6a6a..8682047797 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSMBuiltinsPropertiesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSMBuiltinsPropertiesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderSMBuiltinsPropertiesNV")] - public unsafe partial struct PhysicalDeviceShaderSMBuiltinsPropertiesNV : IStructuredType + public unsafe partial struct PhysicalDeviceShaderSMBuiltinsPropertiesNV : IExtendsChain, IExtendsChain { public PhysicalDeviceShaderSMBuiltinsPropertiesNV ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceShaderSMBuiltinsPropertiesNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSubgroupExtendedTypesFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSubgroupExtendedTypesFeatures.gen.cs index 99933147a7..80bb136ad9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSubgroupExtendedTypesFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSubgroupExtendedTypesFeatures.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures")] - public unsafe partial struct PhysicalDeviceShaderSubgroupExtendedTypesFeatures : IStructuredType + [NativeName("Aliases", "VkPhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR")] + public unsafe partial struct PhysicalDeviceShaderSubgroupExtendedTypesFeatures : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceShaderSubgroupExtendedTypesFeatures ( @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceShaderSubgroupExtendedTypesFeatures; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR.gen.cs index 7c4e90cff5..78a53ab744 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR")] - public unsafe partial struct PhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR : IStructuredType + [NativeName("AliasOf", "VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures")] + public unsafe partial struct PhysicalDeviceShaderSubgroupExtendedTypesFeaturesKhr : IExtendsChain, IExtendsChain, IExtendsChain { - public PhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR + public PhysicalDeviceShaderSubgroupExtendedTypesFeaturesKhr ( StructureType? sType = StructureType.PhysicalDeviceShaderSubgroupExtendedTypesFeatures, void* pNext = null, @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceShaderSubgroupExtendedTypesFeatures; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR.gen.cs index 9e551bc12e..e5303f70b3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR")] - public unsafe partial struct PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR : IStructuredType + public unsafe partial struct PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderTerminateInvocationFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderTerminateInvocationFeaturesKHR.gen.cs index 7165154937..8b0b041d12 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderTerminateInvocationFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderTerminateInvocationFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR")] - public unsafe partial struct PhysicalDeviceShaderTerminateInvocationFeaturesKHR : IStructuredType + public unsafe partial struct PhysicalDeviceShaderTerminateInvocationFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceShaderTerminateInvocationFeaturesKHR ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceShaderTerminateInvocationFeaturesKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShadingRateImageFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShadingRateImageFeaturesNV.gen.cs index 95f5eada57..f278af7d06 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShadingRateImageFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShadingRateImageFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShadingRateImageFeaturesNV")] - public unsafe partial struct PhysicalDeviceShadingRateImageFeaturesNV : IStructuredType + public unsafe partial struct PhysicalDeviceShadingRateImageFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceShadingRateImageFeaturesNV ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceShadingRateImageFeaturesNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShadingRateImagePropertiesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShadingRateImagePropertiesNV.gen.cs index b19e969c09..2e25e38adb 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShadingRateImagePropertiesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShadingRateImagePropertiesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShadingRateImagePropertiesNV")] - public unsafe partial struct PhysicalDeviceShadingRateImagePropertiesNV : IStructuredType + public unsafe partial struct PhysicalDeviceShadingRateImagePropertiesNV : IExtendsChain, IExtendsChain { public PhysicalDeviceShadingRateImagePropertiesNV ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceShadingRateImagePropertiesNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSparseImageFormatInfo2.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSparseImageFormatInfo2.gen.cs index 19a57c3638..4515c678a7 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSparseImageFormatInfo2.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSparseImageFormatInfo2.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSparseImageFormatInfo2")] - public unsafe partial struct PhysicalDeviceSparseImageFormatInfo2 : IStructuredType + [NativeName("Aliases", "VkPhysicalDeviceSparseImageFormatInfo2KHR")] + public unsafe partial struct PhysicalDeviceSparseImageFormatInfo2 : IChainable { public PhysicalDeviceSparseImageFormatInfo2 ( @@ -107,5 +108,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceSparseImageFormatInfo2; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSparseImageFormatInfo2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSparseImageFormatInfo2KHR.gen.cs index 040689c8df..8c3aa81ab4 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSparseImageFormatInfo2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSparseImageFormatInfo2KHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSparseImageFormatInfo2KHR")] - public unsafe partial struct PhysicalDeviceSparseImageFormatInfo2KHR : IStructuredType + [NativeName("AliasOf", "VkPhysicalDeviceSparseImageFormatInfo2")] + public unsafe partial struct PhysicalDeviceSparseImageFormatInfo2Khr : IChainable { - public PhysicalDeviceSparseImageFormatInfo2KHR + public PhysicalDeviceSparseImageFormatInfo2Khr ( StructureType? sType = StructureType.PhysicalDeviceSparseImageFormatInfo2, void* pNext = null, @@ -107,5 +108,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceSparseImageFormatInfo2; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubgroupProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubgroupProperties.gen.cs index e71b8394fb..9eba83752a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubgroupProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubgroupProperties.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSubgroupProperties")] - public unsafe partial struct PhysicalDeviceSubgroupProperties : IStructuredType + public unsafe partial struct PhysicalDeviceSubgroupProperties : IExtendsChain, IExtendsChain { public PhysicalDeviceSubgroupProperties ( @@ -96,5 +96,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceSubgroupProperties; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubgroupSizeControlFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubgroupSizeControlFeaturesEXT.gen.cs index db2ecffa50..58b390704d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubgroupSizeControlFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubgroupSizeControlFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSubgroupSizeControlFeaturesEXT")] - public unsafe partial struct PhysicalDeviceSubgroupSizeControlFeaturesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceSubgroupSizeControlFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceSubgroupSizeControlFeaturesEXT ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceSubgroupSizeControlFeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubgroupSizeControlPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubgroupSizeControlPropertiesEXT.gen.cs index 37153faec3..cb33c92481 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubgroupSizeControlPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubgroupSizeControlPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSubgroupSizeControlPropertiesEXT")] - public unsafe partial struct PhysicalDeviceSubgroupSizeControlPropertiesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceSubgroupSizeControlPropertiesEXT : IExtendsChain, IExtendsChain { public PhysicalDeviceSubgroupSizeControlPropertiesEXT ( @@ -96,5 +96,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceSubgroupSizeControlPropertiesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubpassShadingFeaturesHUAWEI.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubpassShadingFeaturesHUAWEI.gen.cs index 7b0af7b6c8..1bb85c7d52 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubpassShadingFeaturesHUAWEI.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubpassShadingFeaturesHUAWEI.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSubpassShadingFeaturesHUAWEI")] - public unsafe partial struct PhysicalDeviceSubpassShadingFeaturesHUAWEI : IStructuredType + public unsafe partial struct PhysicalDeviceSubpassShadingFeaturesHUAWEI : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceSubpassShadingFeaturesHUAWEI ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceSubpassShadingFeaturesHuawei; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubpassShadingPropertiesHUAWEI.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubpassShadingPropertiesHUAWEI.gen.cs index fcbef6a93f..80918f73d0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubpassShadingPropertiesHUAWEI.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubpassShadingPropertiesHUAWEI.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSubpassShadingPropertiesHUAWEI")] - public unsafe partial struct PhysicalDeviceSubpassShadingPropertiesHUAWEI : IStructuredType + public unsafe partial struct PhysicalDeviceSubpassShadingPropertiesHUAWEI : IExtendsChain, IExtendsChain { public PhysicalDeviceSubpassShadingPropertiesHUAWEI ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceSubpassShadingPropertiesHuawei; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSurfaceInfo2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSurfaceInfo2KHR.gen.cs index 233a8b9f74..8ac21ca77e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSurfaceInfo2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSurfaceInfo2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSurfaceInfo2KHR")] - public unsafe partial struct PhysicalDeviceSurfaceInfo2KHR : IStructuredType + public unsafe partial struct PhysicalDeviceSurfaceInfo2KHR : IChainStart { public PhysicalDeviceSurfaceInfo2KHR ( @@ -63,5 +63,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceSurfaceInfo2Khr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref PhysicalDeviceSurfaceInfo2KHR Chain( + out PhysicalDeviceSurfaceInfo2KHR capture) + { + capture = new PhysicalDeviceSurfaceInfo2KHR(StructureType.PhysicalDeviceSurfaceInfo2Khr); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSynchronization2FeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSynchronization2FeaturesKHR.gen.cs index 49beea7f30..1a168b7351 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSynchronization2FeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSynchronization2FeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSynchronization2FeaturesKHR")] - public unsafe partial struct PhysicalDeviceSynchronization2FeaturesKHR : IStructuredType + public unsafe partial struct PhysicalDeviceSynchronization2FeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceSynchronization2FeaturesKHR ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceSynchronization2FeaturesKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTexelBufferAlignmentFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTexelBufferAlignmentFeaturesEXT.gen.cs index 4bf5183b25..20080754fc 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTexelBufferAlignmentFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTexelBufferAlignmentFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT")] - public unsafe partial struct PhysicalDeviceTexelBufferAlignmentFeaturesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceTexelBufferAlignmentFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceTexelBufferAlignmentFeaturesEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceTexelBufferAlignmentFeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTexelBufferAlignmentPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTexelBufferAlignmentPropertiesEXT.gen.cs index d8e5d8307c..bedef5097a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTexelBufferAlignmentPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTexelBufferAlignmentPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT")] - public unsafe partial struct PhysicalDeviceTexelBufferAlignmentPropertiesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceTexelBufferAlignmentPropertiesEXT : IExtendsChain, IExtendsChain { public PhysicalDeviceTexelBufferAlignmentPropertiesEXT ( @@ -96,5 +96,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceTexelBufferAlignmentPropertiesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTextureCompressionASTCHDRFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTextureCompressionASTCHDRFeaturesEXT.gen.cs index 5e992f23e8..bf0afc5cdb 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTextureCompressionASTCHDRFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTextureCompressionASTCHDRFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT")] - public unsafe partial struct PhysicalDeviceTextureCompressionASTCHDRFeaturesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceTextureCompressionASTCHDRFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceTextureCompressionASTCHDRFeaturesEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceTextureCompressionAstcHdrFeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphoreFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphoreFeatures.gen.cs index 0412a30fb7..cea69c27e5 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphoreFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphoreFeatures.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceTimelineSemaphoreFeatures")] - public unsafe partial struct PhysicalDeviceTimelineSemaphoreFeatures : IStructuredType + [NativeName("Aliases", "VkPhysicalDeviceTimelineSemaphoreFeaturesKHR")] + public unsafe partial struct PhysicalDeviceTimelineSemaphoreFeatures : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceTimelineSemaphoreFeatures ( @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceTimelineSemaphoreFeatures; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphoreFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphoreFeaturesKHR.gen.cs index 4651b5429d..6c4db3eee4 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphoreFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphoreFeaturesKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceTimelineSemaphoreFeaturesKHR")] - public unsafe partial struct PhysicalDeviceTimelineSemaphoreFeaturesKHR : IStructuredType + [NativeName("AliasOf", "VkPhysicalDeviceTimelineSemaphoreFeatures")] + public unsafe partial struct PhysicalDeviceTimelineSemaphoreFeaturesKhr : IExtendsChain, IExtendsChain, IExtendsChain { - public PhysicalDeviceTimelineSemaphoreFeaturesKHR + public PhysicalDeviceTimelineSemaphoreFeaturesKhr ( StructureType? sType = StructureType.PhysicalDeviceTimelineSemaphoreFeatures, void* pNext = null, @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceTimelineSemaphoreFeatures; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphoreProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphoreProperties.gen.cs index 1587b34f8b..048012a66e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphoreProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphoreProperties.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceTimelineSemaphoreProperties")] - public unsafe partial struct PhysicalDeviceTimelineSemaphoreProperties : IStructuredType + [NativeName("Aliases", "VkPhysicalDeviceTimelineSemaphorePropertiesKHR")] + public unsafe partial struct PhysicalDeviceTimelineSemaphoreProperties : IExtendsChain, IExtendsChain { public PhysicalDeviceTimelineSemaphoreProperties ( @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceTimelineSemaphoreProperties; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphorePropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphorePropertiesKHR.gen.cs index 61f4903155..02666e5ed8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphorePropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphorePropertiesKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceTimelineSemaphorePropertiesKHR")] - public unsafe partial struct PhysicalDeviceTimelineSemaphorePropertiesKHR : IStructuredType + [NativeName("AliasOf", "VkPhysicalDeviceTimelineSemaphoreProperties")] + public unsafe partial struct PhysicalDeviceTimelineSemaphorePropertiesKhr : IExtendsChain, IExtendsChain { - public PhysicalDeviceTimelineSemaphorePropertiesKHR + public PhysicalDeviceTimelineSemaphorePropertiesKhr ( StructureType? sType = StructureType.PhysicalDeviceTimelineSemaphoreProperties, void* pNext = null, @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceTimelineSemaphoreProperties; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceToolPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceToolPropertiesEXT.gen.cs index b04a936235..5c1f80e654 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceToolPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceToolPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceToolPropertiesEXT")] - public unsafe partial struct PhysicalDeviceToolPropertiesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceToolPropertiesEXT : IChainable { public PhysicalDeviceToolPropertiesEXT ( @@ -83,5 +83,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceToolPropertiesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTransformFeedbackFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTransformFeedbackFeaturesEXT.gen.cs index d0f44b11ab..c836af487c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTransformFeedbackFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTransformFeedbackFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceTransformFeedbackFeaturesEXT")] - public unsafe partial struct PhysicalDeviceTransformFeedbackFeaturesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceTransformFeedbackFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceTransformFeedbackFeaturesEXT ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceTransformFeedbackFeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTransformFeedbackPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTransformFeedbackPropertiesEXT.gen.cs index 90711dfdfd..5dc71cecd0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTransformFeedbackPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTransformFeedbackPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceTransformFeedbackPropertiesEXT")] - public unsafe partial struct PhysicalDeviceTransformFeedbackPropertiesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceTransformFeedbackPropertiesEXT : IExtendsChain, IExtendsChain { public PhysicalDeviceTransformFeedbackPropertiesEXT ( @@ -162,5 +162,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceTransformFeedbackPropertiesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceUniformBufferStandardLayoutFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceUniformBufferStandardLayoutFeatures.gen.cs index 3f5eafa046..187872a0be 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceUniformBufferStandardLayoutFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceUniformBufferStandardLayoutFeatures.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceUniformBufferStandardLayoutFeatures")] - public unsafe partial struct PhysicalDeviceUniformBufferStandardLayoutFeatures : IStructuredType + [NativeName("Aliases", "VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR")] + public unsafe partial struct PhysicalDeviceUniformBufferStandardLayoutFeatures : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceUniformBufferStandardLayoutFeatures ( @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceUniformBufferStandardLayoutFeatures; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceUniformBufferStandardLayoutFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceUniformBufferStandardLayoutFeaturesKHR.gen.cs index b9d9bb16ea..020dcd675f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceUniformBufferStandardLayoutFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceUniformBufferStandardLayoutFeaturesKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR")] - public unsafe partial struct PhysicalDeviceUniformBufferStandardLayoutFeaturesKHR : IStructuredType + [NativeName("AliasOf", "VkPhysicalDeviceUniformBufferStandardLayoutFeatures")] + public unsafe partial struct PhysicalDeviceUniformBufferStandardLayoutFeaturesKhr : IExtendsChain, IExtendsChain, IExtendsChain { - public PhysicalDeviceUniformBufferStandardLayoutFeaturesKHR + public PhysicalDeviceUniformBufferStandardLayoutFeaturesKhr ( StructureType? sType = StructureType.PhysicalDeviceUniformBufferStandardLayoutFeatures, void* pNext = null, @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceUniformBufferStandardLayoutFeatures; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointerFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointerFeatures.gen.cs index 1813806f23..42f630a2d5 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointerFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointerFeatures.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceVariablePointerFeatures")] - public unsafe partial struct PhysicalDeviceVariablePointerFeatures : IStructuredType + [NativeName("AliasOf", "VkPhysicalDeviceVariablePointersFeatures")] + public unsafe partial struct PhysicalDeviceVariablePointerFeatures : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceVariablePointerFeatures ( @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceVariablePointersFeatures; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointerFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointerFeaturesKHR.gen.cs index 8a88b64808..8552ed87fe 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointerFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointerFeaturesKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceVariablePointerFeaturesKHR")] - public unsafe partial struct PhysicalDeviceVariablePointerFeaturesKHR : IStructuredType + [NativeName("AliasOf", "VkPhysicalDeviceVariablePointersFeatures")] + public unsafe partial struct PhysicalDeviceVariablePointerFeaturesKhr : IExtendsChain, IExtendsChain, IExtendsChain { - public PhysicalDeviceVariablePointerFeaturesKHR + public PhysicalDeviceVariablePointerFeaturesKhr ( StructureType? sType = StructureType.PhysicalDeviceVariablePointersFeatures, void* pNext = null, @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceVariablePointersFeatures; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointersFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointersFeatures.gen.cs index aa3a5a5bc9..58b9fcbd1b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointersFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointersFeatures.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceVariablePointersFeatures")] - public unsafe partial struct PhysicalDeviceVariablePointersFeatures : IStructuredType + [NativeName("Aliases", "VkPhysicalDeviceVariablePointersFeaturesKHR, VkPhysicalDeviceVariablePointerFeaturesKHR, VkPhysicalDeviceVariablePointerFeatures")] + public unsafe partial struct PhysicalDeviceVariablePointersFeatures : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceVariablePointersFeatures ( @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceVariablePointersFeatures; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointersFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointersFeaturesKHR.gen.cs index 23890525b2..5065277650 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointersFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointersFeaturesKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceVariablePointersFeaturesKHR")] - public unsafe partial struct PhysicalDeviceVariablePointersFeaturesKHR : IStructuredType + [NativeName("AliasOf", "VkPhysicalDeviceVariablePointersFeatures")] + public unsafe partial struct PhysicalDeviceVariablePointersFeaturesKhr : IExtendsChain, IExtendsChain, IExtendsChain { - public PhysicalDeviceVariablePointersFeaturesKHR + public PhysicalDeviceVariablePointersFeaturesKhr ( StructureType? sType = StructureType.PhysicalDeviceVariablePointersFeatures, void* pNext = null, @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceVariablePointersFeatures; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVertexAttributeDivisorFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVertexAttributeDivisorFeaturesEXT.gen.cs index 2b01da546d..caa02a9354 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVertexAttributeDivisorFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVertexAttributeDivisorFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT")] - public unsafe partial struct PhysicalDeviceVertexAttributeDivisorFeaturesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceVertexAttributeDivisorFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceVertexAttributeDivisorFeaturesEXT ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceVertexAttributeDivisorFeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVertexAttributeDivisorPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVertexAttributeDivisorPropertiesEXT.gen.cs index 2e20a6e21e..37a4f0511f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVertexAttributeDivisorPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVertexAttributeDivisorPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT")] - public unsafe partial struct PhysicalDeviceVertexAttributeDivisorPropertiesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceVertexAttributeDivisorPropertiesEXT : IExtendsChain, IExtendsChain { public PhysicalDeviceVertexAttributeDivisorPropertiesEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceVertexAttributeDivisorPropertiesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVertexInputDynamicStateFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVertexInputDynamicStateFeaturesEXT.gen.cs index 813b19ca3c..801afaf7e6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVertexInputDynamicStateFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVertexInputDynamicStateFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT")] - public unsafe partial struct PhysicalDeviceVertexInputDynamicStateFeaturesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceVertexInputDynamicStateFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceVertexInputDynamicStateFeaturesEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceVertexInputDynamicStateFeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVideoFormatInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVideoFormatInfoKHR.gen.cs index 200438d3bf..4b4f17e975 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVideoFormatInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVideoFormatInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceVideoFormatInfoKHR")] - public unsafe partial struct PhysicalDeviceVideoFormatInfoKHR : IStructuredType + public unsafe partial struct PhysicalDeviceVideoFormatInfoKHR : IChainable { public PhysicalDeviceVideoFormatInfoKHR ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceVideoFormatInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan11Features.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan11Features.gen.cs index 7717087b0b..64be99bb1e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan11Features.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan11Features.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceVulkan11Features")] - public unsafe partial struct PhysicalDeviceVulkan11Features : IStructuredType + public unsafe partial struct PhysicalDeviceVulkan11Features : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceVulkan11Features ( @@ -184,5 +184,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceVulkan11Features; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan11Properties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan11Properties.gen.cs index 36069f66c3..c42fb2f0c2 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan11Properties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan11Properties.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceVulkan11Properties")] - public unsafe partial struct PhysicalDeviceVulkan11Properties : IStructuredType + public unsafe partial struct PhysicalDeviceVulkan11Properties : IExtendsChain, IExtendsChain { public PhysicalDeviceVulkan11Properties ( @@ -199,5 +199,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceVulkan11Properties; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan12Features.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan12Features.gen.cs index 6acf37212b..04a2f52380 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan12Features.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan12Features.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceVulkan12Features")] - public unsafe partial struct PhysicalDeviceVulkan12Features : IStructuredType + public unsafe partial struct PhysicalDeviceVulkan12Features : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceVulkan12Features ( @@ -569,5 +569,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceVulkan12Features; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan12Properties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan12Properties.gen.cs index 969169133b..abfa05c2b2 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan12Properties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan12Properties.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceVulkan12Properties")] - public unsafe partial struct PhysicalDeviceVulkan12Properties : IStructuredType + public unsafe partial struct PhysicalDeviceVulkan12Properties : IExtendsChain, IExtendsChain { public PhysicalDeviceVulkan12Properties ( @@ -612,5 +612,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceVulkan12Properties; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkanMemoryModelFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkanMemoryModelFeatures.gen.cs index 6d8bd2d6b0..3213d0ebc2 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkanMemoryModelFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkanMemoryModelFeatures.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceVulkanMemoryModelFeatures")] - public unsafe partial struct PhysicalDeviceVulkanMemoryModelFeatures : IStructuredType + [NativeName("Aliases", "VkPhysicalDeviceVulkanMemoryModelFeaturesKHR")] + public unsafe partial struct PhysicalDeviceVulkanMemoryModelFeatures : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceVulkanMemoryModelFeatures ( @@ -85,5 +86,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceVulkanMemoryModelFeatures; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkanMemoryModelFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkanMemoryModelFeaturesKHR.gen.cs index 6570f4bdde..a6277d21df 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkanMemoryModelFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkanMemoryModelFeaturesKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceVulkanMemoryModelFeaturesKHR")] - public unsafe partial struct PhysicalDeviceVulkanMemoryModelFeaturesKHR : IStructuredType + [NativeName("AliasOf", "VkPhysicalDeviceVulkanMemoryModelFeatures")] + public unsafe partial struct PhysicalDeviceVulkanMemoryModelFeaturesKhr : IExtendsChain, IExtendsChain, IExtendsChain { - public PhysicalDeviceVulkanMemoryModelFeaturesKHR + public PhysicalDeviceVulkanMemoryModelFeaturesKhr ( StructureType? sType = StructureType.PhysicalDeviceVulkanMemoryModelFeatures, void* pNext = null, @@ -85,5 +86,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceVulkanMemoryModelFeatures; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR.gen.cs index f64e865782..046c011017 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR")] - public unsafe partial struct PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR : IStructuredType + public unsafe partial struct PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR ( @@ -96,5 +96,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT.gen.cs index b345d01d92..5474ac443c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT")] - public unsafe partial struct PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceYcbcr2Plane444FormatsFeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceYcbcrImageArraysFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceYcbcrImageArraysFeaturesEXT.gen.cs index bc3f002e48..d7fec7cff7 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceYcbcrImageArraysFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceYcbcrImageArraysFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceYcbcrImageArraysFeaturesEXT")] - public unsafe partial struct PhysicalDeviceYcbcrImageArraysFeaturesEXT : IStructuredType + public unsafe partial struct PhysicalDeviceYcbcrImageArraysFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceYcbcrImageArraysFeaturesEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceYcbcrImageArraysFeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR.gen.cs index 21262a53e8..281d1aa9b1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR")] - public unsafe partial struct PhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR : IStructuredType + public unsafe partial struct PhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCacheCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCacheCreateInfo.gen.cs index aba51570ce..cf70dba5eb 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCacheCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCacheCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineCacheCreateInfo")] - public unsafe partial struct PipelineCacheCreateInfo : IStructuredType + public unsafe partial struct PipelineCacheCreateInfo : IChainable { public PipelineCacheCreateInfo ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineCacheCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineColorBlendAdvancedStateCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineColorBlendAdvancedStateCreateInfoEXT.gen.cs index c285407f63..19849dad79 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineColorBlendAdvancedStateCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineColorBlendAdvancedStateCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineColorBlendAdvancedStateCreateInfoEXT")] - public unsafe partial struct PipelineColorBlendAdvancedStateCreateInfoEXT : IStructuredType + public unsafe partial struct PipelineColorBlendAdvancedStateCreateInfoEXT : IExtendsChain { public PipelineColorBlendAdvancedStateCreateInfoEXT ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineColorBlendAdvancedStateCreateInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineColorBlendStateCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineColorBlendStateCreateInfo.gen.cs index caadf66ea9..d8039a43f5 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineColorBlendStateCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineColorBlendStateCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineColorBlendStateCreateInfo")] - public unsafe partial struct PipelineColorBlendStateCreateInfo : IStructuredType + public unsafe partial struct PipelineColorBlendStateCreateInfo : IChainStart { public PipelineColorBlendStateCreateInfo ( @@ -112,5 +112,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineColorBlendStateCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref PipelineColorBlendStateCreateInfo Chain( + out PipelineColorBlendStateCreateInfo capture) + { + capture = new PipelineColorBlendStateCreateInfo(StructureType.PipelineColorBlendStateCreateInfo); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineColorWriteCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineColorWriteCreateInfoEXT.gen.cs index 4f279eff88..633a6b1707 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineColorWriteCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineColorWriteCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineColorWriteCreateInfoEXT")] - public unsafe partial struct PipelineColorWriteCreateInfoEXT : IStructuredType + public unsafe partial struct PipelineColorWriteCreateInfoEXT : IExtendsChain { public PipelineColorWriteCreateInfoEXT ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineColorWriteCreateInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCompilerControlCreateInfoAMD.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCompilerControlCreateInfoAMD.gen.cs index 5ad9ef19c5..bd1d429943 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCompilerControlCreateInfoAMD.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCompilerControlCreateInfoAMD.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineCompilerControlCreateInfoAMD")] - public unsafe partial struct PipelineCompilerControlCreateInfoAMD : IStructuredType + public unsafe partial struct PipelineCompilerControlCreateInfoAMD : IExtendsChain, IExtendsChain { public PipelineCompilerControlCreateInfoAMD ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineCompilerControlCreateInfoAmd; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCoverageModulationStateCreateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCoverageModulationStateCreateInfoNV.gen.cs index 95b89a34bc..4461dd7572 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCoverageModulationStateCreateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCoverageModulationStateCreateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineCoverageModulationStateCreateInfoNV")] - public unsafe partial struct PipelineCoverageModulationStateCreateInfoNV : IStructuredType + public unsafe partial struct PipelineCoverageModulationStateCreateInfoNV : IExtendsChain { public PipelineCoverageModulationStateCreateInfoNV ( @@ -107,5 +107,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineCoverageModulationStateCreateInfoNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCoverageReductionStateCreateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCoverageReductionStateCreateInfoNV.gen.cs index 0d97c2acda..fde670ed19 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCoverageReductionStateCreateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCoverageReductionStateCreateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineCoverageReductionStateCreateInfoNV")] - public unsafe partial struct PipelineCoverageReductionStateCreateInfoNV : IStructuredType + public unsafe partial struct PipelineCoverageReductionStateCreateInfoNV : IExtendsChain { public PipelineCoverageReductionStateCreateInfoNV ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineCoverageReductionStateCreateInfoNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCoverageToColorStateCreateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCoverageToColorStateCreateInfoNV.gen.cs index 542e3689d2..0c80462eaa 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCoverageToColorStateCreateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCoverageToColorStateCreateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineCoverageToColorStateCreateInfoNV")] - public unsafe partial struct PipelineCoverageToColorStateCreateInfoNV : IStructuredType + public unsafe partial struct PipelineCoverageToColorStateCreateInfoNV : IExtendsChain { public PipelineCoverageToColorStateCreateInfoNV ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineCoverageToColorStateCreateInfoNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCreationFeedbackCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCreationFeedbackCreateInfoEXT.gen.cs index 7c60c58d3b..f3e5e05e89 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCreationFeedbackCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineCreationFeedbackCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineCreationFeedbackCreateInfoEXT")] - public unsafe partial struct PipelineCreationFeedbackCreateInfoEXT : IStructuredType + public unsafe partial struct PipelineCreationFeedbackCreateInfoEXT : IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain { public PipelineCreationFeedbackCreateInfoEXT ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineCreationFeedbackCreateInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineDepthStencilStateCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineDepthStencilStateCreateInfo.gen.cs index 74a55c6db7..95039f1b78 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineDepthStencilStateCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineDepthStencilStateCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineDepthStencilStateCreateInfo")] - public unsafe partial struct PipelineDepthStencilStateCreateInfo : IStructuredType + public unsafe partial struct PipelineDepthStencilStateCreateInfo : IChainable { public PipelineDepthStencilStateCreateInfo ( @@ -162,5 +162,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineDepthStencilStateCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineDiscardRectangleStateCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineDiscardRectangleStateCreateInfoEXT.gen.cs index d81de4abfb..0470e8da91 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineDiscardRectangleStateCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineDiscardRectangleStateCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineDiscardRectangleStateCreateInfoEXT")] - public unsafe partial struct PipelineDiscardRectangleStateCreateInfoEXT : IStructuredType + public unsafe partial struct PipelineDiscardRectangleStateCreateInfoEXT : IExtendsChain { public PipelineDiscardRectangleStateCreateInfoEXT ( @@ -96,5 +96,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineDiscardRectangleStateCreateInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineDynamicStateCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineDynamicStateCreateInfo.gen.cs index 6149d255fe..ae2ae4a97f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineDynamicStateCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineDynamicStateCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineDynamicStateCreateInfo")] - public unsafe partial struct PipelineDynamicStateCreateInfo : IStructuredType + public unsafe partial struct PipelineDynamicStateCreateInfo : IChainable { public PipelineDynamicStateCreateInfo ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineDynamicStateCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineExecutableInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineExecutableInfoKHR.gen.cs index 419ac64ebd..46e41aa3cd 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineExecutableInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineExecutableInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineExecutableInfoKHR")] - public unsafe partial struct PipelineExecutableInfoKHR : IStructuredType + public unsafe partial struct PipelineExecutableInfoKHR : IChainable { public PipelineExecutableInfoKHR ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineExecutableInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineExecutableInternalRepresentationKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineExecutableInternalRepresentationKHR.gen.cs index a01b53bf2c..84dc92bf77 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineExecutableInternalRepresentationKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineExecutableInternalRepresentationKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineExecutableInternalRepresentationKHR")] - public unsafe partial struct PipelineExecutableInternalRepresentationKHR : IStructuredType + public unsafe partial struct PipelineExecutableInternalRepresentationKHR : IChainable { public PipelineExecutableInternalRepresentationKHR ( @@ -95,5 +95,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineExecutableInternalRepresentationKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineExecutablePropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineExecutablePropertiesKHR.gen.cs index 687e0643a7..5fcb638ab9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineExecutablePropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineExecutablePropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineExecutablePropertiesKHR")] - public unsafe partial struct PipelineExecutablePropertiesKHR : IStructuredType + public unsafe partial struct PipelineExecutablePropertiesKHR : IChainable { public PipelineExecutablePropertiesKHR ( @@ -84,5 +84,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineExecutablePropertiesKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineExecutableStatisticKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineExecutableStatisticKHR.gen.cs index 81d9679a7c..0987401239 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineExecutableStatisticKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineExecutableStatisticKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineExecutableStatisticKHR")] - public unsafe partial struct PipelineExecutableStatisticKHR : IStructuredType + public unsafe partial struct PipelineExecutableStatisticKHR : IChainable { public PipelineExecutableStatisticKHR ( @@ -84,5 +84,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineExecutableStatisticKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineFragmentShadingRateEnumStateCreateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineFragmentShadingRateEnumStateCreateInfoNV.gen.cs index 1265a82cff..4227a7392e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineFragmentShadingRateEnumStateCreateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineFragmentShadingRateEnumStateCreateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineFragmentShadingRateEnumStateCreateInfoNV")] - public unsafe partial struct PipelineFragmentShadingRateEnumStateCreateInfoNV : IStructuredType + public unsafe partial struct PipelineFragmentShadingRateEnumStateCreateInfoNV : IExtendsChain { public PipelineFragmentShadingRateEnumStateCreateInfoNV ( @@ -106,5 +106,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineFragmentShadingRateEnumStateCreateInfoNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineFragmentShadingRateStateCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineFragmentShadingRateStateCreateInfoKHR.gen.cs index 9ec62db19e..968cdce4cb 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineFragmentShadingRateStateCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineFragmentShadingRateStateCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineFragmentShadingRateStateCreateInfoKHR")] - public unsafe partial struct PipelineFragmentShadingRateStateCreateInfoKHR : IStructuredType + public unsafe partial struct PipelineFragmentShadingRateStateCreateInfoKHR : IExtendsChain { public PipelineFragmentShadingRateStateCreateInfoKHR ( @@ -95,5 +95,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineFragmentShadingRateStateCreateInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineInfoKHR.gen.cs index 351cec483f..9d708331f3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineInfoKHR")] - public unsafe partial struct PipelineInfoKHR : IStructuredType + public unsafe partial struct PipelineInfoKHR : IChainable { public PipelineInfoKHR ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineInputAssemblyStateCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineInputAssemblyStateCreateInfo.gen.cs index 2887bbbc87..4fe7211360 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineInputAssemblyStateCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineInputAssemblyStateCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineInputAssemblyStateCreateInfo")] - public unsafe partial struct PipelineInputAssemblyStateCreateInfo : IStructuredType + public unsafe partial struct PipelineInputAssemblyStateCreateInfo : IChainable { public PipelineInputAssemblyStateCreateInfo ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineInputAssemblyStateCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineLayoutCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineLayoutCreateInfo.gen.cs index 69a0bef922..6a8a86daa7 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineLayoutCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineLayoutCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineLayoutCreateInfo")] - public unsafe partial struct PipelineLayoutCreateInfo : IStructuredType + public unsafe partial struct PipelineLayoutCreateInfo : IChainable { public PipelineLayoutCreateInfo ( @@ -107,5 +107,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineLayoutCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineLibraryCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineLibraryCreateInfoKHR.gen.cs index 9cba2709a8..19e7f22166 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineLibraryCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineLibraryCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineLibraryCreateInfoKHR")] - public unsafe partial struct PipelineLibraryCreateInfoKHR : IStructuredType + public unsafe partial struct PipelineLibraryCreateInfoKHR : IChainable { public PipelineLibraryCreateInfoKHR ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineLibraryCreateInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineMultisampleStateCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineMultisampleStateCreateInfo.gen.cs index 030547d18c..e9e6d22150 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineMultisampleStateCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineMultisampleStateCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineMultisampleStateCreateInfo")] - public unsafe partial struct PipelineMultisampleStateCreateInfo : IStructuredType + public unsafe partial struct PipelineMultisampleStateCreateInfo : IChainStart { public PipelineMultisampleStateCreateInfo ( @@ -129,5 +129,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineMultisampleStateCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref PipelineMultisampleStateCreateInfo Chain( + out PipelineMultisampleStateCreateInfo capture) + { + capture = new PipelineMultisampleStateCreateInfo(StructureType.PipelineMultisampleStateCreateInfo); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationConservativeStateCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationConservativeStateCreateInfoEXT.gen.cs index 31344e0692..7497a046c6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationConservativeStateCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationConservativeStateCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineRasterizationConservativeStateCreateInfoEXT")] - public unsafe partial struct PipelineRasterizationConservativeStateCreateInfoEXT : IStructuredType + public unsafe partial struct PipelineRasterizationConservativeStateCreateInfoEXT : IExtendsChain { public PipelineRasterizationConservativeStateCreateInfoEXT ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineRasterizationConservativeStateCreateInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationDepthClipStateCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationDepthClipStateCreateInfoEXT.gen.cs index a6b988d61c..1ba6ecfa79 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationDepthClipStateCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationDepthClipStateCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineRasterizationDepthClipStateCreateInfoEXT")] - public unsafe partial struct PipelineRasterizationDepthClipStateCreateInfoEXT : IStructuredType + public unsafe partial struct PipelineRasterizationDepthClipStateCreateInfoEXT : IExtendsChain { public PipelineRasterizationDepthClipStateCreateInfoEXT ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineRasterizationDepthClipStateCreateInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationLineStateCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationLineStateCreateInfoEXT.gen.cs index fb1b64f0f8..1b62472ad5 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationLineStateCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationLineStateCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineRasterizationLineStateCreateInfoEXT")] - public unsafe partial struct PipelineRasterizationLineStateCreateInfoEXT : IStructuredType + public unsafe partial struct PipelineRasterizationLineStateCreateInfoEXT : IExtendsChain { public PipelineRasterizationLineStateCreateInfoEXT ( @@ -96,5 +96,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineRasterizationLineStateCreateInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationProvokingVertexStateCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationProvokingVertexStateCreateInfoEXT.gen.cs index 706283907d..c904522527 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationProvokingVertexStateCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationProvokingVertexStateCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineRasterizationProvokingVertexStateCreateInfoEXT")] - public unsafe partial struct PipelineRasterizationProvokingVertexStateCreateInfoEXT : IStructuredType + public unsafe partial struct PipelineRasterizationProvokingVertexStateCreateInfoEXT : IExtendsChain { public PipelineRasterizationProvokingVertexStateCreateInfoEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineRasterizationProvokingVertexStateCreateInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationStateCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationStateCreateInfo.gen.cs index a560caeadd..37d62c69ed 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationStateCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationStateCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineRasterizationStateCreateInfo")] - public unsafe partial struct PipelineRasterizationStateCreateInfo : IStructuredType + public unsafe partial struct PipelineRasterizationStateCreateInfo : IChainStart { public PipelineRasterizationStateCreateInfo ( @@ -173,5 +173,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineRasterizationStateCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref PipelineRasterizationStateCreateInfo Chain( + out PipelineRasterizationStateCreateInfo capture) + { + capture = new PipelineRasterizationStateCreateInfo(StructureType.PipelineRasterizationStateCreateInfo); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationStateRasterizationOrderAMD.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationStateRasterizationOrderAMD.gen.cs index b7fe0f655e..f47d102509 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationStateRasterizationOrderAMD.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationStateRasterizationOrderAMD.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineRasterizationStateRasterizationOrderAMD")] - public unsafe partial struct PipelineRasterizationStateRasterizationOrderAMD : IStructuredType + public unsafe partial struct PipelineRasterizationStateRasterizationOrderAMD : IExtendsChain { public PipelineRasterizationStateRasterizationOrderAMD ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineRasterizationStateRasterizationOrderAmd; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationStateStreamCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationStateStreamCreateInfoEXT.gen.cs index 097dde81f1..d8e5b04e0a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationStateStreamCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRasterizationStateStreamCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineRasterizationStateStreamCreateInfoEXT")] - public unsafe partial struct PipelineRasterizationStateStreamCreateInfoEXT : IStructuredType + public unsafe partial struct PipelineRasterizationStateStreamCreateInfoEXT : IExtendsChain { public PipelineRasterizationStateStreamCreateInfoEXT ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineRasterizationStateStreamCreateInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRenderingCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRenderingCreateInfoKHR.gen.cs index c6b75bf6af..5669cee355 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRenderingCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRenderingCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineRenderingCreateInfoKHR")] - public unsafe partial struct PipelineRenderingCreateInfoKHR : IStructuredType + public unsafe partial struct PipelineRenderingCreateInfoKHR : IExtendsChain { public PipelineRenderingCreateInfoKHR ( @@ -107,5 +107,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineRenderingCreateInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRepresentativeFragmentTestStateCreateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRepresentativeFragmentTestStateCreateInfoNV.gen.cs index 930fd75826..199b275929 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRepresentativeFragmentTestStateCreateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineRepresentativeFragmentTestStateCreateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineRepresentativeFragmentTestStateCreateInfoNV")] - public unsafe partial struct PipelineRepresentativeFragmentTestStateCreateInfoNV : IStructuredType + public unsafe partial struct PipelineRepresentativeFragmentTestStateCreateInfoNV : IExtendsChain { public PipelineRepresentativeFragmentTestStateCreateInfoNV ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineRepresentativeFragmentTestStateCreateInfoNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineSampleLocationsStateCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineSampleLocationsStateCreateInfoEXT.gen.cs index 43634444c8..149bc36ce6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineSampleLocationsStateCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineSampleLocationsStateCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineSampleLocationsStateCreateInfoEXT")] - public unsafe partial struct PipelineSampleLocationsStateCreateInfoEXT : IStructuredType + public unsafe partial struct PipelineSampleLocationsStateCreateInfoEXT : IExtendsChain { public PipelineSampleLocationsStateCreateInfoEXT ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineSampleLocationsStateCreateInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineShaderStageCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineShaderStageCreateInfo.gen.cs index 746203f92c..8501ccddd6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineShaderStageCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineShaderStageCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineShaderStageCreateInfo")] - public unsafe partial struct PipelineShaderStageCreateInfo : IStructuredType + public unsafe partial struct PipelineShaderStageCreateInfo : IChainStart { public PipelineShaderStageCreateInfo ( @@ -107,5 +107,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineShaderStageCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref PipelineShaderStageCreateInfo Chain( + out PipelineShaderStageCreateInfo capture) + { + capture = new PipelineShaderStageCreateInfo(StructureType.PipelineShaderStageCreateInfo); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineShaderStageRequiredSubgroupSizeCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineShaderStageRequiredSubgroupSizeCreateInfoEXT.gen.cs index 3c5101680a..3baa87932a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineShaderStageRequiredSubgroupSizeCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineShaderStageRequiredSubgroupSizeCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineShaderStageRequiredSubgroupSizeCreateInfoEXT")] - public unsafe partial struct PipelineShaderStageRequiredSubgroupSizeCreateInfoEXT : IStructuredType + public unsafe partial struct PipelineShaderStageRequiredSubgroupSizeCreateInfoEXT : IExtendsChain { public PipelineShaderStageRequiredSubgroupSizeCreateInfoEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineShaderStageRequiredSubgroupSizeCreateInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineTessellationDomainOriginStateCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineTessellationDomainOriginStateCreateInfo.gen.cs index 63e9f30846..6e87548afa 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineTessellationDomainOriginStateCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineTessellationDomainOriginStateCreateInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineTessellationDomainOriginStateCreateInfo")] - public unsafe partial struct PipelineTessellationDomainOriginStateCreateInfo : IStructuredType + [NativeName("Aliases", "VkPipelineTessellationDomainOriginStateCreateInfoKHR")] + public unsafe partial struct PipelineTessellationDomainOriginStateCreateInfo : IExtendsChain { public PipelineTessellationDomainOriginStateCreateInfo ( @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineTessellationDomainOriginStateCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineTessellationDomainOriginStateCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineTessellationDomainOriginStateCreateInfoKHR.gen.cs index 720a774a50..2e18f3f691 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineTessellationDomainOriginStateCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineTessellationDomainOriginStateCreateInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineTessellationDomainOriginStateCreateInfoKHR")] - public unsafe partial struct PipelineTessellationDomainOriginStateCreateInfoKHR : IStructuredType + [NativeName("AliasOf", "VkPipelineTessellationDomainOriginStateCreateInfo")] + public unsafe partial struct PipelineTessellationDomainOriginStateCreateInfoKhr : IExtendsChain { - public PipelineTessellationDomainOriginStateCreateInfoKHR + public PipelineTessellationDomainOriginStateCreateInfoKhr ( StructureType? sType = StructureType.PipelineTessellationDomainOriginStateCreateInfo, void* pNext = null, @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineTessellationDomainOriginStateCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineTessellationStateCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineTessellationStateCreateInfo.gen.cs index 89aa43c8df..a2a3127ea8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineTessellationStateCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineTessellationStateCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineTessellationStateCreateInfo")] - public unsafe partial struct PipelineTessellationStateCreateInfo : IStructuredType + public unsafe partial struct PipelineTessellationStateCreateInfo : IChainStart { public PipelineTessellationStateCreateInfo ( @@ -74,5 +74,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineTessellationStateCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref PipelineTessellationStateCreateInfo Chain( + out PipelineTessellationStateCreateInfo capture) + { + capture = new PipelineTessellationStateCreateInfo(StructureType.PipelineTessellationStateCreateInfo); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineVertexInputDivisorStateCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineVertexInputDivisorStateCreateInfoEXT.gen.cs index 24d6035237..b9ea7b4fc0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineVertexInputDivisorStateCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineVertexInputDivisorStateCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineVertexInputDivisorStateCreateInfoEXT")] - public unsafe partial struct PipelineVertexInputDivisorStateCreateInfoEXT : IStructuredType + public unsafe partial struct PipelineVertexInputDivisorStateCreateInfoEXT : IExtendsChain { public PipelineVertexInputDivisorStateCreateInfoEXT ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineVertexInputDivisorStateCreateInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineVertexInputStateCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineVertexInputStateCreateInfo.gen.cs index 781f4c47ef..ad75134542 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineVertexInputStateCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineVertexInputStateCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineVertexInputStateCreateInfo")] - public unsafe partial struct PipelineVertexInputStateCreateInfo : IStructuredType + public unsafe partial struct PipelineVertexInputStateCreateInfo : IChainStart { public PipelineVertexInputStateCreateInfo ( @@ -107,5 +107,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineVertexInputStateCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref PipelineVertexInputStateCreateInfo Chain( + out PipelineVertexInputStateCreateInfo capture) + { + capture = new PipelineVertexInputStateCreateInfo(StructureType.PipelineVertexInputStateCreateInfo); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportCoarseSampleOrderStateCreateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportCoarseSampleOrderStateCreateInfoNV.gen.cs index 6c0e845732..f7191aa68e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportCoarseSampleOrderStateCreateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportCoarseSampleOrderStateCreateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineViewportCoarseSampleOrderStateCreateInfoNV")] - public unsafe partial struct PipelineViewportCoarseSampleOrderStateCreateInfoNV : IStructuredType + public unsafe partial struct PipelineViewportCoarseSampleOrderStateCreateInfoNV : IExtendsChain { public PipelineViewportCoarseSampleOrderStateCreateInfoNV ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineViewportCoarseSampleOrderStateCreateInfoNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportExclusiveScissorStateCreateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportExclusiveScissorStateCreateInfoNV.gen.cs index f12a828228..6d64affc94 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportExclusiveScissorStateCreateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportExclusiveScissorStateCreateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineViewportExclusiveScissorStateCreateInfoNV")] - public unsafe partial struct PipelineViewportExclusiveScissorStateCreateInfoNV : IStructuredType + public unsafe partial struct PipelineViewportExclusiveScissorStateCreateInfoNV : IExtendsChain { public PipelineViewportExclusiveScissorStateCreateInfoNV ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineViewportExclusiveScissorStateCreateInfoNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportShadingRateImageStateCreateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportShadingRateImageStateCreateInfoNV.gen.cs index 903267342a..a335365e92 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportShadingRateImageStateCreateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportShadingRateImageStateCreateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineViewportShadingRateImageStateCreateInfoNV")] - public unsafe partial struct PipelineViewportShadingRateImageStateCreateInfoNV : IStructuredType + public unsafe partial struct PipelineViewportShadingRateImageStateCreateInfoNV : IExtendsChain { public PipelineViewportShadingRateImageStateCreateInfoNV ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineViewportShadingRateImageStateCreateInfoNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportStateCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportStateCreateInfo.gen.cs index b6a02b8f9b..97de0b0397 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportStateCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportStateCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineViewportStateCreateInfo")] - public unsafe partial struct PipelineViewportStateCreateInfo : IStructuredType + public unsafe partial struct PipelineViewportStateCreateInfo : IChainStart { public PipelineViewportStateCreateInfo ( @@ -107,5 +107,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineViewportStateCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref PipelineViewportStateCreateInfo Chain( + out PipelineViewportStateCreateInfo capture) + { + capture = new PipelineViewportStateCreateInfo(StructureType.PipelineViewportStateCreateInfo); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportSwizzleStateCreateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportSwizzleStateCreateInfoNV.gen.cs index b0c5590345..42744374b0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportSwizzleStateCreateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportSwizzleStateCreateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineViewportSwizzleStateCreateInfoNV")] - public unsafe partial struct PipelineViewportSwizzleStateCreateInfoNV : IStructuredType + public unsafe partial struct PipelineViewportSwizzleStateCreateInfoNV : IExtendsChain { public PipelineViewportSwizzleStateCreateInfoNV ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineViewportSwizzleStateCreateInfoNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportWScalingStateCreateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportWScalingStateCreateInfoNV.gen.cs index c2ac6fbf62..7d24c66f2e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportWScalingStateCreateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineViewportWScalingStateCreateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineViewportWScalingStateCreateInfoNV")] - public unsafe partial struct PipelineViewportWScalingStateCreateInfoNV : IStructuredType + public unsafe partial struct PipelineViewportWScalingStateCreateInfoNV : IExtendsChain { public PipelineViewportWScalingStateCreateInfoNV ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PipelineViewportWScalingStateCreateInfoNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PresentFrameTokenGGP.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PresentFrameTokenGGP.gen.cs index abd02ccf93..13b77eccf6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PresentFrameTokenGGP.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PresentFrameTokenGGP.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPresentFrameTokenGGP")] - public unsafe partial struct PresentFrameTokenGGP : IStructuredType + public unsafe partial struct PresentFrameTokenGGP : IExtendsChain { public PresentFrameTokenGGP ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PresentFrameTokenGgp; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PresentIdKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PresentIdKHR.gen.cs index f328d616a3..a4c86084b6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PresentIdKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PresentIdKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPresentIdKHR")] - public unsafe partial struct PresentIdKHR : IStructuredType + public unsafe partial struct PresentIdKHR : IExtendsChain { public PresentIdKHR ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PresentIDKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PresentInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PresentInfoKHR.gen.cs index 196259a188..c6a0e3aacb 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PresentInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PresentInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPresentInfoKHR")] - public unsafe partial struct PresentInfoKHR : IStructuredType + public unsafe partial struct PresentInfoKHR : IChainStart { public PresentInfoKHR ( @@ -118,5 +118,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PresentInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref PresentInfoKHR Chain( + out PresentInfoKHR capture) + { + capture = new PresentInfoKHR(StructureType.PresentInfoKhr); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PresentRegionsKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PresentRegionsKHR.gen.cs index a1a21578ff..0bd4236c61 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PresentRegionsKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PresentRegionsKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPresentRegionsKHR")] - public unsafe partial struct PresentRegionsKHR : IStructuredType + public unsafe partial struct PresentRegionsKHR : IExtendsChain { public PresentRegionsKHR ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PresentRegionsKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PresentTimesInfoGOOGLE.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PresentTimesInfoGOOGLE.gen.cs index 2734781e90..cf6943c85a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PresentTimesInfoGOOGLE.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PresentTimesInfoGOOGLE.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPresentTimesInfoGOOGLE")] - public unsafe partial struct PresentTimesInfoGOOGLE : IStructuredType + public unsafe partial struct PresentTimesInfoGOOGLE : IExtendsChain { public PresentTimesInfoGOOGLE ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PresentTimesInfoGoogle; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PrivateDataSlotCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PrivateDataSlotCreateInfoEXT.gen.cs index 991c2904d9..3402f80d83 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PrivateDataSlotCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PrivateDataSlotCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPrivateDataSlotCreateInfoEXT")] - public unsafe partial struct PrivateDataSlotCreateInfoEXT : IStructuredType + public unsafe partial struct PrivateDataSlotCreateInfoEXT : IChainable { public PrivateDataSlotCreateInfoEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.PrivateDataSlotCreateInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ProtectedSubmitInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ProtectedSubmitInfo.gen.cs index a809f13c10..d998011345 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ProtectedSubmitInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ProtectedSubmitInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkProtectedSubmitInfo")] - public unsafe partial struct ProtectedSubmitInfo : IStructuredType + public unsafe partial struct ProtectedSubmitInfo : IExtendsChain { public ProtectedSubmitInfo ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ProtectedSubmitInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/QueryPoolCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/QueryPoolCreateInfo.gen.cs index cf90b5fa32..c3442a5f22 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/QueryPoolCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/QueryPoolCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkQueryPoolCreateInfo")] - public unsafe partial struct QueryPoolCreateInfo : IStructuredType + public unsafe partial struct QueryPoolCreateInfo : IChainStart { public QueryPoolCreateInfo ( @@ -96,5 +96,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.QueryPoolCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref QueryPoolCreateInfo Chain( + out QueryPoolCreateInfo capture) + { + capture = new QueryPoolCreateInfo(StructureType.QueryPoolCreateInfo); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/QueryPoolCreateInfoINTEL.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/QueryPoolCreateInfoINTEL.gen.cs index d6ece87c13..8920992b06 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/QueryPoolCreateInfoINTEL.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/QueryPoolCreateInfoINTEL.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkQueryPoolCreateInfoINTEL")] - public unsafe partial struct QueryPoolCreateInfoINTEL : IStructuredType + [NativeName("AliasOf", "VkQueryPoolPerformanceQueryCreateInfoINTEL")] + public unsafe partial struct QueryPoolCreateInfoIntel : IExtendsChain { - public QueryPoolCreateInfoINTEL + public QueryPoolCreateInfoIntel ( StructureType? sType = StructureType.QueryPoolPerformanceQueryCreateInfoIntel, void* pNext = null, @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.QueryPoolPerformanceQueryCreateInfoIntel; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/QueryPoolPerformanceCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/QueryPoolPerformanceCreateInfoKHR.gen.cs index 4cf8bd0833..46beaf8ce3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/QueryPoolPerformanceCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/QueryPoolPerformanceCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkQueryPoolPerformanceCreateInfoKHR")] - public unsafe partial struct QueryPoolPerformanceCreateInfoKHR : IStructuredType + public unsafe partial struct QueryPoolPerformanceCreateInfoKHR : IExtendsChain { public QueryPoolPerformanceCreateInfoKHR ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.QueryPoolPerformanceCreateInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/QueryPoolPerformanceQueryCreateInfoINTEL.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/QueryPoolPerformanceQueryCreateInfoINTEL.gen.cs index 55cac0b397..9f8357785f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/QueryPoolPerformanceQueryCreateInfoINTEL.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/QueryPoolPerformanceQueryCreateInfoINTEL.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkQueryPoolPerformanceQueryCreateInfoINTEL")] - public unsafe partial struct QueryPoolPerformanceQueryCreateInfoINTEL : IStructuredType + [NativeName("Aliases", "VkQueryPoolCreateInfoINTEL")] + public unsafe partial struct QueryPoolPerformanceQueryCreateInfoINTEL : IExtendsChain { public QueryPoolPerformanceQueryCreateInfoINTEL ( @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.QueryPoolPerformanceQueryCreateInfoIntel; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyCheckpointProperties2NV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyCheckpointProperties2NV.gen.cs index 9af3db33a6..476a3d9746 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyCheckpointProperties2NV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyCheckpointProperties2NV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkQueueFamilyCheckpointProperties2NV")] - public unsafe partial struct QueueFamilyCheckpointProperties2NV : IStructuredType + public unsafe partial struct QueueFamilyCheckpointProperties2NV : IExtendsChain, IExtendsChain { public QueueFamilyCheckpointProperties2NV ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.QueueFamilyCheckpointProperties2NV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyCheckpointPropertiesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyCheckpointPropertiesNV.gen.cs index 545c677c2e..d30dc19d29 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyCheckpointPropertiesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyCheckpointPropertiesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkQueueFamilyCheckpointPropertiesNV")] - public unsafe partial struct QueueFamilyCheckpointPropertiesNV : IStructuredType + public unsafe partial struct QueueFamilyCheckpointPropertiesNV : IExtendsChain, IExtendsChain { public QueueFamilyCheckpointPropertiesNV ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.QueueFamilyCheckpointPropertiesNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyGlobalPriorityPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyGlobalPriorityPropertiesEXT.gen.cs index 00acfd1cdb..bb689b0bf7 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyGlobalPriorityPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyGlobalPriorityPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkQueueFamilyGlobalPriorityPropertiesEXT")] - public unsafe partial struct QueueFamilyGlobalPriorityPropertiesEXT : IStructuredType + public unsafe partial struct QueueFamilyGlobalPriorityPropertiesEXT : IExtendsChain, IExtendsChain { public QueueFamilyGlobalPriorityPropertiesEXT ( @@ -109,5 +109,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.QueueFamilyGlobalPriorityPropertiesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyProperties2.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyProperties2.gen.cs index 687e43fd1f..6ae0677b72 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyProperties2.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyProperties2.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkQueueFamilyProperties2")] - public unsafe partial struct QueueFamilyProperties2 : IStructuredType + [NativeName("Aliases", "VkQueueFamilyProperties2KHR")] + public unsafe partial struct QueueFamilyProperties2 : IChainStart { public QueueFamilyProperties2 ( @@ -63,5 +64,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.QueueFamilyProperties2; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref QueueFamilyProperties2 Chain( + out QueueFamilyProperties2 capture) + { + capture = new QueueFamilyProperties2(StructureType.QueueFamilyProperties2); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyProperties2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyProperties2KHR.gen.cs index be53281009..ac4bb6b49b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyProperties2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyProperties2KHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkQueueFamilyProperties2KHR")] - public unsafe partial struct QueueFamilyProperties2KHR : IStructuredType + [NativeName("AliasOf", "VkQueueFamilyProperties2")] + public unsafe partial struct QueueFamilyProperties2Khr : IChainStart { - public QueueFamilyProperties2KHR + public QueueFamilyProperties2Khr ( StructureType? sType = StructureType.QueueFamilyProperties2, void* pNext = null, @@ -63,5 +64,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.QueueFamilyProperties2; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref QueueFamilyProperties2Khr Chain( + out QueueFamilyProperties2Khr capture) + { + capture = new QueueFamilyProperties2Khr(StructureType.QueueFamilyProperties2); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RayTracingPipelineCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RayTracingPipelineCreateInfoKHR.gen.cs index 7a7f415c9b..bcc22be889 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RayTracingPipelineCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RayTracingPipelineCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRayTracingPipelineCreateInfoKHR")] - public unsafe partial struct RayTracingPipelineCreateInfoKHR : IStructuredType + public unsafe partial struct RayTracingPipelineCreateInfoKHR : IChainStart { public RayTracingPipelineCreateInfoKHR ( @@ -184,5 +184,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.RayTracingPipelineCreateInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref RayTracingPipelineCreateInfoKHR Chain( + out RayTracingPipelineCreateInfoKHR capture) + { + capture = new RayTracingPipelineCreateInfoKHR(StructureType.RayTracingPipelineCreateInfoKhr); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RayTracingPipelineCreateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RayTracingPipelineCreateInfoNV.gen.cs index 1e133c8337..62fa65fe9d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RayTracingPipelineCreateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RayTracingPipelineCreateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRayTracingPipelineCreateInfoNV")] - public unsafe partial struct RayTracingPipelineCreateInfoNV : IStructuredType + public unsafe partial struct RayTracingPipelineCreateInfoNV : IChainStart { public RayTracingPipelineCreateInfoNV ( @@ -151,5 +151,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.RayTracingPipelineCreateInfoNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref RayTracingPipelineCreateInfoNV Chain( + out RayTracingPipelineCreateInfoNV capture) + { + capture = new RayTracingPipelineCreateInfoNV(StructureType.RayTracingPipelineCreateInfoNV); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RayTracingPipelineInterfaceCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RayTracingPipelineInterfaceCreateInfoKHR.gen.cs index 16ba17ea90..23149ea244 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RayTracingPipelineInterfaceCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RayTracingPipelineInterfaceCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRayTracingPipelineInterfaceCreateInfoKHR")] - public unsafe partial struct RayTracingPipelineInterfaceCreateInfoKHR : IStructuredType + public unsafe partial struct RayTracingPipelineInterfaceCreateInfoKHR : IChainable { public RayTracingPipelineInterfaceCreateInfoKHR ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.RayTracingPipelineInterfaceCreateInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RayTracingShaderGroupCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RayTracingShaderGroupCreateInfoKHR.gen.cs index 9d69a8d66d..b8c71d1089 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RayTracingShaderGroupCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RayTracingShaderGroupCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRayTracingShaderGroupCreateInfoKHR")] - public unsafe partial struct RayTracingShaderGroupCreateInfoKHR : IStructuredType + public unsafe partial struct RayTracingShaderGroupCreateInfoKHR : IChainable { public RayTracingShaderGroupCreateInfoKHR ( @@ -118,5 +118,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.RayTracingShaderGroupCreateInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RayTracingShaderGroupCreateInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RayTracingShaderGroupCreateInfoNV.gen.cs index 962f35f0ac..35338636a0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RayTracingShaderGroupCreateInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RayTracingShaderGroupCreateInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRayTracingShaderGroupCreateInfoNV")] - public unsafe partial struct RayTracingShaderGroupCreateInfoNV : IStructuredType + public unsafe partial struct RayTracingShaderGroupCreateInfoNV : IChainable { public RayTracingShaderGroupCreateInfoNV ( @@ -107,5 +107,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.RayTracingShaderGroupCreateInfoNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassAttachmentBeginInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassAttachmentBeginInfo.gen.cs index 4a88442de9..c5837f0319 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassAttachmentBeginInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassAttachmentBeginInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRenderPassAttachmentBeginInfo")] - public unsafe partial struct RenderPassAttachmentBeginInfo : IStructuredType + [NativeName("Aliases", "VkRenderPassAttachmentBeginInfoKHR")] + public unsafe partial struct RenderPassAttachmentBeginInfo : IExtendsChain { public RenderPassAttachmentBeginInfo ( @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.RenderPassAttachmentBeginInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassAttachmentBeginInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassAttachmentBeginInfoKHR.gen.cs index bd65ebaee1..553cc7011b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassAttachmentBeginInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassAttachmentBeginInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRenderPassAttachmentBeginInfoKHR")] - public unsafe partial struct RenderPassAttachmentBeginInfoKHR : IStructuredType + [NativeName("AliasOf", "VkRenderPassAttachmentBeginInfo")] + public unsafe partial struct RenderPassAttachmentBeginInfoKhr : IExtendsChain { - public RenderPassAttachmentBeginInfoKHR + public RenderPassAttachmentBeginInfoKhr ( StructureType? sType = StructureType.RenderPassAttachmentBeginInfo, void* pNext = null, @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.RenderPassAttachmentBeginInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassBeginInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassBeginInfo.gen.cs index c2804af7c0..d3dcf4fb46 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassBeginInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassBeginInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRenderPassBeginInfo")] - public unsafe partial struct RenderPassBeginInfo : IStructuredType + public unsafe partial struct RenderPassBeginInfo : IChainStart { public RenderPassBeginInfo ( @@ -107,5 +107,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.RenderPassBeginInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref RenderPassBeginInfo Chain( + out RenderPassBeginInfo capture) + { + capture = new RenderPassBeginInfo(StructureType.RenderPassBeginInfo); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassCreateInfo.gen.cs index 024b99563a..c75ea73c65 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRenderPassCreateInfo")] - public unsafe partial struct RenderPassCreateInfo : IStructuredType + public unsafe partial struct RenderPassCreateInfo : IChainStart { public RenderPassCreateInfo ( @@ -129,5 +129,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.RenderPassCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref RenderPassCreateInfo Chain( + out RenderPassCreateInfo capture) + { + capture = new RenderPassCreateInfo(StructureType.RenderPassCreateInfo); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassCreateInfo2.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassCreateInfo2.gen.cs index 36f7dda720..bf1273d232 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassCreateInfo2.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassCreateInfo2.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRenderPassCreateInfo2")] - public unsafe partial struct RenderPassCreateInfo2 : IStructuredType + [NativeName("Aliases", "VkRenderPassCreateInfo2KHR")] + public unsafe partial struct RenderPassCreateInfo2 : IChainStart { public RenderPassCreateInfo2 ( @@ -151,5 +152,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.RenderPassCreateInfo2; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref RenderPassCreateInfo2 Chain( + out RenderPassCreateInfo2 capture) + { + capture = new RenderPassCreateInfo2(StructureType.RenderPassCreateInfo2); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassCreateInfo2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassCreateInfo2KHR.gen.cs index 5824c9a535..81cf367888 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassCreateInfo2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassCreateInfo2KHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRenderPassCreateInfo2KHR")] - public unsafe partial struct RenderPassCreateInfo2KHR : IStructuredType + [NativeName("AliasOf", "VkRenderPassCreateInfo2")] + public unsafe partial struct RenderPassCreateInfo2Khr : IChainStart { - public RenderPassCreateInfo2KHR + public RenderPassCreateInfo2Khr ( StructureType? sType = StructureType.RenderPassCreateInfo2, void* pNext = null, @@ -151,5 +152,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.RenderPassCreateInfo2; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref RenderPassCreateInfo2Khr Chain( + out RenderPassCreateInfo2Khr capture) + { + capture = new RenderPassCreateInfo2Khr(StructureType.RenderPassCreateInfo2); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassFragmentDensityMapCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassFragmentDensityMapCreateInfoEXT.gen.cs index 6e5bf0d0bc..ba861e9757 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassFragmentDensityMapCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassFragmentDensityMapCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRenderPassFragmentDensityMapCreateInfoEXT")] - public unsafe partial struct RenderPassFragmentDensityMapCreateInfoEXT : IStructuredType + public unsafe partial struct RenderPassFragmentDensityMapCreateInfoEXT : IExtendsChain, IExtendsChain, IExtendsChain { public RenderPassFragmentDensityMapCreateInfoEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.RenderPassFragmentDensityMapCreateInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassInputAttachmentAspectCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassInputAttachmentAspectCreateInfo.gen.cs index 481b1ed341..f0d4fa6a6d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassInputAttachmentAspectCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassInputAttachmentAspectCreateInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRenderPassInputAttachmentAspectCreateInfo")] - public unsafe partial struct RenderPassInputAttachmentAspectCreateInfo : IStructuredType + [NativeName("Aliases", "VkRenderPassInputAttachmentAspectCreateInfoKHR")] + public unsafe partial struct RenderPassInputAttachmentAspectCreateInfo : IExtendsChain { public RenderPassInputAttachmentAspectCreateInfo ( @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.RenderPassInputAttachmentAspectCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassInputAttachmentAspectCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassInputAttachmentAspectCreateInfoKHR.gen.cs index 9b2094d128..4734e7dce4 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassInputAttachmentAspectCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassInputAttachmentAspectCreateInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRenderPassInputAttachmentAspectCreateInfoKHR")] - public unsafe partial struct RenderPassInputAttachmentAspectCreateInfoKHR : IStructuredType + [NativeName("AliasOf", "VkRenderPassInputAttachmentAspectCreateInfo")] + public unsafe partial struct RenderPassInputAttachmentAspectCreateInfoKhr : IExtendsChain { - public RenderPassInputAttachmentAspectCreateInfoKHR + public RenderPassInputAttachmentAspectCreateInfoKhr ( StructureType? sType = StructureType.RenderPassInputAttachmentAspectCreateInfo, void* pNext = null, @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.RenderPassInputAttachmentAspectCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassMultiviewCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassMultiviewCreateInfo.gen.cs index a7170b2f8b..75a893c782 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassMultiviewCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassMultiviewCreateInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRenderPassMultiviewCreateInfo")] - public unsafe partial struct RenderPassMultiviewCreateInfo : IStructuredType + [NativeName("Aliases", "VkRenderPassMultiviewCreateInfoKHR")] + public unsafe partial struct RenderPassMultiviewCreateInfo : IExtendsChain { public RenderPassMultiviewCreateInfo ( @@ -118,5 +119,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.RenderPassMultiviewCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassMultiviewCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassMultiviewCreateInfoKHR.gen.cs index 65f8e3b8c4..625949b857 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassMultiviewCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassMultiviewCreateInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRenderPassMultiviewCreateInfoKHR")] - public unsafe partial struct RenderPassMultiviewCreateInfoKHR : IStructuredType + [NativeName("AliasOf", "VkRenderPassMultiviewCreateInfo")] + public unsafe partial struct RenderPassMultiviewCreateInfoKhr : IExtendsChain { - public RenderPassMultiviewCreateInfoKHR + public RenderPassMultiviewCreateInfoKhr ( StructureType? sType = StructureType.RenderPassMultiviewCreateInfo, void* pNext = null, @@ -118,5 +119,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.RenderPassMultiviewCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassSampleLocationsBeginInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassSampleLocationsBeginInfoEXT.gen.cs index 1bb2557ad1..8a5b0b6ca0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassSampleLocationsBeginInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassSampleLocationsBeginInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRenderPassSampleLocationsBeginInfoEXT")] - public unsafe partial struct RenderPassSampleLocationsBeginInfoEXT : IStructuredType + public unsafe partial struct RenderPassSampleLocationsBeginInfoEXT : IExtendsChain { public RenderPassSampleLocationsBeginInfoEXT ( @@ -96,5 +96,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.RenderPassSampleLocationsBeginInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassTransformBeginInfoQCOM.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassTransformBeginInfoQCOM.gen.cs index ecaeaae533..15c9cd7864 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassTransformBeginInfoQCOM.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassTransformBeginInfoQCOM.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRenderPassTransformBeginInfoQCOM")] - public unsafe partial struct RenderPassTransformBeginInfoQCOM : IStructuredType + public unsafe partial struct RenderPassTransformBeginInfoQCOM : IExtendsChain { public RenderPassTransformBeginInfoQCOM ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.RenderPassTransformBeginInfoQCom; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderingAttachmentInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderingAttachmentInfoKHR.gen.cs index 9fd228a6ef..631442064f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderingAttachmentInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderingAttachmentInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRenderingAttachmentInfoKHR")] - public unsafe partial struct RenderingAttachmentInfoKHR : IStructuredType + public unsafe partial struct RenderingAttachmentInfoKHR : IChainable { public RenderingAttachmentInfoKHR ( @@ -140,5 +140,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.RenderingAttachmentInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderingFragmentDensityMapAttachmentInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderingFragmentDensityMapAttachmentInfoEXT.gen.cs index 4e21637154..8e87f0206e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderingFragmentDensityMapAttachmentInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderingFragmentDensityMapAttachmentInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRenderingFragmentDensityMapAttachmentInfoEXT")] - public unsafe partial struct RenderingFragmentDensityMapAttachmentInfoEXT : IStructuredType + public unsafe partial struct RenderingFragmentDensityMapAttachmentInfoEXT : IExtendsChain { public RenderingFragmentDensityMapAttachmentInfoEXT ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.RenderingFragmentDensityMapAttachmentInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderingFragmentShadingRateAttachmentInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderingFragmentShadingRateAttachmentInfoKHR.gen.cs index 3a89f7eb6b..feea5282b0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderingFragmentShadingRateAttachmentInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderingFragmentShadingRateAttachmentInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRenderingFragmentShadingRateAttachmentInfoKHR")] - public unsafe partial struct RenderingFragmentShadingRateAttachmentInfoKHR : IStructuredType + public unsafe partial struct RenderingFragmentShadingRateAttachmentInfoKHR : IExtendsChain { public RenderingFragmentShadingRateAttachmentInfoKHR ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.RenderingFragmentShadingRateAttachmentInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderingInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderingInfoKHR.gen.cs index 0ad44f3980..0bc5110b6d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderingInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderingInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRenderingInfoKHR")] - public unsafe partial struct RenderingInfoKHR : IStructuredType + public unsafe partial struct RenderingInfoKHR : IChainStart { public RenderingInfoKHR ( @@ -140,5 +140,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.RenderingInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref RenderingInfoKHR Chain( + out RenderingInfoKHR capture) + { + capture = new RenderingInfoKHR(StructureType.RenderingInfoKhr); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ResolveImageInfo2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ResolveImageInfo2KHR.gen.cs index eb265a442a..13d1e4fe36 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ResolveImageInfo2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ResolveImageInfo2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkResolveImageInfo2KHR")] - public unsafe partial struct ResolveImageInfo2KHR : IStructuredType + public unsafe partial struct ResolveImageInfo2KHR : IChainable { public ResolveImageInfo2KHR ( @@ -118,5 +118,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ResolveImageInfo2Khr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SampleLocationsInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SampleLocationsInfoEXT.gen.cs index c07066d726..e4c2213846 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SampleLocationsInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SampleLocationsInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSampleLocationsInfoEXT")] - public unsafe partial struct SampleLocationsInfoEXT : IStructuredType + public unsafe partial struct SampleLocationsInfoEXT : IExtendsChain, IExtendsChain { public SampleLocationsInfoEXT ( @@ -96,5 +96,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SampleLocationsInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerBorderColorComponentMappingCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerBorderColorComponentMappingCreateInfoEXT.gen.cs index 73547377b3..702e9fea44 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerBorderColorComponentMappingCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerBorderColorComponentMappingCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSamplerBorderColorComponentMappingCreateInfoEXT")] - public unsafe partial struct SamplerBorderColorComponentMappingCreateInfoEXT : IStructuredType + public unsafe partial struct SamplerBorderColorComponentMappingCreateInfoEXT : IExtendsChain { public SamplerBorderColorComponentMappingCreateInfoEXT ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SamplerBorderColorComponentMappingCreateInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerCreateInfo.gen.cs index 0eae090cd2..69b5f3e6d1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSamplerCreateInfo")] - public unsafe partial struct SamplerCreateInfo : IStructuredType + public unsafe partial struct SamplerCreateInfo : IChainStart { public SamplerCreateInfo ( @@ -228,5 +228,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SamplerCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref SamplerCreateInfo Chain( + out SamplerCreateInfo capture) + { + capture = new SamplerCreateInfo(StructureType.SamplerCreateInfo); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerCustomBorderColorCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerCustomBorderColorCreateInfoEXT.gen.cs index f324be7877..1b29dee989 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerCustomBorderColorCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerCustomBorderColorCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSamplerCustomBorderColorCreateInfoEXT")] - public unsafe partial struct SamplerCustomBorderColorCreateInfoEXT : IStructuredType + public unsafe partial struct SamplerCustomBorderColorCreateInfoEXT : IExtendsChain { public SamplerCustomBorderColorCreateInfoEXT ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SamplerCustomBorderColorCreateInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerReductionModeCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerReductionModeCreateInfo.gen.cs index bb25c01836..cd32c74188 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerReductionModeCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerReductionModeCreateInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSamplerReductionModeCreateInfo")] - public unsafe partial struct SamplerReductionModeCreateInfo : IStructuredType + [NativeName("Aliases", "VkSamplerReductionModeCreateInfoEXT")] + public unsafe partial struct SamplerReductionModeCreateInfo : IExtendsChain { public SamplerReductionModeCreateInfo ( @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SamplerReductionModeCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerReductionModeCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerReductionModeCreateInfoEXT.gen.cs index 81f71b7dfc..27fe793de7 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerReductionModeCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerReductionModeCreateInfoEXT.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSamplerReductionModeCreateInfoEXT")] - public unsafe partial struct SamplerReductionModeCreateInfoEXT : IStructuredType + [NativeName("AliasOf", "VkSamplerReductionModeCreateInfo")] + public unsafe partial struct SamplerReductionModeCreateInfoExt : IExtendsChain { - public SamplerReductionModeCreateInfoEXT + public SamplerReductionModeCreateInfoExt ( StructureType? sType = StructureType.SamplerReductionModeCreateInfo, void* pNext = null, @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SamplerReductionModeCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionCreateInfo.gen.cs index c5db31038d..5d96b4917b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionCreateInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSamplerYcbcrConversionCreateInfo")] - public unsafe partial struct SamplerYcbcrConversionCreateInfo : IStructuredType + [NativeName("Aliases", "VkSamplerYcbcrConversionCreateInfoKHR")] + public unsafe partial struct SamplerYcbcrConversionCreateInfo : IChainStart { public SamplerYcbcrConversionCreateInfo ( @@ -140,5 +141,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SamplerYcbcrConversionCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref SamplerYcbcrConversionCreateInfo Chain( + out SamplerYcbcrConversionCreateInfo capture) + { + capture = new SamplerYcbcrConversionCreateInfo(StructureType.SamplerYcbcrConversionCreateInfo); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionCreateInfoKHR.gen.cs index d8f2cbaa02..c7890e6625 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionCreateInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSamplerYcbcrConversionCreateInfoKHR")] - public unsafe partial struct SamplerYcbcrConversionCreateInfoKHR : IStructuredType + [NativeName("AliasOf", "VkSamplerYcbcrConversionCreateInfo")] + public unsafe partial struct SamplerYcbcrConversionCreateInfoKhr : IChainStart { - public SamplerYcbcrConversionCreateInfoKHR + public SamplerYcbcrConversionCreateInfoKhr ( StructureType? sType = StructureType.SamplerYcbcrConversionCreateInfo, void* pNext = null, @@ -140,5 +141,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SamplerYcbcrConversionCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref SamplerYcbcrConversionCreateInfoKhr Chain( + out SamplerYcbcrConversionCreateInfoKhr capture) + { + capture = new SamplerYcbcrConversionCreateInfoKhr(StructureType.SamplerYcbcrConversionCreateInfo); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionImageFormatProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionImageFormatProperties.gen.cs index 9fcbfc6d9c..9efa720c4b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionImageFormatProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionImageFormatProperties.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSamplerYcbcrConversionImageFormatProperties")] - public unsafe partial struct SamplerYcbcrConversionImageFormatProperties : IStructuredType + [NativeName("Aliases", "VkSamplerYcbcrConversionImageFormatPropertiesKHR")] + public unsafe partial struct SamplerYcbcrConversionImageFormatProperties : IExtendsChain, IExtendsChain { public SamplerYcbcrConversionImageFormatProperties ( @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SamplerYcbcrConversionImageFormatProperties; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionImageFormatPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionImageFormatPropertiesKHR.gen.cs index bc749be1aa..4f06423aba 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionImageFormatPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionImageFormatPropertiesKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSamplerYcbcrConversionImageFormatPropertiesKHR")] - public unsafe partial struct SamplerYcbcrConversionImageFormatPropertiesKHR : IStructuredType + [NativeName("AliasOf", "VkSamplerYcbcrConversionImageFormatProperties")] + public unsafe partial struct SamplerYcbcrConversionImageFormatPropertiesKhr : IExtendsChain, IExtendsChain { - public SamplerYcbcrConversionImageFormatPropertiesKHR + public SamplerYcbcrConversionImageFormatPropertiesKhr ( StructureType? sType = StructureType.SamplerYcbcrConversionImageFormatProperties, void* pNext = null, @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SamplerYcbcrConversionImageFormatProperties; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionInfo.gen.cs index 7906d71b59..b399096fd3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSamplerYcbcrConversionInfo")] - public unsafe partial struct SamplerYcbcrConversionInfo : IStructuredType + [NativeName("Aliases", "VkSamplerYcbcrConversionInfoKHR")] + public unsafe partial struct SamplerYcbcrConversionInfo : IExtendsChain, IExtendsChain { public SamplerYcbcrConversionInfo ( @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SamplerYcbcrConversionInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionInfoKHR.gen.cs index d84eed4fce..1ee0d1121b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSamplerYcbcrConversionInfoKHR")] - public unsafe partial struct SamplerYcbcrConversionInfoKHR : IStructuredType + [NativeName("AliasOf", "VkSamplerYcbcrConversionInfo")] + public unsafe partial struct SamplerYcbcrConversionInfoKhr : IExtendsChain, IExtendsChain { - public SamplerYcbcrConversionInfoKHR + public SamplerYcbcrConversionInfoKhr ( StructureType? sType = StructureType.SamplerYcbcrConversionInfo, void* pNext = null, @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SamplerYcbcrConversionInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ScreenSurfaceCreateInfoQNX.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ScreenSurfaceCreateInfoQNX.gen.cs index 97ef52448e..4ca8c7367a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ScreenSurfaceCreateInfoQNX.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ScreenSurfaceCreateInfoQNX.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkScreenSurfaceCreateInfoQNX")] - public unsafe partial struct ScreenSurfaceCreateInfoQNX : IStructuredType + public unsafe partial struct ScreenSurfaceCreateInfoQNX : IChainable { public ScreenSurfaceCreateInfoQNX ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ScreenSurfaceCreateInfoQnx; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreCreateInfo.gen.cs index 30feda27df..6101a5e932 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSemaphoreCreateInfo")] - public unsafe partial struct SemaphoreCreateInfo : IStructuredType + public unsafe partial struct SemaphoreCreateInfo : IChainStart { public SemaphoreCreateInfo ( @@ -63,5 +63,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SemaphoreCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref SemaphoreCreateInfo Chain( + out SemaphoreCreateInfo capture) + { + capture = new SemaphoreCreateInfo(StructureType.SemaphoreCreateInfo); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreGetFdInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreGetFdInfoKHR.gen.cs index 7700a2e65f..7957e55263 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreGetFdInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreGetFdInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSemaphoreGetFdInfoKHR")] - public unsafe partial struct SemaphoreGetFdInfoKHR : IStructuredType + public unsafe partial struct SemaphoreGetFdInfoKHR : IChainable { public SemaphoreGetFdInfoKHR ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SemaphoreGetFDInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreGetWin32HandleInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreGetWin32HandleInfoKHR.gen.cs index 8d46797d00..9de68ebf1b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreGetWin32HandleInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreGetWin32HandleInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSemaphoreGetWin32HandleInfoKHR")] - public unsafe partial struct SemaphoreGetWin32HandleInfoKHR : IStructuredType + public unsafe partial struct SemaphoreGetWin32HandleInfoKHR : IChainable { public SemaphoreGetWin32HandleInfoKHR ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SemaphoreGetWin32HandleInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreGetZirconHandleInfoFUCHSIA.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreGetZirconHandleInfoFUCHSIA.gen.cs index 3ca91bb142..14bcc1900c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreGetZirconHandleInfoFUCHSIA.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreGetZirconHandleInfoFUCHSIA.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSemaphoreGetZirconHandleInfoFUCHSIA")] - public unsafe partial struct SemaphoreGetZirconHandleInfoFUCHSIA : IStructuredType + public unsafe partial struct SemaphoreGetZirconHandleInfoFUCHSIA : IChainable { public SemaphoreGetZirconHandleInfoFUCHSIA ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SemaphoreGetZirconHandleInfoFuchsia; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreSignalInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreSignalInfo.gen.cs index 5171d288f9..2f3851bf61 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreSignalInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreSignalInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSemaphoreSignalInfo")] - public unsafe partial struct SemaphoreSignalInfo : IStructuredType + [NativeName("Aliases", "VkSemaphoreSignalInfoKHR")] + public unsafe partial struct SemaphoreSignalInfo : IChainable { public SemaphoreSignalInfo ( @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SemaphoreSignalInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreSignalInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreSignalInfoKHR.gen.cs index 8c52b3eb97..751820dce6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreSignalInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreSignalInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSemaphoreSignalInfoKHR")] - public unsafe partial struct SemaphoreSignalInfoKHR : IStructuredType + [NativeName("AliasOf", "VkSemaphoreSignalInfo")] + public unsafe partial struct SemaphoreSignalInfoKhr : IChainable { - public SemaphoreSignalInfoKHR + public SemaphoreSignalInfoKhr ( StructureType? sType = StructureType.SemaphoreSignalInfo, void* pNext = null, @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SemaphoreSignalInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreSubmitInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreSubmitInfoKHR.gen.cs index 95c966bb04..92877cacf3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreSubmitInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreSubmitInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSemaphoreSubmitInfoKHR")] - public unsafe partial struct SemaphoreSubmitInfoKHR : IStructuredType + public unsafe partial struct SemaphoreSubmitInfoKHR : IChainable { public SemaphoreSubmitInfoKHR ( @@ -96,5 +96,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SemaphoreSubmitInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreTypeCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreTypeCreateInfo.gen.cs index 707a447458..5d2d553202 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreTypeCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreTypeCreateInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSemaphoreTypeCreateInfo")] - public unsafe partial struct SemaphoreTypeCreateInfo : IStructuredType + [NativeName("Aliases", "VkSemaphoreTypeCreateInfoKHR")] + public unsafe partial struct SemaphoreTypeCreateInfo : IExtendsChain, IExtendsChain, IExtendsChain { public SemaphoreTypeCreateInfo ( @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SemaphoreTypeCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreTypeCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreTypeCreateInfoKHR.gen.cs index 973434156a..81d801b770 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreTypeCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreTypeCreateInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSemaphoreTypeCreateInfoKHR")] - public unsafe partial struct SemaphoreTypeCreateInfoKHR : IStructuredType + [NativeName("AliasOf", "VkSemaphoreTypeCreateInfo")] + public unsafe partial struct SemaphoreTypeCreateInfoKhr : IExtendsChain, IExtendsChain, IExtendsChain { - public SemaphoreTypeCreateInfoKHR + public SemaphoreTypeCreateInfoKhr ( StructureType? sType = StructureType.SemaphoreTypeCreateInfo, void* pNext = null, @@ -74,5 +75,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SemaphoreTypeCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreWaitInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreWaitInfo.gen.cs index 03053e78c2..cf861173f3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreWaitInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreWaitInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSemaphoreWaitInfo")] - public unsafe partial struct SemaphoreWaitInfo : IStructuredType + [NativeName("Aliases", "VkSemaphoreWaitInfoKHR")] + public unsafe partial struct SemaphoreWaitInfo : IChainable { public SemaphoreWaitInfo ( @@ -96,5 +97,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SemaphoreWaitInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreWaitInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreWaitInfoKHR.gen.cs index 2c3c1de190..9832fe5b4e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreWaitInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreWaitInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSemaphoreWaitInfoKHR")] - public unsafe partial struct SemaphoreWaitInfoKHR : IStructuredType + [NativeName("AliasOf", "VkSemaphoreWaitInfo")] + public unsafe partial struct SemaphoreWaitInfoKhr : IChainable { - public SemaphoreWaitInfoKHR + public SemaphoreWaitInfoKhr ( StructureType? sType = StructureType.SemaphoreWaitInfo, void* pNext = null, @@ -96,5 +97,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SemaphoreWaitInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ShaderModuleCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ShaderModuleCreateInfo.gen.cs index c7b304c5ae..b2b7ee4df8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ShaderModuleCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ShaderModuleCreateInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkShaderModuleCreateInfo")] - public unsafe partial struct ShaderModuleCreateInfo : IStructuredType + public unsafe partial struct ShaderModuleCreateInfo : IChainStart { public ShaderModuleCreateInfo ( @@ -85,5 +85,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ShaderModuleCreateInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref ShaderModuleCreateInfo Chain( + out ShaderModuleCreateInfo capture) + { + capture = new ShaderModuleCreateInfo(StructureType.ShaderModuleCreateInfo); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ShaderModuleValidationCacheCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ShaderModuleValidationCacheCreateInfoEXT.gen.cs index 9212cc9669..1ca2decfee 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ShaderModuleValidationCacheCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ShaderModuleValidationCacheCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkShaderModuleValidationCacheCreateInfoEXT")] - public unsafe partial struct ShaderModuleValidationCacheCreateInfoEXT : IStructuredType + public unsafe partial struct ShaderModuleValidationCacheCreateInfoEXT : IExtendsChain { public ShaderModuleValidationCacheCreateInfoEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ShaderModuleValidationCacheCreateInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SharedPresentSurfaceCapabilitiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SharedPresentSurfaceCapabilitiesKHR.gen.cs index 1a037ddef0..1b6ddf5ab1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SharedPresentSurfaceCapabilitiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SharedPresentSurfaceCapabilitiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSharedPresentSurfaceCapabilitiesKHR")] - public unsafe partial struct SharedPresentSurfaceCapabilitiesKHR : IStructuredType + public unsafe partial struct SharedPresentSurfaceCapabilitiesKHR : IExtendsChain { public SharedPresentSurfaceCapabilitiesKHR ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SharedPresentSurfaceCapabilitiesKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SparseImageFormatProperties2.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SparseImageFormatProperties2.gen.cs index 1bd6db37fe..3c159f5d53 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SparseImageFormatProperties2.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SparseImageFormatProperties2.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSparseImageFormatProperties2")] - public unsafe partial struct SparseImageFormatProperties2 : IStructuredType + [NativeName("Aliases", "VkSparseImageFormatProperties2KHR")] + public unsafe partial struct SparseImageFormatProperties2 : IChainable { public SparseImageFormatProperties2 ( @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SparseImageFormatProperties2; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SparseImageFormatProperties2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SparseImageFormatProperties2KHR.gen.cs index c7fbbcb27d..757a671e09 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SparseImageFormatProperties2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SparseImageFormatProperties2KHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSparseImageFormatProperties2KHR")] - public unsafe partial struct SparseImageFormatProperties2KHR : IStructuredType + [NativeName("AliasOf", "VkSparseImageFormatProperties2")] + public unsafe partial struct SparseImageFormatProperties2Khr : IChainable { - public SparseImageFormatProperties2KHR + public SparseImageFormatProperties2Khr ( StructureType? sType = StructureType.SparseImageFormatProperties2, void* pNext = null, @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SparseImageFormatProperties2; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SparseImageMemoryRequirements2.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SparseImageMemoryRequirements2.gen.cs index 3fc08b08bd..0df5a90d37 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SparseImageMemoryRequirements2.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SparseImageMemoryRequirements2.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSparseImageMemoryRequirements2")] - public unsafe partial struct SparseImageMemoryRequirements2 : IStructuredType + [NativeName("Aliases", "VkSparseImageMemoryRequirements2KHR")] + public unsafe partial struct SparseImageMemoryRequirements2 : IChainable { public SparseImageMemoryRequirements2 ( @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SparseImageMemoryRequirements2; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SparseImageMemoryRequirements2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SparseImageMemoryRequirements2KHR.gen.cs index 3a89d2aae1..416d3ba76d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SparseImageMemoryRequirements2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SparseImageMemoryRequirements2KHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSparseImageMemoryRequirements2KHR")] - public unsafe partial struct SparseImageMemoryRequirements2KHR : IStructuredType + [NativeName("AliasOf", "VkSparseImageMemoryRequirements2")] + public unsafe partial struct SparseImageMemoryRequirements2Khr : IChainable { - public SparseImageMemoryRequirements2KHR + public SparseImageMemoryRequirements2Khr ( StructureType? sType = StructureType.SparseImageMemoryRequirements2, void* pNext = null, @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SparseImageMemoryRequirements2; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/StreamDescriptorSurfaceCreateInfoGGP.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/StreamDescriptorSurfaceCreateInfoGGP.gen.cs index 8a2713f6e3..e8cfaacb16 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/StreamDescriptorSurfaceCreateInfoGGP.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/StreamDescriptorSurfaceCreateInfoGGP.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkStreamDescriptorSurfaceCreateInfoGGP")] - public unsafe partial struct StreamDescriptorSurfaceCreateInfoGGP : IStructuredType + public unsafe partial struct StreamDescriptorSurfaceCreateInfoGGP : IChainable { public StreamDescriptorSurfaceCreateInfoGGP ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.StreamDescriptorSurfaceCreateInfoGgp; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SubmitInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SubmitInfo.gen.cs index 68e488879e..cf6014436c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SubmitInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SubmitInfo.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSubmitInfo")] - public unsafe partial struct SubmitInfo : IStructuredType + public unsafe partial struct SubmitInfo : IChainStart { public SubmitInfo ( @@ -129,5 +129,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SubmitInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref SubmitInfo Chain( + out SubmitInfo capture) + { + capture = new SubmitInfo(StructureType.SubmitInfo); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SubmitInfo2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SubmitInfo2KHR.gen.cs index 71b32b0df1..830554611d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SubmitInfo2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SubmitInfo2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSubmitInfo2KHR")] - public unsafe partial struct SubmitInfo2KHR : IStructuredType + public unsafe partial struct SubmitInfo2KHR : IChainStart { public SubmitInfo2KHR ( @@ -129,5 +129,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SubmitInfo2Khr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref SubmitInfo2KHR Chain( + out SubmitInfo2KHR capture) + { + capture = new SubmitInfo2KHR(StructureType.SubmitInfo2Khr); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassBeginInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassBeginInfo.gen.cs index 83039a8987..47fbc78e8f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassBeginInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassBeginInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSubpassBeginInfo")] - public unsafe partial struct SubpassBeginInfo : IStructuredType + [NativeName("Aliases", "VkSubpassBeginInfoKHR")] + public unsafe partial struct SubpassBeginInfo : IChainable { public SubpassBeginInfo ( @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SubpassBeginInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassBeginInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassBeginInfoKHR.gen.cs index 2baa802783..a5dc515071 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassBeginInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassBeginInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSubpassBeginInfoKHR")] - public unsafe partial struct SubpassBeginInfoKHR : IStructuredType + [NativeName("AliasOf", "VkSubpassBeginInfo")] + public unsafe partial struct SubpassBeginInfoKhr : IChainable { - public SubpassBeginInfoKHR + public SubpassBeginInfoKhr ( StructureType? sType = StructureType.SubpassBeginInfo, void* pNext = null, @@ -63,5 +64,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SubpassBeginInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDependency2.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDependency2.gen.cs index 5d1791d665..4ed93b563e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDependency2.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDependency2.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSubpassDependency2")] - public unsafe partial struct SubpassDependency2 : IStructuredType + [NativeName("Aliases", "VkSubpassDependency2KHR")] + public unsafe partial struct SubpassDependency2 : IChainStart { public SubpassDependency2 ( @@ -140,5 +141,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SubpassDependency2; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref SubpassDependency2 Chain( + out SubpassDependency2 capture) + { + capture = new SubpassDependency2(StructureType.SubpassDependency2); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDependency2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDependency2KHR.gen.cs index aa7b7ecb9a..a56ef7ea5a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDependency2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDependency2KHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSubpassDependency2KHR")] - public unsafe partial struct SubpassDependency2KHR : IStructuredType + [NativeName("AliasOf", "VkSubpassDependency2")] + public unsafe partial struct SubpassDependency2Khr : IChainStart { - public SubpassDependency2KHR + public SubpassDependency2Khr ( StructureType? sType = StructureType.SubpassDependency2, void* pNext = null, @@ -140,5 +141,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SubpassDependency2; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref SubpassDependency2Khr Chain( + out SubpassDependency2Khr capture) + { + capture = new SubpassDependency2Khr(StructureType.SubpassDependency2); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescription2.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescription2.gen.cs index 8eab57185f..b130cf9587 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescription2.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescription2.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSubpassDescription2")] - public unsafe partial struct SubpassDescription2 : IStructuredType + [NativeName("Aliases", "VkSubpassDescription2KHR")] + public unsafe partial struct SubpassDescription2 : IChainStart { public SubpassDescription2 ( @@ -173,5 +174,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SubpassDescription2; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref SubpassDescription2 Chain( + out SubpassDescription2 capture) + { + capture = new SubpassDescription2(StructureType.SubpassDescription2); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescription2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescription2KHR.gen.cs index b418f57fb5..7bd47edf18 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescription2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescription2KHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSubpassDescription2KHR")] - public unsafe partial struct SubpassDescription2KHR : IStructuredType + [NativeName("AliasOf", "VkSubpassDescription2")] + public unsafe partial struct SubpassDescription2Khr : IChainStart { - public SubpassDescription2KHR + public SubpassDescription2Khr ( StructureType? sType = StructureType.SubpassDescription2, void* pNext = null, @@ -173,5 +174,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SubpassDescription2; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref SubpassDescription2Khr Chain( + out SubpassDescription2Khr capture) + { + capture = new SubpassDescription2Khr(StructureType.SubpassDescription2); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescriptionDepthStencilResolve.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescriptionDepthStencilResolve.gen.cs index bdcb4fad11..02a0e2dcc6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescriptionDepthStencilResolve.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescriptionDepthStencilResolve.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSubpassDescriptionDepthStencilResolve")] - public unsafe partial struct SubpassDescriptionDepthStencilResolve : IStructuredType + [NativeName("Aliases", "VkSubpassDescriptionDepthStencilResolveKHR")] + public unsafe partial struct SubpassDescriptionDepthStencilResolve : IExtendsChain, IExtendsChain { public SubpassDescriptionDepthStencilResolve ( @@ -85,5 +86,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SubpassDescriptionDepthStencilResolve; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescriptionDepthStencilResolveKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescriptionDepthStencilResolveKHR.gen.cs index 853b0fd3c6..5d3b50d7a7 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescriptionDepthStencilResolveKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescriptionDepthStencilResolveKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSubpassDescriptionDepthStencilResolveKHR")] - public unsafe partial struct SubpassDescriptionDepthStencilResolveKHR : IStructuredType + [NativeName("AliasOf", "VkSubpassDescriptionDepthStencilResolve")] + public unsafe partial struct SubpassDescriptionDepthStencilResolveKhr : IExtendsChain, IExtendsChain { - public SubpassDescriptionDepthStencilResolveKHR + public SubpassDescriptionDepthStencilResolveKhr ( StructureType? sType = StructureType.SubpassDescriptionDepthStencilResolve, void* pNext = null, @@ -85,5 +86,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SubpassDescriptionDepthStencilResolve; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassEndInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassEndInfo.gen.cs index 3fba369305..2b87549d4e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassEndInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassEndInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSubpassEndInfo")] - public unsafe partial struct SubpassEndInfo : IStructuredType + [NativeName("Aliases", "VkSubpassEndInfoKHR")] + public unsafe partial struct SubpassEndInfo : IChainable { public SubpassEndInfo ( @@ -52,5 +53,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SubpassEndInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassEndInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassEndInfoKHR.gen.cs index 54ac3444e6..5b41230431 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassEndInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassEndInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSubpassEndInfoKHR")] - public unsafe partial struct SubpassEndInfoKHR : IStructuredType + [NativeName("AliasOf", "VkSubpassEndInfo")] + public unsafe partial struct SubpassEndInfoKhr : IChainable { - public SubpassEndInfoKHR + public SubpassEndInfoKhr ( StructureType? sType = StructureType.SubpassEndInfo, void* pNext = null @@ -52,5 +53,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SubpassEndInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassShadingPipelineCreateInfoHUAWEI.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassShadingPipelineCreateInfoHUAWEI.gen.cs index 11312a27f4..18ff28f1b3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassShadingPipelineCreateInfoHUAWEI.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassShadingPipelineCreateInfoHUAWEI.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSubpassShadingPipelineCreateInfoHUAWEI")] - public unsafe partial struct SubpassShadingPipelineCreateInfoHUAWEI : IStructuredType + public unsafe partial struct SubpassShadingPipelineCreateInfoHUAWEI : IExtendsChain { public SubpassShadingPipelineCreateInfoHUAWEI ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SubpassShadingPipelineCreateInfoHuawei; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceCapabilities2EXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceCapabilities2EXT.gen.cs index 80d7ec357b..171f949645 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceCapabilities2EXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceCapabilities2EXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSurfaceCapabilities2EXT")] - public unsafe partial struct SurfaceCapabilities2EXT : IStructuredType + public unsafe partial struct SurfaceCapabilities2EXT : IChainable { public SurfaceCapabilities2EXT ( @@ -173,5 +173,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SurfaceCapabilities2Ext; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceCapabilities2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceCapabilities2KHR.gen.cs index 82fa02312f..a6efc11858 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceCapabilities2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceCapabilities2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSurfaceCapabilities2KHR")] - public unsafe partial struct SurfaceCapabilities2KHR : IStructuredType + public unsafe partial struct SurfaceCapabilities2KHR : IChainStart { public SurfaceCapabilities2KHR ( @@ -63,5 +63,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SurfaceCapabilities2Khr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref SurfaceCapabilities2KHR Chain( + out SurfaceCapabilities2KHR capture) + { + capture = new SurfaceCapabilities2KHR(StructureType.SurfaceCapabilities2Khr); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceCapabilitiesFullScreenExclusiveEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceCapabilitiesFullScreenExclusiveEXT.gen.cs index 3c6745d7d5..a6761332bc 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceCapabilitiesFullScreenExclusiveEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceCapabilitiesFullScreenExclusiveEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSurfaceCapabilitiesFullScreenExclusiveEXT")] - public unsafe partial struct SurfaceCapabilitiesFullScreenExclusiveEXT : IStructuredType + public unsafe partial struct SurfaceCapabilitiesFullScreenExclusiveEXT : IExtendsChain { public SurfaceCapabilitiesFullScreenExclusiveEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SurfaceCapabilitiesFullScreenExclusiveExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceFormat2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceFormat2KHR.gen.cs index 2ef4db8434..93eee5a785 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceFormat2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceFormat2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSurfaceFormat2KHR")] - public unsafe partial struct SurfaceFormat2KHR : IStructuredType + public unsafe partial struct SurfaceFormat2KHR : IChainable { public SurfaceFormat2KHR ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SurfaceFormat2Khr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceFullScreenExclusiveInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceFullScreenExclusiveInfoEXT.gen.cs index 1078e7b6a0..14f8788770 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceFullScreenExclusiveInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceFullScreenExclusiveInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSurfaceFullScreenExclusiveInfoEXT")] - public unsafe partial struct SurfaceFullScreenExclusiveInfoEXT : IStructuredType + public unsafe partial struct SurfaceFullScreenExclusiveInfoEXT : IExtendsChain, IExtendsChain { public SurfaceFullScreenExclusiveInfoEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SurfaceFullScreenExclusiveInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceFullScreenExclusiveWin32InfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceFullScreenExclusiveWin32InfoEXT.gen.cs index 82a871048f..98eb0a15f9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceFullScreenExclusiveWin32InfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceFullScreenExclusiveWin32InfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSurfaceFullScreenExclusiveWin32InfoEXT")] - public unsafe partial struct SurfaceFullScreenExclusiveWin32InfoEXT : IStructuredType + public unsafe partial struct SurfaceFullScreenExclusiveWin32InfoEXT : IExtendsChain, IExtendsChain { public SurfaceFullScreenExclusiveWin32InfoEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SurfaceFullScreenExclusiveWin32InfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceProtectedCapabilitiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceProtectedCapabilitiesKHR.gen.cs index 3ba9d8b039..0537016e2e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceProtectedCapabilitiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SurfaceProtectedCapabilitiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSurfaceProtectedCapabilitiesKHR")] - public unsafe partial struct SurfaceProtectedCapabilitiesKHR : IStructuredType + public unsafe partial struct SurfaceProtectedCapabilitiesKHR : IExtendsChain { public SurfaceProtectedCapabilitiesKHR ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SurfaceProtectedCapabilitiesKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SwapchainCounterCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SwapchainCounterCreateInfoEXT.gen.cs index afc3ae8bb8..549987eded 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SwapchainCounterCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SwapchainCounterCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSwapchainCounterCreateInfoEXT")] - public unsafe partial struct SwapchainCounterCreateInfoEXT : IStructuredType + public unsafe partial struct SwapchainCounterCreateInfoEXT : IExtendsChain { public SwapchainCounterCreateInfoEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SwapchainCounterCreateInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SwapchainCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SwapchainCreateInfoKHR.gen.cs index 7cfbca5ce1..884dd31681 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SwapchainCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SwapchainCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSwapchainCreateInfoKHR")] - public unsafe partial struct SwapchainCreateInfoKHR : IStructuredType + public unsafe partial struct SwapchainCreateInfoKHR : IChainStart { public SwapchainCreateInfoKHR ( @@ -228,5 +228,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SwapchainCreateInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref SwapchainCreateInfoKHR Chain( + out SwapchainCreateInfoKHR capture) + { + capture = new SwapchainCreateInfoKHR(StructureType.SwapchainCreateInfoKhr); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SwapchainDisplayNativeHdrCreateInfoAMD.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SwapchainDisplayNativeHdrCreateInfoAMD.gen.cs index 297d191705..1d6b7ac882 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SwapchainDisplayNativeHdrCreateInfoAMD.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SwapchainDisplayNativeHdrCreateInfoAMD.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSwapchainDisplayNativeHdrCreateInfoAMD")] - public unsafe partial struct SwapchainDisplayNativeHdrCreateInfoAMD : IStructuredType + public unsafe partial struct SwapchainDisplayNativeHdrCreateInfoAMD : IExtendsChain { public SwapchainDisplayNativeHdrCreateInfoAMD ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SwapchainDisplayNativeHdrCreateInfoAmd; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SwapchainImageCreateInfoANDROID.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SwapchainImageCreateInfoANDROID.gen.cs index 696cbdd99a..d706f1e8b0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SwapchainImageCreateInfoANDROID.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SwapchainImageCreateInfoANDROID.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSwapchainImageCreateInfoANDROID")] - public unsafe partial struct SwapchainImageCreateInfoANDROID : IStructuredType + public unsafe partial struct SwapchainImageCreateInfoANDROID : IChainable { public SwapchainImageCreateInfoANDROID ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SwapchainImageCreateInfoAndroid; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SysmemColorSpaceFUCHSIA.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SysmemColorSpaceFUCHSIA.gen.cs index f6ed40e56d..a50dde569e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SysmemColorSpaceFUCHSIA.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SysmemColorSpaceFUCHSIA.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSysmemColorSpaceFUCHSIA")] - public unsafe partial struct SysmemColorSpaceFUCHSIA : IStructuredType + public unsafe partial struct SysmemColorSpaceFUCHSIA : IChainable { public SysmemColorSpaceFUCHSIA ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.SysmemColorSpaceFuchsia; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/TextureLODGatherFormatPropertiesAMD.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/TextureLODGatherFormatPropertiesAMD.gen.cs index 8817a3a400..65c80a3729 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/TextureLODGatherFormatPropertiesAMD.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/TextureLODGatherFormatPropertiesAMD.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkTextureLODGatherFormatPropertiesAMD")] - public unsafe partial struct TextureLODGatherFormatPropertiesAMD : IStructuredType + public unsafe partial struct TextureLODGatherFormatPropertiesAMD : IExtendsChain, IExtendsChain { public TextureLODGatherFormatPropertiesAMD ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.TextureLodGatherFormatPropertiesAmd; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/TimelineSemaphoreSubmitInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/TimelineSemaphoreSubmitInfo.gen.cs index 1f9a3db854..22516073e3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/TimelineSemaphoreSubmitInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/TimelineSemaphoreSubmitInfo.gen.cs @@ -17,7 +17,8 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkTimelineSemaphoreSubmitInfo")] - public unsafe partial struct TimelineSemaphoreSubmitInfo : IStructuredType + [NativeName("Aliases", "VkTimelineSemaphoreSubmitInfoKHR")] + public unsafe partial struct TimelineSemaphoreSubmitInfo : IExtendsChain, IExtendsChain { public TimelineSemaphoreSubmitInfo ( @@ -96,5 +97,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.TimelineSemaphoreSubmitInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/TimelineSemaphoreSubmitInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/TimelineSemaphoreSubmitInfoKHR.gen.cs index 342cb0ab36..c84206ae8c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/TimelineSemaphoreSubmitInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/TimelineSemaphoreSubmitInfoKHR.gen.cs @@ -17,9 +17,10 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkTimelineSemaphoreSubmitInfoKHR")] - public unsafe partial struct TimelineSemaphoreSubmitInfoKHR : IStructuredType + [NativeName("AliasOf", "VkTimelineSemaphoreSubmitInfo")] + public unsafe partial struct TimelineSemaphoreSubmitInfoKhr : IExtendsChain, IExtendsChain { - public TimelineSemaphoreSubmitInfoKHR + public TimelineSemaphoreSubmitInfoKhr ( StructureType? sType = StructureType.TimelineSemaphoreSubmitInfo, void* pNext = null, @@ -96,5 +97,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.TimelineSemaphoreSubmitInfo; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/TransformMatrixKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/TransformMatrixKHR.gen.cs index 8646dc8873..36b9dd30d9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/TransformMatrixKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/TransformMatrixKHR.gen.cs @@ -17,6 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkTransformMatrixKHR")] + [NativeName("Aliases", "VkTransformMatrixNV")] public unsafe partial struct TransformMatrixKHR { /// diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/TransformMatrixNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/TransformMatrixNV.gen.cs index 46a0a757d8..23488e2ad8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/TransformMatrixNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/TransformMatrixNV.gen.cs @@ -17,6 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkTransformMatrixNV")] + [NativeName("AliasOf", "VkTransformMatrixKHR")] public unsafe partial struct TransformMatrixNV { /// diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ValidationCacheCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ValidationCacheCreateInfoEXT.gen.cs index fd17f79026..2b8a21bc7c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ValidationCacheCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ValidationCacheCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkValidationCacheCreateInfoEXT")] - public unsafe partial struct ValidationCacheCreateInfoEXT : IStructuredType + public unsafe partial struct ValidationCacheCreateInfoEXT : IChainable { public ValidationCacheCreateInfoEXT ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ValidationCacheCreateInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ValidationFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ValidationFeaturesEXT.gen.cs index 092b46ee5f..aceef23a65 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ValidationFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ValidationFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkValidationFeaturesEXT")] - public unsafe partial struct ValidationFeaturesEXT : IStructuredType + public unsafe partial struct ValidationFeaturesEXT : IExtendsChain { public ValidationFeaturesEXT ( @@ -96,5 +96,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ValidationFeaturesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ValidationFlagsEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ValidationFlagsEXT.gen.cs index e2adebbe95..4dbac26c1b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ValidationFlagsEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ValidationFlagsEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkValidationFlagsEXT")] - public unsafe partial struct ValidationFlagsEXT : IStructuredType + public unsafe partial struct ValidationFlagsEXT : IExtendsChain { public ValidationFlagsEXT ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.ValidationFlagsExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VertexInputAttributeDescription2EXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VertexInputAttributeDescription2EXT.gen.cs index 1002e14dcf..c2f46577b1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VertexInputAttributeDescription2EXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VertexInputAttributeDescription2EXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVertexInputAttributeDescription2EXT")] - public unsafe partial struct VertexInputAttributeDescription2EXT : IStructuredType + public unsafe partial struct VertexInputAttributeDescription2EXT : IChainable { public VertexInputAttributeDescription2EXT ( @@ -96,5 +96,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VertexInputAttributeDescription2Ext; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VertexInputBindingDescription2EXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VertexInputBindingDescription2EXT.gen.cs index 25213a7a14..315257cdb0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VertexInputBindingDescription2EXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VertexInputBindingDescription2EXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVertexInputBindingDescription2EXT")] - public unsafe partial struct VertexInputBindingDescription2EXT : IStructuredType + public unsafe partial struct VertexInputBindingDescription2EXT : IChainable { public VertexInputBindingDescription2EXT ( @@ -96,5 +96,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VertexInputBindingDescription2Ext; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ViSurfaceCreateInfoNN.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ViSurfaceCreateInfoNN.gen.cs index 02306afc01..4244a4840b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ViSurfaceCreateInfoNN.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ViSurfaceCreateInfoNN.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkViSurfaceCreateInfoNN")] - public unsafe partial struct ViSurfaceCreateInfoNN : IStructuredType + public unsafe partial struct ViSurfaceCreateInfoNN : IChainable { public ViSurfaceCreateInfoNN ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VISurfaceCreateInfoNN; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoBeginCodingInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoBeginCodingInfoKHR.gen.cs index ea3d6e00a4..237aa574d0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoBeginCodingInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoBeginCodingInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoBeginCodingInfoKHR")] - public unsafe partial struct VideoBeginCodingInfoKHR : IStructuredType + public unsafe partial struct VideoBeginCodingInfoKHR : IChainable { public VideoBeginCodingInfoKHR ( @@ -118,5 +118,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoBeginCodingInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoBindMemoryKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoBindMemoryKHR.gen.cs index dec99e331e..0d4d74741b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoBindMemoryKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoBindMemoryKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoBindMemoryKHR")] - public unsafe partial struct VideoBindMemoryKHR : IStructuredType + public unsafe partial struct VideoBindMemoryKHR : IChainable { public VideoBindMemoryKHR ( @@ -96,5 +96,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoBindMemoryKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoCapabilitiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoCapabilitiesKHR.gen.cs index 44ba36306e..77722fa3a3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoCapabilitiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoCapabilitiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoCapabilitiesKHR")] - public unsafe partial struct VideoCapabilitiesKHR : IStructuredType + public unsafe partial struct VideoCapabilitiesKHR : IChainStart { public VideoCapabilitiesKHR ( @@ -140,5 +140,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoCapabilitiesKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref VideoCapabilitiesKHR Chain( + out VideoCapabilitiesKHR capture) + { + capture = new VideoCapabilitiesKHR(StructureType.VideoCapabilitiesKhr); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoCodingControlInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoCodingControlInfoKHR.gen.cs index 57b2d24593..a425881517 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoCodingControlInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoCodingControlInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoCodingControlInfoKHR")] - public unsafe partial struct VideoCodingControlInfoKHR : IStructuredType + public unsafe partial struct VideoCodingControlInfoKHR : IChainStart { public VideoCodingControlInfoKHR ( @@ -63,5 +63,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoCodingControlInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref VideoCodingControlInfoKHR Chain( + out VideoCodingControlInfoKHR capture) + { + capture = new VideoCodingControlInfoKHR(StructureType.VideoCodingControlInfoKhr); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264CapabilitiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264CapabilitiesEXT.gen.cs index 9a0c02c915..9d9f182b4d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264CapabilitiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264CapabilitiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoDecodeH264CapabilitiesEXT")] - public unsafe partial struct VideoDecodeH264CapabilitiesEXT : IStructuredType + public unsafe partial struct VideoDecodeH264CapabilitiesEXT : IExtendsChain { public VideoDecodeH264CapabilitiesEXT ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoDecodeH264CapabilitiesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264DpbSlotInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264DpbSlotInfoEXT.gen.cs index 3031596f29..762bacfc04 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264DpbSlotInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264DpbSlotInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoDecodeH264DpbSlotInfoEXT")] - public unsafe partial struct VideoDecodeH264DpbSlotInfoEXT : IStructuredType + public unsafe partial struct VideoDecodeH264DpbSlotInfoEXT : IExtendsChain { public VideoDecodeH264DpbSlotInfoEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoDecodeH264DpbSlotInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264MvcEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264MvcEXT.gen.cs index 7de6f50df8..cafb8a9342 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264MvcEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264MvcEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoDecodeH264MvcEXT")] - public unsafe partial struct VideoDecodeH264MvcEXT : IStructuredType + public unsafe partial struct VideoDecodeH264MvcEXT : IExtendsChain { public VideoDecodeH264MvcEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoDecodeH264MvcExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264PictureInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264PictureInfoEXT.gen.cs index 4df8cbefd8..05cd286209 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264PictureInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264PictureInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoDecodeH264PictureInfoEXT")] - public unsafe partial struct VideoDecodeH264PictureInfoEXT : IStructuredType + public unsafe partial struct VideoDecodeH264PictureInfoEXT : IChainStart, IExtendsChain { public VideoDecodeH264PictureInfoEXT ( @@ -85,5 +85,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoDecodeH264PictureInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref VideoDecodeH264PictureInfoEXT Chain( + out VideoDecodeH264PictureInfoEXT capture) + { + capture = new VideoDecodeH264PictureInfoEXT(StructureType.VideoDecodeH264PictureInfoExt); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264ProfileEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264ProfileEXT.gen.cs index 71648ea1c0..4fd9e8c1df 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264ProfileEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264ProfileEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoDecodeH264ProfileEXT")] - public unsafe partial struct VideoDecodeH264ProfileEXT : IStructuredType + public unsafe partial struct VideoDecodeH264ProfileEXT : IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain { public VideoDecodeH264ProfileEXT ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoDecodeH264ProfileExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264SessionCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264SessionCreateInfoEXT.gen.cs index 0ca7840de1..da2e0a41c5 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264SessionCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264SessionCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoDecodeH264SessionCreateInfoEXT")] - public unsafe partial struct VideoDecodeH264SessionCreateInfoEXT : IStructuredType + public unsafe partial struct VideoDecodeH264SessionCreateInfoEXT : IExtendsChain { public VideoDecodeH264SessionCreateInfoEXT ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoDecodeH264SessionCreateInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264SessionParametersAddInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264SessionParametersAddInfoEXT.gen.cs index 89392f653b..99ce23b6b6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264SessionParametersAddInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264SessionParametersAddInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoDecodeH264SessionParametersAddInfoEXT")] - public unsafe partial struct VideoDecodeH264SessionParametersAddInfoEXT : IStructuredType + public unsafe partial struct VideoDecodeH264SessionParametersAddInfoEXT : IExtendsChain { public VideoDecodeH264SessionParametersAddInfoEXT ( @@ -96,5 +96,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoDecodeH264SessionParametersAddInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264SessionParametersCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264SessionParametersCreateInfoEXT.gen.cs index 90238ae393..8b8e21dca5 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264SessionParametersCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264SessionParametersCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoDecodeH264SessionParametersCreateInfoEXT")] - public unsafe partial struct VideoDecodeH264SessionParametersCreateInfoEXT : IStructuredType + public unsafe partial struct VideoDecodeH264SessionParametersCreateInfoEXT : IExtendsChain { public VideoDecodeH264SessionParametersCreateInfoEXT ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoDecodeH264SessionParametersCreateInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265CapabilitiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265CapabilitiesEXT.gen.cs index 685f45b345..cdd745489d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265CapabilitiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265CapabilitiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoDecodeH265CapabilitiesEXT")] - public unsafe partial struct VideoDecodeH265CapabilitiesEXT : IStructuredType + public unsafe partial struct VideoDecodeH265CapabilitiesEXT : IExtendsChain { public VideoDecodeH265CapabilitiesEXT ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoDecodeH265CapabilitiesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265DpbSlotInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265DpbSlotInfoEXT.gen.cs index f862b08ffe..de651a5c5a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265DpbSlotInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265DpbSlotInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoDecodeH265DpbSlotInfoEXT")] - public unsafe partial struct VideoDecodeH265DpbSlotInfoEXT : IStructuredType + public unsafe partial struct VideoDecodeH265DpbSlotInfoEXT : IExtendsChain { public VideoDecodeH265DpbSlotInfoEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoDecodeH265DpbSlotInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265PictureInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265PictureInfoEXT.gen.cs index 04df6851c9..1eb57937b7 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265PictureInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265PictureInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoDecodeH265PictureInfoEXT")] - public unsafe partial struct VideoDecodeH265PictureInfoEXT : IStructuredType + public unsafe partial struct VideoDecodeH265PictureInfoEXT : IExtendsChain { public VideoDecodeH265PictureInfoEXT ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoDecodeH265PictureInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265ProfileEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265ProfileEXT.gen.cs index d4062909a5..bdc5595227 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265ProfileEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265ProfileEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoDecodeH265ProfileEXT")] - public unsafe partial struct VideoDecodeH265ProfileEXT : IStructuredType + public unsafe partial struct VideoDecodeH265ProfileEXT : IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain { public VideoDecodeH265ProfileEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoDecodeH265ProfileExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265SessionCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265SessionCreateInfoEXT.gen.cs index 2f567e913f..b6a9c0ed45 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265SessionCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265SessionCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoDecodeH265SessionCreateInfoEXT")] - public unsafe partial struct VideoDecodeH265SessionCreateInfoEXT : IStructuredType + public unsafe partial struct VideoDecodeH265SessionCreateInfoEXT : IExtendsChain { public VideoDecodeH265SessionCreateInfoEXT ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoDecodeH265SessionCreateInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265SessionParametersAddInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265SessionParametersAddInfoEXT.gen.cs index 89eb02649d..a15c7fbb63 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265SessionParametersAddInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265SessionParametersAddInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoDecodeH265SessionParametersAddInfoEXT")] - public unsafe partial struct VideoDecodeH265SessionParametersAddInfoEXT : IStructuredType + public unsafe partial struct VideoDecodeH265SessionParametersAddInfoEXT : IExtendsChain { public VideoDecodeH265SessionParametersAddInfoEXT ( @@ -96,5 +96,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoDecodeH265SessionParametersAddInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265SessionParametersCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265SessionParametersCreateInfoEXT.gen.cs index cf449621ed..f9f884a89c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265SessionParametersCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265SessionParametersCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoDecodeH265SessionParametersCreateInfoEXT")] - public unsafe partial struct VideoDecodeH265SessionParametersCreateInfoEXT : IStructuredType + public unsafe partial struct VideoDecodeH265SessionParametersCreateInfoEXT : IExtendsChain { public VideoDecodeH265SessionParametersCreateInfoEXT ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoDecodeH265SessionParametersCreateInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeInfoKHR.gen.cs index 79f011a98f..f619eeced6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoDecodeInfoKHR")] - public unsafe partial struct VideoDecodeInfoKHR : IStructuredType + public unsafe partial struct VideoDecodeInfoKHR : IChainStart { public VideoDecodeInfoKHR ( @@ -162,5 +162,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoDecodeInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref VideoDecodeInfoKHR Chain( + out VideoDecodeInfoKHR capture) + { + capture = new VideoDecodeInfoKHR(StructureType.VideoDecodeInfoKhr); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264CapabilitiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264CapabilitiesEXT.gen.cs index b4a4c3626a..d00b490151 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264CapabilitiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264CapabilitiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeH264CapabilitiesEXT")] - public unsafe partial struct VideoEncodeH264CapabilitiesEXT : IStructuredType + public unsafe partial struct VideoEncodeH264CapabilitiesEXT : IExtendsChain { public VideoEncodeH264CapabilitiesEXT ( @@ -173,5 +173,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoEncodeH264CapabilitiesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264DpbSlotInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264DpbSlotInfoEXT.gen.cs index 87c1fb9832..ce42771758 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264DpbSlotInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264DpbSlotInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeH264DpbSlotInfoEXT")] - public unsafe partial struct VideoEncodeH264DpbSlotInfoEXT : IStructuredType + public unsafe partial struct VideoEncodeH264DpbSlotInfoEXT : IChainable { public VideoEncodeH264DpbSlotInfoEXT ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoEncodeH264DpbSlotInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264EmitPictureParametersEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264EmitPictureParametersEXT.gen.cs index b386491b53..e2e5132add 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264EmitPictureParametersEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264EmitPictureParametersEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeH264EmitPictureParametersEXT")] - public unsafe partial struct VideoEncodeH264EmitPictureParametersEXT : IStructuredType + public unsafe partial struct VideoEncodeH264EmitPictureParametersEXT : IExtendsChain { public VideoEncodeH264EmitPictureParametersEXT ( @@ -96,5 +96,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoEncodeH264EmitPictureParametersExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264NaluSliceEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264NaluSliceEXT.gen.cs index 7f95e7a687..de4cbb2bb1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264NaluSliceEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264NaluSliceEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeH264NaluSliceEXT")] - public unsafe partial struct VideoEncodeH264NaluSliceEXT : IStructuredType + public unsafe partial struct VideoEncodeH264NaluSliceEXT : IChainable { public VideoEncodeH264NaluSliceEXT ( @@ -151,5 +151,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoEncodeH264NaluSliceExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264ProfileEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264ProfileEXT.gen.cs index 07dd472f36..e4fe75e400 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264ProfileEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264ProfileEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeH264ProfileEXT")] - public unsafe partial struct VideoEncodeH264ProfileEXT : IStructuredType + public unsafe partial struct VideoEncodeH264ProfileEXT : IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain { public VideoEncodeH264ProfileEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoEncodeH264ProfileExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264SessionCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264SessionCreateInfoEXT.gen.cs index db78fc214f..bfe822b3f8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264SessionCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264SessionCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeH264SessionCreateInfoEXT")] - public unsafe partial struct VideoEncodeH264SessionCreateInfoEXT : IStructuredType + public unsafe partial struct VideoEncodeH264SessionCreateInfoEXT : IExtendsChain { public VideoEncodeH264SessionCreateInfoEXT ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoEncodeH264SessionCreateInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264SessionParametersAddInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264SessionParametersAddInfoEXT.gen.cs index 3657c1a78a..62fade5732 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264SessionParametersAddInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264SessionParametersAddInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeH264SessionParametersAddInfoEXT")] - public unsafe partial struct VideoEncodeH264SessionParametersAddInfoEXT : IStructuredType + public unsafe partial struct VideoEncodeH264SessionParametersAddInfoEXT : IExtendsChain { public VideoEncodeH264SessionParametersAddInfoEXT ( @@ -96,5 +96,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoEncodeH264SessionParametersAddInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264SessionParametersCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264SessionParametersCreateInfoEXT.gen.cs index 335c42cd9e..64fbaccbd6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264SessionParametersCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264SessionParametersCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeH264SessionParametersCreateInfoEXT")] - public unsafe partial struct VideoEncodeH264SessionParametersCreateInfoEXT : IStructuredType + public unsafe partial struct VideoEncodeH264SessionParametersCreateInfoEXT : IExtendsChain { public VideoEncodeH264SessionParametersCreateInfoEXT ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoEncodeH264SessionParametersCreateInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264VclFrameInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264VclFrameInfoEXT.gen.cs index 6fdfc9e5b1..e1b33966e0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264VclFrameInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264VclFrameInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeH264VclFrameInfoEXT")] - public unsafe partial struct VideoEncodeH264VclFrameInfoEXT : IStructuredType + public unsafe partial struct VideoEncodeH264VclFrameInfoEXT : IExtendsChain { public VideoEncodeH264VclFrameInfoEXT ( @@ -129,5 +129,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoEncodeH264VclFrameInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265CapabilitiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265CapabilitiesEXT.gen.cs index 19d41940ad..4f5d3fa339 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265CapabilitiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265CapabilitiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeH265CapabilitiesEXT")] - public unsafe partial struct VideoEncodeH265CapabilitiesEXT : IStructuredType + public unsafe partial struct VideoEncodeH265CapabilitiesEXT : IExtendsChain { public VideoEncodeH265CapabilitiesEXT ( @@ -173,5 +173,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoEncodeH265CapabilitiesExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265DpbSlotInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265DpbSlotInfoEXT.gen.cs index f55e50306e..d8859c0d91 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265DpbSlotInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265DpbSlotInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeH265DpbSlotInfoEXT")] - public unsafe partial struct VideoEncodeH265DpbSlotInfoEXT : IStructuredType + public unsafe partial struct VideoEncodeH265DpbSlotInfoEXT : IChainable { public VideoEncodeH265DpbSlotInfoEXT ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoEncodeH265DpbSlotInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265EmitPictureParametersEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265EmitPictureParametersEXT.gen.cs index 18861b5971..540a504a34 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265EmitPictureParametersEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265EmitPictureParametersEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeH265EmitPictureParametersEXT")] - public unsafe partial struct VideoEncodeH265EmitPictureParametersEXT : IStructuredType + public unsafe partial struct VideoEncodeH265EmitPictureParametersEXT : IExtendsChain { public VideoEncodeH265EmitPictureParametersEXT ( @@ -118,5 +118,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoEncodeH265EmitPictureParametersExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265NaluSliceEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265NaluSliceEXT.gen.cs index 98f492a309..70b4ad7ab0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265NaluSliceEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265NaluSliceEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeH265NaluSliceEXT")] - public unsafe partial struct VideoEncodeH265NaluSliceEXT : IStructuredType + public unsafe partial struct VideoEncodeH265NaluSliceEXT : IChainable { public VideoEncodeH265NaluSliceEXT ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoEncodeH265NaluSliceExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265ProfileEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265ProfileEXT.gen.cs index 36f9cf6011..5056f7f09a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265ProfileEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265ProfileEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeH265ProfileEXT")] - public unsafe partial struct VideoEncodeH265ProfileEXT : IStructuredType + public unsafe partial struct VideoEncodeH265ProfileEXT : IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain { public VideoEncodeH265ProfileEXT ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoEncodeH265ProfileExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265ReferenceListsEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265ReferenceListsEXT.gen.cs index 5af05e99ee..512f089427 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265ReferenceListsEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265ReferenceListsEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeH265ReferenceListsEXT")] - public unsafe partial struct VideoEncodeH265ReferenceListsEXT : IStructuredType + public unsafe partial struct VideoEncodeH265ReferenceListsEXT : IChainable { public VideoEncodeH265ReferenceListsEXT ( @@ -107,5 +107,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoEncodeH265ReferenceListsExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265SessionCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265SessionCreateInfoEXT.gen.cs index 48ba2dcaa0..9666dca7f2 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265SessionCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265SessionCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeH265SessionCreateInfoEXT")] - public unsafe partial struct VideoEncodeH265SessionCreateInfoEXT : IStructuredType + public unsafe partial struct VideoEncodeH265SessionCreateInfoEXT : IExtendsChain { public VideoEncodeH265SessionCreateInfoEXT ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoEncodeH265SessionCreateInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265SessionParametersAddInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265SessionParametersAddInfoEXT.gen.cs index 7997c3d7b4..664ac83b7e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265SessionParametersAddInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265SessionParametersAddInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeH265SessionParametersAddInfoEXT")] - public unsafe partial struct VideoEncodeH265SessionParametersAddInfoEXT : IStructuredType + public unsafe partial struct VideoEncodeH265SessionParametersAddInfoEXT : IExtendsChain { public VideoEncodeH265SessionParametersAddInfoEXT ( @@ -118,5 +118,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoEncodeH265SessionParametersAddInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265SessionParametersCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265SessionParametersCreateInfoEXT.gen.cs index 207f93bb67..8196cdc36c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265SessionParametersCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265SessionParametersCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeH265SessionParametersCreateInfoEXT")] - public unsafe partial struct VideoEncodeH265SessionParametersCreateInfoEXT : IStructuredType + public unsafe partial struct VideoEncodeH265SessionParametersCreateInfoEXT : IExtendsChain { public VideoEncodeH265SessionParametersCreateInfoEXT ( @@ -96,5 +96,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoEncodeH265SessionParametersCreateInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265VclFrameInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265VclFrameInfoEXT.gen.cs index 827ec8b2be..382c2a2547 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265VclFrameInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265VclFrameInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeH265VclFrameInfoEXT")] - public unsafe partial struct VideoEncodeH265VclFrameInfoEXT : IStructuredType + public unsafe partial struct VideoEncodeH265VclFrameInfoEXT : IExtendsChain { public VideoEncodeH265VclFrameInfoEXT ( @@ -96,5 +96,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoEncodeH265VclFrameInfoExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeInfoKHR.gen.cs index b63c688f85..65ea4574d3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeInfoKHR")] - public unsafe partial struct VideoEncodeInfoKHR : IStructuredType + public unsafe partial struct VideoEncodeInfoKHR : IChainStart { public VideoEncodeInfoKHR ( @@ -162,5 +162,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoEncodeInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref VideoEncodeInfoKHR Chain( + out VideoEncodeInfoKHR capture) + { + capture = new VideoEncodeInfoKHR(StructureType.VideoEncodeInfoKhr); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeRateControlInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeRateControlInfoKHR.gen.cs index cc172aade7..b028132a8d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeRateControlInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeRateControlInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeRateControlInfoKHR")] - public unsafe partial struct VideoEncodeRateControlInfoKHR : IStructuredType + public unsafe partial struct VideoEncodeRateControlInfoKHR : IExtendsChain { public VideoEncodeRateControlInfoKHR ( @@ -129,5 +129,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoEncodeRateControlInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEndCodingInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEndCodingInfoKHR.gen.cs index 6fdb694d91..53ea2b6925 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEndCodingInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEndCodingInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEndCodingInfoKHR")] - public unsafe partial struct VideoEndCodingInfoKHR : IStructuredType + public unsafe partial struct VideoEndCodingInfoKHR : IChainable { public VideoEndCodingInfoKHR ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoEndCodingInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoFormatPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoFormatPropertiesKHR.gen.cs index 01aa615985..fd1a58eb87 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoFormatPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoFormatPropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoFormatPropertiesKHR")] - public unsafe partial struct VideoFormatPropertiesKHR : IStructuredType + public unsafe partial struct VideoFormatPropertiesKHR : IChainable { public VideoFormatPropertiesKHR ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoFormatPropertiesKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoGetMemoryPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoGetMemoryPropertiesKHR.gen.cs index 9830822156..504eb823e2 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoGetMemoryPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoGetMemoryPropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoGetMemoryPropertiesKHR")] - public unsafe partial struct VideoGetMemoryPropertiesKHR : IStructuredType + public unsafe partial struct VideoGetMemoryPropertiesKHR : IChainable { public VideoGetMemoryPropertiesKHR ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoGetMemoryPropertiesKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoPictureResourceKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoPictureResourceKHR.gen.cs index 0f45a76727..ef90018136 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoPictureResourceKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoPictureResourceKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoPictureResourceKHR")] - public unsafe partial struct VideoPictureResourceKHR : IStructuredType + public unsafe partial struct VideoPictureResourceKHR : IChainable { public VideoPictureResourceKHR ( @@ -96,5 +96,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoPictureResourceKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoProfileKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoProfileKHR.gen.cs index 0c156a0858..856aa34115 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoProfileKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoProfileKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoProfileKHR")] - public unsafe partial struct VideoProfileKHR : IStructuredType + public unsafe partial struct VideoProfileKHR : IChainStart, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain { public VideoProfileKHR ( @@ -96,5 +96,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoProfileKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref VideoProfileKHR Chain( + out VideoProfileKHR capture) + { + capture = new VideoProfileKHR(StructureType.VideoProfileKhr); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoProfilesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoProfilesKHR.gen.cs index f9cccbd746..5cd225ef9d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoProfilesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoProfilesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoProfilesKHR")] - public unsafe partial struct VideoProfilesKHR : IStructuredType + public unsafe partial struct VideoProfilesKHR : IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain { public VideoProfilesKHR ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoProfilesKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoQueueFamilyProperties2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoQueueFamilyProperties2KHR.gen.cs index 9562ea50c5..01ba8a7724 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoQueueFamilyProperties2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoQueueFamilyProperties2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoQueueFamilyProperties2KHR")] - public unsafe partial struct VideoQueueFamilyProperties2KHR : IStructuredType + public unsafe partial struct VideoQueueFamilyProperties2KHR : IExtendsChain, IExtendsChain { public VideoQueueFamilyProperties2KHR ( @@ -63,5 +63,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoQueueFamilyProperties2Khr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoReferenceSlotKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoReferenceSlotKHR.gen.cs index 0b375956a2..71f37fce8f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoReferenceSlotKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoReferenceSlotKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoReferenceSlotKHR")] - public unsafe partial struct VideoReferenceSlotKHR : IStructuredType + public unsafe partial struct VideoReferenceSlotKHR : IChainStart { public VideoReferenceSlotKHR ( @@ -74,5 +74,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoReferenceSlotKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref VideoReferenceSlotKHR Chain( + out VideoReferenceSlotKHR capture) + { + capture = new VideoReferenceSlotKHR(StructureType.VideoReferenceSlotKhr); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoSessionCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoSessionCreateInfoKHR.gen.cs index 570c5e49b4..9e23404cd6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoSessionCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoSessionCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoSessionCreateInfoKHR")] - public unsafe partial struct VideoSessionCreateInfoKHR : IStructuredType + public unsafe partial struct VideoSessionCreateInfoKHR : IChainStart { public VideoSessionCreateInfoKHR ( @@ -140,5 +140,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoSessionCreateInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref VideoSessionCreateInfoKHR Chain( + out VideoSessionCreateInfoKHR capture) + { + capture = new VideoSessionCreateInfoKHR(StructureType.VideoSessionCreateInfoKhr); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoSessionParametersCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoSessionParametersCreateInfoKHR.gen.cs index e07a2437a8..14bcf8cb8b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoSessionParametersCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoSessionParametersCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoSessionParametersCreateInfoKHR")] - public unsafe partial struct VideoSessionParametersCreateInfoKHR : IStructuredType + public unsafe partial struct VideoSessionParametersCreateInfoKHR : IChainStart { public VideoSessionParametersCreateInfoKHR ( @@ -74,5 +74,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoSessionParametersCreateInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref VideoSessionParametersCreateInfoKHR Chain( + out VideoSessionParametersCreateInfoKHR capture) + { + capture = new VideoSessionParametersCreateInfoKHR(StructureType.VideoSessionParametersCreateInfoKhr); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoSessionParametersUpdateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoSessionParametersUpdateInfoKHR.gen.cs index 0b8b5dfacc..c2da2a218e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoSessionParametersUpdateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoSessionParametersUpdateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoSessionParametersUpdateInfoKHR")] - public unsafe partial struct VideoSessionParametersUpdateInfoKHR : IStructuredType + public unsafe partial struct VideoSessionParametersUpdateInfoKHR : IChainStart { public VideoSessionParametersUpdateInfoKHR ( @@ -63,5 +63,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.VideoSessionParametersUpdateInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref VideoSessionParametersUpdateInfoKHR Chain( + out VideoSessionParametersUpdateInfoKHR capture) + { + capture = new VideoSessionParametersUpdateInfoKHR(StructureType.VideoSessionParametersUpdateInfoKhr); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/WaylandSurfaceCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/WaylandSurfaceCreateInfoKHR.gen.cs index 24575480ea..0c700bcfc3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/WaylandSurfaceCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/WaylandSurfaceCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkWaylandSurfaceCreateInfoKHR")] - public unsafe partial struct WaylandSurfaceCreateInfoKHR : IStructuredType + public unsafe partial struct WaylandSurfaceCreateInfoKHR : IChainable { public WaylandSurfaceCreateInfoKHR ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.WaylandSurfaceCreateInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/Win32KeyedMutexAcquireReleaseInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/Win32KeyedMutexAcquireReleaseInfoKHR.gen.cs index 5e88526deb..aa3d12b4f8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/Win32KeyedMutexAcquireReleaseInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/Win32KeyedMutexAcquireReleaseInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkWin32KeyedMutexAcquireReleaseInfoKHR")] - public unsafe partial struct Win32KeyedMutexAcquireReleaseInfoKHR : IStructuredType + public unsafe partial struct Win32KeyedMutexAcquireReleaseInfoKHR : IExtendsChain, IExtendsChain { public Win32KeyedMutexAcquireReleaseInfoKHR ( @@ -129,5 +129,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.Win32KeyedMutexAcquireReleaseInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/Win32KeyedMutexAcquireReleaseInfoNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/Win32KeyedMutexAcquireReleaseInfoNV.gen.cs index dce1a6975f..1ce8e41f49 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/Win32KeyedMutexAcquireReleaseInfoNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/Win32KeyedMutexAcquireReleaseInfoNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkWin32KeyedMutexAcquireReleaseInfoNV")] - public unsafe partial struct Win32KeyedMutexAcquireReleaseInfoNV : IStructuredType + public unsafe partial struct Win32KeyedMutexAcquireReleaseInfoNV : IExtendsChain, IExtendsChain { public Win32KeyedMutexAcquireReleaseInfoNV ( @@ -129,5 +129,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.Win32KeyedMutexAcquireReleaseInfoNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/Win32SurfaceCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/Win32SurfaceCreateInfoKHR.gen.cs index 9d088f4a7f..25a3bd9c2c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/Win32SurfaceCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/Win32SurfaceCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkWin32SurfaceCreateInfoKHR")] - public unsafe partial struct Win32SurfaceCreateInfoKHR : IStructuredType + public unsafe partial struct Win32SurfaceCreateInfoKHR : IChainable { public Win32SurfaceCreateInfoKHR ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.Win32SurfaceCreateInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/WriteDescriptorSet.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/WriteDescriptorSet.gen.cs index 02e1069d63..7f3c2b2d81 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/WriteDescriptorSet.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/WriteDescriptorSet.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkWriteDescriptorSet")] - public unsafe partial struct WriteDescriptorSet : IStructuredType + public unsafe partial struct WriteDescriptorSet : IChainStart { public WriteDescriptorSet ( @@ -140,5 +140,24 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.WriteDescriptorSet; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } + + /// + /// Convenience method to start a chain. + /// + /// The newly created chain root + /// A reference to the newly created chain. + public static unsafe ref WriteDescriptorSet Chain( + out WriteDescriptorSet capture) + { + capture = new WriteDescriptorSet(StructureType.WriteDescriptorSet); + return ref capture; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/WriteDescriptorSetAccelerationStructureKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/WriteDescriptorSetAccelerationStructureKHR.gen.cs index bec1dbe016..bae0ea79f5 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/WriteDescriptorSetAccelerationStructureKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/WriteDescriptorSetAccelerationStructureKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkWriteDescriptorSetAccelerationStructureKHR")] - public unsafe partial struct WriteDescriptorSetAccelerationStructureKHR : IStructuredType + public unsafe partial struct WriteDescriptorSetAccelerationStructureKHR : IExtendsChain { public WriteDescriptorSetAccelerationStructureKHR ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.WriteDescriptorSetAccelerationStructureKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/WriteDescriptorSetAccelerationStructureNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/WriteDescriptorSetAccelerationStructureNV.gen.cs index f881be59df..df0dd1caab 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/WriteDescriptorSetAccelerationStructureNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/WriteDescriptorSetAccelerationStructureNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkWriteDescriptorSetAccelerationStructureNV")] - public unsafe partial struct WriteDescriptorSetAccelerationStructureNV : IStructuredType + public unsafe partial struct WriteDescriptorSetAccelerationStructureNV : IExtendsChain { public WriteDescriptorSetAccelerationStructureNV ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.WriteDescriptorSetAccelerationStructureNV; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/WriteDescriptorSetInlineUniformBlockEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/WriteDescriptorSetInlineUniformBlockEXT.gen.cs index a87c66d433..fa8442f2bd 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/WriteDescriptorSetInlineUniformBlockEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/WriteDescriptorSetInlineUniformBlockEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkWriteDescriptorSetInlineUniformBlockEXT")] - public unsafe partial struct WriteDescriptorSetInlineUniformBlockEXT : IStructuredType + public unsafe partial struct WriteDescriptorSetInlineUniformBlockEXT : IExtendsChain { public WriteDescriptorSetInlineUniformBlockEXT ( @@ -74,5 +74,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.WriteDescriptorSetInlineUniformBlockExt; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/XcbSurfaceCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/XcbSurfaceCreateInfoKHR.gen.cs index d8e2cb7209..6bec60c4d4 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/XcbSurfaceCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/XcbSurfaceCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkXcbSurfaceCreateInfoKHR")] - public unsafe partial struct XcbSurfaceCreateInfoKHR : IStructuredType + public unsafe partial struct XcbSurfaceCreateInfoKHR : IChainable { public XcbSurfaceCreateInfoKHR ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.XcbSurfaceCreateInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/XlibSurfaceCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/XlibSurfaceCreateInfoKHR.gen.cs index c4f5578e11..86aa4ddfaa 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/XlibSurfaceCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/XlibSurfaceCreateInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkXlibSurfaceCreateInfoKHR")] - public unsafe partial struct XlibSurfaceCreateInfoKHR : IStructuredType + public unsafe partial struct XlibSurfaceCreateInfoKHR : IChainable { public XlibSurfaceCreateInfoKHR ( @@ -85,5 +85,12 @@ StructureType IStructuredType.StructureType() { return SType = StructureType.XlibSurfaceCreateInfoKhr; } + + /// + unsafe BaseInStructure* IChainable.PNext + { + get => (BaseInStructure*) PNext; + set => PNext = value; + } } } From c56ac2a1ccdf96bc08cf7541376804a310d6e934 Mon Sep 17 00:00:00 2001 From: Craig Dean Date: Tue, 9 Nov 2021 23:41:36 +0000 Subject: [PATCH 34/42] fix: Fixed capitalization of struct aliases. --- src/Core/Silk.NET.BuildTools/Converters/Readers/VulkanReader.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Core/Silk.NET.BuildTools/Converters/Readers/VulkanReader.cs b/src/Core/Silk.NET.BuildTools/Converters/Readers/VulkanReader.cs index 289c01b521..54198304d6 100644 --- a/src/Core/Silk.NET.BuildTools/Converters/Readers/VulkanReader.cs +++ b/src/Core/Silk.NET.BuildTools/Converters/Readers/VulkanReader.cs @@ -215,7 +215,7 @@ IReadOnlyList GetAllAliasesFromName(string structName) foreach (var alias in aList) { - var aliasStruct = @struct.Clone(Naming.Translate(TrimName(alias, task), prefix), alias); + var aliasStruct = @struct.Clone(Naming.TranslateLite(TrimName(alias, task), prefix), alias); aliasStruct.Attributes.Add ( new() From 055a8099f9348ef4dc9a7f0a4ab451db9add0ccc Mon Sep 17 00:00:00 2001 From: Craig Dean Date: Tue, 9 Nov 2021 23:42:28 +0000 Subject: [PATCH 35/42] chore: Committing structure changes --- build/cache/vulkan.json.gz | Bin 242839 -> 242839 bytes .../NVRayTracing.gen.cs | 8 ++++---- .../NVRayTracingOverloads.gen.cs | 6 +++--- .../AndroidHardwareBufferUsageANDROID.gen.cs | 2 +- .../Structs/AttachmentDescription2KHR.gen.cs | 10 +++++----- .../AttachmentDescriptionStencilLayout.gen.cs | 2 +- ...tachmentDescriptionStencilLayoutKHR.gen.cs | 4 ++-- .../Structs/AttachmentReference2KHR.gen.cs | 10 +++++----- .../AttachmentReferenceStencilLayout.gen.cs | 2 +- ...AttachmentReferenceStencilLayoutKHR.gen.cs | 4 ++-- .../BindBufferMemoryDeviceGroupInfo.gen.cs | 2 +- .../BindBufferMemoryDeviceGroupInfoKHR.gen.cs | 4 ++-- .../Structs/BindBufferMemoryInfoKHR.gen.cs | 10 +++++----- .../BindImageMemoryDeviceGroupInfo.gen.cs | 2 +- .../BindImageMemoryDeviceGroupInfoKHR.gen.cs | 4 ++-- .../Structs/BindImageMemoryInfoKHR.gen.cs | 10 +++++----- .../BindImageMemorySwapchainInfoKHR.gen.cs | 2 +- .../Structs/BindImagePlaneMemoryInfo.gen.cs | 2 +- .../BindImagePlaneMemoryInfoKHR.gen.cs | 4 ++-- .../Structs/BufferDeviceAddressInfoEXT.gen.cs | 4 ++-- .../Structs/BufferDeviceAddressInfoKHR.gen.cs | 4 ++-- .../BufferMemoryRequirementsInfo2KHR.gen.cs | 4 ++-- ...erOpaqueCaptureAddressCreateInfoKHR.gen.cs | 4 ++-- .../Structs/ConformanceVersionKHR.gen.cs | 4 ++-- ...rSetLayoutBindingFlagsCreateInfoEXT.gen.cs | 4 ++-- .../DescriptorSetLayoutSupportKHR.gen.cs | 10 +++++----- ...iableDescriptorCountAllocateInfoEXT.gen.cs | 4 ++-- ...ariableDescriptorCountLayoutSupport.gen.cs | 2 +- ...ableDescriptorCountLayoutSupportEXT.gen.cs | 4 ++-- ...scriptorUpdateTemplateCreateInfoKHR.gen.cs | 4 ++-- .../DescriptorUpdateTemplateEntryKHR.gen.cs | 4 ++-- .../DeviceGroupBindSparseInfoKHR.gen.cs | 4 ++-- ...eviceGroupCommandBufferBeginInfoKHR.gen.cs | 4 ++-- .../DeviceGroupDeviceCreateInfoKHR.gen.cs | 4 ++-- .../DeviceGroupRenderPassBeginInfoKHR.gen.cs | 4 ++-- .../Structs/DeviceGroupSubmitInfoKHR.gen.cs | 4 ++-- ...ceMemoryOpaqueCaptureAddressInfoKHR.gen.cs | 4 ++-- ...DrmFormatModifierPropertiesList2EXT.gen.cs | 2 +- .../DrmFormatModifierPropertiesListEXT.gen.cs | 2 +- .../Structs/ExportFenceCreateInfoKHR.gen.cs | 4 ++-- .../ExportMemoryAllocateInfoKHR.gen.cs | 4 ++-- .../ExportSemaphoreCreateInfoKHR.gen.cs | 4 ++-- .../ExternalBufferPropertiesKHR.gen.cs | 4 ++-- .../Structs/ExternalFencePropertiesKHR.gen.cs | 4 ++-- .../Structs/ExternalFormatANDROID.gen.cs | 2 +- .../ExternalImageFormatProperties.gen.cs | 2 +- .../ExternalImageFormatPropertiesKHR.gen.cs | 4 ++-- .../ExternalMemoryBufferCreateInfoKHR.gen.cs | 4 ++-- .../ExternalMemoryImageCreateInfoKHR.gen.cs | 4 ++-- .../ExternalMemoryPropertiesKHR.gen.cs | 4 ++-- .../ExternalSemaphorePropertiesKHR.gen.cs | 4 ++-- ...icImageViewImageFormatPropertiesEXT.gen.cs | 2 +- .../Structs/FormatProperties2KHR.gen.cs | 10 +++++----- .../Structs/FormatProperties3KHR.gen.cs | 2 +- ...ragmentShadingRateAttachmentInfoKHR.gen.cs | 2 +- .../FramebufferAttachmentImageInfoKHR.gen.cs | 4 ++-- ...FramebufferAttachmentsCreateInfoKHR.gen.cs | 4 ++-- .../Structs/ImageFormatListCreateInfo.gen.cs | 2 +- .../ImageFormatListCreateInfoKHR.gen.cs | 4 ++-- .../Structs/ImageFormatProperties2KHR.gen.cs | 10 +++++----- .../ImageMemoryRequirementsInfo2KHR.gen.cs | 10 +++++----- .../ImagePlaneMemoryRequirementsInfo.gen.cs | 2 +- ...ImagePlaneMemoryRequirementsInfoKHR.gen.cs | 4 ++-- ...ageSparseMemoryRequirementsInfo2KHR.gen.cs | 4 ++-- .../ImageStencilUsageCreateInfo.gen.cs | 2 +- .../ImageStencilUsageCreateInfoEXT.gen.cs | 4 ++-- .../ImageViewUsageCreateInfoKHR.gen.cs | 4 ++-- .../InputAttachmentAspectReferenceKHR.gen.cs | 4 ++-- .../Structs/MemoryAllocateFlagsInfoKHR.gen.cs | 4 ++-- .../Structs/MemoryBarrier2KHR.gen.cs | 2 +- .../MemoryDedicatedAllocateInfoKHR.gen.cs | 4 ++-- .../MemoryDedicatedRequirements.gen.cs | 2 +- .../MemoryDedicatedRequirementsKHR.gen.cs | 4 ++-- ...OpaqueCaptureAddressAllocateInfoKHR.gen.cs | 4 ++-- .../Structs/MemoryRequirements2KHR.gen.cs | 10 +++++----- .../PhysicalDevice16BitStorageFeatures.gen.cs | 2 +- ...ysicalDevice16BitStorageFeaturesKHR.gen.cs | 4 ++-- ...hysicalDevice4444FormatsFeaturesEXT.gen.cs | 2 +- .../PhysicalDevice8BitStorageFeatures.gen.cs | 2 +- ...hysicalDevice8BitStorageFeaturesKHR.gen.cs | 4 ++-- ...PhysicalDeviceASTCDecodeFeaturesEXT.gen.cs | 2 +- ...iceAccelerationStructureFeaturesKHR.gen.cs | 2 +- ...eAccelerationStructurePropertiesKHR.gen.cs | 2 +- ...ceBlendOperationAdvancedFeaturesEXT.gen.cs | 2 +- ...BlendOperationAdvancedPropertiesEXT.gen.cs | 2 +- ...DeviceBorderColorSwizzleFeaturesEXT.gen.cs | 2 +- ...sicalDeviceBufferAddressFeaturesEXT.gen.cs | 4 ++-- ...alDeviceBufferDeviceAddressFeatures.gen.cs | 2 +- ...eviceBufferDeviceAddressFeaturesEXT.gen.cs | 2 +- ...eviceBufferDeviceAddressFeaturesKHR.gen.cs | 4 ++-- ...icalDeviceCoherentMemoryFeaturesAMD.gen.cs | 2 +- ...alDeviceColorWriteEnableFeaturesEXT.gen.cs | 2 +- ...eComputeShaderDerivativesFeaturesNV.gen.cs | 2 +- ...viceConditionalRenderingFeaturesEXT.gen.cs | 2 +- ...servativeRasterizationPropertiesEXT.gen.cs | 2 +- ...alDeviceCooperativeMatrixFeaturesNV.gen.cs | 2 +- ...DeviceCooperativeMatrixPropertiesNV.gen.cs | 2 +- ...lDeviceCornerSampledImageFeaturesNV.gen.cs | 2 +- ...viceCoverageReductionModeFeaturesNV.gen.cs | 2 +- ...lDeviceCustomBorderColorFeaturesEXT.gen.cs | 2 +- ...eviceCustomBorderColorPropertiesEXT.gen.cs | 2 +- ...edAllocationImageAliasingFeaturesNV.gen.cs | 2 +- ...calDeviceDepthClipEnableFeaturesEXT.gen.cs | 2 +- ...DeviceDepthStencilResolveProperties.gen.cs | 2 +- ...iceDepthStencilResolvePropertiesKHR.gen.cs | 4 ++-- ...calDeviceDescriptorIndexingFeatures.gen.cs | 2 +- ...DeviceDescriptorIndexingFeaturesEXT.gen.cs | 4 ++-- ...lDeviceDescriptorIndexingProperties.gen.cs | 2 +- ...viceDescriptorIndexingPropertiesEXT.gen.cs | 4 ++-- ...ceDeviceGeneratedCommandsFeaturesNV.gen.cs | 2 +- ...DeviceGeneratedCommandsPropertiesNV.gen.cs | 2 +- ...DeviceDeviceMemoryReportFeaturesEXT.gen.cs | 2 +- ...alDeviceDiagnosticsConfigFeaturesNV.gen.cs | 2 +- ...DeviceDiscardRectanglePropertiesEXT.gen.cs | 2 +- .../PhysicalDeviceDriverProperties.gen.cs | 2 +- .../PhysicalDeviceDriverPropertiesKHR.gen.cs | 4 ++-- .../PhysicalDeviceDrmPropertiesEXT.gen.cs | 2 +- ...alDeviceDynamicRenderingFeaturesKHR.gen.cs | 2 +- ...calDeviceExclusiveScissorFeaturesNV.gen.cs | 2 +- ...iceExtendedDynamicState2FeaturesEXT.gen.cs | 2 +- ...viceExtendedDynamicStateFeaturesEXT.gen.cs | 2 +- ...PhysicalDeviceExternalBufferInfoKHR.gen.cs | 4 ++-- .../PhysicalDeviceExternalFenceInfoKHR.gen.cs | 4 ++-- ...ysicalDeviceExternalImageFormatInfo.gen.cs | 2 +- ...calDeviceExternalImageFormatInfoKHR.gen.cs | 4 ++-- ...viceExternalMemoryHostPropertiesEXT.gen.cs | 2 +- ...lDeviceExternalMemoryRDMAFeaturesNV.gen.cs | 2 +- ...sicalDeviceExternalSemaphoreInfoKHR.gen.cs | 10 +++++----- .../Structs/PhysicalDeviceFeatures2KHR.gen.cs | 10 +++++----- ...hysicalDeviceFloat16Int8FeaturesKHR.gen.cs | 4 ++-- ...ysicalDeviceFloatControlsProperties.gen.cs | 2 +- ...calDeviceFloatControlsPropertiesKHR.gen.cs | 4 ++-- ...eviceFragmentDensityMap2FeaturesEXT.gen.cs | 2 +- ...iceFragmentDensityMap2PropertiesEXT.gen.cs | 2 +- ...DeviceFragmentDensityMapFeaturesEXT.gen.cs | 2 +- ...viceFragmentDensityMapPropertiesEXT.gen.cs | 2 +- ...FragmentShaderBarycentricFeaturesNV.gen.cs | 2 +- ...eFragmentShaderInterlockFeaturesEXT.gen.cs | 2 +- ...eFragmentShadingRateEnumsFeaturesNV.gen.cs | 2 +- ...ragmentShadingRateEnumsPropertiesNV.gen.cs | 2 +- ...eviceFragmentShadingRateFeaturesKHR.gen.cs | 2 +- ...iceFragmentShadingRatePropertiesKHR.gen.cs | 2 +- ...eviceGlobalPriorityQueryFeaturesEXT.gen.cs | 2 +- .../PhysicalDeviceGroupPropertiesKHR.gen.cs | 4 ++-- ...hysicalDeviceHostQueryResetFeatures.gen.cs | 2 +- ...icalDeviceHostQueryResetFeaturesEXT.gen.cs | 4 ++-- .../Structs/PhysicalDeviceIDProperties.gen.cs | 2 +- .../PhysicalDeviceIDPropertiesKHR.gen.cs | 4 ++-- ...DeviceImageDrmFormatModifierInfoEXT.gen.cs | 2 +- .../PhysicalDeviceImageFormatInfo2KHR.gen.cs | 10 +++++----- ...calDeviceImageRobustnessFeaturesEXT.gen.cs | 2 +- ...alDeviceImageViewImageFormatInfoEXT.gen.cs | 2 +- ...lDeviceImagelessFramebufferFeatures.gen.cs | 2 +- ...viceImagelessFramebufferFeaturesKHR.gen.cs | 4 ++-- ...icalDeviceIndexTypeUint8FeaturesEXT.gen.cs | 2 +- ...eInheritedViewportScissorFeaturesNV.gen.cs | 2 +- ...DeviceInlineUniformBlockFeaturesEXT.gen.cs | 2 +- ...viceInlineUniformBlockPropertiesEXT.gen.cs | 2 +- ...lDeviceInvocationMaskFeaturesHUAWEI.gen.cs | 2 +- ...lDeviceLineRasterizationFeaturesEXT.gen.cs | 2 +- ...eviceLineRasterizationPropertiesEXT.gen.cs | 2 +- ...hysicalDeviceMaintenance3Properties.gen.cs | 2 +- ...icalDeviceMaintenance3PropertiesKHR.gen.cs | 4 ++-- ...ysicalDeviceMaintenance4FeaturesKHR.gen.cs | 2 +- ...icalDeviceMaintenance4PropertiesKHR.gen.cs | 2 +- ...icalDeviceMemoryBudgetPropertiesEXT.gen.cs | 2 +- ...icalDeviceMemoryPriorityFeaturesEXT.gen.cs | 2 +- .../PhysicalDeviceMemoryProperties2KHR.gen.cs | 10 +++++----- .../PhysicalDeviceMeshShaderFeaturesNV.gen.cs | 2 +- ...hysicalDeviceMeshShaderPropertiesNV.gen.cs | 2 +- .../PhysicalDeviceMultiDrawFeaturesEXT.gen.cs | 2 +- ...hysicalDeviceMultiDrawPropertiesEXT.gen.cs | 2 +- .../PhysicalDeviceMultiviewFeatures.gen.cs | 2 +- .../PhysicalDeviceMultiviewFeaturesKHR.gen.cs | 4 ++-- ...iviewPerViewAttributesPropertiesNVX.gen.cs | 2 +- .../PhysicalDeviceMultiviewProperties.gen.cs | 2 +- ...hysicalDeviceMultiviewPropertiesKHR.gen.cs | 4 ++-- ...eMutableDescriptorTypeFeaturesVALVE.gen.cs | 2 +- ...ysicalDevicePCIBusInfoPropertiesEXT.gen.cs | 2 +- ...ageableDeviceLocalMemoryFeaturesEXT.gen.cs | 2 +- ...alDevicePerformanceQueryFeaturesKHR.gen.cs | 2 +- ...DevicePerformanceQueryPropertiesKHR.gen.cs | 2 +- ...lineCreationCacheControlFeaturesEXT.gen.cs | 2 +- ...lineExecutablePropertiesFeaturesKHR.gen.cs | 2 +- ...ysicalDevicePointClippingProperties.gen.cs | 2 +- ...calDevicePointClippingPropertiesKHR.gen.cs | 4 ++-- ...lDevicePortabilitySubsetFeaturesKHR.gen.cs | 2 +- ...evicePortabilitySubsetPropertiesKHR.gen.cs | 2 +- .../PhysicalDevicePresentIdFeaturesKHR.gen.cs | 2 +- ...hysicalDevicePresentWaitFeaturesKHR.gen.cs | 2 +- ...itiveTopologyListRestartFeaturesEXT.gen.cs | 2 +- ...hysicalDevicePrivateDataFeaturesEXT.gen.cs | 2 +- .../PhysicalDeviceProperties2KHR.gen.cs | 10 +++++----- ...ysicalDeviceProtectedMemoryFeatures.gen.cs | 2 +- ...icalDeviceProtectedMemoryProperties.gen.cs | 2 +- ...calDeviceProvokingVertexFeaturesEXT.gen.cs | 2 +- ...lDeviceProvokingVertexPropertiesEXT.gen.cs | 2 +- ...alDevicePushDescriptorPropertiesKHR.gen.cs | 2 +- ...calDeviceRGBA10X6FormatsFeaturesEXT.gen.cs | 2 +- .../PhysicalDeviceRayQueryFeaturesKHR.gen.cs | 2 +- ...eviceRayTracingMotionBlurFeaturesNV.gen.cs | 2 +- ...DeviceRayTracingPipelineFeaturesKHR.gen.cs | 2 +- ...viceRayTracingPipelinePropertiesKHR.gen.cs | 2 +- ...hysicalDeviceRayTracingPropertiesNV.gen.cs | 2 +- ...epresentativeFragmentTestFeaturesNV.gen.cs | 2 +- ...hysicalDeviceRobustness2FeaturesEXT.gen.cs | 2 +- ...sicalDeviceRobustness2PropertiesEXT.gen.cs | 2 +- ...lDeviceSampleLocationsPropertiesEXT.gen.cs | 2 +- ...DeviceSamplerFilterMinmaxProperties.gen.cs | 2 +- ...iceSamplerFilterMinmaxPropertiesEXT.gen.cs | 4 ++-- ...eviceSamplerYcbcrConversionFeatures.gen.cs | 2 +- ...ceSamplerYcbcrConversionFeaturesKHR.gen.cs | 4 ++-- ...icalDeviceScalarBlockLayoutFeatures.gen.cs | 2 +- ...lDeviceScalarBlockLayoutFeaturesEXT.gen.cs | 4 ++-- ...SeparateDepthStencilLayoutsFeatures.gen.cs | 2 +- ...arateDepthStencilLayoutsFeaturesKHR.gen.cs | 4 ++-- ...DeviceShaderAtomicFloat2FeaturesEXT.gen.cs | 2 +- ...lDeviceShaderAtomicFloatFeaturesEXT.gen.cs | 2 +- ...icalDeviceShaderAtomicInt64Features.gen.cs | 2 +- ...lDeviceShaderAtomicInt64FeaturesKHR.gen.cs | 4 ++-- ...hysicalDeviceShaderClockFeaturesKHR.gen.cs | 2 +- ...sicalDeviceShaderCoreProperties2AMD.gen.cs | 2 +- ...ysicalDeviceShaderCorePropertiesAMD.gen.cs | 2 +- ...DemoteToHelperInvocationFeaturesEXT.gen.cs | 2 +- ...alDeviceShaderDrawParameterFeatures.gen.cs | 2 +- ...lDeviceShaderDrawParametersFeatures.gen.cs | 2 +- ...icalDeviceShaderFloat16Int8Features.gen.cs | 2 +- ...lDeviceShaderFloat16Int8FeaturesKHR.gen.cs | 4 ++-- ...ceShaderImageAtomicInt64FeaturesEXT.gen.cs | 2 +- ...eviceShaderImageFootprintFeaturesNV.gen.cs | 2 +- ...eShaderIntegerDotProductFeaturesKHR.gen.cs | 2 +- ...haderIntegerDotProductPropertiesKHR.gen.cs | 2 +- ...haderIntegerFunctions2FeaturesINTEL.gen.cs | 2 +- ...calDeviceShaderSMBuiltinsFeaturesNV.gen.cs | 2 +- ...lDeviceShaderSMBuiltinsPropertiesNV.gen.cs | 2 +- ...ShaderSubgroupExtendedTypesFeatures.gen.cs | 2 +- ...derSubgroupExtendedTypesFeaturesKHR.gen.cs | 4 ++-- ...bgroupUniformControlFlowFeaturesKHR.gen.cs | 2 +- ...haderTerminateInvocationFeaturesKHR.gen.cs | 2 +- ...calDeviceShadingRateImageFeaturesNV.gen.cs | 2 +- ...lDeviceShadingRateImagePropertiesNV.gen.cs | 2 +- ...icalDeviceSparseImageFormatInfo2KHR.gen.cs | 4 ++-- .../PhysicalDeviceSubgroupProperties.gen.cs | 2 +- ...eviceSubgroupSizeControlFeaturesEXT.gen.cs | 2 +- ...iceSubgroupSizeControlPropertiesEXT.gen.cs | 2 +- ...lDeviceSubpassShadingFeaturesHUAWEI.gen.cs | 2 +- ...eviceSubpassShadingPropertiesHUAWEI.gen.cs | 2 +- ...alDeviceSynchronization2FeaturesKHR.gen.cs | 2 +- ...viceTexelBufferAlignmentFeaturesEXT.gen.cs | 2 +- ...ceTexelBufferAlignmentPropertiesEXT.gen.cs | 2 +- ...extureCompressionASTCHDRFeaturesEXT.gen.cs | 2 +- ...icalDeviceTimelineSemaphoreFeatures.gen.cs | 2 +- ...lDeviceTimelineSemaphoreFeaturesKHR.gen.cs | 4 ++-- ...alDeviceTimelineSemaphoreProperties.gen.cs | 2 +- ...eviceTimelineSemaphorePropertiesKHR.gen.cs | 4 ++-- ...lDeviceTransformFeedbackFeaturesEXT.gen.cs | 2 +- ...eviceTransformFeedbackPropertiesEXT.gen.cs | 2 +- ...UniformBufferStandardLayoutFeatures.gen.cs | 2 +- ...formBufferStandardLayoutFeaturesKHR.gen.cs | 4 ++-- ...ysicalDeviceVariablePointerFeatures.gen.cs | 2 +- ...calDeviceVariablePointerFeaturesKHR.gen.cs | 4 ++-- ...sicalDeviceVariablePointersFeatures.gen.cs | 2 +- ...alDeviceVariablePointersFeaturesKHR.gen.cs | 4 ++-- ...ceVertexAttributeDivisorFeaturesEXT.gen.cs | 2 +- ...VertexAttributeDivisorPropertiesEXT.gen.cs | 2 +- ...eVertexInputDynamicStateFeaturesEXT.gen.cs | 2 +- .../PhysicalDeviceVulkan11Features.gen.cs | 2 +- .../PhysicalDeviceVulkan11Properties.gen.cs | 2 +- .../PhysicalDeviceVulkan12Features.gen.cs | 2 +- .../PhysicalDeviceVulkan12Properties.gen.cs | 2 +- ...icalDeviceVulkanMemoryModelFeatures.gen.cs | 2 +- ...lDeviceVulkanMemoryModelFeaturesKHR.gen.cs | 4 ++-- ...roupMemoryExplicitLayoutFeaturesKHR.gen.cs | 2 +- ...iceYcbcr2Plane444FormatsFeaturesEXT.gen.cs | 2 +- ...alDeviceYcbcrImageArraysFeaturesEXT.gen.cs | 2 +- ...nitializeWorkgroupMemoryFeaturesKHR.gen.cs | 2 +- ...ationDomainOriginStateCreateInfoKHR.gen.cs | 4 ++-- .../Structs/QueryPoolCreateInfoINTEL.gen.cs | 4 ++-- .../QueueFamilyCheckpointProperties2NV.gen.cs | 2 +- .../QueueFamilyCheckpointPropertiesNV.gen.cs | 2 +- ...ueFamilyGlobalPriorityPropertiesEXT.gen.cs | 2 +- .../Structs/QueueFamilyProperties2KHR.gen.cs | 10 +++++----- .../RenderPassAttachmentBeginInfoKHR.gen.cs | 4 ++-- .../Structs/RenderPassCreateInfo2KHR.gen.cs | 10 +++++----- ...PassFragmentDensityMapCreateInfoEXT.gen.cs | 2 +- ...sInputAttachmentAspectCreateInfoKHR.gen.cs | 4 ++-- .../RenderPassMultiviewCreateInfoKHR.gen.cs | 4 ++-- .../SamplerReductionModeCreateInfoEXT.gen.cs | 4 ++-- ...SamplerYcbcrConversionCreateInfoKHR.gen.cs | 10 +++++----- ...cbcrConversionImageFormatProperties.gen.cs | 2 +- ...rConversionImageFormatPropertiesKHR.gen.cs | 4 ++-- .../SamplerYcbcrConversionInfoKHR.gen.cs | 4 ++-- .../Structs/SemaphoreSignalInfoKHR.gen.cs | 4 ++-- .../Structs/SemaphoreTypeCreateInfo.gen.cs | 2 +- .../Structs/SemaphoreTypeCreateInfoKHR.gen.cs | 4 ++-- .../Structs/SemaphoreWaitInfoKHR.gen.cs | 4 ++-- .../SparseImageFormatProperties2KHR.gen.cs | 4 ++-- .../SparseImageMemoryRequirements2KHR.gen.cs | 4 ++-- .../Structs/SubpassBeginInfoKHR.gen.cs | 4 ++-- .../Structs/SubpassDependency2KHR.gen.cs | 10 +++++----- .../Structs/SubpassDescription2KHR.gen.cs | 10 +++++----- ...bpassDescriptionDepthStencilResolve.gen.cs | 2 +- ...ssDescriptionDepthStencilResolveKHR.gen.cs | 4 ++-- .../Structs/SubpassEndInfoKHR.gen.cs | 4 ++-- ...TextureLODGatherFormatPropertiesAMD.gen.cs | 2 +- .../TimelineSemaphoreSubmitInfoKHR.gen.cs | 4 ++-- .../Structs/VideoDecodeH264ProfileEXT.gen.cs | 2 +- .../Structs/VideoDecodeH265ProfileEXT.gen.cs | 2 +- .../Structs/VideoEncodeH264ProfileEXT.gen.cs | 2 +- .../Structs/VideoEncodeH265ProfileEXT.gen.cs | 2 +- .../Structs/VideoProfileKHR.gen.cs | 2 +- .../Structs/VideoProfilesKHR.gen.cs | 2 +- .../VideoQueueFamilyProperties2KHR.gen.cs | 2 +- 313 files changed, 488 insertions(+), 488 deletions(-) diff --git a/build/cache/vulkan.json.gz b/build/cache/vulkan.json.gz index e336240b73c74938b2feef04d67efc6b23500e6d..5a4565b913fdad0ffd0825a5941ceb2e268a0e4e 100644 GIT binary patch delta 183381 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 PUg>eqkI^mblN08 zw2lSofHk>wWUbYfE060SYlT*9&wM2LvoT|1e}v?e!6l-jmDf>&ZAxiuyZ%|^EE|{G zU~C(q;$dIwt}AT#l1tN^^tk-c>)ImoD&+O-WRnQTd`qSFf&6g$BRjGtSMnW->d}|+aLlFUgSE`FfvU~V;H$htE zc#$+&;m3Kbbjg^69$m8eL5ehG`9++RdE$MX)Pf({&!B*dPjONb=XZJvTRZGLcfhl{ zEY;M#_>XQDJ=q_`N_e>rhF)H@N~B5J^qrL7qy_`xgC`M_;)9VXPj zkz|t#Cjeb`#D$dMwaa-rnmB|xT820T%M-)_Xcw_CZ3Q^t{5|7OqQuxUU&tHA}BGl%>)C&`xv?cZvWaxDRR7#jL;ABjKg`2t5B_VKe z@Jg7Zm<6JKDhgh@Qq(0vu7cDO)RYXrM;sAwF69qxNibQo(bTcP_A$Wj^bS9u3dT2Jqb!sk zINexQ;C(1v85KUMh!gU1*dcI-G`nDN4E0?{J@-2LVzV=O>a1$jQNpfQ%bIHIv3>X_ z{9JCJkS65%JG%t6jdmws+b80TjJntBw5wD@Z1x)Ov8dsGe$UWvo;&r%?c?-d!`#+Y zYXBvkP;ye0T|vEFU7LKd;BE~UlNo4<)AEW{W|Xh=NNra+8g-2sOK1RU@Q@Z_Z>9On4+1Zp zZ6&+%Pqr+-Th(vQpzYA^ZPUDB;ALUnE71(qp6-7P9qGTha5i`K#53QQ_i*4TW%hEUs$zIvb+uV{n#wiogJ zwn}JuqN9o@6uTWTeun@l7xg&nBwg&lZKehrh10Etq?6cKRf=V)&!PQTXV+8+9!SPD z!phGw;wui-%nSwHPM_3Psdd-VpSHiot3sdEU)?E`MOl&hz}(NA%K!OLDCJWiVwUp& zDPAwqJ1G1KQzq8)KJFTIw1j;ZY6_d0Rdyx!fiaWtgdzr5q-D8{A2u5<)B1D!WEdec zh3d6!gI+HixwMTGbewgS<<0P`B5cE5FBdS!i+ix?5n<{lR_v4n~QGUvotFFKpRYkziA0eT^!;vmdtG zPuul+Rofshr1w}JY^5d$-*21dc~Co=qUp`j^4e<_8*B0rt8b2@;n^o*P)#^QZ3CyO zV>1n(eBK7Vmgfz>Kj!o`BQN5_y@<+nlf~m!+@K61K~+kT+L_}FVrw+P^*sdmzcl}5 zeQE^L)px*Kr7*PezLg#S*r6L*`xf|6yy|5q&*L8ke7hbGkUzA0zqcbfAAg@kXXqs8 z9D2C4yLNbIdtHCu&$e45eNTi$=ydeqjoBjD@Ns&H1GDx)SP^T!kglmluhPoAZ*I44 zx|05YFy(kPw4ASNu6dJ&yB5x<0XVP!Q=Rv}Q@e6o*pI1VHE6^5#5pO0sUJ+J+ilVA5%TZ5pJA6O%8+|vs!*0+8I`*#}G!p^kG6~oSG z8&rX_&QHz@kJ=y{D>yk3^5U`DrAUurp0x+2p38m@O+7CT`N+)9CqXn{*0hTSAV2QI6#nKr*}5{$17eTvCx*@Yrp-;nuk}soWC?4Wd+WN_nojnM%Y< zSk}_Kts+ZPy4oQi3)f_$==vOxHTZv<#y(m|BcKP_bp20(k>nmfNLZ(^rm$Q@8c5|9 zl)Scx{5T-Z8nlrvIJ#Bwl?4Ez7lE0 zE}}VG))=Xu$UT9l_UzjrQ!nUIrTd&glmUnGKa~z66PV#nK2Of78Q%nCUU& zpdcBwR~Sa$gCO;Nc>54^q&76RLc!1y(Z>C*m02;?1 zTxohqEt0fL5tTHKDpLT`S3&AS%WYvY9UJd~an*bKo&C`MP%$@` zMey%u)*=+V#cU#;w$ar>p0*gVEG=ab9}klL`Nwut!dR%u-|jeX+)Gim#qRwk3bEP1T{or2GkJJBQ~-l7Cy#PA7H;Gyo$|SOPe>#d*{d!%lf0(cQvMsLOru!)TzDP{H zEVP*%w>VVoR9J-N^ew;{k5ohK(`@Qm8py!x?mt5Mu?zGBjWfaNyb$ylZGCN>3G44M z8gyToV8?f|Zf-bqkdf+mIUyaF=oo0#GGhYyC8k8sbDD_1$X47qG63yQBgyk zw_V4>jjKc15}fP500e6k+0BMxY3+CT@>9ujAr*ip8*Bq}3&Qb^87@KJwQQu)spBzg zedZrIFQUykoQ{1zwMCq1t(TYPbThAJ^2!Y zAI(cFak#~aT7Xh;5SN#48pBg+pcIqnpi@^TkqSXTr$j9X9T)KLKolxaB!<>e5+!Ge zuKa`8DZ_2l^t-6TWRX~**gQe0&rTvSQ+-Z(;<@5oK>kGjhT?%DBD)eT2Z^{~zVmYR z{b0H-FOTd?2X0-PcxNXb1#5I$xcfJzjdFI};^}J3=p-({j!FI zwgl|mv|!T}>De-an<1lDr^JLUd3FMuFv6ZOqC#IXbm>{~nOajWV^yhTanIu}W0$;M zc)y3PJTSU8@Fi=@BNpE;3c!n1NaB{T5E_5ZyNTZ>GEjOxT=bVbJZLgdQVTYOv9UrT z7##;e9$Df_8S&9T=Q;0#KPhzFmPE}Talj0N%7zIm3`69ItOX=~b)I2RC{QR^5G(rc z`QB8#pmfL3`Bl{rDN~D2)hB#*;2~WW_-ew44p$FU-P}%=;1^R?bu`*E$ zHWZyD$eO?XQ&l6C{#8|*rzI&aFc)RR2*L|STmrE}DI`crOYU+vlsA;_iR4k3_@V~q zw{9n_H*_bd+DRsVvVO z>{l7cF;aLIs#J@RQs{V-$D_xi_Y7XachQ_IOc#w0?$Dda1yADeky8A~3E=F?&h6QpXqb?SzFzGF3<3uqi5&96{Scy+sttdWJGu zv&e5bL~YjJnc8=f*GD06z+ID{Mj-^jFOqr2An?H9lQqU5_&%k5!{W zRw$^mv*mP{W^KFOJK?I=Ah*^ZXl6Rq|(q(m%yr8i`dbFJXi-D1E`8F%wdE2COV1pR@W2Kw;;E$P${S z!t2AZFUqv0VZ<-TRqjI?ZBxDfu4?5rM9Jq)RHiEff+IxbLJ6GfU9A`-K+kIy)!v<2 z0h)a@RA|+?yqK{1!b6-;3$bVPU)YSn1Xvd*Tt^RDE^D;SzeaD&o{;?@G7UzcKZj63hQ|wMh zuc@N%)fVvGH)-(bL4z#*aNPxT&M4#w9}*f8z%lr2pgTy(7<&nBlCv|v4d6T^IBf87 zzS^^V?!Hvy0;vyVw;W}x39XjFD$F<=5Ignuo%_&I){1dxJC^BV=Txj+ALE) z))$Q*INQrQiv!$Lm9;qRcWrxbT(hr#wVRk;>q4V?KQk%JxN?n{3i#x1G6rc2(MM;* zT8R(X9N;=)j-}beG}Ul>cmgfkZ-K`#@$)CW*O3yAh1}}w>%@|kV^cQ}BV2D@kD?f) zEzt9l@jI7C47}a<)bt!?TL3gFGz=qsTb=c>V*7`jnqzUoMT zy>s@u;PoZs7Z%fzDBz1AglApxcist-Q6|!ZI8JxLn3Ftlq}zi@AqJ-015+mMc(j<7 zwRV2g_xOL4NLO#5hs44)@fr&?rj8zh2U4T;q{Fu?5AAn@sst*gT*J1=mx@hp*)!!o zXISh|11U>;$&%9$RKV?bHU-jGZ7>W;FNThf5p}#{MeLHUz5fkY64?UkuVAAh3bGvp z;}qg@Bu?xLr(i?_h^Zv(QRDO_!X$9815o4Y)Cun>h*_OaMVV~bnJOfTev8vgk^N+sjD>P4w7+siOd5Eu!+Gy0AJ%O%Y8K+*^aX zr!r(lO>`hOU=p;`CzZ=fnnkm4^Q%UF;VGEdum%aEW*~JID2GDOBu*qg8eI^Ukkys| ze;V?Q!=ywVmQ)>*&$IdG&Zc|>%|jAU90BnKF2LM9*4!dLcvAB$-=L115ITPrN~FcS z{w_(PjyfMQH+VwGoTx6Ch3fQSF>vMndjAXy_+j@-eT5Q)6`rJ=glQ~8S%;#TW?t*i z_IK*2^8QI~92_20b#PJ^q^J4er`%91|GQY;I)}B}zbnxrrzdi;tY)zpgU3yQf~2-M zW}b)HQ>ehQWR0n>^|?dKRw`~EsZ;Yyf_in!G29wQX@=K0=vLG7PPw>t8rd3r1ga9K z8oAU5j>n`&9|@_Z&xWuj38xvTNJ;o*U%|#(_8#Ad{qLs(UY{0+rfy zi`Do$(ZAswm=TAyZv#ssM-d=*WNgVv-ezK?`*W6!IITVdrya^lu$-v|+EK+ifPnv- zT|kXr`#Q`*^D~`k%V3r`A$P$%k5V@8KKc^&vt8~z#G~Dq zRf#ZP7*2GG(b$#*KVJ_)-c)HB*6niZm^jcf(8ATgDBzOYqM%b!$>x8j`qTDLqOVRc z`xai%VIHcbxC@Bzk6l^jzcH}JvMq_>HC^|&qLkGxmpGThIo_sm7QhUrhF%3*1G_Y` zJhI#hb+%9gTQzwP;3=WUomOzMm=m34Rq_^}RYg=Np>J=A(&wlf7MWSa>$1NEu{ncd zdDaK(PWYYdAQ|LJv^FPhw~KI#PNm#f5(s-bi(DLZ_*p@3Na3dg`DBxXMsEJoj>;hA+DgllRyp zY`F?QHdPEq33t1`;!}6C8KgTuR~u*r2io7@&51Qs5Sa(rbT=@ype{BDa^V{+<7G%R z%yvhW=-d-(0w8(SKfTmn-qjc*-h*2Qwhf-xa`=3G-lj#(k@v5X2acr|y{3Q0E*}GR zm0^J9!cWJ}MJvEl+m>v=oxB^0sYD8D+;S=#x!-ub#}V^)}+3U zh{=Dku|fDd)iBTtW8OVlZ_ikGt`l z^Ywvy@MOkX!H7=GEi;M^_`v)yxdXaZmq^ z*5jiSdzIl2uODMM@HgcBXa4+vv6oG`K>gVW7adMo&2X8uDphkdh9rfy8R9W`z72DKb^{wNVFry>xj8C>+ zf*=6qHb*cK8@4*#Hgj<7O5FTDwt=td>vUXdwi$TwY-Qk!nnNyjd~fqFc|D0}Su@7k z!Na-xH}rYJSnPnOM5$L@RgkKYuc;E8AYV*gwnt%Jb-$`^Jdhf&W(!l#h=e|D2+ZU2 zuf%pgGd5A3M}IR>;e7lR?NHt+&;o{-2tZ?ztLR(y!L_O>IxQuws zFO0tbG6eg<|Efwe^zhggnU>Zi7}s*0KU49uYI@mPCM{8^JV1i8CeeVAp(n8~50L%c zjs!&_4ZkCYa+mz4fbH9~YKyb36n`Z4n7AzlYDpG*W>qFbYs3p<#JgIGiU+ys1#+$m zj=29!izNZjR@V_A9Lqc(4vX1Bkkzhc(sULuF&e&*&JTlc^XGPs@kxoepAbzxrRDF; z3mz}NJFJ*99=f;d zpeOkGd$t$mk6iMC%O9J)01uGlS%)pAiaQxw?z(2a*|ss`F8MB)8J0#8tLI2;%#2Kp z1095|ZX578TE8PHCID0w+jeA6euI_bDeS-L;{o8i3S8%PmGs=$^SB?{A#;7wl!nu9 zNB|zB{PbTJscZEVd^Zn3Zxz2D`j9)Hd4+4$;;FWdo@-`$+1w@IvfON&t(Qsm-hZxs zI(yuHcl$oR*2>oSoz$WU=*^X9Ms@NuZ!TtF=EfCNj2|^xO-tN8;<&(yI)+=>8)KT+kZO**ORa`>w{!A$YOTx@x!f zYW#A5xMEMiH$Q*QFy^^BetNxp7P|NI!5JY>1|F7|5?b+jFkI;}WfQwG|IXyv=h-re z&188xMqjmzv%Yus1#`T^xqnP9r_y$uo^9c7SEI2xc>3dp3csAy+|42`a)8~o;kSzP z>HWLe!`pq}3`-k;tkm3$I4Rji%yQdA*ODvt@N5k3=e{Vxj43m-+u%f-JUEhD&}ODU z@%boJPkb{xb17;`nt=Oy_0xk$DZg#yfI^`Znhd;mnLw^hQvD!xEU-!hJJ7p*#vf5k388 z^DQezttT(7Vs5cl!;GB6*^WC~voV`X)OuK>HJ>s2k&d~7)`#;>4Sr!YDH+@<3CWa9 zGe-@GCSwZ?WW0b`wQy&^35Q?YoVD23tbRNz9`mSG9RM@CKlpCOKG@JU>XMRy=MHUc zgV2IVGCT#*B|g<87j(d$j^?i2QzI8NLxE8=Y!!z^fL&e2uyu7!WZs`DR^Ra)ertJgWpqy;B_d==2p$A=zJ}?6z?Wtrl2BfRqp|Qbw%i=IOd* z3)dz>an|cNJz!glOM5owl+-xP(pJ}-q6;VBhO0-N@p&$JaSL3VtZB#M#^eAwuXam> zds&8!K5;rTD;z3^gz(vZwf+0jlIarQ5Lai**m-#JkgV^qjHfK~4!-vdd7T(5)!#Nm z)wJQ(PkS)p_fPIL9@k#Lo^Qc9;&KK$rsP^#MQ!g4s%h3=nQBJ3-=uWXTnJEDaNJjY0p4vGHMy?p_TTj)Q^rs7 z7L%Bt@$;#|uK`cs9-RU{-92OXvAqq>~=+3hq5(oTh}?Oe0h9M?AKNi-{Z zGK>WitINoOG;Zjf1i%?3omwXz8&X6+#XQp*TW9X=XPJ*#xs7Qy=EZGJ&)T3mp*J3R zTqk#JLEr&LRCOHOH)9*2(Oier!sskL97}1@5FmI%8>tG(fb5sqlaw! z1iK@L`vj3G)8qVx|3h+V`$uvar1s*M27R!V?tH}-6aGR-N-4emLP)ri`F0?_e5L() z5>5ar-vQM`{=Y;Q3UCdNzibmHPYNr!bJEd69U>>sP|kmhmGjc%s2vDW3{opOeo(9A zgF!E`zu+BCr>CFEJv$JD;PT14I}j{LW*R2vW|Ai7`$9u&nh-75${yLC{FFzM=dj7AyAXu* z%j)M5co3~7JnMPOm@c80h8Kzb%1c|O=4#iGIb@>v46DV2-c*?3=AaA4YA;CH5M%lkN8)J_8wlNHZbEWJ~msn>ui0r1h!o+-Ii*z-azZww@(0dm?sU zxpbZ_nq2SwaVhpbwQGC8B}MPPSvM&EQJu`VjJPw5!)QMTWhQw|XY>nAEJ8;Lk}8#^ zGAB_QTRlXb)JR(osfdh`Zr6aOAR0_JB`^p)ufSq5^$ASV7=t z$LTGtVN~CPwnGYc=z+q=ncy^^DkIuYi<;jS zb53#e`x43P{_+bm9g_>|-ZzMu)rJ)Cp9N$A-+s1T@HpdVt!x%NA0W1E3iqdC3?Ytl zkKQMnO>X`nNGqN+_?`*u*~IN!`1-c4xx04iQrf221Y4B->PAb!s_s@1VUD`^^gD#z zpB+QOxjoci*7WrLY-a{H#(Uqyg~K7&{Ne4S!ENbmO`8SK;V)>C;PJMnXzw~Hvg(&L z6Yq(-{bodE@3w42UKj6xx-x{jTdpwc0AzdS;(E+%sc}}Rxr_n6k27Z(qS5tD8e@?v zn@>JYr%b1?pG-OZA~j68+Q?+k52Tj%Mz@C-j=A4{KA+sKqB(%BMb)aSv;^4S9%xce zo7gvc4-mFPc}ET2HXl1@T&7;YW?s|YA^Xf=ueRR->LkytZCU87dspQ%ulMf6rt|K& zvsT^nnF-e&0cF5{GzqFXrP)+Kn|L8WmkQm6pY!9H%u?$`UjlK_Vuy7HzZRtz_UV}o zc;rpqGOaU@-U{V38amA{0ZBwREnPH0$w0^g$B@0&?OzHPSt|_FUcVZu>vb|*TH_+z zJY261UtY?UXSVX5MWv3nLLSu`+i`|zAT0&2r3Ezm04PD3CB)FzRGf_m_FQhP_xxB? z-Fj0gKM7h}F0)k$X$Jj(GOutJ#tw}JaPoOW-z$AA#tsZhvTLDgYC#r;%#s2o=brgs zu?8KsW%cggX_I#s#3ajEbCuZ^CZJIV!{-54+&Oancyee)GMk^VDK*HlsISII->nCY zeNY=n0m#%0I>|C3Fy*PFwZWw+ZcZ&v^`4|P18Jt%!NsXo_y#COrr+KSR?_Rki&OWa z)`wo!k}yo1T2CDTbl@Yl`fc{QYE;IOr(-oqO24Dq>=hXX+45&`%1b!DL0g+6l_DZM z;mee=>*~t+Twd_rYY{zzl;O)AR@pxEhP;sofZ6hxA#@TmRfH1w9}PoNTz9|xlF5}O z18q-Cy>}*;NLd{8S5^nAuf))u-dr>+R@QYb^5^#lVyO*@-@;`F1DclW;!&j1K2b{c z7vtLPJgq5Aa5wU2a_GI(n>GrW&UbLOn(K*rpO@brHh4Jxnmkqe4YLmjjO)BXTdhVc z0x+r1%;mN4XV9RS1uh!3(8HS5Z5JIua$V-lU>A8lQx;eVNeGEAi#D$5d)`ESlyEsg zuXGzURt^FxGkpQ}Oja~LhjN`!t3pV)?DLt+8p1yX4yGm5>(a2QYiBcqZctaLm#5IA zf3aE+B7DR zDtKwfj?abvMsB>NLhgC*u0JNl`J@HGLeOcrX?Uhl$(?m&?cQp<2l<^7FV&@nQryeZ^se z=!rQ~>#`F45bMv=-fzh~S-mH;{-$sVkaUNByH8^TXB#~qpY#|qlJzwyn~ySdSl(S+ zm$;joY<*62Sb+9771BX?GxlSjaNun2dVASKOK-@qTpoWMVlFwPsQlJnEgVOE-UH{+ zc4i9;#$Xux-32!T2_Ihcx9#=S-WKhd$MFZ#^%fAfskQwqGqZyM4X(ddOT0a7Ypvba z`Ff4?pn2;ql`Zw2#JZMtsg;fe`xsH$2R3AX+5o7*Mg&fQ!_W%-2cAG#pidXD$*hA4 znpbxkAho_FYq6^8Y&(_XUVQ^+(?nk1!b%fhr-?SbC4$tkn06L7THprxdazK}UUsmefFiDy=b{k06DF3$*IB6f}@N7EfL`F}x(U zmWHVAR$~n;%i#QrX2}d0YutS@9B~Snuqb|P#-5BDuGR8aaF_;g!np6mhPBR^YASY9 zv_5MiEU&Va?$V-+NcGk^@!ONz0Vprq6mY^kolUlD9j`=&g#4I|-Or2d#J&&H^yu1p zk*|_Q8Ve6>v9x9$0;*FdL7r@Ikb2}0efFYTi#GdDLd0NwpG29=y#EOGHEMr<{PA05 z3`{*tYRnj{8lDM=uunV-%%SVrAxDIn_RZ~n!)q`{8+{II(_Ry1kmVs>6j)Ll#Qu8E>kOpWU7BCp8`} zxRECN^SyM=pAfeL-SS)EFU|sW?ouDX=QQBgx*JlV8Z!VB2yMyM6S+>Fpe|<&{$+pe zFkc2?lh$mxHMdIs)sd(x6=(I;H&11A=N`P~%a@N~F+hpbOft zL_0CONUtylv0I#rEqjt$Oi%osilxpPcT!&c)I4IG_(wQeI`Q>LLvF^{TZ-u2=iR); z{IQ6aPk(^QC$<4Cx1&~t$-b_Jw!-z6%>)Xr=ast)&I1H61h$<~eazAqlV|E9a0|Uv zoyN3AXs;_%FgdJytU7mxYaN)(JKU2dmbqXg4$MPGSA-z4QC4TzYoElG&~6%&T&iTUa2)oYNa&(TuC*st?X_m)2<~c-$`X zc6qgq+pWDZIAka$e^|___Pfn5h-2z7MQ|rgVp1!9Kg9)oazRS(<-wD0-HSk-x0$vK zNlW{g$eE1;*X9eq7WSwuQLwpd>)MG-&n|G6zifu9ITlmhK4p(x-N#dHf`oxmR+o&; ze+}e5czkRf^W4aQ<#ZOoblSS3IMaXaar!(ULUnyt?n3jh)7P~h92W&YQQN7%UH7B| zX7++OuL*q*vG(_c{SKcr%XWdmTVm2rMAr}eNmmouN@qUe=hFR3cH?wibep?KU*JVg zpK*$UO>^NBtk{wvTgD#~os=>l=*pR`0uT@|DVE4uIZUrjzl8Zeh(uj}Me;!c1&1TX!$+l?0q{{$m^&hIcUSD^I0+UhG_e3XK5e&% z4-^THnOl8R4{E6mN!k(hl90{ID@yu_8Q6#lS8+CLadojtnVY}iV0*>C(x=5GT{&JK z)h%+;@g+J;deqS(j=TlvY=6E6LVVQxd>RYSz;u|TAWT?oJ@R+}wr3f%q9ccA!Br(VasW^VrHP#xy zd2zQ=8`y1)Q(D>`OaEfmz>8d3hKY#(Uu?YtbRFIMHr&`w8rx}OyD=KGNg6c`8>4Y1 zw$a$OZQHin*yelE=coU-zIClk_RQIub7tj_?XFHQ-k1}NGU zq1Jcg;7}>Q7PGe4r+c66Dmn4CM-sX>-7R3&)>RK5j+M85-aKarUQl)`UQ>1}UsJZP zHgA?Lqcj0go{kZv$XFz;Pn5*<0=$fEkrfm?9|bvqR@9<6(fr-|MgE^Zzgm`dkL`3U zTYO)hFvM9v*-#!J-5Y~GGI0YZ3DEhtWi{Yr}6uTL6o&yUn6QE4?L$6i!>+On3f z+Qe^z@Z47ftLV*LDLJTu^ufqKlh710fGcr}#02Rxi=(4`tV>Qk|KX1HixNUpv6>FQ z@hwcK_t_7=)oB- zLWC?~04MTPN@GGyYsj}})^T}ai7ZqSyaHUU206Y2_l@#DN8m#rXL6nstUpF1Z{Rl5 z9|B`M^Q||kk9DgpCa=J_2HyOFp~Wj2ATqA?f(GXjW$M-J5vZ!>4b-QeKt@Av;g3Rnl6`pur9XX}9bxIqa2yV`L#xoI?btde_V_!`{kqN3_9oMLzU|~H z2^;%7zZIWUDcym5VE)s{QtjO(e5&|hZcgY(a5rwLBHIe@Z^}B0>@g;7kEgN8V%<_p>9@bi7*aWI z&t3I)pG`KVZ#58+oo)p-u)q0ig0lYu>`r9c0_v%!ynbW&fWPzQ27EmtEd4_VwMQ$I zu3A3P*)dd`w4(KmjX1%`3a1=F3Hpb2lpFYJ5Y;1g3 zb9!-mwY3*m6_it#!+~DkiEJ|a$upl`S=jomcA=fPRPY?|mrK}%iBG=C7BP0Aw(ycu zTpMqDrYra;PLJ7T$o)O@3k5i?#`kDYu<`)m#K3Sn^uu++bf*||XS(NwDUdXDQPw_V zIB>9qH?x#8s_ zNh=p`yVwvwUn3AEPC5BtZx<7;R++W<`m#$y6x7}@Kfk-0oE=E=s{8Go>D8i}gRA@R zt;qw^p!H{9SZws=RGHDfd_|Dze30dvc0bm*H4Z;ewfC)SI`DLxSf^pUjL~EDZdj2O zF*ROUXlkn+xLGVBV!5W?;;A@!B_cnNYS$pqi?cCuUm_%2CkaT14q+pXKYDwE1k|bd}77hKuUwX zJ=f+Dm^@YHt=Pvzpc>M|P!fwtQ*-r5Rgxs`oZo418;jCT@z4pXCeMS(O|pv(tNa{g z{TA^|J%GJn*KLpvy7p&O4tuT}oYIBlYQHC-{%POM!wXV)S=Te1k0(1pOVoLt_#Ox3 zg7&j3KIf5#v}@z==VOy2T&QnMJKU-w&Xw2$s&7{zvM9OX(+Y-=z7N*R=}qp7tv%iq z6anyjsJs3&@APm*5xf7|hP38pvySNfqOw8zQgZroSRPVdg?`PBj4}T#S}0#*`SJ{W zSt%!ej?!_%8TtIA<96lma|f)*w%t|Fe|RXrY1roRk(|})L$igpg{DE~_PL3TO%by3 z9KZ!d|FDH7xApf2=kBIR!J~^vNMva#jb;&L7e7FpJwWWo#IwH{wc}due#{8YsD4%x zogb#*J<=hSQ7zWNX-tZ zI8CK46QFC3q-F1ol2LOH9U1vP83I=|5DKZ`{W0hxvziyqGQ76&R@o_PHra>xK1+U~ zgGwIiN>--gUk34v-3PYK9A1W{IXGHmeijcN6OL3uUkdXCngj0|cJE%W^It*y51sH1 z14JA8S*b+!0ms12Fi*?x$|zf36@9`Y71i?qy8T=XkvN$>K7YC}i+t%K`Jyi~(=tq) ztcmDZQ^hyp9kEv|E(y_aWzEQWGZX46ERDrbvQqpVdeSD+Oq8`Q_WIJX>w2If1*M-G zl_*>mq@p*?;4Lk?{i!mGMhuW4EA`_pGIj<6F%MGNo3=Cdt!}BARnu^jJ?*|9_TLs& zBU1BIxxP6$);YOSQZ^W(ic=%T!m%XMsFZ=|qEejWNQzV3>Ou-r2#iislZCu#zMY@L zx?|HItRiO$>IK*h`j>CI4Z@?xjBgVw=@*I4Bh)CK?;;%_oPfac9`z^o^VyZVq2D%L zhn;zKEsoUrC)M+g2GH~cyxipXzyUnwLlm4C(C^5*=G%WZ{(5)3M}usu z8TxDGD*H{EbG3Tke#C+knWGXeOFJG*A-281mbR%;h|bw8sz%6gtTh#a{_)#phuH{T z_UE+6F%g@*$a92ul)4mD?V7xZ%!@m2Q3>WsGL|@~K#bI?YP_}K^iFbreC533)8aB4 z5XG}K>fnze;B4EN(6XKRn{p^SEM4uKCK(V-f*Je@7DD|c`E#*&6y=zu25C@QutX$V z(cZLUf9tgsQ=Wa`+Oc;*bRU}b#vR+}A!S=7T81onh0S=lc`1HY4a_-sR!;iir`ZZ9 z+Q4WuK(sKEL~%+?(wmx;hR|i4l}~CI6Cv$8f|8iCk_ecPDVo!0HRTnB)6}bylNR~S zcA=mY^^MlLNs(t)3?>+OT29DdN6d!Q00>K0)b#z1wdpA^4^cytS)~C3;)G#7G$NN* zT|a6}-L42}M}g?gJbM@=H@})I*GB}|>Qf-tq1L`S0|QR_icT6WR+7;89p%)pvq%sk zM6rPMj6yj2{Fx4?znerqK&m3VHKN)Vg=|M47S+L8iwn+0#3v# zgBtS;G0ce!c2E^IX5VUo|do^ce@)2>l z+-o+j>ppVhDS*$WPq7-b&^aM}c8&kjflopEIG1naJ6~!XuO4>{<1LQ_15i)9+Dy`o zHPmnGRIQ%B%xpna@+lDvJa*`lU)Kk@uaQdY zIa9bo_xi}o>b$ogS@c2pruGM$$bA#>9#l<)(o#nb(waGyDacY)LQ<1bsyxV2_Fr=x zY&o?}1Y+OVi`}(^N>Y(j&A7>_+e-SKYi9>7E)vO>4vzL5mp+@)1K9&wF=wwVg2I~> zAK$CcuAm_tVDkh*EuHtY_JU|grDsis0?iks6oMD67I^RwqdQa>&%NdBvOhp8Qr@$~ zIhA0;dTIkWTIKJ0ZL7s(pbfWa{bdG==87C6_$B=GXA4}!X8P;-@}wfcpDP*Frs=b_ zeMbK#U1$iUxS>s2yxqj;A`^nNK32YB-^}|DQD|05?UaKwLKN@g?Owo{fCa5O#_{#s za3|-~O&|HXuM8hgoeG@yFHE-c5h}|GNr6-qR#Vcu zV^EPA7DXs}qX31`@PLoz`^tGfEn!t}Iz_MLtlKvNkbesz0CaxBaUcRv1R?;R;xeQI zK?uI36YF_7F<@-!A3!?wIU7W?EV+H0LF!GK)hUdK*c?50)ZHpqU$f2bHu5N1k;PdF z5j458M!WivfN4oMDD4`01Tn=;b1GoW+`db89Jb(|2b_oRCgBZ(A%9gVqb1+3xSdY) z66w!eK7gjSWUL zF^uuGVzF0GZ{*J1k5>Y>0CDDMhF{$m>V}!-tBp>G3>Gru7oLs#T^87dGCz*rQ*a`M z$iEADPk?|mlfGWFUWel$Khm)$B$N10%bI9VQ_sOm+&RkyI1u}FkTjC@bTmRus&&;q z(I@_OIa=doM?-qaJ&kBhahdkkmN5>5T=kTnIvbI;R*;Z2*xw0d-V~rz9Tm}wYdJ3EbIU#y5jaO>ylBF6=|IE>M z3jY@W5B%*uB;#~8s>)eJHSUvp+k$3cX^E_>s={w*9wcmzoT%la2^mJoWT|4wdhtO8 z^zRKcoOB?>CO^jnu7rN{vN_fNF13ZZl_E6BIp%aU#}xC(eFiLp7YABbIcA*37I5Je&mN@Lg>)_R? z;OZ!ID(_O=ZHd0JEYl?(Kaf*Y&MpMSEG)$>l;K+H(1$DM;gUs5fhMoa8*u@oZ7DYAM2hChfGop;9`f$109N ziC+1#9r)Y=ZHyIU_gp)$;2YK2)8|$!x1n~-Fms~XXKo)4ouqDYC+0Rfiyvw1rcrEO z(@qGTekdT#9Cu%AehUv`Nz3Jkp&jZL8fw_ z?nzhQQW$#lU%Uo2sSN>HHGA!5C5l|F=b1+B^ ztHF6T15Cp%aL?36-t=Hy@;!z3qB=IGw5Wt3Q0qcC^bcxf3`l}JvvK8!$gCiv1e38h zCYOirZb$QByg0||5j@r5r3^3HY-;(^)2dOYkWKqDPe1?Y&%~FTqa<(BbTUJse2Pe!{e^JjAiFbay3nC>Yl&1be5MTG zpq4K+xk!p9N~Bo={E!jmXqB9kc0$xwKH z0&qi!z+;;_I@1d_NIx+{6}Ul_>x-kr4#GpzD`<90AjEbJyfr`t<(Y?s2Ny$WJb?^G zrn$p_;*-szmI!B075 zFn$8LQ~975vz@@mOviKWWR-m#E>8O@_J%t*)`Twe_1JohURUFE^z5gVxxKwml zw0SHWFTDt&2;%l95wWnCJ|@;w22GrQ@DY(d)F4+iVop+DQa?{xKmWuD9hyp z-W9n;sLHMFx)4_c=u%1}uI^;})slw9YtTbf8l9>8a882|AcAHM*KlV6Ud9f_nNB^* zh@Ogh{0~c)(ie9TKM8B4+ESXdF~dMv8_VSM9<{?}#`5LSL;1{dy7I5g|ZEf8aYcA0GnE6{ZS^{6N zG`iU01@n$>J#^2pd|Nj5(Zhq1T{AYVJ z%K7Kt3{tT1T0|&G)1jkO0dcqB>vny1c03OZ1Ti3TTNkwuvw%@KdvUXKy%b{Riny?I zO?mNfN#bTpMP`B1NUHjXm)LdVlWS{b?jh*oatlU!Pq{JTNb|=YHE3M{kAZi{usd4U zi17; zgk>P=K>+Hvk^Mk{F)Z=OsQK@?iP*;dse)`On-8Uzx!x(O12Im7p{BpRc!UX$WhFAh z=enC=4i*$XU1^=cUml^2%CjoW=7gixTlCL>o_@hz_EmRTw`^MVPnXKDh=KUCn!Rj- zfyr_`NQ2|zYyP0V5h2+u1(Zm)Wk{+m> z*JRK=vh_F-I}-7rYuX-|A&X1JK+ao0t!%ZDQ0}Zd(_cs#ca^*%VQnl)PbL@HDxV8~ z5eY&#;q!ZNOmVn8<+wb}jrX;JB-9ED73=w3u}1ir+-~KN#v?$UGsY8i-1y2cAn+rC z^~OwKqOHu}2!TLn{H)x?enBStJ3;zGk+x235l6iI-O-|I2$Iuc8h^m(r)LgDhS`u8VR8+TN=*}uvTtV$4QF?nMga92uC|(b(eWTR zYf-K&F*quMNu`aV&yFKTlhI^Zz)B|?O4&;15c0ZjfUU8)b$&(>t#t)UZ5Z#=FxcIsZ?vRwISz}n^HWe@PVz`m{d^aM6o z>qx!i$o{S8S-LbXCn0?llSDILwQ7!Nc{IIRCkO3WuAhVs7$whkgM`MWDca|`JQ1@# z`<-mKu=Uq2mGzf~81{q_9!lPg<=R|{Hq7Qg^{Wk1eiMz;v`|{LI!ah?_PXN?VC4Q< zIuc>w>)ahpmmzHi_cpq&F|ESJ9=aIuDwg; zM>pp0BUs9bn~4LP`V^iXbXKy1eW#b26om5zH8W_zuLwO+-C>&W$+8L@+OYf7ni{eD zpbdN~Cuxgvbn}&C&t&sy!Vv6(g%=`0SXjz-B9oJftrJ;7R$L%4N9BOU_eJW0);CBW z=mbo;wJH~Jd(@6J>9Rto=v)@f4h^;Vlw6i%V(b!fvw4I^rkLA1O(BjGi}@YWTicci z5PcsBo8!a}WS;fzA_d+#9TWZHgqaUZhfQ0{AhR3+^YHWCpSs_sx=L#aMDCq0W+Q(; zVgkO}@2jqqroPrDGL&tWL$#}z`Z?<2Qz9Vc9LuS!M8vDCvL7pP&Ne%9ZuN6~nR1(S zTi+TCH{yL}VrT#e63(prl6~2C`Vo0m#%6pE`r>^eTKMcl;q9-ThY;8ui5Ft#l8We0^t0e>65HI6(#GNiz)GC&0b#_17A_mTL`1UYp?~l6 z?QZ{pL`WtS9cNnf`9csjB@sUf`6lVVpeVrB-bX|v%@-h^hz=T;-eM^cAB#wq>AzLp zsw$F{QvPi*IkrM`wg-lLkNiIfKfXs60SZ-pBIx;C67ZpjWWQ4U_a^?9BHn8`eN5s8 zWhRBT%b7WRt-1}xh2zT*6vQ~fK3RIL-3t?_rG zB$}&kzN2=x;5QT;Sggbw4iS6x&rRQhk(VE{wyu)ok`_FioAX1b$JRh#bAJgSzE;ic zCcD%gwc+x$#>34vh7kM=_t{WxH^`_`WNB?Yug~p1TlsvxrG?cE1ZNlX>V=@hotShWpu+vq!fKc$d}AerT!MsB zO9|r}ki<^b<^VCoX{#(4~DKJi{-ll(v9lr+b^W@?X7Gfd+hGqG6_^1I9BsZIsuG&Sh~zSFE>slbcM0q61O=i0GtzO{IKe z{O__zmDaVR#2q7ZwM^q=m?W4beQ&^jSctN(M-Msryb3r#1qFMS>P57dXj6chEX8w> zeVJu2$g%Y9C=Z=^BHNd=aQ~}7aNTr57nJc%QR@5dKASQF7@=%o7ly^1C(QJP&*bR~ zn`Ku>OBsoPkR1R)S*?gkHXOq7xJ>7^^+o#Tjp&>U@v*hTM@K;n;`#SFR5er)#>P10wEFi^Qxe=UDEpoC3SdjJql~$?%&MKfux{j+mXak@3nVQkSPChgs6Bmv3F@S-JSbe{k1fi;JyHAL zX(swb?@bP-Xdlu7(!L~S#jh>M1($iolVsFSF5s$)h|aT#QD)$-IG85NCTX-!sqFB0uIsM* z9zF`KCqn8|S{q}d5!Vx}ziwT%hbvExXhXXhZVU(N$OI@YQ$>t2#t#I2u&(4mptNST z$Y%eF$N-I9?HjVsGiFqo-s5{U08U3W-w2N76HJ=&sW-Cs=g>DKcSGjwI^V2dq27#d zH7G!KFz%ObVJs0)okG*(z;ACb-^mg%72#B*mnqRVD^Hj#f-n6B;v9+-esM^-M?dTk z-OfzYqY$wy}!-pLcXyDCkpqhnJraWsi1+&BEDhVlSB9W|{J0mVq!GGSyfPXDBi34TjLMY9+j=|y7@) zjGUAGs(YYR-N_rrRC)m#B;3* zN~eBsH=;(Z9pHtjlJWZz2&Z9U$*mg8m6!8Vq*5er))0W-CAqn`$@DR)e+<}Pg5 zT$I3}I0~{Se~eR2?8)v1Ipjbh@$&4~&bXT{Pr`g)b9n>aKIx8mtyg6Bq{sm2&XIYo zC#YDQ5S}?XU1u)+ z%|f?mA+8FW=k+KlG_=V|AhU}KLKKB|6Q_^L)R*`^!D3u{P$0D!tN%il+iEabjhQ}T z)v2MTG$=gzM|vp3POkxD?9->__!0f%C6*{s;L`Xz0_BaV5l9pu1sVypllE&tuAi-OSh5LxfC(KeJuma>*(MQ)bSJ zq_djjkopSaL7kbB*&*He$=5?zP)bm$eKqRUZcldVaB@4D38!(h2jjJ2NcAP0H|@cK z_K)A&{@y@*N_VeOX?LD$)p1I7VNZVI9up-SE6Lucq}7u#dqN>^ygui`W%N{;(=EvB zf5_rOZi_Z@N)QIpP67A~)2dx~ui<&J>htfycLl-mY|g$~xq)>r2l4$96mV_bAol#&*Lr=XO4ERFC$a5G?di=JR(qnAPDM8uN;`S!q*yjn z1F~CDh62i4^8|${m4@k*nV6ZF;Jn|3)L61~Ni#GuWhT+8|BET=&qC7|mNM{3m~8t@ z^BEFz{@zAc8z%xcStBC_|jk&lI*FuKX3j5x~JT#r(K{01Di8(wOD@%Er zowtQ?d#h8}J@bzXUUI5IcKH=p5I7p8IgEn%$QiqoruPrkKCy>;2zYguO||Cj#7$#8 zsq4lRSv}`!P3ytf_H%8Fv8U@J@zLk;!*|<%0$iD6sl@mC^wh^6;^UJp#}LaBYC~7r zd(3~ITn(EX#*@B>kfTAFYZcdF+UkrVhbNc9 z@Jr+!pyHNbrS(zyqKp(w(n2L!E{j}Ls8J0P6TVQm56{hU`seg4k294E^SvqfOW~Im z_P5}J{v_XtPyccKg5?5j%)jlCJ+JT3y8YxHx{uIVA$s?3Jup<)Js{T8Pv3vr&h=cr zJ%b@{7Z0Wjcc;do7y}@Vza&8x2M*+z_PURQQc>V$GPQS*8q=K=m}?lM$AFl(4ik%%p1f-|B1_M#`lM1>Pm#?HNpZxETl_OBL; zM`b@2=>mFk%zJVv@*BXinD%!VNM%r|U@?3_u|Amp_%VTGRs1q$UQoKhX}zocIxVD( zIIV%NmsdN8Fx%UEmE*e0H~sw;lx^np?OM1yefB`+o{aH&at%mh7%$@SUA|jKfIIw- zS*}RaTg#zhy3g;om2?(cY<*x?WShY~2jSJ)SYT&Be5z~&3TML#$!0gc%Y*fHl17-# zW))1RsQvSI7e*ptzOPdO<@`K>4bJS_lufFMcfaGRR-8`g8X6qJzy1o@9{3z%L(n*A z{2l-Oe48k(JL2#X%zU?_Oo+UK){tbg>WpqeEkx){LTfG z!D-jsy&F*%rIa&hPUO#U6G*ktS=P$&pfeCBGG7>{7P)Y~d1w7|{@3*;62Cha+X@$+ z2mZvh(r6rGI>|v(V~rb_t;Lnwvp27{+t?Ox8%m!=4z1e`I1uVuc{MTYAL1L`xtO%l z*0gPhL%c4ErOVN zvebM+PB~JT^9{7+1b)M_-o}kbdXuu_59<-_nhmy>m-xHGqebRw)pL}dqVNwNoxVH( z&j3i$b>Y7LFq1G)akH24(AVpCxrb6bbUu&B+@vDTHK3ha*vRBWGAn;-F;3?}AZS_q zp`bg0)Bbup(j{)SfuNGucdR~*6W|sjVy;hSHv;I?KCZ1LlI|)zE^6MQI95DkIJF^; zk2{4&dQ5xw#y6O2nvN`N!4EEeTV4k~9qod_pPcreehuA0tLX(m1QXIFa}LlXLrT=3$QlW$KHYKwuZlS%HDb zkZk4W&lfk;2zfgp6u`wGu||3$I;lqb*1M?dLMzel?mP`VRRX1C7#cu2G)dGoEo_8? zhHe(W0$=OOO-HqU)J?}C-4ev-8kjPE9y-6g-Oy~@rrIl*GKRQ$_2^poOts}_LE3N^ zD`ArG7JGmsd`0iPyn@_n?_j_bRb??^m>o7;*Z;Yn3CHCX?H4*?Jxb__C6Fq6WYrRN z=qhsC11A!JahT)Nbpu@bY~f?$%B@Cy7_nUd3Z*YO%VW_9F5U}W)KcEV#kX<>M|>`? zOUH<}d@>@zjbEFX&K0?xz22iVvT2N|-Wy7xp%<((Jm1Usop*1unOR&b)XylM)W7xu zzNMWCaTKX&&6%lG|vnHC+Clg3lN&}#qvqpxuOOKPLKjLyITy2-Gi>@bW(0_6z0 z5tgjcBsH#*XyEKO+xMh%S?8kPtLU`$ttCRJCz8rK7 z^6Zb*tSbH{Y^-f`8XvPfkOh)CNbr?eX%#6uVoNiV5psIr1$PQ+-hpu|Es%Z+kG)-t zB(FW^M&!=wRGs!y?0Gwi-Bw#X$^?alpV=o=x?>fq`O)AnJt{J}gg*7MdU1$=fl##l&SZ zAPEQA<*25fL2v7Wr{15;sY0eBKRy}{ALjl^C*0?i>4qZVPBMOOh$dJVsMgQYfL42S$PS z?6vX+jr*DMg9069OS*D9P$3^l`V$)Rbr(0w*jO=hwFIY!Ge-W-=4|T_jHk)90N2oC z)qhz7sFAnIBwg3AV2a`8OmC7^hV9-jf>c*?(Gez?Z3QvXGzox@j#uW9o+u+lA>o;v^td*`&ww`EKot;({7?UxdLs zcBxW}Ss^1eHPeNIBlO9asS=+V7WD<##b4U7>npCry5-)6spE{19l(!A1bqE({XQ~b zU|kTKl`}h}e817s{4ISYcDb$22<=kSg?RZ8u2e+jx8AhM<0d>FM@TC+f>+`(B%x^! zS!lc422SK{{Mzn~T}~oxCj3Yo*gsck$T#dMgTk_cUaBeX4^Um9I!h@&} zv4{EY_$|;HEBL(IfJ=0lA701bY;t8r&_BE@5v9U_A*0a3THOq`?-4&4`Z25=872inYm(n>6N)_gAE2Kv7F>G|M2{evIaMMC$ zZbEV{oBgPgN?CMNjtT*8`o=)>|jBilu))Xa#eMy_;M74X7DTbY1gDi{V0zR6x) zXssjpn;l~^qeBxv?gIta%=hDWPmmhEwpm-Qp4=$2ZfB~lsN0II+iS@5E03HAD}Z|z=gCOzKWkaU_BcOO%+57%cTM>@P-C=;vS&m^ z8}eIT^8pkyD|VZ5@lX8&+a2~6#7>zoTb33XV`4By)m1A8aB~iZ2mgORNFrCz18oArF2t-VS4W4 zrr{Zj6K)Hl4m7CtK6d*)Lw0j09n~`PK7+CaODNH*;eer;_h-ArvAiHnqr71;dXc~I z`IY%=^0Hj}PW+?D$7<1!7?k%?I4wt3PC(+I1is~Q*UI_FM6JAr&Lb37%89U4Om!_{G+G%z5hLoNi1!FP&OiqxExTo z{hil>qIfT^?QtRG#EF;(Wm0z@UyujF>TUudI~k5V=~eX@WVmtfChJ(2!}@6V{wKah z*TJV>`CbDx)4->6sZG;$4S8nyn**4wSv+Jpkf;8IYV^gM1TE2N4m`RA-NqoO>NZ_k z+0Vd{go|T#m8uq0`<+hm z68UI_hg|VKk`}W55;+`=oetu+*E7!QBy1=*(dJ^?W&F%yv1G*~)+Gz@a0_55x zFJKl=;Hln8z9)SOk$B6R*xhyJ`l-CWv*wlNr5EJ{M2+7`m)z4o_qzUv8b^Cvd1f~Q z^^c=Yh_6o(>*3*BKpgx>$Y(GRggBowGd*7_0>vUxcVNB*{=9(jO7D>0pgzO6QzTXZ zL4}g^2k(nm7ciadD<{}AK7ilYws*L=bhd7zV`==s@;!p>?IZPk$j6FThc#fd4QO2J zPstyA0k(5OFntuiR#m{$?jGzGp14|R^^i;Kzz3*^2&QOzxZQ79FZMN>gB|+thSnHy z@}U_~%AC*Lzoq3QqtjdKARLj_8SNy&{Jo4;TdkJ>C<@R&K*-V`R7kwjaoJ|ROA0xK zVPwG4Z!_vzwsjM<9ndo`fdej~V8lqNf#5FS*qa*HYY7lH=3?X7LzKox;qlSg%V3=t->9_lu4Cnp%V4cw?hE}0 zmD;(Z$$5-e!#WWkG15^7S0`J5+Zu^$Vyq_s(Y%~6uJ`oPyR?j3;P?ZAaT_ z^md|#l>m=$2{)F5XbJa9IN&Gr5~xK6km~gl+8zYfXiR(PY&(U&S5v_fL6?_sXF_!b z-o_dG#0&9vz%e~@q9JQ&4q0oW$iDY7oZXp|naM(?+n@uZ{hm=qvX>=v6YjqX-=W7y z6}<8%M>-TSQW6VPvU;L^N&l%NFfC-^DM0)Oz^p3t%}Ft40Jmw^)+GLj5fh${5i5>W zm;Kvx?V)qSU{XO{PvHI=N8ItL81$oZN)xyv{`Dnep6DeAJp+gV;xLIqrmuk`pl^8q z@xLH2F_k15GKY>46MmbQ9wY?|1UbnfJF_B-8!0OjI1r5%8S1&x4=ZVANayU*guB4* zbxp>)k%5)F#l~7taydDYLC*)_$fjQrq`5aS@`)8<6p@WJgJojGGw{23ZSo|ddE!O} zT&ipWKgK_k*cLLHKp^}M{eN*fNEq%n#d0W@WX!KEgbRJLG2?#oUz|ccRt?_kO9tjl*Xa2SJ&z4(u^yJYrSyNn{I&00)2JNXwip`A z+X&fY{|8%4BF~E)>~v--p^xO*-#Gljvs-X80n0rOMDc>^s9=a5b`HH8Mdl=M2#y&~ zTE)U(JW4ug6$+IH$|@cz6{PC19F~S$-}C(ke5S{O(3|m@f{}>M92K4{acQytfgu91 z0h{0AnJrn|eipXa|IbXadP)SBjfms!lVEXyw;NIX|6+fQPz!ft_rkj} z7;UFWFgfv@Cfh0LufM+RUlQ0~DgoR)NDpKJuh->(J8-GHy+0j;(e`v}arQgp(FpY_ zpG^5ZFz5JsJ>RQNrkDQAoVYuFIq`BXl21K#uts73Kvs4uzBX{(s*kzcOMLUOjAV}J z`T5IA6Y+EF8us`t72|pPVfF_2`44B%6NCW0@qz}d5IKG|w&uUm{T1OnNTDh3qh&)~ zzugjwEuSK^QnU?!=AS#*^Y)N0zRu+*Ov`b=sH^%dI$JpO(T5W(-h&Q;3E;RW1eq8rw(HK^Qh#4ecJ|q9 za9P&vCzOAdTB>XB;q+&FHRK;&loG-p&HDTf`uzO>o$#GGhT+YP^mF>9kaD4rec=S* z*NBygpk<2>`n3*~q00F`OCb8uWs~iGm~%h(OW*vgcF2Tu(m(*^T&(ptQU-a6=owvO zStr9Y#(wer@Nl(iGwx|(|E06A7Sb#QWop@NDl#yw7{T~%XiKmXZ2=RZNCD3LUk)8m z+xH+j-ekk$KQ>|WPlg=dG#VqD$4)+X*EdM&>{S!cm}c{G#QS}K_y8srU-OmM~-PWF{*S# zrThM1PDT2()tWDnpG&S$1tTi}mJpdtbuk!vtY_clwQ%Rie_x^(B!}jvsWW5Z!Fs34 z?QsFJ%pX+ zjQzu%U?&|V{zn|0Els4teIO@DV~!(cNNa8ahJhP!ff{8)gMx+|uym)ekWrCot?%>Q z`+L{k1@)jW7E_cA=(9mzP$ijyFqB<{A#CV4Mqjw=_OU~8LiNaS5N%wULGcGrOtts^ zdVKuhtjzYWbSp6*pGcTg>YWIftzs21v^OfNgcm;?V}D7 z`;9A%XC?5>$}Qkb^S_n5LX0oBd)ziyNO50I1sc1YvuTZfa%gC6lc0Q7VHXkx~{3k4{_(Q#oC1b-vyHa zUJFeI;ZmdoJW&(|dzjXKJ-&S?a?Vi4sL*;U+0?OkchurC^$=TXIeL%kuj3Pi(IWZi z^3kSgJeMq*wl(29rXHnNC0U5ma*5h0&EfZAOVAG^ur1?4;yu5cpoP(s9e%`9awIqF z%CK;7vW1L>_D+6ei%*CUF`)u&6OUkK(EBQ{-lvPQ_<`lJVI-(P8X;+cnQc^X6fZL zhg|MlkXq>4N9F2t_>h9_sfY8o%iW?N)_7T}aYyxGDzLb}IM2D_x*c`eVt!hl4kWc_ zderT);D~O&gN4Y&Ls1`R8h?x+((Th(KbHqqjmwv~mpGTzrF~aNu#)`OeZ>9zoK;Po z6ST>SCrOXBBA2$EiU_s9)Sz20V-vxD2t~6RA=)Q4KDXNmD+a)waPWxZu5}|S3vbQ}+-035d1Ats%W=SL&Mq2|otZ&lyJ34_w|z!o zbW^Y9dW4r4F`MfC!J@wGP4FOp9J2m^=u-Sa3owrJ~f;j1TZJT_i{m+N%vm-X$pxmHmt3Ju3 z&&`_7vU?{ytF7m$naio5_n5CTPNN0urnFRWxFxYg=ZQ=`xo=rVn_MyX^L_Z#O6KjS z(e;oli%i~MKGda|b+V4yVue$64Vx(#dGQbQzl>1A=mdcUEIifq8^9#?rw2Zsp(24% zK-fK7Q6^K^H_d{=?ifAA3Yu^q;ZSce#W_|_(M&PLDIYOfV1!&VR&fbRGgiZiWo6>a zRb&>X@KBF8krF0Fa2rjo*6{US$hU7q5Tf=}ijtr%zF;b0uI?^Lfr_du-C@bmTCk*s}CCN7|wkeSj zkA3Zg#B|m-GmKOH;Cg?oFj7j0S4PwZDm_r}>0(Q(66c=OQ}ABj;7srezkmpBqBIkY~k_ zHLCKrJ}F8%2aZMd?Wy`WBO zN_)yY!>kXu=>D71c%Hr`Illa)AEcCXN5Q5K$uR7Ci&eLR0X~hUc$v^4#PT{TbA=-P zKXurwZAliVs(tDhjkmKRB0F^smkd$MZKmwf;+F1s++2>{v5!od-W{VeNO>c);^hMk z*BL{QmNge5yH1dn;GAB|Jsq-LvMXxkgiPAwy9-C{GsIPe=EX7(ll`>=qnN|hA=29f z{W3qbUHOw~0NGe0NOo28kZgOAY8u&Np5sLN_3r!bWjDruymjUN@z#y+;yr|&D$nzX zkv>ezwqZyD|Xo) z`dRSkI$O(kQWurG>0Wmdq)h&4JnRvsRtuQMH+RbO8%#+}rY zxH9)2EHsI2m z-j>3Sn9yhv@LBoXXULi;gF70J``B# zz(XQ}LxcHv3U&NMtMG3_Um)}Sfmf^8L86DsWEMF?f`l?XLn13y7mh~(DI;}-+QC*O z0?7o)?ed5v1i4YjIbA|*DSD5XePW4lXuzg3JsQIU*pHJ;4ZK);tTOf-pndJsw0H?;T!5Pb8@AVGcuZd$r9lZ-3jR5bO1$TGA`m=bDaM zYLUXE2V>GC+DN3g@t)u^{nCl!hKd`D*3mpZaKZhfa`M%bJX8V{4JRNaPeH9rp%h$? z9=dTDkr@!s*q+Xy<(0C&4#0B}qHG!l<`U^hfLc-VIv#{18HsB@0 zG%j~mv(8s%x_9NK(U?!5Q1Bb=a~HZ)GiI{DB(T};IsrNa@P-gP&;LKN-T_FGXbBq~ z?$|rnv9)8{wry*7Z1iBqwr$(C?U^0hwqEbO|NY~=c=1JaS5$T8IaSq_l_!a7Bntiq zgP|9YSi|;A51thZXk_56Unj`vp3#3=MGG=?6(_!5h6SXA&2I%=esseUgb6+csQRG2 zsFMwBcVBOTPv;4KF3v>*?-LT*yE>$Cz*iq27VuERyRY8{$n72hGJ*_2yT^Pu<3@q z$vxW-_=`pK?*918_0#kcWM@F@5Gwg3d&MileLkRbg$by5w(Zq+wu$8pGahhzggm(g zIe)4hPd*u$2Ur31&erZ;h!?vldSbrcoLygoCjh+S-jr_m=dqf4Q(tQSB!dl33eW!e zE=cNMa5wAUEwhC!h!h)Ha)t6H7F!4v)3#v%p>-J|tl!BM+aiEHtArC*MiGH}Vr?oO zqN%^NxlmE-K)cl*|G#8t znJIUYA>d+o!|?t-z|fTo8*-=Mb)+Po@OlfcxHWx%-3<9>XmL8bq*a4`B(*MQIzSd1 z6=>rX-OqssoIjOvJ5Og)OaoFcVk$v4RCq#24Q7k4qCCItlL9+Y`6Rg}uA=v=cy+ym zJN5~VoR-kA+JuzIsE|{mC5Dc*=Q{}ZmQ37Z^ZM8A)0o*(mbeU&9v-(FIi|3yGX=J) zR2p3nF$HM8-IrJ0_*vTyUgC*EV#G@^bIk~l{ZT^#{K}aVL|x4h^~~&ocP;}K3^^@G z?+)V9MD^rs6S97`xKV)q*N7=Kb^KqqBvyb3#ds=OXRTD;a12f&Ji;M_W0|`(N?QEy zS&T`TNtnX|e==gulU-&aIb@0uv~`(BK5flpK8pCKJEijZ|6lW^Qh-Kv_nf0m#BZhi zaY>>A!hclp2bZs`K_JAOczm~W`vomTc^sB||A!&4L(`vK5!dJ3d`5q?4$1Og&Z97q zv$Cma9oeO$Kccd8UtZNL{0)>LAMwze|jw=LzN^hI2q2tZ6u=`8| z2Tb>3fRggF3|Xn@wh)!%b6fhF3|k*1#pXad;!zou_ffOl#NwLlS;^b@V2vaWokt8PgjC#<5 zorttghPI}sXNZX4B^hmn+yBOLD2)*KGDnQb*sD)WPed=69Fv?Q&E;vImK-696 zk|RAsc8ux-(`I7RQ@E^cevh0CRPdS-*ox#Akg(>OlZm`f-!%KQ>=s*No?KJ(9r}>)Eroe5P?!s3uKGSlc_;K`5Au^ezFg zXbZp^Te1oip3!?oZMB9ArMbw!R$fCX=1L3{ymnSA+|icaS}j+mQE-_0=;@eUwK0A> zh1etN(=nktX|K_*P+XOIVH?_)F4dxEIiY~R0)3*|32X`{3dhuI)PU2L55^4)dC-&_m&nAGe}>}YT&pm#0C$!yfyz_L zrUhyxkSCB!%^Yya*b!)_uu!bRXWNi?tnScua~rcNfUDE(NVM8Yr(6D-bp?m?0P{1MXd|AtgJ!( zkGYHkO5Iu+4ubC8WstFnBVpa-b!k5|?<{BDiFfys_TKa}K9}tQ*aTzxL+>EgVC4%f zJAceNQ-pVbr7Xs>o`>yLR1cH{#*7QK`+7{m8q_fh#7?rRPAg&y0?nx~SAQxpHvDq( zI@sl%^`H;*%xlD(qnKU$Yq2rIphbWBNxqU9+S``2@X7<7odKii>}~JyDI!_I>Wu!! zB3|fz0^9tlDn?!&pp0|zAJ5iOH<5OdZR7et8RCYqOQ9EHV$+b=J(J8JAD?RYGiY|1 z_LHxC=^6L7a+{m`a{{k6X2G+HFdAQBI5uRaP?nM*61bC8w+cL$DV);Wt%@+H``A=u zPKoji732a{nfFYotTzoU=D3bwejP$)9VFFpf|3G}92LOIJVe>KuJmPQcHE$+sQ??j z>|t06GtplULeCVTTB}~vqa>k7RlB#u32Jf8nd#I!^{34Qqq6Lu%~F!*1SWL;=Y(B8 z2;elDgXL5IsK|Pi<$`9<6??*R1@aU+fulP~*%N?eGEqq^Q_9Z@7lNh>W%|oet#XSt zB5|4K_W}OTWP}8OlQGv1QGTc`eIc5ZajcR}-d(YFBw;?{v;zCi%)`3Ige*?zsvsK8 z1q1fAVXvi1e}m9Ul3$P`0Y$qZ2yB>in&3YJ&KW)r9k!qlLwquKJ#c+X3}t|{OS$P8 zvKg(%@3a?x&=l35CHne|ZbhqRf*a}02FT!R&1JS{*A#l!7Rw#KtNeR3db9fNdr(|U z9iGeutRiadzkpQ3#rQ!NUAJM0xO0M)kwQmWX$YJ(0}ePt zj?-E_l$>zfa6mho+TN2-I^8PZa<_iK3)#hO4nAEAaZew>BCl~jNtvp~8EkU}^c#WeC6HSt`UDojfo z-Q?`kez2}T$?~){Cj&MbI!odX1cd$W%0x>9aFh#+2h zoLtSH>qpv3uYn;6uPEk~<7nUQ0-dVzbYt6UPu@FsbM0u~ja6~JLUiV5@jc{r)jZ`J z|DyX>RJnI>d4JcHSH+@Za_+6FnMArK_C2%cgn@B;5r&V^0ErlpQNWQOP^(^7?G7){ zyUdTEVZG%JEDc=zoOv2}d8K?qEe<$*b}J7McWYctUtZN{C=aFhU`HPZ`xj_|J+f3B zqza*gPn!B?Rk1(!5Z1&xByX2x`b|R(Y z2=vZ0-lZwLoG_UK1hC&NhqdPJeme$h<}G zB6!<%bK64#``Fl8+D`x9`VsP71gXMKS652cpLhH|++1NVLBuS%I`srBplKkoEBXW> zVv--kOFgI~C#g}gHDZ3|IF-7x=@8aR9!egpa&?4-$pHD2b$Ovp!u;xtS#w_TvU|3( z&mXp;W_ zH!UC6ZvrCU_q&d(OO}&Mz)X1lf*qxHsc!QqYs*tkGlf!zOjf0m{HCa=zoxeta4WVX zI+j3E@U2>;I}=z|al)TrWeyNJC_*?+<8`Vu1ks&0l?iIIscfi7ewZtqnjHbKHxQJ9 z+W+Cuiggyky%=HC0_pn zFndx5(Vx8!$MQhA9|PqD`NiVEcn^|HlUI5>hE=K#Hqm6&HTQ?6aW{Yta<#i&zj@zh zV}#`j7=8WGD=+tbG&qXk&^5M_HZ6*eFDUs;ztZSSOi=m0Dzk0R=QxsFaK)Jdb4r>a z)9If%LyWI^57vW$=GTaeGpHHAWP@PliP=x5%usFTGX1gjTKgRlID=UN3oCx8-(T8o zEnJ|wx{c6jql*Hi7l5VdNP&*#(%%r){*4b&nFg{oNs}TAh)Zn|pL5POU$`9$_Ij%t z%RFP{xWX}bTad!OL_Nr-5=S^@g?D1Mha~CC&{D?r?nbP0Z(|$$o_&Nfk9wjW6l&?{ z<&uYs0&ymvjW9wUzrNni*FK+G8$T$aGi9zIk4tH}7M==E-vI9N@z~vy=8x#^>`J75 zyZm`9I{wxRo~PQq^}-xmlU|D3Z{A7Ip{vf1`zZCSYTlu%OU{Rj?TG@7DYAut?!-@j zbGM7H?J5To!7hIgO<$Us>&`Dwf;IAI^5u`wtH$2hmG`U|?-gFx{U>ZsS0Of{^m{$o zb(PvjTT_p0d%yz6!5fnbF!fKVlRcg4d+Fv;7xs@<@7yhgc8X?p_c{OCR`1p|-kY|e zg)FzqVtGQn^rNHFbsSKVP~OnaE=?Gb-in-CSTc|cR8OnN`~9B=X+wt($Jc+(Sc;>~ zq+7^!=A){~V#zDjLn-z%!h4I}97esDND5u5Tg>w?3;>$6Iq#BkFW%V7H!5*)viB$L zd-wtOoUZdu<9{u+l3=;eu~`YN8r2O6tzg>_L(<%LK=RC}tuk6mAD-cz-L+nrS(p}* z7Z5n=2Y&$D@;&Ve{K$<+bCMSPv6`F@Yr3D{GKpo}g_TaQH_vqj`z18Lq#{g3!ZZ0A zFqs|u_#NPaC*gS*2=11ao0EI~UrbUL`?1gPU*%%i808olXX)bHS*$64XHDn~5a&qX zrLMVd2o&gu_z^HzH5!IG?m*MifLQfnnuK`N5hZnMNmd z_OBE5Wo=4=(t6rdDhL_pft05M&U}j)e!PK?s*zDIN^{4HKQu$zVZ_mcN;Gn(tf6PWjYX31C zA->6YC%HSmibc~KS6@Akm)V{idDnXv4meKh?0YrYlG<0q;-%Lj9@FjWN9I4pE_%ziRUcas-4bafddnwv zRe@Ct68YwD5^_}whj%KkW$=8H{oai=?#|oCoa8*<@tqL4pfZKYm04Rl$TN-eGH-1V z6DP>IpeplT0TK@=i4mtH4P|L{bu&s6%9$vm4Zcc5YJn1Ja-{A5Ox+G*ausc}a%#1i zG%p+{l+230n!)Y79Y|IZ*U8Ikilw7k=Eir@2YwD`MOv6aREOE&rc)jajp|ucs{voo4_ z4DM?@yS_;&YlMi%)2b^xQ5*&`--LK5vhop1EK)7N!|X#RS4q!uV{%#0-9>Z7rN#Y1 zaRWvv9xqNLn$LACgI6i69to`0*#uY!E~Uu`)6)N{i?J+&6)mqzzv2_Bb){GFUz|rn9a?>VyE{I+>zzIQweB`U%r&JJ0*R;I;nhDUlpZ-@ z^yzfR_Jw4GP!#9i+9IS>_xDq59?DZA4|#{9#6wTuot&mRfr#;l7OV}mAH;YVMGd=t zp(}h6Nl86k|jeY@UgPE-@8UXI8UOI zucg3=0R67R?!1xNdyw2~*n6V?e8JIe`xbUI#SxXfqFi{a$s(dT38kDp8#XgGTha z3D|*~N|6bF^n|LFXxTjiH-o4wtL<+oHLJM*$5`19s2)g5;gU<`(aGfZs2-9Yp&h|t z9oCgl`<<*0ASi(8$&l`ol%>GpZ zr1T`x(4rDfpa~Psu~H%>R1kA>hE52r#RfA4^Ru!L&%rWK4dJiE-Vgr5h=HR?+Yz2f z%d?Gc%ldj?OL-(1)PCLeaovR#8A#ij+stAA@?v)C{wV#K<;8!iJlolwPS33i5PoNT z|F7aFx!v2U-AMb*9lXT+>sA-7WLb^Tzl|E*M7-`tM(*K{g>eVfT3yS*r1&%DXleeU zs$A6iBgO@YZR~bo=$_XWFtD1`Kr}JMpYTyHH_bZiFfa@^$zV@iMT*vmAn6?_{>mx; zLcBjzS#I?|?h4d#C1u|i0hFH(sAwlwp!51JstdRwCx|S>r1N+dbY&ipChKhw_5R9( zJ`uQ>nYj|^&yWo3TCOEJPr+`29U)-I^xQ_=1LG3AiwwSQwT^qNF24(m(&__AKJZrF z^rF;x8S}1y%iy@!%!7+li%R;5&A;~lt$OmGAWm2NP+$xc;QG7s+~mIs29>U7%EsTj zjO1Bulg2FeU{!fe54YkD1)0??!iEjO_sG{&*@N~wCGV`SdYGTs33c*BlK04@_c9zO zC)~L>t$P=-Vl7E_uVk(Lp?bi#L9anlHoM#fgq87q4{P-&N#G_`dP%HrvI?UdbVQnV zpy|Lc{lc99h$WING7F?Kn~edaxwKVF5~wpEQfLX}PSmmj;0th=l&F-b4m2R5c~$rk zZzD3{4F(zFa6g?52Gnyv^EbamR0d0Z1&)$ZeDmbLz&uN)D{(6L_(SXs85Zvpljunw zmpnn!YC;dG@?jd4!0|N}iTURX7+{0?No&IKS&NY25-r05DkECUAe4}kz zx-8$wg9R-uo&W>&^Nktr00Xs5Ddu09vG9A(!7OPSK@tI&HUo(H3HgyfRFS@yAeA6h zuj&|Pzs4+SGP-1E%o-zOoK_vvVW^+hXy^sfg?qTmjRh3W_n8zL!#w-6(KgZRE8L8{ z{(yW1zz$GsSgKuiNOaqny^sMoLC)y?Os@UZFZ+Cn&n02~h&9;Y;ld2S7T$895h|&` zbg`@R;|oC2$`cDJwvzRf5-S#z>-{PO)JFXDQY%;{7MX31cLkg6*QE=?O8SS;g zVSwIJ^1{*STgJJ+hIv?ZzRg`eQO@n_x$XtDg%#Dm@H@swyOlHvhV`YF!uOUtqqGC| zY%NZnsg^F;J2iWfwNfVq+78QXe$^JG9eUvZk)JYQ<|SICByemZppXpqt3BcqYn9pt zq;^tR+LPZPyomg8s4)#zt?OsOOa;|`B}OJCsYpRVEj+6TMlJkhaY`knXu+@9(WpbsDm{5Kdri#x1T@5h9h zmR-g~aqWTw5nyW_q?P?V!yxO$;Qqz77U1K%wooj0;x{Mk1HFpJG=m@VDFP^fB5`}g z58$5@uH4_7^M>uiWTRVHIFE75xaUlvWVPwn(a#r7#UEGdeiLy%iL_q!Y{h*!~RFkV66FGmMBE%yDGdyAEp8_F^rx6qzA&UGiBLUW*T8K7AKP*2#^DR zM6sBV7#biVK~&>S6_^Oe^2v}7LT{Hu+zTMq{dtsxD!pMgV$lFmPi!l5W`aalqjUKN zmoRV-Q4Mk(qLAj&7eGscn(GRRazmDdAnDl&`zi`H+BXfm&d8wT23(Om4{W(@+iUiq zfZnYNXp(DoV}r85ZdR5f+gBEJD&eiiMm#DcFXr?RgD3{^6p{&)Lyh`d@$8h_0hFC- zzC&p5d^_o#B{hI%NMGd%wD1;CN!mdA59Eh2pt(L5`bCg-R~TCNruUi2ET5Gj$({H! zd49GLm})PUfZZd!e)A6KVx(SJOz4`uGRO1G--`C(56RE)A7H#a_Br-h2v@}njroun zA3-OMYIvKy3_dTmAj>SHRn=xKYqD8V$m+~})f5M8Dtr{EbVJ9tM|Tb$?%uF;xW4|b z2Fh)>dAp9v=d1F{c>;p|r^^Cv?WHx1M%Y^%4pLX7;;)w7j-G#+)l|j{S6$>?jE&Hl zw>qg97Q}FwB)WGkJ&U48)st0Ky%WGCt3mJurVQhj6t^OCr=Ww!=u{y{StE2J{-VD1 z1ORs@%PyLP=r7vk&%n2!q#eCvPE*n2^sq8f*pw6Du{i+%{1ZcV1@USLM=E?B=&G+x z$G26BltS8+4s;YtL4JXY7>tld71U#~rJOi{26pzfd>UMA`2oI1jkR)y`oCb6buX2$$~QD|aR7z?{ud*)gEvkZPE4&Ws8V$;#hs~~V(;m>h)iJL(4bTO1i^&NFw`1R>Vnw*$RvvqEIw;2PG!GXCoJFB`);nd z5O5IU&J<;!B3e+DG=@2x>o5C*PY$%a9;kbZkqS0DrrA#bP0%mDm(Kuxc zzQtp#INW~_e;^uVgbmN5fsY~QJfkEG!v*3mudKrawXzs_jyR%V)UR@A2OI54UQOHm zNS!U5Hr^+s|MV{M0yML0;Tg8NcWh32-K;uX3|S_pnxB*TEJcC!&)jhPd$$|AV!b>O zuJKGrdfp?& zggnasL1}P_H#g9+kJD07WfKDBJIZ%UMH6sX+A#P=zrTufMZ&W=@36cmK+KBp+8e(U z*P~glz|?!>MMy8SqS*V{==P(+0ayr_uxgXC`V(oH;1w+oTTr~L{#JBc_`^B9nSBgQ zVe}P1)}pjFtp+JnwXqWjw1&$kU>18$!1oD3_J^?W}B??_tk4D=xk#d}ujG~}vN*vGsM zn=IeRjvycaMNu6X>n|E9TqG-}ipxnz2`Dy88IW&F5%mVnM;NVn>vMFe<3%h`Ixo{6 zzka)K^aUl~z~NNV4|=UIX{{@;acE4U%WVYGgseShiNDWY?#jP*|ftoj$N$2`r zai7q%7_Mq3wGOOs8{E+QwGALQi@fH4yRMK8Ft$qv+}OeuXrL5@p$a$UNe%FoRK zz0GM-qY`#vfi`0~W;-yD^I+uPIsS`deMmgtSmM)}?w}vKcI446`7m-nG8DF*;=2{M zDgE<$1be@$ZRZ$J|8b#Q*$H5U#pSiT@0kS`2Tk%WDH|p_CV<7IwbQEO*V;zjUI`Qc zz~QzlBqm-M8Y~E`{>jN(oCOt!!o{|7(M{Q7;-(!h%88#L^ z0dpa_^=EW_x?vA--T;tSnpL460XRcZzJ?B_E{X+wW192xLoOKydjvF5lX(C+*~=ED z8d$7KZNofex(jL9W^}xy1NwJ0%UW~5DbNQ%DgrcI`8;=-_cT>^?&bGJ4JORAHVYbx zEUi6KplUkbLy0WqlEpUW>X|H>(tY<+{SBrJAKxvP&Rr$&OXKyT;dl4f5*n%C;wtBK zPX*Vm*9()44js3qtZq@MGj2}i%4P%fRpe9C_^b8JCW3cov;DgLMd4;Po^2suKxC0N zr5X2b)5{mxHdEL2kLj-l&kLi~-`u7s3EDnT`oN<3C`C?a4e;iokB1_E7Q_583>TYf z)@GP1u#@3XR1?8Qu1lzw$xg!BgZqA~yPj?!HDQxYA6h3(ZF?ycsNQD$ZC1h@e)0XQ zend!H!$Yu;^iEfu#3*C8EaXrDKsB~85?9COzIh~%U3*7XY4{Z<6P@vP6;E1$s#ZDQ z30=+>xELg4n20EunOAnsm?*NC)`S~Vp@pJ~<3UmWO?rI4?3|mh>~uv;KxJ{20!_6t zs;r=F>Gz@Mq)Oul3#?GxBDKBq8;X+dB3A?Xc7>LuY^QXY}UdViMBrHBqql}jjy+_Z0&5&7^1l&u^J<1CBLY*k|Zr* zWFR5=Uv%IrydONBxiNxGjo${Owtr6#yg#u^?^bCSLNrNn5x6u( zN>P{OE4wrO{CNge{1Z^31;ypyvsr9hV~8|#e>>C6aGc4%SqnNjDUHGm*s2{Gh-Ey9 zi~1E^w+!&9t2Dfp-Fj)jLi?OrF>F$IYa+0*Cwy4%mM!dYBJj~vWb2^Tb0yi^oOD`H zv>@KY5b@tS3it6%yrp2V(HsNU+zVV?24F4O3}e%KG1^m0Cjb~RmZvUEr85R&PJ0R- zK>7%O^7Qt9D8W?^PAre8c)=YZ;iD4cBBx3t9>`Jt3QhTdE#z-bMEY=hEtoyER+nzv zmqTDo5V!r1?;KuvTx*;qzq{ETezb5lX3&1$d6C{^c(3gn`?Bt)>uX9bDmiOPD7;UY zJw@PfcWwJ%I|q#XjBCLsZ+q0%w|>CBNRn%|d0#AJ8^mXbMql`Rdqs47(Xk(X%8z-X zE7*ulX#>e(aqBGQY{^X(L{>#?(-SX0Vb@akssYu3d_K?CA&6exe|4K6TOKy%bnxc+ z*6Oy+I4U}0N`!fB7YCTBmONr>g4Y#VkI-eg#J;{9gTQR)Do|)Yx<&^>^z`zscox3f=&0S@JrnZ zL%2aeTZ4%&h3OBR&<{bbSaIlz$HQnvt^FCN0sbplV4>tVmFUiKE8Q~>fX>WUwtlmf zw@`WUxFkSw`Aoa{ed?iI^@{ONL3_=q;zj00!;i)|~e6szx>SOOIoN6)g<&*dX zOIK?LE*Fw$C6hYTSEe$dQ$FXQ^i{=Mt1z#paU3ILg>~DVqJ@L#wiIJhCYqSjkI_xo z&FXEeGu7rqgzF|!vEDPB&iKUvDckSPf>#0Pu3z3F z5o7Y%@K(Ipv+)s+-V&aSUJS^Sl7hfC2xJRP)E8*)ZhU?KH^qHAUJ_6q#g3wHX9(v6 z=yR&4+>P(8j!wNK=1sf=!c8Z+71A*%HfGBV*9H;OqJ=j7p!hh@5IV)QThsSz=dbO4 zkw`7&ui}LOaGHPF_!HEBeUbwB&A!0GeO^|(l?qk~=DK_4y4f9Nj3YR{y5M^b-TELY zb5K@18vtjKu`J+{PdzBUBp}+?eV$c@aAQeZjZdl|i8i2r{dZd+F}1N>L^&#;3OF6; zZAcaEgfCKk0#M#kj@0>8cx24tqB}vY_#yLr5(_?B>^AF74B&r3KlcH4(1sAo*=lAy zUFHpP;ZDMPg_384)D!Awq^nz@Yh&|pERx_hQfBB`#g?wpMKQ~jTV`y)@fhPUyet}z z?pUid)u)NKVp?LTj>ua~H2C`?zKnjFr`#ki`g*3{{2a`#^I6z^R^5H!bm?1bh0MFIU=uE8mX4yQ7v4;GKA(Q>tNYQm%1nn5IR&gH9%0i(@*^ zeX*s}S-7`#W=*zo>*H|Raq)Cj6Nv*CKDf*HNBmnX5mkU__j*YaT~z}fkAWl8?rfVT zF5}%|8b^KGft>h|<6N?W5jZ9(>J(S;I(#?tNAR&M!RtmKz61UumQ{4L`FrhQtOZjP zGn5upa<~yVF+r*a_^ISmhsj6q_*4QoTqJBL}v>kJ-;(%Pf118*E9>t!Reh)CTyNg7+RVP`!<|t48v6=DSi=8WkHusnI=B_ zyBwut2!tk9f89>hj+z(+*u{2#mYY0!^TzF7E=c^Uhvb_94Swf%4@nO(()b$y4L^D_ zyTi91tt35weQNJK9QsJa$DC1*KF|HkVl@&Cyh4FVS+UW|?(E%%cKKU0m=%}EP18q3$-O~kJ75XE5UIs~&i z|B(k@a^UR0vmDI7zv1fX+nMz&0s!u_jtDxFZ=yH*`FBBvc2If~)5LuPLC3}Q{-&?h zyWK1Pn~A~ymtV5J_=P)9+(>o4*ndxM?r8bnNpCW{-)9ZyKQZxmAmKBD7~dRwe*<0( zcMU$k{>|~7I7T!dAYps;L;(C+LJJP#PnZ4JX6@IbgY)Bg_aC<0fQggt$=;>8_a->jzhVnz7C zf%gQql5521bWE-mw+C+hQV!s z26LbsgH)LYTGW!mfRQpGR|%QH(4eng_)634xbqLX2NKBuNVss$JvnrWgyAkgCPHx@ zcYVrnG6lPNX(UZk$-E9WrmgZcadRQ<0%)vOyHJ_NR*&=%K2%Y2oNeTLd|iUV$sE3+ zJ;e{{S$NEnxrB=+~D*>3BvjRouY-KlvnU5@BX&Yd0B)Dss; z=J|OaGr?vHM*ZkD8bpOAw2cCQ%cx!w;iBvgon01_X5;9V%qGa=UbURHhUa;4tNU@3 zpZd!TLW@axuaySF+Syg$)3w%RC&M6VV#tqjw*Q{*N^xc8=VQySnZ)M-4YinA+N_k9p`pNPMF4`Fgmg3 z8#+n~LOhu%@lIDZ+3qiB8a!4#`z zy;}L%aIEh75tXlj0q};BNJiZgfgK{8FeU}QU)Iu!-Uxx8T31SI4Us3KFh#%eVKm4Q zREVqD40lmrd`Fmzt$CjCj0JirVGfL=HKI>iO;n@CGv?$qk}d6l6Wc z^4-|dxMfDtF1mWo&QGZp64EC@tzk6)XvIU63hwiygyXP3;7XwF z&Un1%Ge>1&w2I3gEZmFNZ2wxE4Q6#Mok>r`Y3o*F zx|uDw@2mW9L^>Q_(4dHCL_C3Z$pYznF(HIk9&RH4BRf4NqYf}Fwrq+1C1vGMk=r`) zJ1(cZyCt6;P~J)3Ch_Z(?R1T6lq$CR(<+0nXv*1h_KljBHms(W-LJNEN6y5CXN9K` z9GThP<;OK{#35ZTY5#(1O1+Eo1{(8kChiYCC&yJ;QW94j|3Dd#_*P8c=uviofrAuG zOzQ|sGoI#))diw}pZ(1IB1;xwoHrdCm#%FHO01(MfIIab+SzQM=5vNP``k*w_U|d= z%JjI3St5`IC-9jB8Nah8D`zLtM)s3wjTdA;&fDx4Z5v2Y$1#puj6Ymv6~S)UwEUf9 z;7wtgLkZ_sKnoH?(ziC15oZ&Ar)u_1vIN5q>1OLHpehF6hPHhKK?lqc16v_u@G8Tu zl%0_x0)qa6F%=DJrX?Cu7Uxr3OPeEOp4?_d#1CM@6jD_6m{* zDJ`rE#x#3@#;k~FAL6OvX{E%MO4UlSm$?jb#fu1rsVb%HJfIBLWSZq*!nKMxK-%s7 zV9tq;Qtu>Ky6Tor%+xr#@&5IG^)>cAOT%3I6_82FWIc@$HdS^w8j_+zAs*IirnN74jcbxYJIrN``WUOJ@*B(}dk&pYZ1x=1u; zB7_i+W=pK~{!0yJUns_tM>L~YWjb<3Q(cr7#oANO+ZI=vPi~{d$9>q0OqF#6#N>p4 zGXU4q0P*P0Vj=4tpRAu|@p_fzgEi>7X?}N09i)Lu9xRhhJ=lsXP4#_ZI%u~~^Uh-b zsc3I}D~iG*y2XY~YyqX<&TyTg8~ zu(S2~7v)#|fkFDE7fb$81K!zY+6+(AyR6^O%@}$#%p?Mjy_$DBV=?rtjG)q;EMBxZ zxQM~6ix-={>LHW8=+6MGjt_HgU=>~YXrlb%oo4kt+MSe1}0{Cj5}UaXHaxu!|~ z%umL9HIhEP6I!cJ&nLxh+{Ft}LBMTu_s7K~|Hg}(4af9XwQYAR>lXY)uMTNpT7UD` z`}(cY^E*DDs^`@y8n58Ub$7PHGWd-*ZMD;9{Zo6FMtts5bo%N=$R?wM^MF1=vo&`A zqse^-@xbXu2ZMRa0JH2aH%SOghc8--Ib{3ch;SF<1XKL9sK1HS#!ITHKEis9?wQ*b3H6Y6*p759x1Uj$bq=5S*)G+=e2?@1|QACTRx5;2F?1m%ZQq zqBca1W?oF2+l4t=l}=+Yv;s8$?m}RPA9<=EGDLbB|JcI^B_GW9&hWJEw)8_nYYEET ze6k{icm90@g=K|qc9YDskZ6Q+TBx5T{Kv4E%=_j+S{DatFlzmp{bxJ(2XIZcJ>GF= z$$0K~E-}^uF2h+z%Bs!Y<;(mBO%pU zY-MaiN3yBGQeEpGqvU)Q4wP{8k5Ds#z|C6 zUS{k0^YIEy7ka%J$wohxCkJvYLP^Y<4eFUtC!D|a$QwQ!BZi;^K#fFpkU%uXsxu|p zNPaYZ=GOV}e3E%f3rDcX#vf3srfi;T>b$vPhqO5j~b4bfU;R!N7e;Q18cx4f6!A zY{Hn+&r?cimqK%g^cTsRW4r+X8@P!?#V>RA2}%ZaCzX}U3F+<-Bu9mL(Z#hi0k8Yz z%pJwcnwcuv4FiDlsED8{6&y6u@5OkFVCYeNVV{nX?U!tODpM+%=%pmW8qdG?#QfrB z&ooC`g6A8r#zBH9Pzux)nfjich_8gVj&CYvbrWM(;6evR#i!(&v^Uk!D?&)9PL9|G z@0I$Yq7q22JhWSOZ929y{yk^RAZom_Cy~lC)~bc6j1T~+PF{?hXm`gI8NQo|@N``M?YY58YZs38m+H)|%WE zNNG^DO=Tz+V2q6-eZ`RP#f;6H#!$*^dURSEeI__1uf?B+LJ`&iMRP&9q#f)1a4RSG5%xu(LwpfIL{hA zJS9qc%4%No3&O*~)Ay(p%mmB?b^O%O7)&8OXmouwzvqm^qes@eW5Xd@N5PB-jhW#T??6#_MM?4@^c=tia+>!M=Uy4YwgN@yZ+66=XR5wO$*U9#g=R63bPgQbQ*_ zCmnXwLah#@WbJdF1Pjh3++R$Zu4@`sLSgt;V+}7wZ@S<&CB%$vK-WHsY770K;^4}Q zePHgK;x)tE8Y zG*B958sI&`@w*7oCGx~fU9}@}b z+6of*Tm}FG4uxT$@e(XIkjL_JrcA_46{*yZ0XZY+X2_fh@RR;xh&3!AZ&7HV23v+( z`paD;b_yDIQ9XVWz`z}ymdyZ07QE@wYgdzVqS>4XPn}({@0{OGF^{H<6q3y8gBXeT z)ABOhR8uZ#hBIHllR-z-o z1`uuwa>Nu}1HXC#+=yPlk%*ssICw(5_5vnjS8!AB;Gu7bx4dRcgL7X@5M(~|1_%&d zrCxiA=vjWuNq6cUT5c?KnqiKsHJau(GOcQ1l|=@d-|Hs%El1k%Hfb;|@#Fh^mwnQ}Ur`L1;GC(j@~EtEbJJkiQnfEV#u$P%N#|34Ma#+eIVo+! z4k*Iff8RD*Y9r1?g5Ua<@b`O6nN}sPnpW%rtH#M3Ibxp_=86HV)HOaV7KjNXj-hM(LnkfbZ9$Y1O=FiNf+Rb;yekdVfiR@z>A5sP8oxH*Aj?2Lpc27!L;0 zN8*=LmJQoQ_!~LE@6@VKm6{&Xq z4-5iLh(OeVdphDi);^ZMF?5t*B#|q8Z|%Enxhe^V8kH5`QX@A1rv#odHeW#$70}@@ z9K#jVD1|!%$@vY4qL>}ALoBA@8kNw1U$LA)+y7xgWM3g+1iw!0NLY)4BWwd-%Q!HE z{BOhZ9XirbnQTBKs_yx$=$`-*M#u96dh8g`&5q`c&Wj`PBo}a$pBa2nFLJtn$`TU- z90qR@38X~mgRqByxZ{dojbIJK?@{|%$NSlr0g0GxnP$9BwED5dDd}<3X)i}N+@FM_ z)UpQaY3j*u%=+xZFy$EE@}tW&%p_>Woq_eRw>U5>40j8jBZ70_D#&lV|S{Pt_OW>bgQ^NI>#fqsO?eV{dIcPK8c3MX0&zcvK zr|0JT+2p|cO)`GuyTFX#{RbPwRrlxK+iWa_tV13pGPT>rpc`cv@k&}mSe{apf?({= zHbSKw_^85=?>$xhRaa_*qMbS`&MVFku*j4KX~3@nh`<;Pc6}#Q0K;VfV*~k9n*x0s zYteNmveUSQ^jXo7{#BSq+~#5~ z9c!Rg3mseXO=Djs_Jdxbvvz_Y74?%HA9dmysTI0FiMTO%@`rXbjQCHxA8w<&iOo3z zA+o$PmUI7HP>VKze*4KR#;mA`Cg%Ghb1dDUSp*zmtPOwJgG+2}Tl{I#Bo{r5n}X{c z9|vWbJ1-h2M_03GcCkf3B9j1Du{w81_VfL{NU-XZhfp7#UTPdOc*ZROy<|_!kZFMd zOR&n8Ak0JJQ8LD<^#4=WTL8t?bX&u?6Wk@ZyEC{;(81ja0fOrw0|a-sV8Pwpg1Zyk z-66Ongn#lp?|bj9`sSh{LGZCCJ z0|z~g`D->3G-FX-mR(Hnr78i2MzSVre-7xF&3=h6)$O(K%RXpj?!@9BWmHr}4Zz$O z<4!B?edf~eVm5z4x2XvBC_=Nn;6kWl87W&rv6WC^JCoReHq1KYgX?Oe}y$C@df^<_{+ zsWq|CM*U2kIh`qqn8lC|SQS3bOOmtjgT@J2La1465u(~jrF9pBCf8arJmX~?$@+8Z zM4&9UHrlM4i`o-J+TyA?XBzzZKXm)X;}uXUr^J_d%Z?OHhh;qYn-)Mdp7b`JfL(5S zF1spW7DyCIe*_Wfmj1|sg-giM3nw_$w3O#(MG6NI;|Szj(bx}h$?yEwD4Yuss(zMZ8u zLH?yHmyL9y_><0pbjeT-*~&Ma#wjj6uZ<8|)pO&3^>LmmR8ra?o9lK`u-zTe$0rT% zS}wdB)H!}#3A%P=qB8u!l%TAFyZml^G|sn!5K6WPFuar@gOs8A0A_^?xy$9b)9IJE zX0Y7x$w*MYlAa43r+vvTFqqdvrRdqG(eY7pZ6SD`*9`5mHy1 z;t9OXZy7G4TH@SgJatmsDafqV*5&&~+y`xmLNpr9HVfGn>!@J77Qfa;!Hl?#i`Iqb z{GFjsFqunCeExXO1bw>p3izCf;nsLn$-~53EY{Tf?#R>rO18SPa>70l1=m$FCJiE! zxNOLQ#m%6bwDD@1EcHiRl$E4c%CB!;idnOwmX`2~z9w?Vy_sqK*gctPBbhppHj^g( z&taTL#IC8+VuWBljg4$#SdBLcJMN)yyez6)b|6!4<>-NN-= zV)oUro2QOpTS2zN!==qCtbj=??r5+o=J;^@gCyR(t_lTDk@1YO{agKU{0{C&@q{zv zkTs1Rugo-Y5U*?{9>M&TseG(hn7&e+wKza;IKKet1G8|CXyWaMzWP8RMe{@ONFL)^B(LHg z3){eM(XpfP9Stb+SZ0=rbtYT+3(sPMV_b%7+^H;uYc#~OtYE1VteZ5S)GBjTWBjF1 z%duvmh?6LGz?N~bQ={735sg~Ab3qGQ6x>o@Li5Bf<7O_o4ZyE?HWl%5yNw@%T7D=z z(a;q>_qAMiL>$o}9NU7?)nK?z;Z-CP%?Q>G>Z)u$)ghiC!eh7Ijrs;lPbJQDK`Vj@ zRLJ1qFHDrQ!;V)BQNkHzNnsL9QY_B`8%!+F76W%vaOy6~PQ0v5-jm!J_+R4Ufb~oq zU(yN+G_u1!E)f$_Z<)MXUvVBlohm3a6z z2W8N)2sf;St(Pk9Y)g6-chjUty&%fC9M2H$SHTvt7poEA@==iNITW?(H*f%bkr&}d zfUVtg@OGenht61QW;R})-cT1mc@hDM7YtH}5u7}ucs>4+j%Dzt=X9hz4|Z54QBBu0 zSuSqi(k|nsaie^rapdOAN` z)(+M*Ie5g~_LvT@fyIi3Tf`8^amBosFUydvxkRKc`xcVQPl5E#*M%QWBB7W9DTs=) ziC#jDF`Ytt~{)o+ax`End$%TncBseMq@RX8$aoTNUJuNJe1UCQ~C!nIY!&yiXOgkb)murIFGho$4ke6)!wA4g=MD~8j>}-^AKwWQ61A*~>QvYRbySGC$7~V|s3uC04^>7s29NHUPldT$+@J1{eJIwpPPM)aZN#G4Fg56jj=N@-{P&@PBwKJ+1nyRj4RFFK$xaedu>XFA_cpQd2glo zk(*h&VmP<}uNAG+@_KB6F9m6@eVUai%BU8Ln8I|ZB}E~cXv+Z!Cub=5Dw=Y_Q+>jd zoIV3=bo$=@{W{lz@9l;IvDo+3sl6`D0Fg6KSCdw4M{?57d+D<`P(fklf}rcq!k5`a=_FS z?{?AtAGc-8lr7_BO9=Lh%zL!fZ6VI;_nxm0B>D@gVh zP^lBOtgVF4(*Ysl1zLU4VA5Q)G~&tAkm4<##+nz}Nsvw^+_z3&?AM5w+4r5XRC;(e z$hMrEO2s;u60!(%;)+(anTa3+u^;|_Z{fP*>+Kv1^@4B0v(rj zTzxK`=SI1ivD0i8_wZD0ggyjb8RR#XkwdUkZhx?ylE<>&0TRB_zq9{U&snD3^qeA* zM&6x1H9$(Knwe(VBm(j`L`R;3kG%W!^Y3Fh)&23njw)yGJ56un!w6kuHQ0ijv}MmX z?Dv=3TeHMnj=(v=x&}GEAA0Vt<%sF)0-Sq%JTVVg~xkL-oH9<** ze_|f^(HM4{Pzn>>Z#h3o3x-mUV?1gEC&ak?>7YpH#ofXj7nC<;G7aX}W~w?@vwoqC zf2YaZ0#;Pi3PEOKv`|B4QixzAW-8mZ#{aY#qN9*vSV8l{2q-}_`vEE8ZkO2+Q$dkX zH=HJ%1{Xt3pPDi;_?|DEhIT&bFK1V~`S4F8UzzLIT|8Qrk0G1`$bE$3UmyaeX_>JE-O-vh>Y~?MYa9=$eB$f zQJYhmykc?q%nVH?LPDHFoLR4<(f7*HG@T4@RT_ap)#ii_-N*SjcJ}LEUy`i;%)E~t zjUNy~f7$)OqpvDPvipK=)O}Y|4W`$)*3eOApI9lkau;wr{<^bF(%kfpNT%|P$sVDS zHeFA6cYy@!5F^Yem_Mt})RWZ57Qh`O;s+MCbK> z)+T-1TyT=3H-x(v??9Pj>Lk9t$4<`e<~;}=DXQG{YQ@O;zVu@Z`L74xpI~vvv##fd z2^#6r$;V0llgaO!N)zwFC$r%g1N*cuz9e6s=BNKdc2FCyy)np0ykzc? zJDt{4qHz6_^c8-&`haDkWdlUZ_|C@Nc|2{yXN5t`qPOH`YiBLuUnhp6OwN8WM2U6k z*zLfv_TId$)?{w^f5S^*95-yd{s~da>U<5owE?WL_s6c5EU5NLiFJsIEwzIhR$nFG zN?sS2^t)s`idxE*FKi@`ZD0LX{w(@*i#`A-#5kYE;PuHOh`{K13PFosGry2zV*Z|t zAC12U=qrDpZHH+>?}-hZ5Ix>snyp&F$RDlz6#Mx|FH{?%)l;9p)BgoLv#sj>S3QL6 zkKXm}zBgYEqDdrDX#9C-YDjFDltB>4loZs%LQBBv3E;}{Gi3_{9#(B0yH}TQg*&_s z#T1(?TG@lwXRhRPy)b^f51kEVTgF}A+hyqOpolb_f~FVUBHbGXTKL2!;qJ6A)PM@K z9Nn7qbFIhhGU;du<%~`i^V#dIf9UZX1byxm5lK_I%5Vd*%alCk;UMymXK#M| zh7-R-aU1xd1Vahn7oR_mI1>R&9H;WWeg=7jBi>ubZ0^J;M6SdWj|k9J5uidkqw7XB zGB=MrQhV&yS2T~Dq(TpL13+gB35v42~eo8sj7wzcM+dbMHMoNRMUU!=GBcz#}|FX zi8rI{Z~Bm%9(t0LZ1oZ>7!MEWnqKtZ^S2ovN~R%QPR*bH$RP60Mi}5XB}q@wFA+LU zN0(993dh6=wa3YbngA8W!$Ln1QjD_+2FyoHaLprYX9)bSmaoU9FWJ)#Hco+_>n2v; z>}D@uhzds{HAh)IRH|g&f-YMn&f5(jlKO4_g!6a+I!1;*h(#nj04+*o0uHG?P=P)J z62S`(a2DU2Wt4(}i{F`zXq%Jf=QyEhn3Jv&r~lhCE8R~pT*3e_XA5L=S|z}!{pWn` zf5)H8{`21w&PVf^zXj)mdH*dqAB5r}1!R+RSK(~*55JKt|d5n16`-HXt;hL#3sDl#^NpEEWO;!>4^U66Ah6%^S_2flo%a=7N;^nL){MkJ6bf<|Lv_5 zWRn}nX#M|gmoSTA#Q={YkPn$I0v4hV)I-BIHS6iC6q{lZW7F~@rLETcD<}MRCjdEp z6PuC!7@L;$s6xkoMFzb6zjwAzY20Uce9VVFDf#i8pf@SFM^|_(J^@iT(X5S734}4E zcA35rrT^i|Nc#-<@q815uKi2|kSK9R=VVzFsAxTnpfmxC04;CwB3~SJvW~bvN4Sw4 zXD@YX*&8)=kNtK0bfL}Pf1!FTi`7dko4qt&Obz^!eaw-mYgX0EDO!kai3*?WJwWku zEL6vWD`|~1r!G*tU?FYwTU}rbZF>S`_7bM=-p=rDW}Go7%{?AgfanF`ON?aNxGF_jVj4yQEH4gq z29f(;QSX+ewQT;lB}8{Oo~DxkD+pGY8WHN5N+zVA=O#9z6N5Ik4e~%w%hdhulcTVf zVAyl4?c-Oq_GGd}`N{J@n=5Ow+s(iYe{?v$*_7)2ge7*U#AxCBT15$AF;h>vJ{X{) zJ64SlP9PMKcYFBs28c|0&b|TWz2<9Wh3tSU*8t)lxjJCwa_Eq{~XA9t3A`jF9$T?*H1fKHr#*;wXW|QxesB zq%+0+hBFDLT<0^RV{*~x?mJ?%QxXZk#%MRZd=)OS_6H~9(E^mrmptr#vcMP51+Pi) zkljNOPDkEP=2H3H_oa)>z$9C>CfX)--u>Y%d#4!Oj%%kLW2*}MH1(VO-lqnVko6^6 zD+BAIcaUd>E{PLGmyV2D{nsOyU9Kr%r+wV`z0OtvplQ9}`&->_DyiWoiBvZm!9!Eo zy1Qpfx@xvdyBUm1ji{k~iOG&X#o|c$?$s~bvQ>AoF=$Cj?v|; z>)-lKY|yjB%(nI8G~7=Z{c8wWxAs)Qx$;!-MuFgXedK}(Xy(N-6FBoXFH{0$6#3DVjd&6LJZYf`D-*T_mikl(;)XG=eM%bo z0^C{8;LLayTL+g9kHmz5pK>Gj+ny&#bA%pr8z1~hMP7U@-+qSq$kN@WX0lXQs&!1F z>F}sP*F9OTB=_5|1A5ey4Z8B_Z{^X1G{K=gxg?+UX_i^O^jAFn?8eKY6;uTMD0sRPj$InOIR1th#V|Tq3U#X8wdNWiqKAfiE7N$G(6|s zCOBV(R;j}4XX`agh9WKBP?EOmmI9%uS=0`|e1@gym45rk;GFfc?a!Y;6t5i_3Efrx zON`g*tB-wIpLxd^Kpn+G??YHxH-! zchr+%=)7=Iz97a)s&8+rmtLt42%Wx;nY~72aD(;KDFK@EU!N>cajtv-2r)se9z40x zG020hp>oC;&(1<4W+7{VA<^~lq}v{lidxAa6}5m1bZlA*ZeCD{*x4Mlt^u{N-{Oy; z!(cMhN215xvZ5y#XqD(mQ9|4?NF!lj5W{xwuY0)=QaO{2hnANoI2+ebM!Xj3H$`Dz z&00GO+AjHjK2jRa9fW6-iMV=LVMJqva15pDz~GW(T6wykN0U9cGuY>CydP?O5U0Jvzkboj9jw$;@OUKdh(I#sN=AJn6} zF3DuMGO#};s|28l%+u8Ks_-bl+WwB9n~mp+4MQ-`uxTZpn#Z`ZWNf7)-JnqrbA7gV zR%N+w)(`S9#5`bVK{tcjkRGE{1HdWf&Z%8!pp^S17O&E)#h_B<+UC{+(HRs9_T#|} z4iM+E_hEe1TDkFwa@ESEzr~F5T~S=u6gG0pEPnFd7e>`~WdQeUCm%PWp^^~45rCn4C0yK(GD)TV1Td;^LFjnwYz9+*lpP1OpA^x2wSJ)c zvZA-<^N~11PTR1P_Jy?Ss1p=pK1!~mt}@3>NH14l;;{4?Bl(d1{H?(vm}&ship;pu z+HXak>q-vAI58fZ!CXxv%7i5cyHHI{T0rPL17FOCzDS5bmKMo}a)mkVnDR8FlmPpJ zva5Et^k+S;Hfh~1(n*SxIn{AUp3ZfUvHN_s;KOZiq>sqTA_w8^DkK!|y1Mk6v=Mug z)>7Wg+R}J~Mt&r=@t8s-FwH;cbLi)x!gp(EYtbR}>4%1GlLUwMIz^rk1vF$uJ?^GX zBvge;CRXWGxbV=kEl<#&V65SiJDA)boOl*RVueP7r=T7p;n|7Z#3sW`iu9uL>JlQ6&WZSilF^1p$&Il;e+ z`&N1PG~4_{+!Egx`3p-PmY6UnY z8ZRpisNKa3nudG4=$;-^`B6a(MY$=9(?}{3y>?Di#uv$L8!b|&r8rZ{J@_B9ace6j z>`%TmWrIIVjt^3I8+!C35rXiPG(fI0Y6@g@xUebi;hC#ydSfaFYI=iJqQN)^iq-W@ zg4%k^kNJrs=CpOi zq0Q+mWJ06tes;$WS~V@U#UA6((%-%wg^7{mxK_j96Vd0N@sW_f0LJK{%y5w+6_ z@7(?~btfnhyI24^qOmL%Ei|wA_srdX<8GZ>i=g`Rfr{KilqCOcUcxn=;{#>okq0J3N!By7hfUVQViir++ey(Y zQX4}PqzCrdcX^saNGq~`NUKrK|0S)&uWtT_vwC_w|1W2Sg#gRB5aD>OEvfu^|9&ej zR(Rq0#XJE__`95WiIij>(Lm`s!9W94!8hBXq5Zj5!b&yDa|cWvshhXDYPsd3sqKi& zJ{$@OV!<3~PzQ*X>NnbaPQk$E2&r&q4X)CL%U8-Hu zy#znQ=@pULpIb=KA}!l3+rhgIZJQ7bUj%i9cF7ur|Ne<}dEe}_L8$r}k^I4*)nh%+ z9M8bHfDG1Q5f6M3EH_MEIo^qLwpwp?)5Ls$ypy;PfU%leFb`9r&!>zc@$mveG<%buonZMD+^uI=jA&l9h9c0@y>4`UH zUaLbh1ErQNTbZI6uASV8hzquNyc_=SJp2vfn&i^$JIfFwyLwQy#``zm{e(#RJ8 zfTvqQ{=tL5g2G$Diytwx`y9cuY70;Gmv5TmvsB`OCL+&1$BNmRFThP%)fpgv34@Em zkBb4*&E!M3Qb)zZIi@~Is}(1P4+58}d=s=(7s_U2z`^n{lVo}ZeB8Dq+LN3y844Gv z7*7YKc8OZ)g^N^1^VxBdtcjwdJ@ct=~bBlQBz$qO?6UjRLLRorXfcWAZZgAD(I=|Vc@C**p0W1umsnJei& zc4FGixy!dqsC{hhJ(qk?LPuf!bkKGplYELmD-8l=W#@*EcV`YeIh+4A)?UO@SG+Gr%XSkH#sSCpXuMR~egJ zidUhn>yoF?Ar?Jv8OH(+YN;@y;ED@M2p%|b;*B9o(6c<4?a{at-0*yogq*$L7enEs zXP{?UI^ebmOiUMiG{bZO4z2||1wp{{oO(jA98sbK&cTTk*{KAigy1yqNeG(Nv0Z7Y zVY&oCFqVQOo0>EyiYBR2P7xB1BdLO^^1N7rBuKd*T+}{?h=%1nHlKyO1NRStn*fyy z-&_vu3@qTXG_QG8$2zMnx4?hejMgIjMf`5;&RQTFb$XsIgaZCcGCO_Y%lH&W@V!y4 z4eQIwE(ZHTAITRnZSiMt(G*t3d=#!c;)=>owZ`_zUBo|t=M@rxVnMwptu@EKsd9=g zJh<@93U}VBqQ~lvqlL_3yYKf++BLHdCsno@Li(6NnP8L6ZIB4dR?(FlrK4eO8dd>> z^FXi}PTXdBZXS!*zt_)>e7uiy`pJ*leeoywDbmqE`9#}xgZE@1x6og%9kK#~KT-Zp z>r^DaCf|%W_tmroZOnF^)e%K`>{3BM+4(hk`#Pf6E;6=(xb7raxN>sI{8j!99@&(B zf!M~}=zD;rv}_@l+QIrX%B);iveHMCln_Xnl|o{Yla~@();mSfzjCN(bq9$q`Vs-=~Vly3w9g?X-iZYXzvAmFz_w=tLyDLp+Uh% zu)#UIPj&XOA7p_}kk`6e0dwD%5A~Ps5%Yu1>OQsl- z`07DMN<8A$U^kG?^GLz}i}szTXUi7lJh@YdRLT99UiKUNhxk6^PE*OvaC>2qDVhG4 zT?UK(rT5J!Tn!;CersRByt7QG$}rwvVm3+zP7eej1rBc1c8ILwA_ zK-|MTL+(lVQk5qY9yF@VczfXWGtVYljT*Zy{g&C2mX1Wkv`8PL8Uw%9Q~n3E`DLM= z4hSik!~r2CX)St^0GB*}h)C#jW#3kVxz+j|^M`kMel(VRlSM0Q*^F>i$5TmIUurAe zVIO(f`BQ;ii8j)Kp-{_!eT>f@Mr6>K63BFvF>$?nnm1f5>3;Ew1_GC|h0wc~R_8m4 zNParp?F;kUfcyeT^O+|VDlm;Ojh4~TX0>u&H%p5&bnn!nIaJjo+$7w{x|82g8J&K$ zly0YJM|1IRI6snuKNgOv4(^9~mGf;o4`sU!Gt#P{g5@EAF=9H(6?esBL%YHL*jb)E zACfsM(1aGqMx#nK69Qh431_1O^nH-x4_d-aY5Ut|&G**u0&_fLBk4TUsHl-+pf)tc z4E$t>c$$7bF|rX;hqU}L5P^xtjq)36CaN;6~(eD7!Up`2&Sx*RC)*AgS}udUSyE zO8B9sp2>ifCkqr8-RV!=6Xs++!aDu@>N;W$no*chD5|fUQ8=|g%GNY|!ql3AJS&nF z7{|6G=p^XC5_FVVn(a>5wq^U+BGO4W(mW$HBQ%xmDb9lkvo!ad!AeXlASAj2B*s#j ze^B@(Iey&F0XuSll2^eh#Vu>EuQSAjkur$_g0Yd`1f`9r8Od+D*j%l6sS3+iC@F5i z6NOokp7w5E6oV8&?%$&D_)|7;2NIJ5QR=`n1BrQwE)3FGANmqWG=ZN8l&}=Xuz*E) z3Rp#R&=qLKaL3#`EKDN*= zXd3h!Xla}^m+OEu?3z2av~x|gJML>1s*7`ta&zrAg3Im3J0=DR=7%@==h5FPPQVyZ zSH)W(6ShV+l3SwE_2v?O+U{DCN0A7I*N1lj-ys1@{+)t(S{M8d=}Ng?(}_E`+8=6D zAqx{Bid4jb!#xAgd=Y1dL(Zp-Nv;etcdp*zE>r4{=grWO9G`Oc)f3BY#}>p$+*J=^ z{517`pt|C(cJD1~%xCEB*W>}2Ji*X{-fBxK8eZ@VkcbYeamF(CTuk{6bVG?TRk4CH2Yo!5}{_*#Q4nSHI=k z^1r(JC-Laq!wzgaU{lV_^c7MvH57a-?CD50)S1yI{}BY{JtU`T%V zt|#^TgEl7|BFauePbxDMwmED#It5=my$DvWW5BJ}iawRKcmii0s4S=QsPctfE_oMM zH7>%aq>Tuikc%s6$@@CE?VB%sEa$Esmkh0YtrLON6ImhR+!LABD{R@k+opUaT^;b^ z4R#td5v;_ZHnycUW(;FC-aqj3+Vu`BtIQFIhQMRHH@rW*A4^BX5Qb!mHQjyI!Nl-W zAV@DNPMz&6U{H|F{+GYy;$+|jA$Nlu$k`=V6O21NEK_6Gw~z_si%S8kUCqTV0s#g9wSWX?pWLfY?E8>u-%f|0D2-z=jA7(uD7a! zQFTWZ)uoSjPXc{a#DUh_-aUmQO`%cKrRZSY!guLNCYEagvQ(BE?1!DVtrVWZRnwzgb4O3na!b)tH?%4P3c^EpKay(7dW!nUi&zQE6x13ws*1!fYKwCZ z_!#Wc^~qU)zlFw2H`IwmLrTyIMT-;f610RnF-IgRDmnvMs8FB%Fq)2_51c2-rhiGv zY7>Xx@gJ6t7;b#AVN6fVG7G=zu)3?u-Tj0Tqk#z$q>0f36~ql6O01!i(AY_P<&8@ zIIQzE%p*38>=RGVF8i>I4f$vOaVZzzR1~wtD>!CvlF@6+uMLGdn9fG5ewc~)$FVHn zh8q5H0?52_7t2CunUtQ4r5SeE z`N`Wn@E>&oel}A5of`}n8o*C}U9tgvGOUn{XU)_XX-m9e4M`J{Ajk|GlJrPE08E=9 zceEIu`Qxx<5h6f1imB*cT(DdE7?TMXciCBT27CP^PyYFz??QWPgUU9P;1dwSd^Pp? zqx}RxbxJ8#?!uvAbxDYSqZ>C4^7k6oPd4PAdH#-z!cQ9tJ#H_xp_tZ6U^X_VS`RYN?&?U4HcHDb=5JvVMeXMVeaZ(OB6l@!W=`)&6UHROmfPh4K*FW1jmT+mk{0+b)lHLEk%JH^ewCw=ZC{ zic%uoL73P6;>ca7wn#u9$1e$?F@t&W1|}0d8Y5RHpN2~Ag@4bMyrGoV9}<% znpp{Q0`U0wi#B|O6*EbyKm0Jnvt@jC&)fBlHA?r zRI%Q5g>*m(nmH|rS&jPG3uffq;6S&9l40F!g7Tn$%j#*wMT#NQRI1UKy7L05rqUPY zq$oSh1}Cg^&epVd4X`ZW=pA!iS0_&NYA!=GnUp$bk#`Ml28a&jg~_l!h`&|qytf0s zA|f5qHwfkuwNN)Ww8IW(CiY0&khUZq2Qw5Z#C>((RE};}O>es~UxsQ*^^Rg!SYtochh3N7e_D zogT948s+>@LID$VT}$GTbkqEHd#u zH0@m&M>7mJ#=BhmN3^*W=DX}WC0kfdhG@sIs4asqMC-)exMw+c+m$HCeC1x2cG}Bf zCVx$gAp@*=9Bn+@RYxvs8|H!e-UQLjxX-0Gp*O9%hEWYIcU&j&St3k=juGX< zeJ&4RF4@3wC8Eg@IvcKzEsw{FGIf}9vcakxwgO6ME<;r+OSmUgk9DYb{-%KW0B*so z9ckvZ^9y|KKBQ?P=WSI3hlTHDgLmD*2fR&eH4KZ0Cy(GSN*e!RYZ{JE*V{ht`n}*s z{Cb|kG=Hw&(((jnCMn?gHqHMs;qkW{3eL$?Bk0(;I>96QnbZPklG*)?DXeo8(o^2Be)d(T_Jf?u1+7r-GPKukC=4*&G%0 zmW|u60u%X?KHgDPOWnR0*%l|5H1-u*Dx4VE=WT|IA@cVluV~yf$30Yg-M(-BBY0`R zbuJ;K_5XjD$Q@!krZt4!g0IfcpK*P-=U6AqZtWUz8YAYQY4=-?C^}>gVL*)0#Do^u~nK_Y}un4vqb%YKmOy*guUE(z zXi*=+UCxkG=tY!2)ll+_oqt^%K}tQU9+tZTg&%7Yc!8yt_5Sx?AS<Qs&jAS zE$>v(EoR*y~n-bGh1KI9FR=EGLY=nH1>`#Fqg`JMPKw3E1@N_DS4BD z_vogWCIyPYvVq!|%VH%Ozx(PzW~u5GqiPoA)I3RDDI>hik^h09`6I1}Y6{a(_g!!m zeG~Af{5%)lQFd>#1s^amwmP7ogVb=CwPa3=PQJZt#T)n`aUSbu|{Y3V#AfI@Dmb}K(lTKnkeCiMx zM;h%OR1&xxzav9!2bd;8=R%B5rY}=}9kLf+dAi(}N~KGfB>AWI!D`naFE%Fx_Eplr zd**W@D@rgb{{{j_cL1WJA);gSyJnHe?88If1H!B-3I1*FFlY~PQYH4)yTW+d!yND- z`H5HT6+-yryxVQ3pmdjucoy(H#ZnyjjChl6Q3)XbHEMyoA=qu-n$o_HkgQ#ESwfa{$WZp@GH z2lak`{jbO{MM{4D0HV^#8f^XESGTuhXm1x!zS(LKDmsJVTQ|lXLT?xUTtRUM#7^$} zLy5;j+!O9j%DooaWoo4G(dM+7B!_e-yzIX@gz82jP=huHpmE!q{?=f$CObxrZchyg zOlZ@;4VCdR2f207De-)5fFD%+IX{?%UO2!Id*0rIUY;!LJ%8@H{YA?npVi(|k`fj5 z!qBS|Nr$aN&&zWV4%O`~n$yCM1EGG!+^RwKgX<8@2j#gzgrs!8Sn;5O*wN_${pgBa z&og1}Fv)+GwIhVO2FoFaU0y^U4D>0(#9-Vr0vLbbrX)Ls7H(-F0dYS2it4PY98D}r z4)#uJS=+7=kYRG!b?Z4j@TpvLd(?@+BC3N*_?T5|$|MC)32uh6#bU`ABx7J?P&*hB zZr{qVf7x>0XV;T?uUJP*TH~5)b~Fsx4&Ox5Gz#~`YpNH}#a|3*Eiqz}l^v9Y_m{o} zfGAib#nocKrGRVu0q}o3)hMIXi7LA=eiuH0C)~*Uqm=CsY(HiubhSn;jZZh@wmbOu zlcWJ@MQ7he7`IpFMxB2t%O93X_TZ>0qO>3i6DB8)KGdM45)XX0{dI-a&pm0e)O2N4 zdm9=>y{GU;1qt4JVE*uaprwsPsr@DU zs=#`F>TlkX2Y4BQ#YHe@<=I~|ED(2WO}Vcz9BO;+IeF2GdJLG2ua218l?eQP<( z-r;y_95_F9kY}s14v5e8i#+K`LE{O^A^6;}QNrup0s5Enpu=PE^dgfZ8r>_xx5PPB zACo-gY3wIGJj!=jP#)6|3OiFOHWKLovq_nCT1;}!8cWD%^^REVSM3H=eFa=ewt~@UZB)of{~mpd z&Oc1L=zMP2wH3Fs`6KSs@i)!R%b_BI94P<%YQ*kakZUz+uACZHc}@pCASJB1qu zmgfcX1(PgL%$6V3Jmua9`)UJr(&;cFhUkz%73YVDaks}k9ZK^e9$*O@IV@w|)t>SA zGoRt&NC1M(ZVM}S)JhKKXk%P=7NKxHkF+C|x}R9+GmJ;l4bMws-U!?>0qv+vz|Xp> z^Ki>-w>tLEK*-g~AMM&k27An7OugfR}P24l%gbMT2)3v3a zIgU0tWl_L5|KL|cx)~aM#Lfz!%KKaL_PZjc>bnl9@9RvN~>HN+3!-gKZy$a z0@72LJAt-V*_Qlf;+pVejWo;*SuO?61eH5erW7O&gT{i&!I}|dd79^dbQW@0(lDK# zI2Ltf{!$q%eQ2EVHCFD$;>Sm78DYe)KTX89QTb#olrVrtVn{aOet@(kBxnz;QUr+@%(5f(Z^8;s#{D>7XXuiXi_DN66`?&;q z-NoF0GJpN%i@0>Rho4^qNXsAOJ+oq3UGlZP z2vTyN7%exn&GOcG`ZBoky@SoJTr>O6^=QCH^nvQpGn;8dSAV;^f>sTA!sZdDN>C!$?}0YB(7$zi|#5EdCx2hnR0yeg>RIcQm+Ke#w3MAJ1`E8)8e zDZ!jd90@*X5n|&JsGJyKt*0RS4SK*evK$Ui3IQyKn3pA;%d_6Q86JOwopJmSDMS6s zsO=UEQZYYWMFiRg1MbYwS$F|DK3ySHIR9=fm#~v4xF|am8dSESTZH7{*Gd8bceJ|G zZQqo7V0if#GpZKg1HJt7x9I+(oGB-J$7yH}6l&zWpcavzWfK^WsR7C3<-57FUw>-Z zxuKwRVx5xiXUBB&)d#6~14*ItsE(m!AC7mBM~LO4K@V_ijizkpglY$?E|)5+ec6c7 zRS2i$V9?)NeEU`kY<4_7IqZ>3TWEO`QJU)PGyA-EcKHMLGMEdm{yeV-CNKSdlkKlN zUnei&ip$`BP7nS3{!Yuh-afDfxTacYQ*2#l@<-7>=W zXjbDY=x6sm!qjByNIEgK2r`4??Ixiw8Htg|#JHO^F$^V`UmmtOKH1s}r6lhSb&DGT zq@r!;Au0frTgb}d{;n^JU^Z4x{Z!&jo81M|Q)PHx3b4WpCB zQPFEc!Qu$K7Q~5rXgH_-p54DeY6xQO5;T~6tWDEl>Rs!lDnH13UJe>Ol=49I?skN}{Wqy!W`i^!no@gYte zt{+K8S6D!=?iaC)uQ-y!K;g+C=gjjUjW(l0on$qI|_e7WAq);ZY!QlKgp}>%0~YW z{vd4Ak5^NaddSQYiix6FwROFA83id(Qp*A~aQ;Yx_bbw=W7IQc6w4q?ZE>MOj526G z4G4f=JWuZj1o03BGb{mYDKl)$BnC6=#WmCr6`Mr<=1-Az=NP81GMn4!STNDYw5X_2 zQWrj4lHoGfJY_2-_nI{nlX*?vS&h5g{zV1+Da1e4Cg(%j8CSbcX$V%f2>h}Le?usi zSu7yrFa61{hiDn+dNr#eC_GjeO1!CNqB{Y*&Mu6G)=G!`a=fffyEL+U&)GeGDH!L3 z#J7XOYHDuFLTa@`ij1Mzc;}P~_b?sw@f885@ySDnwzW4Q4V@-~u}_M(xT@w*ZE#|c zE$#~wVGa?H5D=5M<4)3K@YS#Nbl>G)&(7yDv3wfv{0`PA9X=t)g5qapByUIm3O&Gl zN9q31!Z1+8uV18OWAi1d!`| zS)$&jn^Z?>0a8$MInMpd zcuS&+ykdE!9>@Em(&W{!hE60dN&@`xuqqNKV*O5}LJ7my7L!Bao$*1EDKb`aLKC&D zyGjKuDY>0MUr|csaHdP}`?0BmDHT^DSOjO8PatuyS-yA5Dp^u8*8#K~IzEpXeiU1T zC5Qvr?t7CEPtOv=D-pGhj_0x5Q+;j>HdPBNU88>I&pLar;SeE3R>iGU@rP`~fIpi+5-Q;m&m?M-Oh@XxU-?(5RS$NhhZ$?t3 z2038^#hvioe;=5(=U-W-6a)^D`i)RRH}b_SB*?IW*_cHB7zit630IsWV?SRAHD8&P zO;2BIjY-sFjbx-D_gX02q?-T~P3w7nT$u0B>sU9eN;0oP9;x^@3SG;9t9(#PD5Z2l zOWYZ3{6M6rdXk1si5ZRKN1d%VwpJ~Cm!-cq1+VkGOe^5Lm=C=mO1J>8{jkVf{iLn) z``$#fI`No0p2}8s;B)l$E%Qa7!Rec#tLLV3E)>!C`Kd#?dS8&?KB#$skY*le`gJ0T z_o(#C-;{O!8|PWR^GEQcF40<9xTnQj8g|o}?@~B4&YIyW_~HAsyNkc&9U;?E-1*`A zHiv-W62OIj*7(aM2dq0ne=fVv=kxx_v-ACG{zx8`ad+2Ol*lTadUZd}B|}bgAd>nG zWL7Kr0Fkk^2b+Y|hMEt+r`ZmXDZ3J(Z>n7QL4R`-AXA1U?=1gRF5#6dig^;f8y#Ds zw55x4BV{2(N0TZ)nWRx3Ak+UtAJZohhHDV2XHe$4tT2Uvm_%iWOW^wrhq5FcCjy1x ziKBS5b}G1rQ6L#%Buyrfrfn&84=UzBdHnAsjUe)Vv6F-Vwo(|NjqWy`ieZN4Wg93} zZX&<4Y?K}mZ_7g~9Yf*~C@rjqRt&eyx42=I{!DynM9C%Db&k#jg5N80Nd&WZD3{Y^ zRKUCAkmGL~gUPs_xE1{Yrx3+K_!r z<#6ZK$S|@0D4GCxsW5&%I=?2}X^uBs9@x@7;*>K*9o^&R5b(pKD-If7K$@0Bl{>dM zWa3m`<+4iVF8vDesyhuF8~y8GiD^>66V_`4~5j~rw!worAYiOn5Nc6%59pzRN zog^Nh=;Z-FPSOvA6t5DPCKj}!5UcI+F;ODd4iB?x$a&5$F3&e#CigS`%ByT_51Go^ zQ0Q3s0~6jut_Z0)MXunOg1F?%rt)a_Y-Z)%3>Wf(L6%IaY%Aho*FlZ7lcBl7vnGGa zR=KqvSRA|tNY|0<>gU~DOVu;!*QjaPl`7NW!n%RNIc_?dywvOaJJ%`yAVfUj6T_x1 zQFO^-i8H%JD57ESToW-1+aVw8l2-j3j3!LJTlk;erd6RY(&4!&2}3ByL+NO`h|Hnv ze>d$whU|-nmoU{cxV_cshBmvr6;@lWYa}-?D5-|@0`sk}qOQ1mPnr0Cmk*MxV%Xda z$C?6+HApELmfrU{h@*BK7^hqZS{ar}v=k(9rUCM36P53Uv8wN3n8O51oR>P|dv=73 z6CyJ*mkC@{E^2T`59kG+mT8l<(BmsGsm-QjP_IesG~J^G503(q>VpRFd;6!(WrALK zNmrR{<44h+?eZrhey@+TCvB6}y2HDvCmz6O_G?@DP=5VxGi92}{PmlKr!=SLyV$b5 zM4d6rnO{HfRlOtPI7Z@*I1K7wY&k`9$E0AXkPMeW(^Ret9*6CTUQ+mD$PrdUFvF5S z4&AaAqk&9;iEki6FAy?MRuiraM6dT$dxAkMM+U3fIu;e%vf`j|^)g5K3H+2-o)n0` zjgZ{Pkv>0kQQN%7tmDxhhsvs*Gh)eR-%0uf!*Mr{Dh)5`zdmtQ_tzM2c%0&(>!t$* zVOGMN{6F*7{^KmdnL8S&`6TsSvZmM+Q{mm;PUOanQ8NYw#cci6S5pn&bm9-OXRl5j z$h>DC5K%-6-)mI70TKqJZA!xZ0HiaiQNPV%K8~%Y>$0n8A?=R|Rl@y@-iN@3f2d0r zc~D?M?Nv+alZwL{{t0txD2n#IE7)Z#J0bhhZNOFC?#78JTfK=6_S{%xF*?LLUA%D) z%H&W}y0I4`Hg!HM-DTb77vy2@&-J97zFFUO|EZZ+s3E@HM>)gh44Zj)4dBg7@KVMk zA^(&y8~osIbCYJO9fM`80lHZR{{hFvrke+idUQo5+=_Tln}D zPwzc)Acq41R050b+PlAYo zf@Ma*0S!thypxM(i&hFoG_XsE9s3BwvRtsVq@ksV#}w5v(TETVhZ$ zx^|AR&g_8_dLT&4LYdkkcS9I**(Ec9>0aj^qS4MJG5P7EUL1O9c6h;O>7%g3_YccNrH;gKAEt3M_klZ=jI4?XM!pXeiy`@d5<5J3_lh&tX5v3 zB;bRhu+#TJ9cTv<4}@dEt!+~L7=DD6C%I{qa;e9`W17ra0oMhaUhn-Xx!b3o{<7$C zjQ@C)9EN&7%#a9Fka#(lCdeO9p4o3Y9A>%%Hrb(=@l4J!2p>_lg9=oM708CjkAK)O zK{wme@FPmm$u+uPPfZOZzS3xh9Lf1?Rda6497RmRM#eo6u77w&bhw73okOGcOjW+) zbDu&>S}1pU0?DhbD1?v0;~pdlqk}J|{ye3m@w10dOb@YGV}+}B@x5*J@5I`;VhEqt zsLH{d9byaD+rLWO5ZQIJt&~KG;)yroe@?!z6y)CUjYoa+l52A0RA6ltM+UQT4xg@R z96?+mMK|6zzuBuF4M!Om z9_j*o+Qc^_TIoW_GQMRwt>u^yS{KOWam4D;NC}Jn=ci~9i@TzxjYJhWA{9B_gQqVf zi>sDyBc$sS6r~}YA>nSGh1$?IvI%mt$q8ri9E^k3Wan>lZVx+QIXjgOhGk4;O8L@+ zHNf)eUn}ZqLPnKCetPjgvXcJfpI>*E}rkv`MX8bQ7(T{6hm6E)x&=Z2Ld>4cdB;VCH}<Av(O zVqh5_yRHd$$(NTft-tRw%~P@71r#>UlYehQT^r19|7h-WvwBR?y`2)ZsD1#YReBoG zm<2!CjVmiUPK7v0g$@eX8eOrTpFYiCQm**gf>9wr);R#}_D%XYH(eI<)xUB5S|Lb1 zy{Zlf=Qm~ajT}TJ#L&7}lE*xbe7%TdNwD>hbTcKiyJ&tb>YL-*NgvDecl~PUNO`4* zURp0;mcKFkPf_+U{0YSETLlT-V>Zv8TTOgJx+w8`-Mb zOk_J|6o(57c9maOt^a&_?>!PNTd79xqZ$p->`ynBS1%q5LE&(tilI+Gx#h5rcC282 z@^x`chg-JHax7j)TKc3sE5r#lT9%+k>_IjpEn?Bb$tMJP6;N+TKp)pB!+XniXMELiyN$^B({T4NweGi+)Buxk$_ zVw%EOY7u351c&9)!YYTaMR}qj>W#`^(eh~-JA~YPzP>VS9fg#hJm`eRy++$NBy?;I z;p;hv4kC0?g@}}z@e=%iJe|~Cc&DTATFxjTMp0->cx@Saw2a?cKe2bV5x#>hJ>{Ut zkG%MWV$>hwGLoxD8%28BmB&)GEaU@H!Bo(m4Jf3D$CZWypm9A$|2~vgck3&r-#V4B zI+gg=p1XSq>_UV;jz6g#q`i~6K9|a49SWXs)1THDu#P7RSa|_C_UbwD_mIT>O}tw0 zebB8?Gkt7XWK8{tuw|niH%-5?P^FAp4={>7u-nbgi=>}o+;3&m%>d}Lj%eNa!QbE;jID**{%Ocn77OKMy+&~}tht1SRGEr4D%5o0Xv(AiV2Vmtmro*x zgDboCOFe2N6A6%Y$FwnY@l-Z}qU&X$hd$J639Wuwhxd`$tQuAEb)xd>=af^S~?j?Lwp9s{?}K+0lrKg{OB` zQM5z+ZKn!UeEF2qg9Cwv@)ys9cg}WkLHD%?QMrY;yoG#ImLb5>5cUs1v-+wvD z@hR-sh0n`~RT)Q?)S`+xu@i6gt{>~vBa9asYLL>aSWfzl!v$rJQ84;nj# zExY(Z4e(#u0EpRo7EHSs13P+Tz zF4TgO1G^xc7LdFte$;%fkd;C*e_D~OhXTa)IeL!fM_2wyw->s=GRqS>oqDwEO%hr#+C z8jzWM47)Y*N-ZuA%8-x!bai{@mS)xB!tCq+LH8(YP1`c3m8h(O8dKfY_9jTPGI+;O z23;UwicZ0jXbL)uQc!5rru`$bog$MB7;hcG=pJB4nwhIhSt`udS5)4*{QXand-daL zfmLqJ)eqeDupXgLnCp#<5{4DLk+ujn?x=1M8IHsd%1P)NVl8z>61Iuz1!5=Ik4Ski z!a}>E9Fxq5=S2%)1u}Ru*hyq)%R`?W&Y9TwVeviZv!L@l3FAZ!3+TepPEfG|7(@*( z6EUJh6lDTkSED9&l*)-4|1pkU^iFVVfAG$knGU5&zC2oC5GSF3?|syl?LhFm>u%V<382ANVN@) zF0a}Wf<+G?62obHeL8cd>?jUqnxt&kb*&SXbyve7a6r{Z4@|Rn2Nx5jrZJegS`URdoMfY)9paqXxz=+KpfXz6`^3xb1$0U zrdYX6y)8X6R8kN;g;BX}`}3t0zO*HD<+K0xu|s}yKjxNm&^Rb(4-^u7+Ih-Qg&kG+ zLyXYrLcjS6Za?549n@e#YfC`CyAt3;$I;gmash49Db53Jf-!TDIRU|uHL+G4ShRM!hzn@h@U>H=D$APeU*Qa}?gip5XQ=eaFy$aS4byJWdhBtJ9ww?L;^J zlR%vUf#RtIt&1EWY0iOcL%MX?zSplm@#v8V#!u)p*s${{g>9u#TI>X)fQ)n#&B zgLt&m$kQzcko~%0jgFD4@$Io&-+kIgcI9)-b(`xP8IZ}qf73-J89nYHuOh)I6kzl{ z1L%w+e4jg3VYmP3j|Cl=fzlXHDHHbiS`OAn9_{kqM{=GktU5l5rRS3%tnGG91=6Mo zztbhl<-sh*7K!8TW%#+76G-^0RHzpN(5yqH*X`uGY+R0_P|K zNEVsOn8Zc56YB8V4n-N6F(Hv|Z0oQrl8CKX(E}UMd>W>EN#cF8gr`mr6Y13uSJ@?7K*qAWLpIw)5(jOF1xN(VdnoZGpYH`j7hs)odQ1KzR)^ zVR4ijfr0Nl5bl4G*W?v}wg3DJPvr9cI8T>i{i0JMLs#T-PS;(W-sSBv1M$OOy42!N zxaOqjb^WARy^@99!N%^`D!rPjY-O$%9ixO!VPF~#U{p%4zHHn}XV`oN1^Xh1@PUX4 z7elb4u~?|jgbJ81muFP20cIW3*f6y$P#)83ySno=M);2M+|<><7we1pD!C!OFJvdL z1OBz|xrz2mQONg)GkZmh_9F(7v9UA3rHEN4VD#Vb?D)zFna|`76z+*0BCU(g`1k#A z>779(Tnx!a`P0^8@kdu@=8wpZZ$adgl)^@=lJQ33_h}o09pxGU0-+Wf^=6|P95IWUdZiSj6NNgpdF_3~u=JQ2rV9mc zTYBvtrUx5GlKrz~Y!vrbX4i``eL_K3zmZOU;Ga&1{HN0mNNn?Nq{89u(Dpn}r3fZe zmWN=Fm=;8T*WWEh0n1q_^C7PR$5i`;e>z{iKi(+GX^fm#FOq+}m1Ba+Pw?WiUCmIa zU{Z5d*z~t?NM5M4c5f?$&7|L<9G6Hif6Hf27RX1liuy4vVu^gsl<8U(QW&#zP_uLL zf8}g-fP@1tTz+M0#pfCmd6Hd{vctLG!H@4s4RZD00VT1#;|sG5&{BM4Dw2O2E)t~< z9v=cFR}}It7S9M!QJ=}7UZ?L+F!Vber7McG&IDjG^bYTs-s_~3uUy1f$7mtQd{8nw zZRZ{-YyIErmKcwlj%1CS!A6=IXRM|(yJ)D+G@G-nCGIxOlgu}R#@OkXa6>M5*ouZo z_JRiiNd0GoVO5uZ;CLOxvWvn&)r_u1^QMVY_UPP5c-a%sd00c^r0cKhG`a>lB{xcQ zzjy`jW^LUK|Gs-y6htf)dD?ASMP80gaeR>`N)0QPL@TPGVHV#`K(jB}5T86uH;U0vUA6)2}XOq`6Ok{@=io+CHF z;Y@O!Jv1NPydpFo6IWc zSHS5rdSzPVL>j;NMff%4;{yU_Xo=1=Qa>*?H5_V9M$t%tFMQ7K9hcu)Nq)`jFfHb& z5%)E3Cr$lT^6qL{s%u;7+-yUeLdYrrZ%~N6kM%CszkD7S`P&|?1iUR2B>MR0#mr;@ z1b?=;WWke^a}f^gT%xE+C2GO9WRCG~`iXxGko-1N#f(qc_oJjHb`hj^*{ON%YY4ub zz@Q~aj)7*BSSmI^q)-WU?<9XezEW8F;YkHn!?JQ`Q2H&oIeXhTA_r=5US>Z6;L_92 zkNL5xq?rH4wZ(0I?dc$EfjPfyw6NTi9j$Ee^A*b35~{GP+V<+Fvcb1nYzaT+)Bl|t zFJKjReG{zse;e$F!7@e(zc+ew&XA&SurHT3`aEIYPy3h{k74OQf7#eW%Y?IV>~s(!t4=4Rx_u zp>xIoh+Sj@^4uZQbmCDX^Wfwu=P_P(NM+sCPNbSD!ysBB` zMkIHr1%}9ezDHiT`+u|(cMPq9{%u%n&-SWYM5=i8jI$+YhEywEx?VN&-3kU*+@i;s zyXxR$38eI_0P^#e#5OOLzwk&*bNxG{$ox{3oh>rkFOqg^V5#w)#|HZ%dz6)jSjJ2Lgx^0t|Ev4j z0{tlXBPJKfw{};EPAdp6!Lgw{_2WN^n*|axsx~)8dj+6qQ%y%F3LpD@BA%(ommxe|S68xZ~F83x24yOVl2}?y|QI zqXfi%5qE`IWjGu=z*7*a)D?Z@<;;-f2jqCsoFgeFa;BON2z8|Uz zXDn;#Z?E%dqq(I={6IUM>6<3WZQ$XL5RczU6Xq)7#^3H@s|vCHU|}Uozm@xky{mxn zUF{&T&E8@lP>Q8^E|+;Za}!9Y$VFF3e>&sXg~6@R0M=Z=f~8-yW9j|VI?!hcDY11P z8iqunhGz43SrSi$wyU>p1Y0KrpbDcD0H5?O%Ll7&Pl)vE7O+ZiK0Q(PhvBgI%T2gh zl_YG&`ztz2rx;9^;Usrv*b=^>lXdC3If^}C)U2<|1Cq5^`UWcsd6D2Pb8V3Y<*7@T zv*9!S(=l)}3WEx)0DT$A&_|-+qO=+_sa9mmkOFqRsOl$zmhjmyr0*^qGviD{KWTyr z{4!;|PGF;70HMwla!4FVcWX}r@O(YoOTWC^X2IV-wCeAsIZLrb-v^V-LE4|lO>1jN z25*ZaS`g14rx~M(#!lYCZvtV>&4P!%j!Z=h&$&5sT{2)a2Vj~P!l3=$c)|ZE1+|Gk zTyydnMM#WTHyou#7ksDeV00g|sByUhNrMa))aMm5fScEb)GgzX~ zBkPtKcrOZRE54+y}vSdg{JU`24E{>>MuC*g=bS=Zg=SA$yOMIg+L#6;XVH zgX8Es1HU@NORTh9bk8p_WmA;W2EdqIH!7iP70$K?QxoU8TYUmKE zFwJ-}$Y(R~g@k{E-%@`_JYi#v2JT^*U0Y-v-d|x7mx7ZuGR%tz#3pST;Zkk>`TctG+srp@ja6PT{c*WQS#!3aA;4PC;k&Z|r$?fF-q*@*d@_=hx8cQMKaVwyymI!cQ0?p$B6^22o$grHSiGLq>5lDldW`eA)H6Wqq9= z`l#!KLQ8@7scFas;ooN0_n{xyn>^0nx|F#F)xRrHxZoad?Zo8mv>W-IH~kge2ShHK zwn`Pn3n5&@sUv~KVWv&3d3X;LI9nwb@UEy@~7v2@S9 zYT7wNP8#=SgUdz4?majwoOw47jej%z(Gc6KB^fi3*BvE+il^4?0dA0F*EarGtLEM( zzBTnLaA0kzX(dtjkS#6~@3~_R6}TTc5Dg$4F~sL+>#?`x&z?sC&+yVAPDXE0D&a<# zqh%aAi&(hU7l+#4*pn9{9ncX+t_bb3g0T4pWuswXUSrPwgVtx~j&yN2WX#XT zQ2q@TYNc<$)*Gi!2oGuvx&0x@g$5V1kDAhGU@#zBB2W{>GqAfd4dkc$8X%ha)D-a3 zf68*7Ui8g!|Hd=bgPf8W%5r8T?zrX&N(j+mC*@Wp$>>|etQFFHj;M3+B~RO#<>+6% zZ*+}qpbUOn*isdh(O#46JxY-^sePpAoM@E4_20_zmUZ83K62*4{n8!b4mR)b1%~!cPu>-eMfPWT{@U#S?bcWL zeC6Tq2ab}bIn8r`O5_>gG~bfvfier-CbCcJE3GQvCm8XaMwC&Hmz^L1IHCQNM;szjyD z#=-y<8^z6IDRQ7AGc{0M%LEZ>5FBy_=?n#bmC#@2M@!DNPFZ&7@vkh1x$`PR&zp>} z%6V2M5JvyxG`1aBiPheyjm62ka)s`4UgXX{k(&wC#*M5vXwt$lP}wb{hWL|$^5y$G zBaJ5xwxH~s&48FQN{(35P&}LZ+Nd)*qmQesZTUv1r?V1DjTP_-xk{ym54nQ=dy`yq zW=^!zp6iIX!`tT(a#e_q@wBJ$Gj8*!yJs0U+yQvSd@4#{?7^%(@kaQ zr+?(ir7nsi&I&5`^{cAXk?j#zYOn>{3j5Y|iyF2bgM#(5#c*Koiar)44H^6owi8VF zGPYAK@ovFVcgL9zBD($W*iYHYSOh1mO=*U)nOnTXMiU7?PATwGfW(wN!uy?qpM##Sk{^R5bNL;NiKOz@hK zip3JY7kSnDt17QEZ4%4n1(c< z?oS$gw{1HoV?4y{DrzzXelU8D3kYr23oNPm_D)+CVH{Sexii21{!16;sp5`vIq`fp zX#vYaaQ3?ZAx8iS{7}=^J7P#K-ru+wQJ2}vvgaujzwfXMi!eyo#mp`XuKOA%OJG)! z-d}OQMwpPz!IKOvzH3_8?Qa{8f)u1~QLpO2zv%>iOZA||_OC)(x2}*o^D)apFU3|C z23AkT?z`u2H%X%h6GdCPf(^W_MIJ%FH2^s-S-oOMO#Fw4`o4ED3mt;rEp#0R5NW{+ zlUeeH%zC5xRugKS_}fOGiezgup(N8RCPXQLgm~nH4DXO{*O&`124=Z)cKRh93df8G zVWjFjyBc97e-sTN{x?oI?(%_^yRErhnpK#aDW5~)I9n~ zwQJ3`_b3?@lWRAQKOBkQCtjj&-IaC^pB(_X0uG6uC`ZA^JyoYj>_pZA3%*quLJPif zg_Cv9k%#<#& zbPL@9!``A+LsSwL6Tw5AeTSrFXx=Lb9~3j&UKQ4I-R8f%%v1K(B<}w9XKhLwycOmV zvm;WbeaHSkh&;Q}OA7pJ#83SH8Jp4AVC_#~XLkf))`w!YM6ZU*Of)rLeai}zt$@@KZA$4y z#=O6yt&UZ3(y`sKI<{@w>DacltKaY6XM3O2RcqB@t*U3vImWmr zogIY?>G&^4R}7&3tk^%tjhbflJy)ChS7RK(v84c7kXOW*Cxj~m8jNT3x#U_|bSMi;89Eafqd9n|_Dyz&0hi5K8#C!{#Ta)&1 zXpGw^O>9D6r7p^rxcU!jLTe_d*ph{E8rkR^;%LOrBPl>7uM}0I^ogP5fq$2uD$2|% z@jCMLoirPbJt2V*Vx^QiOjae;Vm>L@hKSX{xjQr^hiRk`4YMhBko9kYAMYCT#qdVu zxSVNDIz|4OG~k9yTqSX=@&MB1@Z%*R6pe3$s9C)HFjIX%Zg#|2r~sL)2UbJ z;wJ_jGv5Q++hb{0-W(x7G0g_Z{hi~P@`IU1==6mq+%tFSxIEpdp%SdCHEc||P95eM z3OK33x_%9gzTPsL%QUD1^ei%57cArYzm51a7_QjcruLoH{3dfcBoT#gm4a&Lkx74p zxBUJ{#UW?byb+2ShX~3y>Fn0x()7?_tFhQrfU>v-QPo4?j`yYrxBWMTmpVb%}_X@&YtHK2o~$4x2wL#`j#qodZL2 zsL~c)Pc>`Y-IG5mo?y)&whQr~(+Y^GJ7o+(9O;!YCGCdV;@kmb1pHfOsO#V~7$;sm z#>MhpWg%)1Is0BncYH`K)e;XG zeQR7@h>Rk=A|mdJV`vQZw28-^yi_|iL1(_zG2;Kk?`{1a+QcfnzJdbw{WQ9g{R6=b zpr>lwqAiYlGXge8HfiiN29-jjq0^!bzyGI^zX(zgMKN{GM9LG-96bPcwCM(`?0Bt| zys8l)ZsM(!5R9T@m3ZwUWqy!VSDL`uzXI`q^ zZCLYNflxH|mm6?UQ&7x|7%P8x$j{lz)M;rmbUE{33%%zRoUpEi{}t3Fc%je(WcH7; z_4+Fx_;n2V{#;ggBC`pvZ6oRMD5rzdG+}8{hP!n$6+!tJ%5rES(Q4*Za3s1qjaMi2 zZ}++edD%gVBR4?araYZKVmU`~bC7R5Oj5C`B9 zf%Bo0uqgq%^6L#0hc3O-0EHTm_WG%RuJ7Q=DF-Z`$3Q%i2sJ6G2gv^FZoklZkvN|9 z;NYBc;Jd_GW3#M$v!9g1^0g@a#qbm;yQM90Mv2nFKC6wzXN*B-^iTiPCz8;6A-;n;9f{(aF0@W6&#q_K@9Kv{ zta9Vx~-kwO^$`CFJcU*L@$Asn_PP(*yYG*G1DsPknz6PulAF0LRPIUoSKXFI`` z*dhO-xzhAqXsZvWS30&g&neM7iJ3%mBpFnV#~wE^urap{70Onfqx@S&LbP+n^sg%u z?HxU0m=JIErY^(8I+;1Z1Nb@l7trkzSKui9r)dt2eZN7M7=pjbF@4JyNh{q9T1Dyt zDQ6ki=xl86$t(<$^5?qjNj+3c-h`G=Qlf@8z6(Y5ZRc8}OHWznQfZ!iy-NOUaY$~n zx#j$rDk|YQ?pmFnZ92Z&Ioal6_2Ud4v(|pm4kLI_j;k#?Y=SlFPi zLx6AiD}x$%LB1e_uSva7sU)@^b}`xUH}PqMpcjA(2rci zO^{zGQ?H^EXnqp(^`+Xi^5J-%AK334O7X>ZRS|bFt$8-wajw0Tf9w3+ygu@UTP;N3 zWLVPKQWQRDkwPS-h1brgd{c7-hUlDKcCNbx{ zn?k=Tb6Qq#Dbf%?g2?i?w*-v{9`T>+lS(FmNqbI*gi>^8JC}ulHEq9-Vwt6vnaQDg z#JRC^JATL4Aw#ZNO+C{>7&Q9#sfy5_R9kHBc|gEK7wHk?G*Wc8*%(N)kh-Ur>cOue z;^^+qA%hXX!>tUtwqNOZeLU80zlOJ>h1~U6`!7&NA@sIop3gq|<5zc0hT$y0>tq4c zVHoG)2E97My=5IZ$Es$%u~yR1s!6(LeIN(@e=pgEQ~c#xv)XTQHBLGd@MKb^wu^u! z0z_OBe)s@ZFcXHuA!GaX$X2N!)lW&hBU4N}qWKE3RQxmyWi>|{S@LgKgN4@^9U8d3 zvfKK~@PBs*Ct%&Q7|Sa;3L}P?V4=GHq-Gd;REgz*i2bNB4-AK7fOjFo5@y&|%0R94 zCzJ|8fxp)v{fjJ!3ku^>Ex^_txDxXYjCJ8ZRE$kXvrvO9KS`B zU-N;>d?%GIvK1000Ebf+6OhRf|GcBj^Lj@k*r;dZGed{K83+fC2~`G=!i2)}4_GHk zjJBRi?GtNX1jJ+W1Es6cCQm>oo^0eqP}Z`N?1&2l(aw0@ov_!hUOMIPUkIyQl5tHb zp{yj8Qtf|PbSRn33g;VQF=;9hm2F&R)6DX(sc-0J11cJevsJ$+E$bQACoSu5Ov4-& zvn=ap&DZVf%bgW2s2@ygRymmUI&6|rexHFLa*!||>l8RdKcNt>4Vwe7!)CqW?ta{K zkIXrK2D*@`ci1&8dh@6M;?i0-Ws1lk8+&RG#-Xqg4lH=UiR%|ikI3JTr$Ka@G6I>!E%iqGQt|Uy@L4v8@02J-;G-p^ z%P&YJnt(M@IQE}8UhElB)V$y1YjTk@^MnnTM2yaX4HT+KRYPG}7aLI(tt|Bq97P1ZTl;O zX~D0eQN(qXcRSAp1q2|Wf*B^jz=9#6kWke8x|`bUkG=u@PSAn~+jHIX)@`H4Z&-G@ z(CrTjR&LuDZs|Xc914SiY#4p;^{VoH#sT#&C^+POf8{CTZ2iUM93oh5!-)3Tc(;Lu z?UjYuOdimGI!k*mV=hToCq;TI6^^8?FGN-~BlQ4n-C6bS;eEWZi-cg=I_qr0jm^k) z2r=UvYt-7i{e~hR|KA_fpS+7*yZ!;JbUS`?_tNVYNqZLdn7kXKI1ft4>eAw?>li8f z3sPh9P)ygdYp^1#D3V|9bMqX9TaSSn+A!I5!2kbh>V@%G9d{N{O{;f2gY9xJL>SR- zhX`2fF6a;VaZc`6?3I+oeidEu;A4Ya_SWCQ5?^2+@b}CNCpd`S0#`0fD+h69$hCm? zA)w^?U0`dUiuaDl^H~>D?)!@Bf>*jwZBZ*lB8qA%OftxwHt5T5e;-38_@7!IuNjD> zfcelUM0TRpxQ~V4NgrnZ3eImeWGPTSW|YpFC_|gSx4u_7q}>?52=tVKPQNtb`F?Z? z?LCB%BcYu(q57s>ZAtqzRb;XYL+O%0IM#his@=J#X{WQuQc47(xHmL^XI9*0M__Tv+&mho6vVRwk1otQ0QwTs zP)KqR0=J%qh4*;vtbX8JFXa)*A<*1Q-pu+ot)ah-*^>Ln{tk9mU2LbukCE&7qE^c! zZOr^`^qV2Pm;KJ}x(1@nO3ltAE3Qgb#p&4*fmSbFC`pzCJKX@$4fdTH!TtJJSY^gt zkJeB?=X^C@4+_z{7=cLI-xQ(%5`e>q0~Q9;q7@`3f){%(pBd{^jh|{8BWzUO{D&s> zMjO7AXfLx00Ub`RWHsXJ+^j9?$|PY?2!QHvN5=Fu)$NGSEF%j@4kdbIMDcn9QVoDm zgOdcG|39cfEkg@&DE43S&sE=k#hO7VKnpW!u(o+4N^n_tktO90wdBpcIUhtGjHnb? z-oeY=CJ5_4S5mmJL8LIQi@iiHC1$7yxMVJI4UVsEs5hc$CT_vp-bGwVDviJ`cj&}o zYI*3~PK66XX0z0bqn`Ku?|wkFI00vQU(Hx)qn8qzXD(bPgBOjU=_d~331>GT##vN@ zSDPOT`9Vsty)z_Sh+<%i4&8$QQ^3F36GRAKz+Zc!EE*)cz%uU+=3_c4Q~3t8U0I_I zR9nj8uY`HxZ2>I>Nl%)TC~H`Yw^+6eTP&c|Ef2rZaj8+4Psd0f8=QmgJoD<3Q?0Jp zw0*?*)VJtNR0ve@Ezpm?ua+MWevKEjVvVhH(FCV#@(q(Zg8jGq`ths<%(#VRJW)l~ zkdH_=NZcI^FQda!s5|psiN4Ttfd&Y1nE02*voEsdKv>VH1_tH|lcmJgRE%0rHR` z=Ovy@y^$wiIvJ_EXwGgSwzZK4drNEmk)*;ID%rzX6l|HvgEY=69 zN0G|(LgaWjjeWq60hLh4A~RSD_++My9QqEMpHL}UAw)F^6eIb;;Gq>A+-Zcy0#Jq^ zJs3s{l1J86HI=!llca9G{p7Uipx=HZMoH!a^XR%l%XM+`1*Td=bwCr24GwM2P32cO z%Sphj@e@V~yU{>YiWTZWR5-4$&0$a)Dl56MKk+p@fxlGv1j5UPoO}MKt#H*gu^2@b?XsNbLetNJ( zKzlK$NKPse;Qnj*xDgxEbyVUJx4SJWXVjUfk`s1yj_a!Q9IN~FWeI1Btuw^T*+{ZE zD!~-BZAgWOIZ%)K1bvidx0_0iF4pCqO%ILAHe!4M2%m$6rl!C83W+bBgMJP9DJtH= zW*k`<9W2X!zTTM>d1fj1YmfLlZK}04Y*M5fvX@7OTPBfxKD-AE4?p+``VQiO<-s>*hfj}fNceP*k@f-z$~f8TR3v5ot{5Jp zAsmw`qCd0T*B9t#G!Nub>>l>-d32h3L-xr7!@U0J?DDK~MU#lzROW#&8H!lrV@G&yrrQLZ5luv}uP_K4Y#}ZI7|D5tS`dwtjC8E?XVR*+|LM~<7 z29Ro;DNu~=*IyQcf@sG+3+>IT(yQzrt?6|c5L@h?iP-*FINYILj5d>Ox@ z4{d4!S_{K0a92&OYR?xL1`#Xqt2x~s{=zZ=t`b~6Kv+Fxvv(nBuPE;`X8(=N^S!Lv zZX#y;;7IE?3^`pGEhep>@f4nL2#YVVD!)~9OW;TI{v{9X_tG_O5o+VVW>i>?r&^UZasF;g_8yDg$t6L$y$cp6bh*&*|tDmPzucHBg zy#{l2KP%x!y;x6Zm~`RYEv8iu`MAdYsu%~JQ{&oJuvt7CtAr*o=lVrSKUc?1oqZ7A zl;*g3Wkq;oDW3}3`R+r96v$szu^1+loNEh;m5D~*qxO%gLZiTgIb1&Ao9N6mZCXNED%&E29>{$8>J~l)oc1zCr;M_6rqC>>+Z^L*$gxSQF)xqjmOG&bu$DA`2eG zM4KEvYtttReyhkUnVVE0sJ%hz6Hv3~?*cI_)k+=%E+_*SJqtbO)&gFtaROGPiBNU& zZzD);YwsdJ*YY(XRc=5p0)jb01o1KQHGR|liU{eAB{ml|t-~R-<#!3>#ajS(2mzf^ z`9Ztr4(Ylp!*YGQHfBl7hUnKO8Q%-X-dn+B7y^k@+?Fn^&eLBZHi^7PJ0 zd|xuEyZp#}N-^c}44rdTJPj|0ZC6SJ&1!X&^{-#fG0`D4H{${HvVEJ>V(olL@joVF2|NrV6V~I-+xY{D_ZWrb9*GD{0rBl z!J3cCv~#y^IF3^R`!=db&e$8{cA;%X-QUy}cHbM)I$&u%O_J~?b_@YX7HN;@x>F6< z^68^sj7I+0gRrIe#^-=+Ddcx38VT=m@}<|(!(w6Y_$(nwxi&vreR=r&jTJlQ=S7m= zQ)s8LO#JFiJT2lvtyH-D{(fDX=gz#z9R(gPUgOlb@zfR4ktxFQ_#bOL)cm$+_o}0( zOrD-0&n`aG)SxOQ72$xm0C7~Zc{pBbNv?Zz>4fWYopw3p=4Br=GP9uwgcDi}R5pg3 zpJ*=sW$3+=VQqW|sYg-G%kh{U)f#oL6L_c@cYWtJB#QUE1xKTK%_KY!C?X)z)n|BE z+X@Zv99CUBs!{S499}3yZ-X&G=g??&3k>*45!ltrymk)H6s(h@Wo1x! zYK;gj`cnt~Wjcn9fq60nP2}AW<8#v6b>?J9>{S29b2-omC(I+_lC9SN9kZO>QAu+fa{QUz{%! zaAEScSg^88>st`|25S#pqJvzWeBJ4~TQedr7pF=J8s=C@|xjz%QOSN1<&eJui5>(%8NQaJH92Sktj;eX4cnJFtF zIsi8AcC&w>=$Ue2)_gvQ5Y{d!b2?0Ss#{s2%cPf9zVLSM#xqQ`+nA?->Ze~Ec z^v?9udqM13+VT&Ix%`w&lgjM7b`iQNDY3V56^D)d*jJb-yt*F17o%DD{Xb(2NFa@< zWeN4NoI?&fQR*k8O9Plo1H!FIJe(BZ3+{tn%I=zA8hiJp4=j>Zq~|WgqYDLi*<0g} z97;I!ZDD6kIrGa$+dP#bHbt2TGu>cNN_A+K5`Kiz#yN*tWd^)|NbtkFLD6*;8~8>483UjXvy_S^U7sJO=TGco||?M7s$ zU)Fhe`UM!I^M-QO*9*>3@JHRm#noweziyYJ%5e(xORZGX8=F_xO6Bnrb`qL{#*F6Z z#zz8)&V{K>$5K5eo>&uaolc~vOPK)kZrE@ZEr;Rqsa4!$OwCJ$hsmutTgC>f_dU)7)2ga)F|T|Ae_U@H1o1fVm2|<)G#a+sA~p0WHaJ@`vE|~;@3VgxscT| z4xaqc@J?2OtSSxV&)VGjnUjCZ7K?o#6dMunz!|&bsk-x5lKp(^8TGS)TTbz%mVbQi zhsY$=(^m%DK&qS_1CZ2FH?L_VR|xqqj6Wy4{x?@B<(lRcd4U-5L&QwFK&bQ`p-dE{qXO${8>rUK_>>)*QVHYVsZNPzcMta1A2(nmZm_g!0~Tre6dZT7Y1I zxD#tCFDwWZ&4EA54;`PZl(1IlNT$s*k6&|E$;&m`JKpdG$oi-&VSoinR;aH0n*BZX z%+xuDN9fV1C6tmm%j&h)Wab^Y(X zH1H(a1l*mgH3XKyaEtJY;QDBdeC!R}AF1QN*l|C%|q zoe67?{y5@r6>SpUR!y>M{8MCq1)=@1WE5iih|VGG@&4M}=eh9eWIIAujTrR41NkzE zhN^~}IN>TNVh7kjO(A?4_3RG1ZP{wn4SVv&lyC=he=E(KJp^_Y-Wk&h=8UL0>OOWA zAwLcbAdT6R034x=V9A=FuDNQ$y*>C#ZCCE ztsh&Cd!JbRWM3e6@9B$)ICwj9>Is^C0|b)yfU#3x{wY+b^#daUZ|^C}&I2)D9l6CU zor3hF`=O8|nN4px4-O$&vjthZN!z=u5g<80e78Xd)aF#BFbSGhwGzR5;PK8i zYgk!DUKznGFo-K~wF;_oYG%o*8dWFrJM6}{d%l!J3Yn9yT>j*)%Zp|1t1n5^=CM+C z{ePi6g2$uvp{;nbtuJ5wulxTQur{8pw8J)r74Hl$B|0WUtgME;(&qd|pQjZC6#>=N zQzf0>%`+;WV^s<fmfpQ?4a90MYW#695^WhvL#oOj?eG_I9~{TL1I7l)-Onv;I*ZJ!@E5 zBCe%jL{4ZNUgZ{kxqJ>q#l~BF5?6Lhs%+WW0aYNTQDy*Wx|mi%EC>i{v`bArrXCNX zCsZCZ0%yk9&GyTlT2(y%5F>?Shf&ZVJdeR4^g_My#NZW79RRC+S@GIX1=z;qR)$}= z^xEhPH=_b`>x z$><))Fse;bC2L-4SD`$37eUB*K&wGe>S zkzV+rUf6X>B?7RvjC-oni(h2$qcRhy1$%CQ&~)65$}cf1wc^|ohi@4%&BJwL*XcED z%dX!!{Ntt)JMmGGU6L{CKV*f)UvJ6OD=zG`W~KI|-)eOr3;- zc6D43n8^Kr(L;T%xcYiBs2|3DO;r8|9S>v|EGOZyrrd^h4-51?m=q?AC)Ou3%hMOR z4%?p2WXBB@f&jn(K2hE~G2iumr}r9+j8rr2vxy1@Oymn2v>^5}7g#*!uO+i7y+o~G z{e|s10YkNayeg!*I0Z|?vj4nQwHL!gyLE(BbrYnS{|iXqR$6-J ze~xvP(_C{@=U(ot+n1^rpgB2ld@zm?%TRs&8a-%#LswiHk2)PyRBn1FG7EOsFpKu~ zw)XeIqD}$?P`9^x^rrkNg#cNOdjiRY_$^tTF>15xET$gPbv2-*{6nk{KhG2dbhLkp6(O2 z+My1mYyLBQ@o7PD{0SOdU0ZI~a#TG$tGKu|dVWFpZOE!Pw4rHLQQ@kjn5vJ%dX3hc z^Kzp#W(n#L4@SV4lSNM1`)o)86~u4oa1EN(`P;7EEdL%rSs#6pcLM=qkm2WaW&HOE zWt~=lJTk%LUu+ITadh&Gb^Yk;|3gaZ?}J5J%Kve~p#Lj-l88HnWt)+~Qo^f#;dVjC z13HQ)!uK2JSmu2fK$0yk~BM3Hng2jOtMZ<2B~rQV7EWAE*@vlAxCcdBe#W zqlGdNXoxjXEfD?hU2qa4Ex!3n7A%04S;07`#(}JOI!t&$bC1wm9U_TfBHGa2)L$A# zJrhC0&Y7j4j4moZlipIWJPZr|{K!J4Vd*^@iQ?nobU|L#TYRgA$?}r%=jhB|6Ah{> zdk)E;v4>q>Vvhm^DD-x|%EByLW>15VX+N&6U+JVr)|xv4FMTZ^{lMYGJ(mF#ug?XW z&j%&5T$|ce$J8B-x;J0zOCzwfnn5bpdoO1u4f<3A%i^AcJ&Lv&+oa@%Ef^q9p0-F} zxRYbg8aSD#1Ta}q4kY$)h+K`*D8-T}oQNp&|ETDMcHS7jLUBQvCu!Dwee&Uip+d#q z3mM`jLl+7yB&SN#j0rmR5&-3jLd`{dP*QNOS+e6}B>FYqf0O9<;4}Nc*OTZAcd!WR zTNazXhOlu4hU|`2?aKf$Lodq(SRwHHbsML$y-V3Fa77j+vuEj|N3#LScC;>yDhfC; zA|`9C&d7oCB(du z)%gXeLVAE6Y(r@R4Ek1HT`fZyfBu+3fL9(T8z_4%2TJYyKXQVmSIEF7ua$oMvct*4 z#{Uiu9m)MtSM=2`i1eqvgV)%_JE*={yHx~$jd%ePnj(|&;z26CiyC8n$z$d&W|A+( zz!1CG#af{=P-1sjH@2uRm9o_~SzJHhM4l$`q!=k>UKdTn+?^XsB*08hm_a;8OrdlT;mNa6P4LK znObG;*}_~Iz)KX>AY+=+v2~|bYmgKw8+X6K|I2aw8-TF87^^){LoL>0m}g05cumNH z(XM?Iwkcv_shPFIXhLACxq!M~{>?{1__$f&5e~&KmNRmgMt?aS&DR}|u~uRm1%HvC zSOF9T@?0xu7z%22&Rc75OmdXVdPty-dl4ZSAYX~FfUl#ASw4ayuy3f3h_ce}wPa`=RMSIYD>s>*&a|VFo%^;x9VI`|X0VQ`MW0xgVEU)?=G(_K2H3kW%Y_u+@9gx>5ekR%J zYU6x-Cd2R>+ncz70dn?_P9GQ7&E7N#i?4v&F4V?%=ZSoQnS`WQ#7q}?p-Z+kTVw7X zo7|i5@kItq@D3#@I(u-NJ%}w=3t{c6sCZa`1plVQZ#o+-r3(Q$wF2*~0BteW|GcSs z!58Jz%J?*=p_|HL4PWK|K%D=Bj-PogD^k#N%DuQh1PQ#Gi6QO%?)Leox_sk%auRLo z;PQ0nUS6KQfd%}3i!Qs^PncJGMM@zv8Rg-oyiuw)stp&bSvjFRmKj(OZA@nM7j`PuAJ@2*cOSJHXg)pE z^3ugWw(fD;QW^kv!w7e6PX{d)SHmYO8|1^aHEx@RwL5QmH`q2q;3Kv-@>d%j(O?l) zp5+QTM$!&~8gSyncd`XY8ybly4ZsRx-31~Wsn5(LdtXXu zbo^r3oIBb}*nYeRj2@jlEWTjW9T9GcVGGdA+o!+@D!o(kkB1<=*$_VFL?gZ7b=(@0 z$>!yNo>|))cPrmmwN@5EzKohvcP6soJ~(1`w|gW|oa9?1`lthHK5VUyuc1})S`nxI zI^(7pD+=M`Tw1YbjpBHy3*%jnlmVZPYz!2lC1}X8;Y*hK1;VzUUQijr)5oCnyAaLr z;&IAIwO2=wAcGE8JPx@QKW|k~PCduwu1jOo$Y#6L6r^E}xql%G7(cA4tX|8dH~QSF zze%8-;b_E5O}{GPvrjZ&F?H+Zp8av zRE4y2h$Vb}C(UCpmDl7Rer18k4E{*Y(>syD{>4upb{P@|uD{O%p~R+xs%Vq-%-oE{^T!mX9xOyl^UxG} zSb*{88ufi^O=rF)m=|a{<+e3!zcvpkg(lOEVQa9hV27mIKd*Y($L=sks(s@O`49jO z!(?>MKh=SBMYQI?(yHvkaNMV?+L2gon^E9_rjEnL(qOPVaOl;!9tpY+F0uq@qjjbYAeM^Jr3P@S#0`?jAYS;cA-ULUts zAB3H{BClH{(06i{y+b0(4h-5nJa87(zJ5;%Iw}E4vJ^qiIW2EnUdb>J`J&eSf~L1) z3{pIX@eB)}MHQ8TAtZGP-Zc2w3m^}!v<|BT!OKZqDO1;k;NsWiTVGVqc^bPdN4mSI>0)c-;uA5xrk!<~U>`a3o+In7f7O z;B!aDLyASZ>x|T4WHIh11ph*NclRH-GWqxa^wepce|cmWjp4H}<}*#Bi^P;3WhP?P z=I4G?)39XJt7m>+Eva&k-aQhQ5~GAM1b~LkK18*J8E>eGpQ^oF-ZhZgwDA~^wQPH5 z`J4U@GtZr`DB-kh=yzQBi%CP_S>}~$W88NfOa5dy!y)a~nYkswHrbtE+u-o&OcfB5 zcAzm=83Khj=jaBAG1-}PlJe{T1X$;F$h9VhPLabZSNaEll%p* zU4k3%9v7MhJP9c83(P6n0gB(sxUo#@enr+*{g?QS%di3rlKGM^+m?cIAqGeV^14Jv zijW+eqE-Ct<;7;u@M=zcFq5kTV$b0|)uCSLbnx(8nopwR1D?!N=TD>}hj*F3H{n~m zS?hzk)rM@672p`NSa-FrV{9>Iik#Fo?ojWS;^||!5x|R;ibw*$qYF9&4QBVLmYLVs z>jH)f1SYBfHEp9lu?z9M=cQGXnpDpJ*KSK^g3@|@BHPYKT*gX1;kL zGU97<5;LqXYC(@Lg=x{tN*R_^;Nc$mQ?Cdp1nU#+uu4t4JLCRAW9ZXV^!)7ZmhMihvL+T9OWBbl zqF$GygE##U?hR-_xIzTen>=bi7qn*kynS>hK`W#ja8#1s$#p4@=tYMg)!8>S{yqY@ zN{cIuOhY;vqq*;i^D|@E;kMTWHQ5~6Zx5si35&sKv_9`EEvlH9&Ne#lNvpn9h?@`V=b)cQ*ac`&eijR%0=HWxz}g@GVk$y1#pWKfPO?P8^@FzPkfpqm9Jq zar$Kez?0!KT&c(F8T6bKD=^?i0CX!~Df^_#Pn<5!D_x({A1M;#L z0Mo8~sk8YuGehDLMw$M7oIqQeqe;ORw)(c@q7+Wss)P03nr5FX!lnlRw_{c(Ou3&c zb=F)gCDk<9oOu~l-cJNXic-W79is-+6vCAZEW-~J(ZP6N5CM!c!zs4OiG$0CxO$*O zWxnK;P;MLk@vg2o2b=8?r5O8|rxWt^JMv;-r9%>3=Bv{z?OU8oLSbZQHB?UCJUW>Q zBJ7{j1IQb?-9^7z1QJ_-A^(&#mL(!)2aP?+Z;)8^NdM5bM)x}uRHyY&=YaD1RRz1b!Zl{3uV2$k`cn!OXKB$7gD5S8)r z8w8cKSDh<_{(3luFHw4h2Gq}x;townS~OQn*yL>qsMPN`-lG{e zekhyl1lL10nU!(u`YFa)vjDMi=+{Y$bl*rx1w^A~0~Yypu6aZ$VRRg8?04uHV$i34 z9-n91{}gCX-8S4h7YwHEDT1m-q9w=x1eq2l;5{ypQ$3s`{jdDOTcCvgv`5%5K z{b&|EmL_RTvev&c$LF# zKLHXmi5mC%5{|;t;Ubg$#W+O~6}QGuw5uo?^?J)d>eT7rX#1-jA*DO>2z`Qn0*D32sWBL>89m7 zZ;L8UOcd|C*|gHqVxtn<+NEAGwruxW|A?r7qE@+38F{kxRgHSnUeVgX3TRZ-$=AqJ zrRKQXj8`~>D!C>cDuWdTv=MqARj@ovCJHC1?I|*+$j}fH2&67j-moGGfVHm#WhapV z4#%ahErj$Gi{*<=;qxG_krsF(HxX6i4~AS> zb39Pfx->#*KqajQo+F^-8#fk688D`LoU6)Xjw%iJce5@gfP%EmBY_vBAo-IDi^S~mZT^n+D%-`Bo!UvU*mm|BotgBh-6Mkeb_beo{d;4 zFnhE?`HR9z?zc4$X6=avaG8;ufMJ&9y^9(3 zM0a=Vd@BN1W{uI);~(YLxb3b+>(JVMiqdCCXX{vQ={$X)iM;6 zuIQMPD?FMvqOn|*x~tHW4phq$?{hxTHsh2I;2x3Z2?d1v||>*YK-L`dvd*<;XALZ=)$DSgj9lEC4}zdw>;>KneMs%$=NSk_yL6 z?mqZP_ja%u4C{m@fo~zaM79~H5FL0EG&cTkH{J~c%iLyZE~AkfmTYJS#1&jeTh;v% zbhP|Gusf1s!0%?e!nEF7_QQ$MZfi|nR1P<*XdxVe6HxE}Wyv(F%WKLsS!QaQnJzW@ zALSb0oPc`A3MN3iHk^A-4&*uefK=}8WJyaC*Rn8ZNNePA`FyL0rpybbQXhhH5o#L4+!%S;&45B|ygD~3s|{ z$a*`ZV%JOHk^nJV98toQ>L@24;a!`G816BEhGV-|r;fv)b-C>7%d2MboilWHb?2o% zaa%i-HF>BtIB#1>Y>^pFX|WjVWE5qPBLYjN7H!-KeS|#qrdjLxD74c>`0rMz6oVNt zz2r{01coH`w#1v$)=0(LKyN5U6!;K78|yzV<3(L$K5))R4+JrzwV9eM%4%Lb4gn%o z@tS9?Qg8Y>fgmYC@>Rx=&JK*6dbW|f998KcDh;qY}2N;rf;xc5RmNw?Mav|j9R0P1}n#` z6yn|7P}R?_CZ#s_l<+!vhp=sqlxyWxiF@RQ}W z>r~Rtu59o;(Q4V)A#5SAvC82Y;d?W#_tn3I3w)SyM{xvcVs2B*W-{@g^OvzKA(4-K9xNSyIENS_7KfY%bmR-2+ zB}ZVxdi^-LT2Or#Yh@OA;qUC?%_$p$rK*!AH}dkcJW@jmcwpNTSg@V@k*4WLQR{Du zvG!6^kaXMSi;=T7Is$0^0r~a|wX`WJwd@r$XX!`Jh&X<_M~XSUn`gA9D!rft)mkTd zw`~Em8Tn;!*kx@EZ1)O8tTjQ^v#DOVfJ&!N1j%r$+Odr`f!v-g$|F&u{bWNZ)Uq;F z<46F)E!;AC8;qKG5_%i_i)SoXvyS6%($@E)gUay@Fm5+Sp({ZAAA#Y*=haqn;Y@Z( z1{I>6-vBkZ#N>JNCCIk;5Hk3$6s=N>vQ_u8D2Fd(?ZF;NCDvSH;X%VzW8n?KLeJ0U zi9X`Tvq!ClNua%Pj@hte(ta0{asK1t^pxwgmhQDHWQ`0T#kf{{6qkdjMj5JtF-mwD ztt=p~yn&%rt{Ff8Dr@M1fg|Q<@ugsS&MJ%G6Vm`OV(z};gJ&l5olXpnH3LUFZt=3F zZGX!wNm(1-vGE#R&KHYE>pR?cu05~hGe(vq$RY`cS_8cW&MgypT^OQoiF~k+YeodWPF3^E& zXmrgzcFk`)Lp_|2MDh(jSp(-MoxacL^fyGm(MKPTXpfNtmnGahz;ERKMd6;RR9$6)-G zWmlJvnXP)U^4Qa>yhJX};UK5mu8KWCN4-f2+M5eotbzhh>avfyC8u zIH>SNJW0(e?V7%aB}&N9S_>V#XNClFbsSXqCbj4GohpT>muTqgM?~Z(Si;d%=b(u`$FurFK@bMj!UHu%i68^6P@}9e){){8voR{W+BT}OA7czTm zqp2|NI1|V%v2$2u7X6J&pQ$jKqvn8{Cz-Jf51FV`V()c(m)o!uYA>++u* zxzJ&h3s4c}Vc_cg%^h8U`-`AJf1P=4&WaPiDoa_~WyOWDFeeG>0kE6>Ms=xnRi&z9 zkkF3R?<0nQ+G}t-9d`}n^=B>l>bQ@4bHv@p#uU{6d;* zl-ZA&C_g?u=G%&_nz`twv~a;RPY8_B(x%26Tz1NbWkX@QpQT(6|sWM?$Xr} zGT=?*(RYTiPhX@)llTW+4$GzzhKEn2Izx3Wl{5I!Sh?1fg*Yh>jtq{snA(-IP@CA- zIZx&~OyWHU=%t{heO(gBB41N6(%ly6WEKA(%KkDauJ7prg>h$);O-FI-Ccq^gS)%i z;7)LN3liMjo!|tw;2MHE-1+^Vs`u-AZ*|qKJ$riQoRK=G_gbsFg%-fImqiBe)~0Ga z!1(=veUl3f-9}gZ%)H(&){YMgVi0b-d!wP};b-kDAsr$>PJCi|%@JH$Oy>TUC40J# zTs*LA?CSO&4DFy5e^y%Xd|RY!gP#d++aDiFFH~fnp}k$?BR<`G_$S}&mEI8zviw|x zUF4+f9?TFCEP{pMW3av=7hV@OG6cTqU7?>ZI%u$;kQIkU0g7>Jq4=XtK;Q>>jujBZ z!(`9#fIV5j-fvwQ_<7*fKg##MCJMWJr$!0B!+f;jPd;0RCBAbs>)SBq=mqM02kahq`@ZR zKUvZd=sD!v686h(2OldS$20>7{9>+0Yx0fFTq|+2d1;#lcVj_?ULAw~}3GBTmv@ofMG9r*@P~c~*8e~L-;|P_+|1i=} zm5_*a*1qv$JP~e%1FpQSZk)S2-C++njT$a9{FUN#M=yv%lA=$7wJ_H%TueOg_Bc7(%#VF(w_7od3 z_a@4^z)G>w?T$h2J#DWhcTSszG`!Pr&ib%ax=m}@ho|_#H2k^JyS{H>Plrz_8*$Lk zC!u2as6fZVY?GQj<(BM~p0v^(ezRLG*sU4fy)UBz(%Vc*_eN!R>wWrM^V`@Sb+Na* zs}tmHFMxxe&8>38A~??ZLaQk@R_UHAe}A`IT&VM{8rXP{bfBRY`h1mbX?{T%)s0AmGQQRBZRt$p85_HT4n&)-nZG& zrv9X%buM~OtebZYj2#o(#sKA^*2_uIp$tIc^$83_-w?CgAihF;O@xGLhG>QW=bR=& zbw;=oL~?eKO?8hnvewXR6(+a2vsvfDXD+FTzQ$Fb_EkpQ^rfLEBAIc-)V%Z+qsfiO z0Dc=2!wnbE#`>o+xXi61ct1JG{A0BM&UWqv+rbE~#zZdi%E`)7&U_rxCWmczQoDl4 zQsAKMrTVE*xb~$@<;umSJ;s&_3+J!d#gz7jY2}1>Wb`udl6tkx0LZsw@4Vy0y*u(b+Q)Ma>0A5 zz6(-Vzg8Q+UB|+~NiMYB_;by&mUZ@=aedYF+$cv6Y|RIf+r=a{sB$Ee=fiHsloap2 z#Qggc;&C~K39Ia~`-zHZo}Pr#j{Thmd9X%wl5P{pAlYPcqBF+J{W)w4NBa!q+y-Tb z1D8!BA&6Y9OGJp^%)CjH>&(2XZ#+G?_HM1y#OgCG{>R9;rP$T}EI1!lX@SjIntiyb zKO1%v$=){-7z_ok(RYuD!!Hoe|Qlx(z>u6SG{*&@%nGVe*H+bf`9_jws|HD z2IptD8k(o3aX3^L{Yyo~3|b55=;=X|J^e_1iWc`G3oGk^RjHRoOnQdms#jeV#X~*w z5hKS7k+t3d^D6>f)ci`KBcSQ%#BjV8Xt#Q}i1e*%yt!^!gXy;HxG6{qQ}A$oC!C@7 z?>bZWD6#R0jQxoRI$R_PK#1r?_#!}f{b8R`x%S0u|5^X+kGKSu#g}T(%DV+R2Ftv9 zpv1BsVAa+|6jn-u^#&SFiKW{l{JN5zL_o@SJv$WUdnOEhe{d8Ug>cl<-5AtU(I^lU zj>20Ym3u`|jI7JKet2F1zPGie-&ZQ4&=n-!lu>;>xsK0JTZI+5<$&TRj;jd3Mek?( z(ytX41Rnwq7=R`nT%7_vrCeu=2sEQ!^CN04;Rs`Rx?{*S8K)(*_<#ilS9YlLt~jfn znb^nV-<3}}uCkPhqF2CTe}Ezc6rt$ckC}vMnM0v7SZANWgPoy1nV$8SP2uz+yt`(sX=RkhJ zF%c(8j$O2uUtVKh>E0D>k$OyjV5UC_V?xyf@^1g>C}->P+t%br=zVv~ATrfdXC#dC zUL(^oLDC%>Cy)j?SD?|);aPT%WFQ9J=t?~k*mg%>@z`jki~fq%`gw${SWWHYN@<4P z#8I)JP}29%eFIUoVvW*hwG`)~(YP{?34Mlc`oS?Iv?8_)wJ+U+2>_j_%$IOo(;o-^^*-ZqXS3$5 zAGO8QCbZn2fp|^rI?b?Y@y;v*V0BqOTn?J!1m(%$joyjS(cB)^$>Dk1l$qPvC#=ZivSh`m_S#-})dB?&750dFtfqQo zqp-_C=y;-QZ68PX*LC}32idd_pWG~)b zI#L=~I0WgQOJojgCV(d8-Vc400Z@?!YHRgc(+f8N6mG^)fW9eXQ4YGsR&^@`7ua+8pP~u*s%wyDfIXjRHwyUOA;FVCvR0zi zzC%&hLa~H8>+`@+=EzotjlCdn)t{eZTMj{#8>qp-C9kO5%|D;E;4W5-wn0;yn+~kE z`Gm2SuP!n>Hkc7Bzht@6dd^m>!z9XBYD9-Ky$VlK@j)!9e%@I((th>f$AE}KZ!(RCovz;8jyHXwZExqhda2KO!%Kx5Jk zjt0ZV{S-uR4cBj9HT7;}$DU!!vIZ!|naz~mKW$T*G|nmGE%iC*Mfv)LN#^mU!>5v> z#0j=Q8+rsQ5ZuErH6x4w@u&kpe>Bid_BW-FJq^YVB(DoHZQ8$O1{9@RIMHYzU1b=v zAx9PjHS_JV^uZokq3l&K{)lunXS1Kgf_I8an>b|rGL2}6qU>tI9pA(q@s`qb5P~-P z{Mk0i9NvlZ7vjZ?ap0j`Wn^fn51R1^c6BodTw&K5#l1cH`;aB(y-*OgRs8}c#rZbQ zsxurRQ*gsyhhS9g`XUT~K!r~N0^eT~!L%**Ba*Qu&;%slU~MONheEq!lzXD*&-eDw zncd3AFApR5+}b8axvbM+mmhoTi3EN8sexeuE;ALFuY2_@0Px`F8Xw@YY7z?`K#|~S z#Bp+Au*)Ojf6ld6n{F4eLmzVBK^O=g9PPnFe!xX6hX4-u%?n@^ zm&cRJ*of!|?jknyu)mkL9_1ny8lEf62fX-(4PImcA0^7o*k}{)al|Gc|FJ5A(^H-3 z)oP}e?(2=sD<}>3`ShW_^JmwCgUcmPf3OSXHePvf9S`b4pE}%WgTPF*`u=E^7bCv? zbkX0osCymYr-Ro?LK4DMq~i$FQ|1!yO;XlP&ONj^|*PIfHcaVfJuIQ~UHz|5h;LtTi8qC4>E zXB)BDa^On%VmiLx(x7*?K#^1rOY}Of;iD1M1i|P0o6EiNz?iSeYoYetkVt`JA|w(} zHI~+L0g1cxeowLQQc=a~`>jKs$TPa$KfVGNHb=Ky*gzko2}uQimqw&QY`xbFQ55$3 zD`exu2w9h-62IuKkhDwoJay3`uP*|LfH@R>&fsvu3YepWg+>G0PH3v~Yi@jWYriOxh5fAr37p_`Oezt?Yxlkw-fFUzkv3 zTn(G=;hkw>k%+0gaM76}Jt5Xc93KnXtB~O3)HCh7CxM&nSIUW2x{r6z zhW*WP+v)Vk*4lL2&xwnRjki4(X~)0a&Jy%q%!WY(&s>`Ep!{J5&)7!XkHsLxk4SXh z76xkfNoIKKYMAMf-_OT}qA4t>(N;NU*py-=trU!NxU`&dR$_l;2bp6pqSYqJrzqZL zvX^mPqw`uYwnqRf^%MH>e40JirhOn#r_0I)WBLyPzT9e&T{i;moc?1;V!XDq{{G{z zSsS*M(Aj8FSpS(4AjVTJ;Zv^kbM9VDSsjSYjCe+~O`qD3WGaW!lk2Cos5B;fvWjbS zoy*&VLS0G_TlJB#;f=QMHx6mGHJ-T()M)=?1gwpA<4VIJUf%=U1Z(ZUr{BLp>Q9px ze77HcnTzLo?ll^hz3PR!OJIYhdbPG8g%dU-5)90|ztw%FpDdeJsKVOj%A^M_b^Z3$yIE;(x8m&`F>B? z$v2rDngiZ%*sfqVA^qwcueOSVe5NKg?eZOe1z@Xitq%<+tPcO23yupntE*|xA`(%8 zH{@ORwyVQzbnhX2*{-}{4@AK!Skbd}niPL+O?a?l0W#XCd8H4Vd@O-9kP%`mm-!)? zx}j@>@)`cgD?@w_8c-i^AclN`{6Pj87_=W41VDA3KN>n{V>(mSS1rYrF^-NokE#}2 zfx_rjCG;c_)9DUny5bv6+5ai)^uG`oZ(ALK&-_nYffnHoS_|nTxBeWpC(Qi~?q{-Z zg2M~WByZ{8x7X~mZO~GneMQ$YrIxjyopcOkjj&G==@BWlW>1yaho+La$!Ff%5!c^I z02V=j1?rHKGphRJ-gTW8*62AOY=WPxUoii5PH+<;cjLfXlI+zczaX!`|Ic1k`MT<> zGw1T~!s-h+K31qZ4IP4ZUrwTZQAMI^C|iZU{bK?}>PD{Sh>{fXxSS|%YidbtKYU5D z32xiULB;dh5RnkM(DGx!bCcXM{)HOd&Yyh;XD0l_PZ0OqPvVniiDEjzqGcbPON^TC z;WG7X={zHIm5W>tgG;PM{LD60@uJ=w*RZOa2`9uk$tb$cs)(FfM|iMbLhoVCpG14BU4(l2PDvgYb+bm*1IN zGcvYc>Hqc|g&e#wfSi=HHp5Z5av|7hY1Xst)p-6$N-F05Y_z7h`cS>dci3d^RWmXr z1r4tZ&A38gwyg9%6~C^bM%)|R+#MxH9rFM$k!4Ek2eKY^8J?4t2nx)8`~tRbkqAvgtV3>TyrRYd3X*ah2Zhg<9jAqAy6>vL{wZEk zyCUXNnK3uB|*0^~WY?l^b%8 zs$G*qQ1!%I0J-s}8$_lvE!@aps)Mc%EPC(!2c>LCMzo7eVmbX4p0N-ms@i!m?f6m@ zL>F;veE-{`brk)@T{KO!5?aoHEQ6YBlJd=WtgtI!4AWY}H3;=&TBtoZ`Hfy)y-o<7 zHUG~`<)z2xSCm3;I+F2)Ug>ca+-xY-G;=ZMtxnSs=N3Ie&qk?N<4n4{ElAI0v31rc z*wSI~LTF;g)Ior0lVn&(|(nZY+6irV%z{F6COS zt$h5{MRGrd6R7_Z0&Aw^9O(CQ={nhJXIvpr_>{8fnWt^e+5jxQoQ;)g2g`%ZB$6}i zI$Hh9^= zO6o*L`FD-VumF>(cF>Q%7@Ak;>S?unSBt?y7iUyKKA8T}PQ;@n|Ei&5u{i3xfo2cR`gJ6?rZ z4F6&JEJ6QjvySD)@UVybrV|-$8oe?r(&pG_> z)D~HFl%cP`muoOXDsGh9XpPC#*d)PlI^_MB9RlMo!f*6iuD29-c6os;6qTOm8HGSX zkJrDU8f|F`b2T2FJ>)jsayXovIdH-b!{sJzQDVo-XZ|>n84c!;+7!?Z8>N>m8KnnQ zQDIWKVYo#`=XYH>$+7=3b!OSgPc{q#jvMM87jeRQ$_ibkxISXjM;X-S+It8`&i)47fw{!dNi<6Jy<$GREN;vyd{T;9gdTQAbP)R`%<^9S1iOgKY&*&J;Jv3(qy zw;2VfE8%Jyp(fL{P0tP-wv$bYJR?bkbxum*jZ1=mZoXt)+a>8aG9>_4%VobUiKguw z4_mFktzMB>37N|=?$jEj*+C^ zOzE7Dou-P(r-YGr3cmOfT7LHmwv@hNHGc?=QG5%G;esU1+-?+(w;PEh;kq@>U-J4- z%8Wc~pe?F3?)9~3vQVKv6sGsSt-x#0p!an^d&2c=wsUVmYY<@Y@dr;OeX*1Gro-Tsp$1t}9wp{vWz9ENvIRAbm&v9# z;E(2*17kPMd%5RL-c0Fs+8$D+XCI56JfKk7rf_`9062C2pVCB#sa3tqCXHb#d#{U9 z6zB?7mhYt5z#G$N*9z*MWv6TleZ zwro8DvXM*pQ}ze}&4{oVap%>abvanJ;?I?hXpCl=eIICKI~gZ#M0Y@g#W_nLrkUn# zI0|?-eaCKGeir76QCOZ5E4-GB%7+vU*de{UrbO~Y<4Muy1(6B*mc z3$tEFneZFZdkDMo32{Y3KeULd?n{h0nDUuuBN z^$K;~?V#^!SntCx@%{4xf@l^jx1v|QbPD{NyOfAIeL7?=Is%>q zi-jJBU32Bj1xeX4Ku&bjGV%qPm_CQUGc(x+`dj%1fa~E!+c{9%BlE9N4SU@^=4P#gUs*$#ExeK{227Fr(sh&O-OYn-$&e~XTS)BF-kbuA@19RtE$h(58)^`EsW<0pd8-fdGi zK4ow!k7oT~)7PQtEvF(hBbem(GmHeo8U$hy+lvt=1U1^`lxpvq z%SC>mg}OV?VHTW(-XAVSNhXOliBUBM4CjH6ZDY1Bc@^K?d4Gju?CA>&-AKhB+&cf7 zZal2!EkRtF3hWFOSHdhoKERF0Ek)+5nFyVP?x>UExg7kqFy^L=XuQQW^Y%1md6b)l zJ81Z?$1L-vS;MLm-aBX~0T}`bt;ZH<-SkTh}98=#V*;c+L& ze{s&7xakU>pr(gdvJH*Nwc~#?;~`b1x%xPsMFUBkSLM>T>t_|;My%CnmHs+)&@sCT z7P5McX~Rl+S*pg>(w_TQ%CpL-v;Z=X(TDWn>Xh zr*ok@l;0BkP#qv#u6-cT+F*i8xLp7LX8`@b@cIAbqS#@gsC8-3;}Ks+lb~o%xikEO z-wFc0!9*Q6o3rjYrsbNm+RgyDRH;T~cQgh!>D}YiKEIo?RBmv!(}oiq^cWwyJ%|`g zjgJoKHQC4GUjxXVriH{KD%G90IYPcJH_mBv)|pp~K!;B|LtS|*@1~g{9$y!?ip`GM zU6r3P9q6p>aQ(a=lny`XcetbhV2pi@)>#W^yvq;Sd#as$T(*SmGjJ8rZ1ya}hGmBU zQ3#=L&F$zI@M*>9!xoh)&Tv7*ui;xfQU$8A-2a)3y}5NuDR+odxfna)4!J$UA-O4< z!$wP!?hgfeKm9w0^se9pV;w^h1ClM(VR~4dUSf~zv4uF{e+}k(>>spa#UInpJ_I*Q zr#3QmJ>qSQ$WdW4)h>~kl zzkq#p`Dnk>k5`uosENlwIp-Dq(n-3Jliw>YqOxu4NPoY{mYAhcAztT5ycZcPEWcx( ztsOZ$hf&|>JTq^&#Sg`SnuLCd{OUs|CWDZ%3|VQpM4h?t!L#8saVzls=^^_zwR+ou z^j3MmK3Swwxxcuopyn!pgZ0WsS)3qvoBXc~&&T!hoVytdmvH?Y^fqqQ_i^(9JUSXL z@R{{9J_v9-?MV!S9;i~RUGgbwD|B=75T-t*KwQ?%{Uz6`eIfXnq4L_vg=A%KN@xPh8_}^9DmiCU&Qr)S+&86a@zSqfB~~l7 z)T7t!Ezq-g0}X=Zl^ve7Tn+-Xw^f`_M~#>6T+B!7hotkxp=%*(gV0S$fukW@h@rBa zd+qV&1jPsxx{?TWDaP2WHK%k&GC1pPvahKsezDZ*Wf3nzOeS6-k(#Y0=qo(zBkdQB zLv$jbir!%Lp`=P-x{n6PU2F1S=)vIcqfiV+6D)YKwG$M6bx7w$QNuYjiAc6^7wi&n z44BU56py}8Je*GJW7cS9D$@@LIoVu`BpC{tbHV*zb+9KnP&M)^*$*CqvGYt7vr+w8 zCUy)W*ZOGp0h4 zX9Ll|>isaU;}!TFh$%jtKU5;CkxzqbK|_)i)F|)3QqaIjZ%oMsl{eDK5^mk!)5(Av zpPD8f*{vBhjkxwG`*4QldPQe>9{1`AqOHBif7GpCo^0MEE56G$Xi@Ux)=E$+%m*!j zKD9D#M-@&{zP$bV@+@E?wdPu(2=R|Ap`Sb}Qb$8KE1BzESw0m8zCg&R|z~1p| z36Yhcctnza^=!9>ZoKRk1g|p$d|IQM!5o<#+_%+)Xmx&<)?FT49`&#-PixQPBd&sYlS+R8*D^ zZ#kEqzVBf4i8uOaD7&I>EbGh=o$J{N@=#1}k`xQ2=&wnN`^Kp@8& zbT)2|KY7WOzx(utS4%NHIod#ry6N!QW*Xo?BWhg<=ZZp!5f2W)_;;CO*P!+rPg&snHaUrt)ftp9DSSb4)Nq zPs34yVe`EW=bnB$GP6b`ZsL7O7CZev^DBk{=VU0JiWIb|zw|!8{kJF5j3X2mYQCHl zB`nWq6|V?vF7o9|MnQrI*%lDH8td3IBsG~f>A^B;;T)vNQv8MpYK}Hauqf#0jQNy% z8}a`q+V@iw7bVA76ju~iKMpR0If$9)cQo#Xs8z?{h=#~k9eFIopf$eO7cK-sW6k=V zli7ELK+|Mn&3`I>axVMmZV|e=rbW>r$ zN29ZhVDFCPJs&pKX+IyT@%QPkv-XiGlughfw-}D})=S5;^xE2Y^6de-XX{DZl?^Kh zdc0bu(wQ}ux^dLgX{%T?sUQW^cy|Ylye5PkAE5V;$I8*7Sjd} zBtiB^4j1ycyr;E_*xH*^Y@4~$n4gtmaFKrVi$JrVg@+HX>AvSM!3mr7!q|~Jt$!Vq zF@^Aqfy=n>Rc}q;UxoLTE!k~3V9~t)Hr+9iQe|;0;8c@S$ZBw{V;uvhGEG?bNKuRvcJlW$A{zX#sn&mw^}5~rw(z%a$l^| zwT?H~@l`lYz!1(xYfY-QeR;^OixJfJa2*W1!%Une9d%PlzCiO(5cI zE>1CI5fy-9j97z)(LpzMv2!7W#DUS-{Bw>_Pu3p-5xZrE_um4#u}{jc+k6Uqr-iU6zUVK*92(%X`vQ z&m$FFJQE54mACO+`l+g`W&LhdcfzP}6EQe+Wb^6HE;E;0E6yODOfklTh94iR2~yR2 zG`%~ey2HXfo`&iIMTsqviKd(S;z7tu!n_X=3ap4;nUZY%Hw{|<+K*0@N};&nX@_rP z#JVh}*)Nhu0K`+w4oHi_Ajd^!C^&lo`&Z))f4tq)E;d*wfbPo??afd0&5@Ugf=LTM zlpgbRw($i*Rnkz+eiMVI@Vv0a5g%>Nuwc@RY$M@RW zPvo#B@MmcYN}t>L|)(9Kjf%EW}hLUn`u@)j3FvcNeE*y~MFVtm?#tNd_py*`X1NW0<=iWxcB-?-i zimU1u*I}2R@$PHqglX3ph^YMf3b*EJb|c3eioIwMi?JhzZ(ch_K>JI%d+lMotCCKf z?n^L>Ro#!BHoI(PBuT7QamCMt+S3>WPKT>Z;jK+%ZSMo|xmJ($nXkXf9>p3^P_CGH(OV$^7o!7G z&7f`b)J(tFGW&UOv{5)9&AFM#xlOfXq)u0m5nSuA;4wX*-5zesce1IM*Tx^pzcANF z`BKme7VONfUqOUgf?uP@*$fBc4yM6n?&|mmD+nP`ABu~p=}O5_E;oL@r>i7Ju>Kd{ zazTmu-t-44;m9YrjD2sV-)FJO&p@dnpI1)hortqrPQ#jgS@8=!m?Dpy=0Js8CONz#pO@#nZiB&6 zXIjfH&O4`{A9X$U4XGEKYTzTZp1pB?Z=?d8h6Ie{GL(Nx=s}a#?n;D`5`mV8{)=}y z40!R#&X)Tl51-oOIamZyh|Ye9M%0Y+`rQmFei&`($oL5u4+eg7&t;fdCxpW0F507v zwu${8F_V13uoM$C$BewSQSs{8HAjQkvr*v{-_fUumEER&%cz4M)t26jAb!qmYp}w% zlmZWDKiJPVjbhGca@h*%RmAjdQ@t8t)jGy(of3cKJ`3!;9`tFPQ|}eWTW?c+bw}z$ zqu9eO(Q7HtX@hk(2CJG7%b!Cyty9qZ=&RY$Z4HL)jBqMpp7%5D@9?Nx`E_BF$P>Rm4@IL3`TBf8?YfgdiW674PQ)Y<-45~_o z_!macNIAxHX31qw{JPG165*W;A;y$8QMOJ^Ty@D{~+y(+La4 z-}e%Dejy77(*>ZdDh0#zq^`L4l>RRr9+<&uV;eKUA*kB_sE`&ie>~S3VOdT5W9P2& zDWyf(ggqGJR~pWd>#!T0nU5O&mz4SVE^XRsU4cT%XAUEtZfb?~5FmPBkC8+wpMs>E z?XMQqpSo%y-)g%J_fK;BJw<+W^;Arekb=!g*5++ZcNrZdIl_MR3#dF;Cb*^wFpPOj~bf3GT)tP0B2oyo<$HgcL z4F`}$a|>(iiAJR$*m%fQJq0PVv%6dKQfvD6GvG@#|MXpG$0TrYUEWAd@+A%Lv^0Eq zx61`R-2@DEhn4k?$q_~Nb>oh-bua*IUeX_=vQ-t+fkQM&pKRC5Q^o_8f{W-|@ec+C zx<#+o)MXcUfr?k?uWAN7%#^4j`Ttb$s>>la@aSt{8G0R04}{bx1LQxo&UCzq`CH}3 zENU#d4J#)cG&{cYq8p<^RovhprhS@8a36rO3HGVRp$u;WV>25FWTYa=8Tbzp&HZk} zMu?X8ep)6ALRiQa>Z|1>(H0{GW5(2FBVx7tdLTFEKv%RWv3M`BcgtEqC7~?YL#wXF z8;56m?XO~UC2&~tl=pOvXAZ(%dw(RCiFGubEywz^T*scglwI&fG)w(b%S&iAo;n6` zp?3IMQ0Fgtzb~l$pj=LCYgdBruh;ym__ohKj-wF3I}U_Ef0zbnySNjuWSMhM?4_L; zr^%8pG);c)d>$PIU9Mz+wk;k_u8o#11+N!sRx=cLaoa4uOe~A&_LdF|BFAQ!Egg<3 z*zCZFxaD{%-2{G{{pfZGyxn?Ka+n3>H<_k?%_$hw5W3rf##}f&|9n3N{$RJ9upBUC z>I=12PLu2>PvKz^shP2}75SSYL$F2O@7SaKS;x$tf15R5D7&owZ44nYYP1e80G8Hc z@mGvc+KQyJ8VCI20gg}c_GA#QOL0n$izACaawZwHEg9jLrz@Wf%N3WkVV;4W4F4m) zWruDxiL4Y{!sMJ0J6q)1bn7ioHyzwO)@k5tfE6D1n|W1Wb`Y7XHhT)2Lg=g$pLMn4 zgEoik>~shIIZs)rjfDjb>v1$Lh>W-{)K1=kedi=gaAg#SIo7tHlkFet~LmsE|xWsb_zH<8G3!80yMPt+dY3L#IUyS_@PB-OuqK5_uGx3l}J9#owh56(D0p9 z1ZulJ?R7R4qu)tlqCyi_2(zUk(ilpoMtyKS@*uM;%oWS6#5wEVdd>PV&iN98_m^*G ziEBH3cur3YE19QPYcsQgmP!=q2p>})at;p$>qwpf&7KC|sTfO)@jh7 z$%=BFvLPNg$ae9Q7I9k_!TzLKgR#(0G$uNhH_>W>T1=+UT_& zIg1Rwj3F?IQK^p*}Y6pgdnPH2~3d!yA(-U z{JpvjuE~(2)0-h_4p10+e75oTVZdV{oj>X@I);Q~vLmU#iOBGiZ1Qe)8KOvI<#3^t zh?#3ZRlx7K-`0dKFg|e)U%p$6b`+AM@S*VGM7`X+$JT5mTaXV(@!*6KG{uN#9wKhOU@IyFrc>{wbg z&GLLcJ)GLR=9QD4XgM=p47XZ|U^p3|>>vGVIHgjWl^+$GmsbWHPNS?VeNj)eQw=O zYeecHC7I2yvcn=av{m((g{LoXvmP6EOE3eh#J0dHC-mtz#Dgx!_y_+FevDf#R3u15 zXB1q^*Z$SFsU#)RozKWuSgtizRNL$FKx`FmAQB@5o-GC))PF>HQ5^8D(|f;gHS%N& zIEm{E0qtW{$6z^FDG5st8#HhWNE;I;;+0UC`OU0^f9KK*PQ>S0N{|@OmW85*rk2oB zKm!()M?Z$5a*R%^xj4qEjjy8M9dF4p~@t@AK>di(W+> zL2-a_szR%ryI%--G`QB-Tw1rgP@!(Y1iYm(4&&x=Qh@d#^BL=7D0;Anotscq=S2V~ zpafc}*fAQt*`d7ke*hzF)jbn>=%~ZuQyjs@?pHFAzbBs-seMxDdTlc2uk#9++$Nxu zV{m?ml%Pv6G!t04sq}tD<7|LHM|c+%vd?(2qJ@vDw=QBDpuv6IbXdTAST*cW|6OF; z!ykY_rxs43NvHNZM{(yn%Z#TRuDxRKmuWIMU2C^0H3xwzAeWmi1D*q(!x9@$WQ##p zM}cegpSH_p2Gp)-SbL9VSglb;jzEyPOb)Deo4?qUIS)a!8Y2 zw{)#2rq>9ydJnO__-Cgl=ORCi>96v}_X)HZhva$7gS z8fo0PuQtp6O+)h8x>z+o1FEIxIaJ|;UkSOVgI+^l1#n8CAK@Rp=E|WTNkIjqXn#TW ze_5DiRztN-@vp6HTJDVeC=I8@-qbg6t$R?@!K7*Q_dSvd(VM$CSm^4DA)Ax0iY0h9 zD=q}}U(GQi>`5Jn4n3=~dWtCR{4yIX&cu*JYntw6Q?a;%!3iIAW(d&`|WVs!~a~J{_sBs36#<1Kl#0hQjIRY*bH^P4?@LEjS%IZZgv5n*ieFi1QvO zdF$0p*W7<-bVc~AFStyED&nRW~K)PLitDm}hWRbCwFXqMXnvOlN{s0R3BzeMa@ z79VaM-2AQ1BedOwEE>YNmBbeA{`VC`LlIpVFUxR2i7m&v{)CD^PY$wMfdL-lho(cv zPvCVvkjTwDUDQo^H!#(06tQO<35h~UD?qJdgiIPlk(hXiITeYndG9xd>A^CULF;h< z5Q2lya}9ItD@aK8l*)P!ri~xQ>>h9-(U5d}b$qd2&n9MALTtKkLZX_^H({65+AM`C zGPz;tYd(+y)=OsxNkB2uHt$f)wkcX|kGLmkUFJ58`Ei5z2mHiN_jlP;;4BE!tSpfI z_;wp(^8V6Ca^qM3AJ;G6*p0DlvUTW2#J}Rm`>n}$5L-T5Bp;MqX6sT6Xia+RYMeLe zz51lD@KYJ66k40vE$N&1qnP?1Rp;}({Ok}Z{sKFEgj8}IX9h~{KR8?!zPw7Of6XBqt|$trG8KG^lf!?+TwoEoI(XE(VI#SKp_^m zJV>M8+5iF-N7C03BI>JS4KbNDo>p8BjXS_oxQRLd^aKm|@N_MMe1m!$gbO6EMp@l? z#aCd)BsiI%jd(s1rq<1%M)3f`uu6YpH6QOc9ceHC^5~B8-r}Dm3kh&hJyyd0 zPB(c}zkYrn+N|7W>EpzhtHDM$!Ju%oA&UzOr)OEnJd|^LnblyQYb{%!A!UsXC|2WP zfeF|sy`uV8JeHX2_g0-BT`SgwWApf(MkVoh%hbG~%0=98Z@heJ6;hI13s^X3;_?{$@UJfLIb1tvzZv=Ypy*07nRC z*&ox<<9FPcmyMa-yVw1j89F|%X*Q#U^c@qjveRSf#P7SK+mYtqPi>si#TVWVeRu>( z1uAwS@4c+=_!6!`&)}(63fE z%ba-D=s&dvjT`Pf#~64{N!I`^vD&jt8p_cGmJG4%twhe-eN7Ty8kkf3I2J=hV zV@9WJV|dR;LuVfHw9Lt}8lZDz7V)m-xOD-{XO}@*kO&tjQb}aJcyW;XhW|dN4_LLx z4^Q{b|B*|YmMY=d_7DIS5W8h+a)np??j?V@(`OD9z+(N-#PRaZb5B*#iE~(Rx6y{3 z+;;Nu{y*LRx$4Kc z`@+z|>#aQa#~T`Xwym~2XIg+0o9`;hQ;x*2KD?+=ul_e9#PqG_jf>4o!PnZ;z7?3> zC`IM@YaG3N1)Kuq4F@#Z$eSX6fRgUT3*<)}w3k^GFXd(mE?h0U~g*rHsH5rC82h8yPJKytT2} znun#9YVID<>u@YTz_G1y$cbo>A7U22q$M(&>8;V|<~`}&cxyRoOCe0JRPFP+o+YAj zznm_Y4mgww>;xVBHt0k9#jvOR0c8cU^P<#MyW7^2ye0sm59bpGd@duKk}s+p>( z-Br+3z5Ru%-g~cSt>2>7gzqGE)PIA*QXQOQdb@W}oWyuWkBcC61zF!>E#nwF2YT`v zd<{Ash4n6kLaUFbfs5}&rykD@TcML&kFn$Bo$u3fqek&r-eojP9fBuSY~`}MQzM{? zm5`V7`utZFTphB&(ONm86)$QX)o$- z9nz)O?`&5BdGxK=lR3NWcuITpVX~+hlHwDWAoCOzv=E+z$`8O?StJ{h0-#OSGN0Qa zy6t`}IhRIrEgWfBB`yu}%0UJB|Ax$Cc(gsw%&PF(M;>A>C4cSE6hT`iJ3UO zHr|NwZ;KV1{$%()$6zOg8>(3Tt|9Zdxz`eoRW$x13vGAHD-ai%^OU;!4vkQ2r4(#~ zG=VXaMR1)h%|u>WPLSx*8`uV8n2CNAO>Qzm6Kfm0=lp_K`FRTD=?z!VCZ_R9_dElu z8x}hMn;Vk2!P}C_7Q4CQ*=kTYiH6r51^u^q5tKsiR8`k-j;u(k0<7z&AVh%R=$1qc@;q*4z~H*{?>yf$d|>jog{ws zh7OcW(Q=<|6C(3{K8q)xOQV@6IsZ1@dshA|AXcTG$`Q$)TA_SD)>}khsbw;VOSh<1 zHx%LeLARJQwLrHBXjKn6aimn#=|vw{(QBHt;r?FufAOc6>x0wN>~Py>@n~0TX*QcS z!aMM01leWZXi(dZU0rI`!UD-6{<8I`nf2LA1Qj~^gDuDY&(k*uTJ7SQcSnf*=z zBYg8*TiWH>yp*W}YSx)Erww80vRRlR-pYQPk zUM9ZfsMD-yR9PDPvsxmHQo-!lqVBs&Om!U_*_Aqe;j;L~gt3he4^10^(t;vprh46X zb1RC&9HB#@wJau%Jbd5nCOp-7^uoQDz^vgEPWUCpTh+NbP0MH^k~PtDrq9+xx<3Ml z%BSVfM@7&ARsR8dA-ng+fM;?x|B`@s~iG1{PV?*NEwcw2d3`b@DaM z*7mvD)zd}hZ4=IIhLHehUohR6tSmtr9I~M^rxC&nZK01kqaIt+p67VRN-9) z_JP4v355n8KOrjoEU%Mfl++_drb(@R@J04JiKBASB#)D3S3qeIh=R%?M=@AH>Vh2_ zHik017G1)(!kxl#=2z7w{_yvsW2Znpnt77|szw11Ql_8U_9NdCng1LOFTksK9Dg@DFWbM7Vu2)o&Qm?)pL48xx0t>DW}H5_h5sT& zO!=T0lsfj;;L7RN7Fe;@he-gO*SSXyB*ELv190^}-RU!KG_7c4TMnBbLlNK>3GEwv ziW1$XP7=XxAr;?`o3=|yW{evxi(Mz=N%8KQVMd22)dT2f}ri)MSm z9rApMHQM;oUxW1JI+nbcApuJ}SKhlTf4?3i4g@B9qZFlog*21FGz3Bus&Gfw@{?F8 zB5T&l_fgE-lnAb@Jtw4x(2*0!4PTan1;r&M+8gVIGIS8Hh{MKSLMpX)R;hnucxQXW zR%Y5uXSh=5F@wS`f$StAc6CPm=kfYf!isy>>mzXnE#_^^<3q7|BS1p(&Os z(f#A@DD;k7+f#dWM-C7(lTG`$$@m!dQVfE}w+XamEKQ$T3S*SiWLeA>0(o6P!Gm|l zA3(-<*Fr}7{lv_B?nbW$9C41j(Gz5d(7zF^`2Br%9c(5*@HPx z7Ol8w=6|5|G817N=KBpA@_~zWs898Bqp}R3%;96vi{7Q0sRuTq5!qP6D{$*5P=AH$ zYu*kPy9WBe9eFONK*M$nW%1xBG4VRV2imRiBI}ZigjXE@D?U04W4oaGM^zL;h$Z|r zWo^~#Ve)GV4n-XZck0qVX(X#a$^84jX+{^`M9#(HOHUb1F=z+_bbrUXmDkX|X&cnP z`j=GXqVX+S@wP69{&&ui_?-pV|z{u`_l!6QRuSmT!`*zhS~%aR7mf!UoW6=egPtU zUMgJil_`?TCiJXYeBsGqv?GGxQ!blS&&G9YAfa^xEVybj-bbUR*KT`84+c$rIZHHo z>!_PwSdr?rt10ovx#|?mwzD9{VE=oabl!oDS&|>Td2c2=@eXr+)U_ItyWm62YxTA&~)r+)@u*deoEQrSg|~;PU*LL zzI`Jw_{HLY-03g)#RBS^PMBpI=IEyh=5X`U0L;H##T58~@2RO-K{vavMUSZVZWJ=Q zZNd2@qF8%~`lZ)FrI7iUVLE@9b29^@@YYqpbWJd3EeF$>gU=D6M}Rt(9D(D)wNhRL z{66+CQ25~K8zbj#)Z}1D#s&!aUsFtA{fVt3)}r=HIHuU()`;l^eKgs+lD}GPfRlvZ z%)$ypk#PHOLj<4+AlN=T>_K&glvaVkM@tWwx z#MyG^^0l8k_I!coR zb$GfEPrY+7AaC#dA1=jMPM=!8c92``EsL|8y<|OgH(yrNPj|zw=0MJjdo4lBs{Dp3b zj|g^)&)}DbO|W9B>5|C^qVp~^enaGTd!onMM>{Kn@9X`Wd@PsG7G0*x6%fDf@TWUm zrYj`!yfR&wwDb0cy(@_ST>5QFm>7u7Cu8W*Z=W)4t1x&!sdpr$=aaZyXK--fTb`u! zqm88)Z(y4J=IoNZxf3a_`vH(8eeQ1v-%;OXyU@`b;px3NEgnqUb*blaX(!jeD<*- z*+I=ExiiWQbZe!cCXG=%Gz7G7Ar(Wg$0-#+G!m8E1PI<dxpul|f^ED%!aX;*U*qcFzyReSjpq;M=%LGUvjZ80{y9 zwUPr+UQ~)huLI^nr(olGk2fB1OU(tby-BjAf%x0$&mfnkv{S~I3^)U6$Xqk8#&dxd z3vJMYx&;UAP(qZ1U8fZEek5s)3jx#Z96CL!T1Qk`-`A?{^fO&kV2mKv3e2wBBz~)a zS*+kPY@O&F0VOSslfw!!!V02Q&c&t}-}gD+#YI;|Kr(iCz~uMY;|-X$a@svX7#xtFXxiAoYR#S=tPl!)$#CmV=B#YR=)w z21+uJpg{=k#IgRO8sA2X2x$Lizh=t|DhIr|{QNg-tKAXSQ4Bde9t{>YyOt9S)4x>Q zkUk&Zbk{-rj`TEFdl+@)oJPa$B4PoBGCq$v5(#dzw)ABcJryP+9?Z2?6(*;B-=BjL}_VaMj;_K{{EH`gWq zn{eI0%XAJg{LoA3xZr!!N-7fp&%0A)eIkAX4U>cq5)2>bACY8`c`UgZ}*%x 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 z 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 Ipf#cX4-62NXaE2J diff --git a/src/Vulkan/Extensions/Silk.NET.Vulkan.Extensions.NV/NVRayTracing.gen.cs b/src/Vulkan/Extensions/Silk.NET.Vulkan.Extensions.NV/NVRayTracing.gen.cs index a15fd8a64b..2f360ca919 100644 --- a/src/Vulkan/Extensions/Silk.NET.Vulkan.Extensions.NV/NVRayTracing.gen.cs +++ b/src/Vulkan/Extensions/Silk.NET.Vulkan.Extensions.NV/NVRayTracing.gen.cs @@ -138,21 +138,21 @@ public unsafe partial class NVRayTracing : NativeExtension /// To be documented. [NativeApi(EntryPoint = "vkGetAccelerationStructureMemoryRequirementsNV")] - public unsafe partial void GetAccelerationStructureMemoryRequirements([Count(Count = 0)] Device device, [Count(Count = 0), Flow(FlowDirection.In)] AccelerationStructureMemoryRequirementsInfoNV* pInfo, [Count(Count = 0), Flow(FlowDirection.Out)] MemoryRequirements2Khr* pMemoryRequirements); + public unsafe partial void GetAccelerationStructureMemoryRequirements([Count(Count = 0)] Device device, [Count(Count = 0), Flow(FlowDirection.In)] AccelerationStructureMemoryRequirementsInfoNV* pInfo, [Count(Count = 0), Flow(FlowDirection.Out)] MemoryRequirements2KHR* pMemoryRequirements); /// To be documented. [Inject(SilkTouchStage.Begin, "pMemoryRequirements = new(StructureType.MemoryRequirements2);")] [NativeApi(EntryPoint = "vkGetAccelerationStructureMemoryRequirementsNV")] - public unsafe partial void GetAccelerationStructureMemoryRequirements([Count(Count = 0)] Device device, [Count(Count = 0), Flow(FlowDirection.In)] AccelerationStructureMemoryRequirementsInfoNV* pInfo, [Count(Count = 0), Flow(FlowDirection.Out)] out MemoryRequirements2Khr pMemoryRequirements); + public unsafe partial void GetAccelerationStructureMemoryRequirements([Count(Count = 0)] Device device, [Count(Count = 0), Flow(FlowDirection.In)] AccelerationStructureMemoryRequirementsInfoNV* pInfo, [Count(Count = 0), Flow(FlowDirection.Out)] out MemoryRequirements2KHR pMemoryRequirements); /// To be documented. [NativeApi(EntryPoint = "vkGetAccelerationStructureMemoryRequirementsNV")] - public unsafe partial void GetAccelerationStructureMemoryRequirements([Count(Count = 0)] Device device, [Count(Count = 0), Flow(FlowDirection.In)] in AccelerationStructureMemoryRequirementsInfoNV pInfo, [Count(Count = 0), Flow(FlowDirection.Out)] MemoryRequirements2Khr* pMemoryRequirements); + public unsafe partial void GetAccelerationStructureMemoryRequirements([Count(Count = 0)] Device device, [Count(Count = 0), Flow(FlowDirection.In)] in AccelerationStructureMemoryRequirementsInfoNV pInfo, [Count(Count = 0), Flow(FlowDirection.Out)] MemoryRequirements2KHR* pMemoryRequirements); /// To be documented. [Inject(SilkTouchStage.Begin, "pMemoryRequirements = new(StructureType.MemoryRequirements2);")] [NativeApi(EntryPoint = "vkGetAccelerationStructureMemoryRequirementsNV")] - public partial void GetAccelerationStructureMemoryRequirements([Count(Count = 0)] Device device, [Count(Count = 0), Flow(FlowDirection.In)] in AccelerationStructureMemoryRequirementsInfoNV pInfo, [Count(Count = 0), Flow(FlowDirection.Out)] out MemoryRequirements2Khr pMemoryRequirements); + public partial void GetAccelerationStructureMemoryRequirements([Count(Count = 0)] Device device, [Count(Count = 0), Flow(FlowDirection.In)] in AccelerationStructureMemoryRequirementsInfoNV pInfo, [Count(Count = 0), Flow(FlowDirection.Out)] out MemoryRequirements2KHR pMemoryRequirements); /// To be documented. [NativeApi(EntryPoint = "vkGetRayTracingShaderGroupHandlesNV")] diff --git a/src/Vulkan/Extensions/Silk.NET.Vulkan.Extensions.NV/NVRayTracingOverloads.gen.cs b/src/Vulkan/Extensions/Silk.NET.Vulkan.Extensions.NV/NVRayTracingOverloads.gen.cs index 0fbc0c5637..92ea160235 100644 --- a/src/Vulkan/Extensions/Silk.NET.Vulkan.Extensions.NV/NVRayTracingOverloads.gen.cs +++ b/src/Vulkan/Extensions/Silk.NET.Vulkan.Extensions.NV/NVRayTracingOverloads.gen.cs @@ -151,14 +151,14 @@ public static unsafe Result GetAccelerationStructureHandle(this NVRayTracing /// To be documented. [Inject(SilkTouchStage.Begin, "pMemoryRequirements = new(StructureType.MemoryRequirements2);")] - public static unsafe void GetAccelerationStructureMemoryRequirements(this NVRayTracing thisApi, [Count(Count = 0)] Device device, [Count(Count = 0), Flow(FlowDirection.In)] AccelerationStructureMemoryRequirementsInfoNV* pInfo, [Count(Count = 0), Flow(FlowDirection.Out)] Span pMemoryRequirements) + public static unsafe void GetAccelerationStructureMemoryRequirements(this NVRayTracing thisApi, [Count(Count = 0)] Device device, [Count(Count = 0), Flow(FlowDirection.In)] AccelerationStructureMemoryRequirementsInfoNV* pInfo, [Count(Count = 0), Flow(FlowDirection.Out)] Span pMemoryRequirements) { // SpanOverloader thisApi.GetAccelerationStructureMemoryRequirements(device, pInfo, out pMemoryRequirements.GetPinnableReference()); } /// To be documented. - public static unsafe void GetAccelerationStructureMemoryRequirements(this NVRayTracing thisApi, [Count(Count = 0)] Device device, [Count(Count = 0), Flow(FlowDirection.In)] ReadOnlySpan pInfo, [Count(Count = 0), Flow(FlowDirection.Out)] MemoryRequirements2Khr* pMemoryRequirements) + public static unsafe void GetAccelerationStructureMemoryRequirements(this NVRayTracing thisApi, [Count(Count = 0)] Device device, [Count(Count = 0), Flow(FlowDirection.In)] ReadOnlySpan pInfo, [Count(Count = 0), Flow(FlowDirection.Out)] MemoryRequirements2KHR* pMemoryRequirements) { // SpanOverloader thisApi.GetAccelerationStructureMemoryRequirements(device, in pInfo.GetPinnableReference(), pMemoryRequirements); @@ -166,7 +166,7 @@ public static unsafe void GetAccelerationStructureMemoryRequirements(this NVRayT /// To be documented. [Inject(SilkTouchStage.Begin, "pMemoryRequirements = new(StructureType.MemoryRequirements2);")] - public static unsafe void GetAccelerationStructureMemoryRequirements(this NVRayTracing thisApi, [Count(Count = 0)] Device device, [Count(Count = 0), Flow(FlowDirection.In)] ReadOnlySpan pInfo, [Count(Count = 0), Flow(FlowDirection.Out)] Span pMemoryRequirements) + public static unsafe void GetAccelerationStructureMemoryRequirements(this NVRayTracing thisApi, [Count(Count = 0)] Device device, [Count(Count = 0), Flow(FlowDirection.In)] ReadOnlySpan pInfo, [Count(Count = 0), Flow(FlowDirection.Out)] Span pMemoryRequirements) { // SpanOverloader thisApi.GetAccelerationStructureMemoryRequirements(device, in pInfo.GetPinnableReference(), out pMemoryRequirements.GetPinnableReference()); diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidHardwareBufferUsageANDROID.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidHardwareBufferUsageANDROID.gen.cs index 6cadc86244..9663aad63a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidHardwareBufferUsageANDROID.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AndroidHardwareBufferUsageANDROID.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAndroidHardwareBufferUsageANDROID")] - public unsafe partial struct AndroidHardwareBufferUsageANDROID : IExtendsChain, IExtendsChain + public unsafe partial struct AndroidHardwareBufferUsageANDROID : IExtendsChain, IExtendsChain { public AndroidHardwareBufferUsageANDROID ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescription2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescription2KHR.gen.cs index 5333c73452..b6915748ad 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescription2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescription2KHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAttachmentDescription2KHR")] [NativeName("AliasOf", "VkAttachmentDescription2")] - public unsafe partial struct AttachmentDescription2Khr : IChainStart + public unsafe partial struct AttachmentDescription2KHR : IChainStart { - public AttachmentDescription2Khr + public AttachmentDescription2KHR ( StructureType? sType = StructureType.AttachmentDescription2, void* pNext = null, @@ -165,10 +165,10 @@ unsafe BaseInStructure* IChainable.PNext ///

LrEaDTw* z+R3U!Y7bON(&4w{v}|3;<4HJGX0EQRyYQ_(ZJ%T974~Cyp!i`}s9(P}2qajOUfQgc zhtG$`ODx1|E}kcp#P3(u)OHfhiP)&CnrLI@8CB0+enOv{EfE+*K=`V_ln}d$hHh;k zFz8|_=O0cKL4`_bV1xl>E5ZaJxKTh^+(%n(iolLU$;x!+@Q=6rHT<2CDHZD_(B;b| zBa^J35UTQI7oia{Qy3Nukn@)+doj2!wud}jkAoBGgjsvS62 zLnD`P!GUG2r-e&r;An}R^DAMv=J$&*awb>5d`THz2w@aql)$jOFu?(Z0YW2}6Oypr z{@YBlMOUAtG^fO!&BU4=%+WOMh%w@CMZdW9FeXW~xGmj1e_a4MUGB|X3+^|$8+$cN z`hyXBB8PZ~r*>6)ghNv1CsmyyViM^d&(C|UlY4EB2WrQd<#Qc69tugX`wln9;!JdQ zaqg!|i>k4+-;K`9>0CeOR{~yA& zVAKuG8($QNj8V0J#nw#=1V@z!Q7`GbaPod452AFb@yTH%GX4QMh^ZRq4{K?|Wg#Rb zXxc$8;)y`s;5xrLRC^%t%1C6(Ni8Gc=ocI0!bBD}J+znx^v2(F`s#NK=Ji;-)-<}C zi6Y{4w`;}Mdlz%!WVaE2Iee9y@L~P8y39Hsw7N{#gxV`k6j35jAold?(#4k{TR}Y7 z&TfN}OyrPm`u2_ByO>Guw_W{`65@yA8Oo1A@kD>Cqb;z%b;?7DV~zD2?BaENGtaDbyTg={431sREuHxH@kuN>mN4lz_nyv`tK?Nq%S_9{y>;Rn0->71z! z$_iUb)XKl3vOf$%zg*Q_ueUn;kcNFm9a!WZXvGp|GuCm>xo9?q5nnWqx6`N963xz~ z19aRMtIJ9L%$}5wwz$ke?Z<=obmh|GCeFDr<)JItr;gUR&2_n$C2aW(2fBU= z`|3Ymne~ao+p&H92Xt{SCDt8}y-#5JOV?)L#g403-HM-GTIYFPveI6J7#RlWHm-!% zVMl9zNG@eR&_}|yV*=w>UB#oWK+Jd=un0Dyu?=Ne!tEK%-GFjp^NKFgV>g&u^ z{$FjSxshcTnhdmS=%m7H=!*G!L3Ii3SUO-h87!2R*cO}2?^JZvDs{QpwC=mmTJqxM zOjA)PBC+jE6V%#l=vv=@u7y8~ucCWn3bGMwA_QGr2ts<(eDoY8=%4f^w|SYibC)hf zIvrIpCG}q<%pcpAdRbh=t|DA}(WKfo;v&mj9)Ul`vL^ffJgJ7*YP#gx0q@o(lgaly z)+SZ_&7m}N=|x;WiYL1gafU>A$nkf_!ha7KhkQbgLCVJe;Bh~sr+`=-k8$2IQUo!E zZ>3$Cs~$@=;TA!(UMjgzCVFi0j6Rmx7@80d>i{-*=vrROf~b1e0+X0Plu zAu^tKC(asIhCSJ57yci9fES-%fo5agCg~Q(WvAH|hr{eeKyrSghu*YYVr>MGyxNm} z>23RA71PjII}pAq{Ucad!&KK}GJ}@*kMP4tc{5l^V~22v_;Q;NSOqxD&-aJ-7(JgS zYAM+Z8m%wsZk(=Es!%0e40?%_>)9Q)e(!Wqx0pm?)I zm(V1)NlO4qKRRSQXt(RoxVSUhfxcDQsUL@iT2`xliws#_^_5$5^O-7s9#>-b;r1>R zR5s4OU<&03IntAJfE_1`IseMt7!jOxb27&;^+R({iVdz8G%typ@Kmn(Gz&aOGbFEd zs?-$nlneS)zWwWciSKQg=HIB22SJYGt@d-qXTSU@jwf8Mou6%b^c>oHK<##P^5}sD z))e8>zjgLka~l$r!a+1NeWsl~#87s~VL#1zc(S%4xtFd0!HG)TqIKC#aIBmkdyl+A z57e-)>Gkev>?7&j32m@S=y9NI0XmGCtOEaCI>iCMn~QMDH;Zk(7W*g-`i<~+zG)TR zJ}o$#=X^(Ml7TYyN}>~;0CwiBE0=$A6iwuApSG!|^)a20UNn509!J*TPnZ5@Png%g z=y^C51wg~2l%JGrdAg0pe1lvgJAWvJ=Tu_^j=7>Op}Qx*?`qz7neo#5NCYT5g6M{4 zxRDPKM46bA+9iglljYIr z6Wv%rpeHWLjIJr@9!Ue_%Ins$Y&hMNm4L3}-_Jr2DX_&hA;j<#fzAh$Fd+nO=g5q_%Z&V)h?Fo< z0B~7LlmT~gfRzwntwBRY79a+zr3Le!Ed$3yN8XPf`}G-?SA&!g0lEZS2wVtCB!xEa zbJ+E_a7dA*A93Je#|Cjg&?#8nC!;k39j+SMPvKu^jjxf&UnzUdEqj>hKMV%=;9#MU z&z2eRG+;vgAVna!iNL@}QIXqmYH}M!{{W(3BCfmnpM=1IUIW2lg=>cSIlNQB!@|YC zO#`M>I`jOA;*qa`{{zCE5;73UP@>d0H7X?%ryqj@n5=3Vj)e;@EY{EfDcM5alLP`1|`&a#@ttuuG>Ang)8#M zctZYB^XeHd@fQl%n^GM>fmL3es_b{#vc+??uU9*pF*4=9X0~hnzqKbc`XhJ2Z&k9{ z!E{**3nF%vBdT2L+U5paXbrf#{)JQYWT$m$w##6-wtG8@pVs|Le_bW??Q@$o`G#uO z_KHVUP+K`KD4f?mz0pii{AJ@Ga|?Y(;opfa>YQznE%0kT&Oj5c&qOo-T>(Yw%v|Vs z4gU{(ZW8-xOn(aupkgFv4#lP;i`I&6QDmEjnws{=*aZ5->8kXR+isW6OR~>bhN0$F zQ6$4YR?c9d0aZ?*G1n&;O(7b)M|`ashh*dL6`LI-!J#M~RiGNrSBQ?pCi?v{8cxkW zMu~DIlMEB(T{pzrdBLM1P;$CCHiJ$V`C3&9mpb6s$ za8d|nAxb{$*a*&#v``XS5q8CbZu&prluikk4|jG;8s>$VK_S>M2Rfw;3G<2Qe_(rC zm;p)z@eu_|WS@wbpOn9FwY=pb!PGWlI+e_3q^z$52o@a~e?E!83+(v8BMRjAs<=vtyeTkz zmiGNcrICn~6dHLO`(Ipx1lSjz6&?+hDPiK|F8o&XMJo|$p_%?#`2Pa{^wBE1>Il*i zG&%1#3VoTErIW6g!*M*M4MX6O$4zWAmw|atb6%L%=plhShA*q2n;>$^j?tk+`C{^> zbH(`;`;C-u{V}p5YvXB0+W8|2SpQ#+B=*xWnr%!-Vd(!GVkM!4xTAiecMAUxRc8TJ zH`DEXytq3QcQ3TKySqCScXtTx6n7}@?sCv#h2riMDK4eBf2Ys$-tWD4Wu3K7P9~G= zNls?6XYb!1@ZT-;k-kYdCSMS%j8I3bAW;=4{`Q*Cv$0*1d?76|!M$A+PZ$ATSB;sk0EYC!ru1kuscLLF6mXq%O!rYO|md@Q4N%%YkC-pZoEqkQ+LDpaWGd{B{#P1+Oy$v|;tK_U{Ih}HQ$c&Kq zA1WRiD&`+7@IM~I?u^B`{W^hDrESyQpkl0(H5g3Z9ia_8zC8cVbD2nhR+4sFXl#rL#aF`tE_dMTVYWDsZErEsV zN{Qu){#Xkh^S7bhorn?xKgXXE8~nXqfQq~2%(9GSVNS$WKp3~z9PzVT(C=B{$_sov zR`RpSqQ9W@I-~vwt;lat?-vOXHgRI&^>oO&+=nD%TbcVG1t4&Iq@&tf?x4_}H9WD! z^@;v$x?r>w_zY@z$5TPJZ4OS->5dPAuKiYhs>D}+fha3J)k07+h~Z6M>%Bh!a{WkD z66rk;4EhPdu(QW{>e^}+s}+=G9lW3lC@xIW4{S#>BJSZbM_^>(sh|q4Xq!d~$0 z?GvRICkr;y^jYjh2(R_>YQ!IxfuW@&=k>nH7S2*@^MrZh$d~Y`fR-6xg!|TK1^>$i zjAuRG$R=BV17i-1_Sup-sAx&Bp!MGW_Eq!dc;`%H(cKM}P`zg>XUBb5jcYL}14em* zh{=!)wI4Y`_!jlYK+BrnGjVP1bMCW2F22HRPYF(xLp*rQj8H%y(9{y;`xpH@F6w$5 zO&}aB!0v8Rlw|{g}u*_o?L(0s*8pwX>Z`xhC zJZ%y19iW<09GwVE(o6f?>p^0C>T7bkqaeEMPIC&?*L`)f_tiYtXWwO+*Y15;06qa+ znL~)0W5(`0`SB{|O-nZ$CAq8bi^<`0LkreEMdx&MfMGqFq(1OvaYmF<$5LT4Tk0g% z+SJcX202ohpkTD-P{;MHIy(u-QxSbdxcpISS zT~MahLsF|Ez-|K{C{hzP&w7goFCE)Y@9MHtsV?Ff!mN9;7$nNMMU$6rZ?%gfnLG3Y z5}Q(zV5yOc2$-mm-YZi~O^aZHx_a|En|K@Kypr5}3m!H&{b_DuN>t1t>n#BdOd$OVYvvrEP{=G#EQR^(@PqF3aj zR2YlBHRgX4Ntd6dD3jJuewXqcCN(^wGM|t}oIzS6K|KK%QdQ*4o4z6+aRs)53@n2L z!7;^TB`#C~ic_Dq69_BJ$3$PrMyOQ~B8CY-zkP%6&Rp{xnasU#P!O?`L<)$iZNp2y ziXgvTuLc%~nHf|}#=XK$1wKx^@ik>~c*XibK(DJ0TQ}NA&+&qI6hr#noN_cws5atYi-49tiB4+I->U4hjV#-KnBb)Q(takG)jm)9x+LX;+eM_>T*_o zsx0?2AwMrq7w#pCrsZ5I_JRrJ)&YJ==5(nByb2=dzn92MF;oK#t`;@gpm5zDUAS3S_x$ORlp}aiD>Gqw>9_-HE-yG0S?(eM% z%}9OquW97f_se~ui*g%AQ$g#qQ2F%W2Vz}{L8{dIf#JT#SgBW+@Y8s&IUZR~WI+X^ zW*b-8Ev3p%FS$BUqoatw^M^BI6+{}C|MmHWaf!3}f^q7nMBPd+gni|P7OK7KhMsV? z+n=*(n(XPM5(Sh6>*O(CNMnT-u7#(~9ZzoKUa8bhP2&T)@8ZQa_})Cm(gB* zY{WudPVV9N684bupHI}zIbD#3CcTP11)yXt?WLy8k@SS$hCLfo=cmV)-p44!y}ty# zp}7QMZ7_^$zZvg@bFgX_tYB*cizn&6B@+5TCF{^&kw(l1dLtv)nHVg>9F{VJ;_ zr=x}+d{?;<);()RH9R*v8<7xNl%WS5-D8=$K{J+lU0PkZw&QT0#@xRzM()+QV6r5x zTa`peJCHePP*mQvTV$TdUJNbir~m#LMvSD`m<-sm^_cenw+9(}$J z3iZ7-UBtl}XY2iJ9Sdu_{HECK;J<0vc4%IB{QQsuALvVFIJ`BSU|S1K23Cb zA|SC`+TyM`C6-uk?Wpwi88xjy+ZdM3LEF^UF9l|u9G(>Hw}!cwckm>Te97V(FWE=D z+w32|D;*vfzf&8C$Rr}AMxU_9oFKA@-anRdkK`F7p3t9@N47u(IE0#0AUKvLZ2QLD zuW#5~Gk7+bvM@hUxiTi(X6f9n_6fRO?4$Y5%wSC@uJOuJcg`E=kJ_rC8O&HUwbuU& z)6(oU=mxV4UzvPqP8M;*v;#IlOg4shrl5+po9-)@_<7J|dns6l!>(EPp} z_vH&V&z0#`J^A2<)Cs#0>_DJUT%gxFR}&uY7K4FBSkK(yp}LG~hXnSS1=}z1ib+{J z%WVfQ5hXG=GrPX?>2IZ@R+XKftWuK|2N$TYOqT}qR%3qr^`t$v9|I@iKBm4t>t){#8+mwS_#02ng9JZ4mtbVs^h@S(LRifBJE zOcwf{ISh|!msSK3V|V;KH-aj|Z+q$U?C9KfK)zapGSeVC3FQ8plStUmao;86e@eu5 zc$pvGx~{JGuE04|g0P_C&JoYgW`{#JA<=@Z`WFHRO*%$(Q5MfYhxfWpC~b(YhFVsb`8N%IzSOJ7m9b59@Y)%#Aok75>h6hmO*guz-A5Yq2rk3 z%kz5hvme8G?!vISIxw)))@XEiY`+;RH3?{UO_Lbre{eGM9q0;rz5+&*bZAJ?|nkWiG`5a@xIwHw(Ww#{7Sem zb*^luXmx7M;XdsqT2An(Rr+%Oxf%d=#fm_kr-725oQ26> z)rcqrxTLhn1-KBU2{*vzUh9L+75HoJS5gwv$MqvuODSH;jdW-v&B>LRml!9?Pmfu= ztas8A>67h}$;|FBM-K1_RL7M&VuiJ>FA3#qN##vP5AK`-bC)v0oscx+wx`#1WpD|bzs~&pUvM+mWtayT z**2WoJ6G06RGQt=7GN``-qE$R{CcDNYzuIGxh!Hdta~>3ZHkd$nkOy;^%8 z;>4u2yvIw99o9duwL-ZOcZ%W?S~-oBucewU9qIc1+dqh+3^~AldyuxDM_ZT184LjW z=fQE3tYq+ka$?gfzHC&Ec3@FRKo4RKoKWfhr>O>Q_gATRg-6Ft*6O55S$BeyEy|Xh zaFt!$D09H$>_lVtc$Ky;r}_w?73G@vk^4192DbdzZ97sjJBmt1$}joK0=8sbL>(IZ ztQm3H%1dYp*u-FIav720a-IrIAXlZBOckBp#&`bqqg<78v2wB1rpgEjMzPyv4!kP7 z>b3NYN|O}H0$YXDSUZcZZn1n&JT5($4Js}2&yJDU;?WZu`xx}R#XnWtq^%n+BNcpy zujMGD$)#t=N@95mrL1>(W{ReZeySX*{HD963n!w-%}FfESLw80egaM>YyX8>fjO#N z+HuKQq37!SOe9W=*-A;)+MlH4a^ZsBwz;dwsoaNyRT3)Nd5pS`hSM}U53R1WLVM((J~Fky}mP~me$;T_mVync>Ovo=HQRdrQCrnZQ=@a(&uY?B=%4MqefRA*8h>JbvFYEP*{sS_2;q z0o>3kp~6YQ(#}*X+eIAFDVzjI;)oPCgd0F$%~W*a zEdHe_d=5DVyJ~P0=GYOz7h{eLd@(+ds1mpqi^vj9MUjM&z{bypHhe3h15UeNzI2E8 zgb5`7XtY~agQs7!o?oS7xI}Y)&f!tVn`u!MD{s|g52}pLXnDmX5Go1#0fgY*+|-#` z8fjz>WgYj%%0URKGf^@rKtHy~#2C6BW6xWoxeJ#kdniI2!?-g{1*b07xW$jaYju*D zv$$5WSs?DixHirh4CIXW14+?&8#ukDi`nZtWvm-ajoIEfUyxjbdAcPoc(Rf`UJ1cv z3$%Rh(P<;G1`&1!wL`#)4A|h6v+Xq0<>FBp5CDbN!fWF`9-`WZj*;W$ zoT-VVXgiQkQ*cKW8~_}S=hWyZYsJXb9LjFfftAVygd)8#=JG4q>T2$^Kcd?l3VMS$ zv#`0gn$tX`8`i)rzEVTdT;;_#y-3^8Bv-lTgI=OGCLF?4Y;;7|!dk@y4w}j*@3ISF z@7~X$^I8Z1u$jG54IPLL%{7cmp*Khj7p5b%m_7Y7j01;fD-p$t^EIX!_Q1^t}Zjp<7NJEH>4qhG@+RmxS|$x82i#j9rpYJxQSD~&a-HM{@Z(@*$R;foFh zeW0ml(5=eXn1{HrEt9Nf&o{k>AZY15 z)%xDWkQ)P(p6|3uSrxCAk%l!ow_`wNK*T=LK&%l4#;mBhVEy-QjuFIR1&ZEn)ZR0G zf<0&geOk>NY_r<|JseAWeY#!j-{=k1`?BGN;^^NIke-q}*(K|shf~cu>2m@nxxXkraob)3VdbOAdmZY-x6E2)&q6H}-262mvGu#&&dEu}kn|HXx8ulsW zu5kOV>afYe;ZfN%MYp$1MS!m7`tN-taruR1S~2w&Xr#hQPFZw~ji_T~sjoI(4c|zZ z-OpkVXh-e_UxpN(pe=vn197$o{9CmwT)S0amI7sXV!l<#ldC@Q^+spzeaH%N#*as_N`)=IKt*8NEZPpOOy#`TK{bgs2kVN|px0Ewo-J|)>4qJE z@6oLWl0uw$+4sUn&A{v`2}X_EU3sLYo309Ks7`-1dJX9doG*xx1=4}`8}=XrCmx!!`N9V4M8p^xS&FE7K7v>PzWHD z6*$$a2@JRl(~+1*FuF1~#L?!H5ne2zlkYE(-(TVu+Dctrekb5VJO51=5Nw))0C|M| zf~`!${K5m3bPiy6qd}?e{)U>(j<7Jm$9hbZtVUo@IT8WSB%fQhC#*SEFlO20CXi$4 zyRTv?D{#CM`98f3mSz(bWS0@_bQ*{_6YDG`W?@yxVBezLkRp^?+jbjfAr>ge4i6b> zKD@8^lu~53O$Wy1efEhzo?S77Qp0x4FnAt5lUd{ZRtnI=&*?G9qtnd6(7-3RPK#v7 zQ^>C>!YSW32u^kMr?gJ(x5$!!l6XnU^KNnv(%@b57oMzt0(I<;(_TQc?if_#f2 z7|sj zq-CD@{sP2*@0jP8pSfk61wP6Sn80_0>J#&jFMUZ^o95bM$oaHJ;%x5u=lb>EaMh8z zmAHMp#64NhT8CbVB>miyBkBzI=ey&W?=o(#waHYYyPveZYmcoa27E2+%jH4aU?vY$ zuDbQQDx*^O%A%=owM*x~PTcUYzEo8PcwQ4A2Zij37$nZ+ddz^9t4^CzfBVO zWm`yW?3iCe7Ev5o>MK*JQ_*4a=~pz1B<4#aV(N=i;bT%H4Tl+vQ=Q>NzC=l*82Bc} zuEohSCei<%iFUK{LQg~o7iCCRrUNjs5u(i+At@*-Vo{M1!ePXM$;l})2~DlVX9)y8 z7K;sB1sU46HmO*Mi4~5+i4|(-NrewuaKg{(Iauh~<$k79oscYUS^BO{HI%G98OMHv z9`k}+zuKvFNsb#^U+6ggwHD^1P|5ZOovSL&Z-}y>^i3bS8bLuqSz9PoWnI8P*^DuC zAq6)PS29Mr%C1N-Rufo&lmu^N(=|{oW>vFvjFPPS$WLS2-2A@JipLg4(pGs03tS+Y zO&1K%FASR&wNfBHl$r|?WFd@N6pd;va3p2k#q)F%Ve}7;m^p&iJ3vE0!(_H^X4C!Q z|1owErr5YSD^MD*W^oe}h|)B7BWp(2g=Y@sOsAoKFXWr>1RmBhD?f17QJ{%fC0g;A z>xc}8iXs)1L~*_!`5W>$bsfKbO`H!tu!_|YPkuz&7YrXO3@fx1F`{1ve_3{z2tG||8|J;}mBm~3 zN=NoiVwjqn!~i3U@HnoQgtNo{fY`PmK6Bdzw6eF+l`5W?*$~j^*MF#+w;{q%&{K>v z42~nyBv>KlVPNl9BCX*P(diS!hV-3Nbm&NhW?1D)`o;bS=`14iTElVio)TZ&T# zk(@Mj8CEH8vdS22w56J|lW*?UrqaAa%ylK-+-m|6YO4qfoea8(sT)}uYrilfD;t!v zsN+>uDdhXBRj#p>7-?j@a6)QEY@1C?~(aG1D?^w&|k?^wzgIO<_pc&=^eOI;@3LIxvA`yE($2@uv%r>(7=j_-0)IUCiZ4)gu#-_ zGI{^(zFbO7vslJ(k9i_XMP0Nw3F zCPViI{S<)M{+3lgtbY*2@@qX~`SvUO$6qaho-4KqM01H= zr(*;_W=tohteU{)y}~xwLu7s58W2sR44J%eOsRRTa~w4?^GuPjtm2s+gX zAPG9L`p-?kt^a6sL0$i$e!jpK=v(lsyEaWL(7Lo;>l)?MV5v$9#@usF7=}F9El?Q7 z{_KQa0Vc+K2&@QA-OdGUA>#=A{`r%vFVi%{7yIXHlZopkDL${^w}<`RL=Id#$96I^ zLCX6TDj(TcgHxcqsMX)-G~^pEPiEyPub&&WJ=4iTHv*@}J#9e-c>C;QIO3NNTy zvg=y37xb8-drQ7e_+>+Tr}gg3=iJxflm?7@^gOOTHf=J7IHCZ16;aNMQSqZ~f9BF1 zG=~_j7;;5$4i&-`7OkJhxGwpTkcTy z=h&`0QN#$0EjSU)gM02!3s#>+6g4tngD&DoA2;s>myZX3@9Gz&>vQd0CL+6XUiwiya9 zYi>HCx5fopIhue>#FrN(n3bt)v@}sTx5u%O5ihquPRemy^L%~pHX$7AS+=|wHjUR_wQ6{6_dUp?77G0$TMrSSOM$X8;6vtc~fkid3) zRuCp&mLGu5=FRCc_EOi&yWeelx(^s}1dipscH)#g`z=Z+O#IB3-taZqS)5-wvgf2x zkfqlYDJIsD{g9z$DvLEk^K<}wx z*uS23QBu15D&PnsA?rYLvRKTdbTQ}1W{jD{77ouTJyx>#S zVgh5s#`Qbc8BaPFy3X{CZuFMAC(m?1fQP5YLS6_CEt07_<*yb@#z(9J>r;@)oB3~Z z^xJncdN`7Do06!=`O%Q>M<^pRM9Rn|KNO$#J6+vDA=7;5m2)Yp=Vs_WyVmFdgh+Wu zo1Hrn@vpu25088Wv1K8^qToqOXKwb|iNo8R0?6BUu~z`p)e-qNQpaVPy>&O~fJC_F zdH)Isn@hgM?(dnBa=;31*38=`B4e6Z&oYThShECg-^<8%Q+3QW*@6hfO zrH#cER7qML{Gqnv_@$!d-=VMtQNv4NUw_hV%VF3#bS`miOs?1iO;5HWTJW6I4G4K= z^+$&L##dO&^U)L5_}l{`WYE*rcbzK^1_uS#sCSyI@}wlgnDGAhPRZ|3Uu!I!f`9gV z`fhbS9qr8!bZ#5^)z%5==iK<_@g1~v=VjYp9-)e7Vx#&fBNk33W0mZD7+`gf$^~bq zOfK--kF}QdhG^6P`|}uDS4;d)v$@>9L7klfpk>pwbj$92R7IgcwHI!C?Kw;G2iPr| zq59R2WmCCTw>JlysQLhOt?qX8Y556q-rY8qo?_cd&szVkfY*HV$U+m>HF1=cn>(#t zZ6;P^&$|L$j7RhRdx}pGwrqfLH~xu51Cks zTc$-%hbMu8EKZ>u3BI3GwLTbaAREK4_GH&ZqsnAP0F$X)b_^ReLf@_4Y&;G!g0|Ty-Ela& z#F@6ec5XbNIarugv$!&(i@4|bawc|j&AHC}?{xtX z=6iOo2}6;mXvYP#rMt1#hC$U+dBRbs*0kWF>h7QvHzr$G=`I_3k=jTv~()uYbMQO(*k1l=y{H0p6}eu!Gs zv?I>9rq9WeGS@OC4mFLF@Zz@tid$XXUv*Awc4%)udcIFLc3&e_lYfKU*GAosJJuY@;XgMK=Qm~99Z$SDVdkK}y}a z!5lM@l=>>1P@QWQS7Ast8CTHsLu-x%e*6=Yncc?zL66nsiQANJTVdk%+=4xT;fmFE z>>J}7MFZ#DWEUb=JG58az+~)7FFi)1A*?}B67Bi0Sq)c%)70rzFFP z_I@Slv-5aB6}%~i>spxd>aws5Zb^FL)gH>eg4pI^K|;j~19Ih@t{aMbtswS?mIr@a z6oVbfmC{yF(liZ{DWsa5Fr6)6lTT%9Q#EpbzM&*BZfCE)^A1*i+`y1SH_zHouZoSC zVEQ(DfzynDCN(uLNS?=)*IGI&`93IxC+Y@v{6FBL4`uL;v;TmJ-2N!e<|uBCX3mX* zDE8g{p#CNM{H6Z<0#kp?#*Z!lFczry4b10xeQg8xQ+Gh`U#5~wW^!P47f(=Z3eO9e zsU#$wHHQ{9e)R5N{LEuPG7#g2^$)h^ zic7{^=~)YkYY!{(9Q z08^6+=i-wDe0Sa@?W-4C{^v|M$`A#>CRi#and@IdgNa0{!~X((z#Jn{0=&OZVp<*Z z3tAcTi!#x%O(i;C)&Dj(Han2ST>o!{u$un^GQ!a{76BuwdH`CP+d(vN3s|j6uE@3 zdtDaZ%T-g=qE7EZm-SZ<7GBs0ijEk)y9=Pm_wF4L*HjBAcFQ=dq=CgENk>`^)eZ7n z+nWYjD7C!$A_Ed3MJp}rx;F^M?ZDnU&qs*qSmq+am@cZIc?la{^C~rv>WI9AyfPFG zmkM^$Qt6{ix>IN#pVmbTF%;-C|5o7|j(fzV>F<;gwbh+{E6uBzd};|2){QbUKYAed z)ZnXup(ntcdnPdCnJ#~)8W8H9Hlp`Uc5a%*wkBVjV2C}9!9GXg3hySfrcWgjY`aNWI5*IV9mU(qOlXdV^)J|T!Lm;1EFVVfxG?=qOPS7d%Jr3bYfxlvvRd}zs{7Ty8CMz`H&bduB6 zts3?vOBSim3x%XN>6X%b&@R#K#V((PuGz88cmquNll=#1RT(*$237BE??Zn6jw0)e z83Lc8h*}Qj6oRjw*`zE}g#!_QLu=6hA!uTaVs!gu$Kz%6Ip9Tkoox+qPV;jZH5;>W zSVg1-{x(8joCB02Rl*_QjaF1Su}Zpby_Oy8e_-yJ%^+w_DmoX*%pv-GJTxboK#DceEYe;a8lCVfk@q?^M@x9KVfomA-mar)96- zvD*~Ii0(QQoBdtAH zvPmb?#x^C&08hO>ita;Bx%X3eTw~3HgR)G@m;>O^j=1vdPl$?~f`@Z63hXZ0yC0{9 z)y#JGc$VFU#XAOHa|3vVgidf<+7AN~XFI!0dKS)VhyRQP>P|mnCZv53K~Lr!m@%$} z<9<~*R2+PxGYi$K>A)nzjLAONVV#{t%J}(cNP!aT2&CBuj<#gv@n^usvck%acA;0x zqEE=tGE~G8U%D40+NV!Urn1#rGz)Zn|K3^_cVel#vQIHC2iN!#-hz@*ECVSoqsKs1 zYA32DF0>*{smH#eAIdx`Ok*iGYXjex(p+-a*m`X^nYM}7P;$4Ngly*0dfgMu3>k~e zw)JCm7Ptei`(x-mlISG`$xo*B)EUb`G?C)7>ZfQR>Zq21Doe2IDOvRwU`txn2wMjqdmwZg2dY_Xf z{wN&DPdb~ATn_l@hC@reC(9fDTi8w(>RCh7=CeW!;%1o_ks@6z$ z&Q(JdnnVL9J9~LFOa$uT!n~e*KVCYC2NbQ;B&@hQOtSE5VQlf)`ghuYHMDaF;nepJ zkxqMR0sWF~rmZ6TugE9W!M>1k6H*3?cKwaGOsrk31!`=%ERbD?IUdaWmNU5~Yvj|!iq)n(Fg)RY=dr2Gfd1&Vid9nzdur!T zOYSe;HrCoasA{J`_#J97EmUQ36GB$7a>Cb|H!NI<+1H9!f<}>HlyMOlc|zT z8J5W!CAk_FGP3%YpGTLeiVfu0fkhdh?59h1sh}TF_aYusPlnJJy{3$;CBq1nChGAq zo4<8qlg86aZsBZw-4M?@fi%YVI-)AujA;Ir*G?8Z&bDZQ&NVwB zyO*8?)n2J;uU&8g%+*H`lRrq9ffguA2E^HbD;+T^f+S(FVKWCY%b#&1i^qWdhuw}d zPQ97I5|oYB$oC2do_eDa9W*T<{F9`Sri@(bX(khweCqf0`dbeJ@4te9YbRk>nB$1l zS{qF<`@NH^FLN;`izBZRS4$^K5=qrg0Zp&zhYtQiJqE2eB}~JQdzVbc{?=Awx};XA z<<2)bWepdS%nl~#t$vqAZT-N??*e6*(@(69ER#E5+iHz(YmhFtUe-=tb)Li$rMWY= zc#kEp@6OQ*v+v48ws6{}nn$}xO|s2rHXRE(v@NxdecAZ);^5{&jPFl={vfl1Ejr+_ zW50d0J!z&U>*~=JrZK5voiTU{S+KubJvv9LpK-azZJUPa)N%e;g+>4z%4V1H;hvN_ z{5xVEMdb$+gAi~0ZYCYFE>AaaS0>J;UcR!8X&#u0L_}ZvDd67W1()7KKPEpI)f?BY z2pByG4VW_a8TQ#-iKJ8Y3+sGn7vvS=vQrG9b(|(p0O*=$n6p64#Ew_DkBxK3;E5}M zu5p7oE0zVS7;6itVm<6fTLEpVE}EvzYU8pEV^f(kqnD3m889XxQz6&lRKbQZ+oKx< z)HB>rg93sQETBaG&|9jVeg z=V;9Rm7zzVkF>VIQu&JseOz{^*;UA?^dbQLc~=TSjK3FXci8NCA~z)y!fpHZ^w3Qa zaK9^vwXPrYBJ){i`Mx!Q$cF$w#)9rzk5cdQO7!%qX#yNCPQKEGH)Z3Q^>9a^e8Cf%SV-8W@jS?tOrk)BW)X!9v zx4U_)baloJHC~!}?(u-=ov^2M!)k^YQ`!n`JNJ*PpNwbLYTUN~6#oxjO|&hkpg zBGX^8!|JxYi9%?&zN!c1&tmQ)i+ZzjJ+tFco5THH)TCe=hYuvaxMy!p^01%e`M2Kcm76B#kcWmgsHfm)b7pV11q+ z#J<~CAk!BQuH18jH-mzLKgoxUGplx=^=kWoPDE4nz8p>X(N#2KY|ad8bi^$WUZFIn zS5oG!OzgQxhdNNAuijV1_WP+ti6$*+@~o{|At5a1o4k<2+m-OND@wb%kL$42AJFV{ zpkW6Y&VCI|`OyVz4)ipUa36@EzE>H_=?tmhTj#&jhhtY6>k_ctKosn7|Ltu;RRnbn zJhLwI)&!9D5eN;mX!dspdj5T2_XeA{pzuqe*{rxq{}|o+U5b- z^~?Gx_N+iU-lRw551jj+Z*&HeWea&yQgZUY$Uyq?mGNkqbn~SxUDj{b&V#~!g%XO% zn!{*)ZNxpW>z{Eu8!wUfDj$^y>e;7(2VZC<9q;quA6CEd;V3VJoF~erXU4mY>U4!X z>*{#lI9PA6dA@o#y5`xHwKt(#(jl2Z{*Z;BJ9&eUnVod#E_)akoN3_(4=F`$M(qz= zJ~S#dGi^TmZ7@^h$m4lN6UpuBnXl@)&@a-U>;<^W1*y0gvI&n$wMt0Ms_J?Gl47*P zxTHhvc9OcIKPIX?n$}nZQ=C`4n;DSD--7*j39f)}f6YMu-jZ`j19n*`^G^;w2cd?3 zi|c;l`s6K-wJT@iXc?d{x7*mO=Wku@N>v~xx;qw< z;QG;8wWk}L_Aw21oC#KDr5;xOkMl{>)eaJZT;aeU*Q+I@0$mw5-GJ<^&yFL%CV5Zg zQM+CwTagUHgI*v6Z*q7pSBScW9u9lj#bzXTURAz#@@icuJ(5lZ;GiTHhV7jiNt`lv zD!kdc<(1Ejyil%v^8mC=KPTbivNgg4CmmCerE+}C#K-+ih0$*cS|RG?)H2aw&&T;x z)tHC`ev_kz?;W0F-p77Djc>R>>9W3Dy*)TNA9?s52U{TYv@{`6w$QUmJz6V)kDe)u=^H-vc8*e{A-(H^7}RqAmug zt%b_6Qw2xGLOy&=fi-X|mY3G|??tg^`W8tA!DuXz?KGN&Q7^qb^VV)MP2jCIb=m#a zj_|c%tMT=q+IQnZ-`#<4B4+X}r^GqVfAN;|lIyyAfiy86FB7-@B0}4o`u=Y1$nZCH z6m_5`MVj+~!4KeW__O1+)3G4$lp#8&ztH2MQu3FfE9CvY8@2a3y+$GT*EP46xv>2fD+q`eKtG7B{=7rv< z*tzecxperqdb!IFXs7B(vJTLsZw~FDd2dS z`yyOMcVW2|fTNyPgp0V{NZ6>%gc%ge#6CJF%Lh;v$cvAFojDguirv<&{HXzU)(4gT z9$4=W-KZJ(3jGh&Kav+8s%7eYI+$EUDVmOugT_Y~gtaE?TR_ooJ=TWkz-DIWz=7tq zK6Ka^9lUw*;??4dRKGcy_Wdo1*U!b(<#bVY)VJ~V#>Wy5?+U}9aI&gD~PTr1V4awt{``#W-&M9-CyF2?9cS$;@zP8UBZKefuo&CbWjOV(H zD~)f%8JFBidwXi-!a?(?zgN115&s=yVXAQOw)3Fz*>|=5`}3UU?~h*%3d0WO;=~*SwosE^-{oVbQg!(RprDBw%Hao-&!M|$`|}b8Q@x+6N^8U_#vqNk=_^y)Dk}Oa}I(L1sMf?;pg4W&=dFG zB7MN`{^9BIExq`Om;Bq$liR1xJA_yuG`SaH!xo~MgmmfkVhc`j~w{X47@ z!I{nnBifySki+=vodILRox7bPF2dorU5Ce^yk5f@z@5fmi9oV)li^DOM*;^R?EIae zxvY2(IT~7gGCzhskpn-G<0JNWg3|4AW$(f9lx>656!OXss+Q%NmfQu?`Av?7eJcbT z?=)a?H`*vV4JB7h-c&<7+{h^5(f8*$IXQ~#s7=1m>2+r*rBIJyn%_h<7B|A^sDd-k zl;In*Y_)HS8&O`=R!Zb6=)af&jmMwOENEg3&G$(ThoAPz2T9`dSrx<=sR z=yZJaI6zR1U*L(#4bf>K2Kf*yrmwXjFxgTMEo0K#&Hd%apnQ}4bn_rFIKn(~*UKGJ zm#mIK;Ysj2HPDfRP@_$x)o5}1lTvI7WijH3a!F;h5IDRf7r)X>^xy-aZf(k^q3W+X z)cDmRxFd5k1wGZUg$t^*IDKXyMc!${ovkFir!Z;MfZ0m+7!poR6s+}Bu~3AhR`?7D z{z^_yzsEr?i%uPhDK68aR8ioYmo%CMV=t>a5K&xAV$4RJfhmtr`d1;!TElnFV6j9_ zhP8|A?+!`kik)cy3pEvW7$viUY;-nRbdrT2Rw0Z^Fr7#WnQW)GLuArq2V!uNp;v$M zCiqqGBeJ0lap^U&*Fdpk_f-V}-=+sCiEE0RAZRMqe)KjHXr?$CiKr&(6Z50)*{O@F z+aK2AjK?yJ=WO{E!e_+x~Xd%I-F*mQ-eFyRS@VW5V&aigKDmP$Du+q`gKa3_9~ z-@eYYIr@HmyWz}0AsNbk{u$tTj3_>swRPKV?)ds(u@~^9rj*YXDNpyv*Rys-!ygX3 zjyO7Q4T}JZF*8YP0nJ=U7r8;8`*Z_1v80r-2Krx_NyS#g*)*>Fj2b)p>E9~{O8n(~ zRDva#-fPF{e0Cdk-SVcJ#AXkG%-@R{+|#m+Ag9UBVZ}^Vh#p0OHf65>9b?woW%*s* zvtPn}5dyMtSyi>VIwlYMX_Z*;lJEHEyTrY_Zsq_667#2c=_|5KM&nBuTUYA^?#96f zW=5(Rj!XC?NgV&j*W%s>l;ITAnJ0gAjalwOq@3otF2fxnBFI%vD5AU5?~9$}vhUDY z$z&fpP}NcN5`yUnL{bP5F{uqgsk|_QXB+PL2a=oR8-B{Pl4+#Se!@miNef!y*ArC= zrhNg75FLpI1K6+1js^n`h!k*?y^<(|`;y&05O`toBk&;b$Yj43FWlEoCSM5)sq*MH zU!kv*7dfMwTYWY3iffCD@1ZPtP-0(CITwzuOGpd22q>_=HE5_!bHH_@5Q#FBpby5Z z*hS74_u+A*OEfWFkcuK4Q=#zZjWZUH6qf?3bNeIbo#EIh@G-i@Y0xP?g1?w^yuX&m zPaHeKh=rGgp=1xjAO|nqE~GQ89G-v+7n?m%naMUr1`IOrI~~X0Nw5SnZfH zwQ4(=&`)E}Ll}5YhRxY&=FDp$I2G*&B}ggsh9uU06%uuJ9GVko&hYu@w5;3_zvTR{-AL87-G(My;FmFe!pHn#5E0KMYcDmEAfl*KC}p) zyQ5lai1s{b?zO+X$Q2w)K=;8V#8?t|tI$MO7OODe6}OolnpkLHT2+;)!RT(l^9C)V zBQ&K6|0t&3v5Vqn)KI6G#I&qn15)Lzh#qO1hY_;&nkr4q>;&a<{C`sBJKv~-~JC%PIUp7f)(|XbgRi|Qo@dx~8q%z-nn2-J4d3E}yvN1&X zcg4(aHxE`8-68Kb50(_^xJF#7$M5lk&b{#Jy9c+dH||nvJf)PARw(0xg##v zL;Y3JKi0|p_;YBT8WJUuUa)w;tZUg7&4!%ipVU1?mX0+aFEh{564U{O0Wy%Y&?GjSpRp)Tr$5CnE7hZ3|j%CTT(!vt+aKTPi7G zY8D1l@>_;ySHr`bHPefvt1VhC7$RG)3S^lrPY2U)xa(SZI}`-f#PxFDzZm+`*O+5_ z+hV>N?Mu-Srws)&gz=e*yomlkuD$}Qt*%+SNU`GXR-EEaaVNM_DDE!B?Gy{{?(SNw zIK|!F3dOxpyhZ-d_x!&)DOMWXSX^wR*T?<| z1ppACC2Ba0Ot$q3-Se@)bDtZ5k{%b2`yXdhJTH3 zkM`*{vaozFs`l{AnhsQI`pEq5r)R0>;V+NllB9GPx0*y-q#+%s6k7d^(aM21>IsKo zHr#O1Mj}yl*~3s~#~H;-uP_JOE4NiCLo2jI+jXL9msf}|)rC2?BCEBp0s7{6jE`k` z{(g>2pA1bi!cw}Zg5@a($>HXiq?nHwBDH-CI& zxmdJuXqh*v=hZl)K|TZe$vC~55#YGwk-kQo770q-Kphe%-saS&ZaBx?NSz4JdQ3Vi zMC~HLGcznE#g~1{5>Lm`bUlYBix&KtAhiLKkf;MH`l92s-t24?$^pQvP){{!O8C2U<-4ICax)Bw zv@$^<%~TKWVEmuQ^qgY3=dNHSMV_24J$5S1P619{!WVe(d0 zalsRISSyb9>2kp4TI5jBrv&2emih6>%{7{OR#SUA9(JC`wV^fnBI&)RR#G0W=%zPG`GeKL2^*5fl-2pEguhksCt2zfeex;%Xj5}#6l?Yja=TfL-$BSW7Dv`iISXWqw115}`wvaf=4 zOLkj!`xbR+6lpWaqiE(1oMzSTB+VJ$&j=T{{6T;s8(k@sN4$)-FN1JPb}Q_>2J=T- z^-unU)60djCOP%hSyDrNLEmQi3^`rEZ7Zr+pPx`yvowOVe|^x;rGRCN=aKfs2%wmM z>vX~6A|wPZ*{T@r=Q*bG298~$lQSpIf|DxoG;QY(TNBc9C{;In6?{y}40t_H{x-ZH7!oZ7f?S=RHsqoNM4Ux;E0C<51<&~8w!Oof6@{Q_uR7Hoa%%(N^T+dadJBI{1SaOv3N z6+4Z<2_Zv7qC1nguRX4A*q?m=9Exs6U7kX3Hj1gHwL9oBO_uDx3u+KwaXJW@fn2}| zu80uM>S~@iFoi;XaG`!NPQ!9zKiqcRCvLitJi*+aE$+m#5z+nza zw=_5-96CHmcrhoR=Ln8Fepwhc;IEcX%RX-$d6L(#uUx1_XVRT(EfZ;^EJfYTN>^1I zBx+S9J>Qpml`7WVJ$-~lM^(Bg#0&>rl(h&JNdxNhs!^dKVIl+At1*M1i{PD$8I;lK z5U_(`5E8kt5XqGX@vBRklmdp9w6ex^3#BDk4aPav z^7u$JNn~+kwNSm@9`xP=lmhny?Nyw{V-you*eat?Bcw#Cs3Yuu+T(?_#OI7e_1*2| z$}(~RtHhfYP!Um&D~_V~qWAJnDXVN3vW>}?MBsw|0`86Yn{90?V7`D$6<;;A402$V zCEvSgX3?bAuVOR_i7k~p=`O@&BBMQWX~La45WiS&WD&Vkpuv76CroPg!;ub}849mU z;aelk=H6vtzhr(wKFP-O7ILTJOtb0}JK>M2@UI$JYy5++ma~r7(N~)b7av3&3j4;o zAuMMFlxYn$V=+z&fY3lORH~6Cj7E%1Fzjhl(Sg)}=KHsc{rb)=?RDn?MISvSbkvEI z`0&d6EVeIaJuINCDGxEMFEKaU;0RH2mz*-X9q_*W6) zCHZefDC>U}p+DoEmyt>-MT$l1ZxPdLQu8H(bbdUMR3Zr=qxY(trl`TdC5XuQE5i}veGi>+WKV}gHo zN1;V;Z}d^W@bh!bWO=s2rgSYxDStX0QuHkW51^#3`g4+|uIgU~-tyb@ z9P`|ASrQ8Sw&=2BMRUJ!o7O++cT#HApZ7}8@zHt88^f*q(0Q^#iQ;pj+EIqlhSBzh zf=C6ay1-$+el!j@1=^M5#xj2CMf=vO(o~ShbSn?B4*i<5buTwlGxB|P5t>>mc# z2eoNZz%Z}SwMJVzorWEA&iV3X1uoHfoqJ2MF7dHppf}Ul1gg-osP9zW?;-)qw7Llx zo#L{^kYp?3x){(Xq0TJ(xYWIweEMb(RVx ziEA`=DWZvv&cn9d1~0%ZPHW8{2F!ylpbtH+(9eW!3Uqn57&?i>YJ^tWHJM>6BI_8wnAFIu;ex-%zZ z@Z40s{qa6!U>fU(W&$p;E_F&MhK6;ctZUa7lc!C%tqtPN9mhs?;UtXMZL+lCvJdaFMIvZ5Hos?}&_**Jn*C6s` z9sDgPnVa{svQ0f859+?C?IqPJYe!q&ru)`6#6-kDmWmxuz$9W#WkGL9bO+Iq2Eitb zPKNOOP3fr6(I}92$A(sr;@s>_UKrTndg;brv%&BhbvZB&sdI1Kgt!6?fPLYScE1x* z@*~2x7suXCF$|cBHv3|TX*4$e#RyaGuf(oM4(vli^B3;*@pTXP^zn%zQ3j++O5^>q z6jge7vhq2Zr|6N4#Er#`O>APe!g#4wR#2_pOBe;#iY}4cqH`k<1x5K%N|)@~_M2Ov z>wd8*3uVqIJus`NO0m0_0S>J=6ef(4qmK~S z_zy-n=rKt#v&CrzPy}x-w3XQniDL9UzC=l55xxCe@1-uq_VTKZ{TSjd18tLZ7VuGI zpn%W^nR%*rZK=N?B!ub*#lKL=MpWB+d6U=IOGBzL#DPQlNJRnZ;D5j%z_8P(?r~sc zV(o9gAmuNOHZ&vuPy!)IHJ$t+nmlV z%hTZcRRqg-ncJAVF8+k-W8@m?r_m7)&7V%$i#?CqPfpKf>p-u>ZH;4Exs1fuZ-2Ug ziqStCa4BbM=$+`Vt;3;5;X&-V1;@OK?6p1?BND+U8}Y>2M5NYos0e6WHWESb5xwHQ z;B%2*hQ_~Gfe3pTs={;zgch{Ko$j84T4B#2UyBvRAW1_hF!dOX5xJOVAsg_(F^XB%bI8M)lo z8HO~&XyaIf)7J|tq1K($Nk8EryLlu`94OsxQee4R270Q2#ZIEOTyH>T9oFA~psZhV zCT`^(vv4P_^|oi2(=Qd4uPAc(cR63#I8+~tDiPy0TUiuInL=;SoRm>g{1_M*1CL3e z!Gp{T=p>Ty>`=d|)&5;vmwaxyE}|$971BDkdOa-ta7ekx+HwSA4W9RX)CUFsBaauX zwNF333;cQZ0X~}H^gzWMC^>5yMkS@>#vrN@>EoVmBeO_ITEWmY>W}-ZXA-Wr;is!= zm&Ww9a1F@=QPmzA;1%Z#J|BxR9NX zLVS~c>4m$5@D~@vOXXD)Wh?`~XV^11>-~z#hFoF0x>^tyfq#z=HYZpph3xq{pZf`X zvI_Il+K}%?zNKJvq@orzDP*S_FvnqOZ5q4cf;Np;q->h;KO!@mBjU}vW{x`xhan!u zy;hg6{`8sw4o95VKb#`sG^wBP_lWU;9ik*oV7O?%C7BcsM=dy*0SqakHp`9Cj}F1o zkR;$c1GdlCN!9M1(`PHtz|rY%0LN&uG1(gE^Qy2(sR!e7W4byB0nb*@=E5?C~wap&cRwsU~VoX+YoEOm;T+CL# zpJUfQ;pQBGW1i!2;f=^O2SBHrXdRMf{G0GUhZFq~l_15>AfSEkD_ZGQ>nx(Wms%Jl zgCL(MK~iU46R2i)M@+)2!iG~b>HJ`k(kOUL#5AqkSO-_BtUR-GU1k>0r3$m0rnCDde<5@ zcH6}Xs>EaK*mQxmv@MdL4NTNw7q@apUNm+ETH8vVs+~+qkVEps(8?I zXTMaNc+&>iA`CMb5L0m|u;Sa7g8KsY>g9X6Wb^PsQ)?rdOrmDV&}`x<#Q)_eUv%(o~4w z(T`QaU6+yr`b>9n58E}l~D!#m6vz_evS>37sey*xy-V2iWq$kdSxw84o?9Rkf z7E@MONy=B>Pw1hy7MucE>yVtTWdjY6qYb)lQ%KH}JTjioHMLdzZJx(s1pW1yT%Su$ zOP>nsg~o8-Wb#cATj(cnI2;^|;hcSD-C0UP>U_v5WDzDp$=jv2x(D{^0~3!A-Vioj zwno_k=&ciTdTSQ%^81DrTQ|b-TzEQJ5`S*IOOC%t8NJ)y5AkM8q>(xpFw~m-t(Bs4 zK7m}F+8DXk)n~i+{bbZ*-!oZ?ZC3{o;nTwBoF*S(>Z?w$hq!5VaX(gCBMwyP7+j*d zb>tWd$y*Mw%n|<&nqk0O)c8I+B(Y(o#w>J587?f8 zVWlFDQH}MPxo-U`e}pD!16?AqEsv$PqeJ{1xNv9|wMH<76By}0I%&qkxYSO&8kp}s zwmdafu6*`<)%^#GJ4a)I(+`cpMwD@0l7N(py=q;I#KcGG;kGcs7?6*;Q-uE z(lYwF2G++WqjV7V@)Wh{?2&`EEyOp$ep1h6)Q=@V*xF^x7W#d~A z_N?Oo)uIEGNdQ}Ss-e6ldoj3^GQo-H)pY8dH|4 zs`!_zj>RH)s8t9@bR~>rHoo|*qW(6t=-ccaohTj*A^K<^d;S9jViI>6uN-K0T!xXN zZ1v-B!;3*9Wj^fXAtiyhJEUJAt(ODxK7T+T>;>F$KCbagGmrK=?Gz33Mz5K2Gj9(O zwemw^lzRp}aEp-D>`kO7p?lfaY8ia~NG7+@yy-`l(}6#MYB9J-b{DDT(}8mO=T|4h z7F!dtkRfrLcWI_4!1>*9QJ=_{WoIPscn-uUb8_eC!`o&v`uiN5EksOcPmBU|p&WRX z?Tu(Dp}Ves)ait6;r8nE?CxL|vbcaBz@5ejtPyT+jjs7BqL*@Yjl$t0*zg@&XTz1& z|M`S+BJtvvE*cuULuTMc-&cm1jSkIZ-Hm$G8&vPXBC_b_?V0ht6K6=ip?bNHLL2!R z9`JyGw>ZxM+PWyK%b%{vwX`;XgLjWvXDYhunfi&}+ilE8;{oPN`7zQP(j>pJie>`8JB) zBX6O;84t7cNl4yh)lVjU#W?AAC+306U;D#%SKsp#5?c!!96$X)bq4_G$&?@W1d|vu z4m!1Wm?;X3Q3SgB6nwh2w?v^G0wUdyk9}F1P?me}1tFY1D`)jQj^5t^%AcrGyHRwg zx)onZ(dGaTao1^#81dKisOTSZeoIL#lmu41J)UJ?kGr;dh4~>T;9NW9 zntBDMe|FRkO@Ii;3N5oHU$9ofdvlsST!d597 z4eZvC+%5dp5DM-y()(ZF>gY^3(WJ-bkAa&zW}F_#fpNEFM)ci)qIkM(Y_R7j(;Mq<8riMQ+A^MToCq8dhpP2~_d<=+*cL zVNY%IzzjEEfwP%OT5GDMS=b^*v$7?%_9U$Czc7tT!*lVB$Gkz)t3u)TW1A7UIm1K$ z$^P1Dzq`YQ#sH`wZ=f>Sy7qFM^xZd#=aRSh31XdVvVQU!R*MnQWwy}~0if;3mRcOw&I9t z39OW`DO{Q@9sj=2bfhrt8jJS z%zGX>l!*KE;%?emP&IKfXHIy^lK0=$O)u3|Qj<;7`Q*u?e?GPvr+G!RFe>(noAVV< z1LC()A-k;_Q!_(f(DcCuw2!|chfnA+)PGTfwh1~nvRa|ve%brFetYnucLNZ``v{R3 zE)G88?2jJwAK~ZiuU{Ru>%fYqoK)+5KC{0*FUH)XypBIJOJqf3bhdZBc)L&YMCz@{ z#P?N4$p236fqJ)z<00Ppr$WnitEI!u?r_DnPh<7_wEHp>Sj>%7j8h&m1N~#NV7nxf z2P!z_gt-+>5>tD#ByiOP3kGn?GR`l<^eH$h_H;?|e!S!M;+jEw;eHDmvE8k!7K6r3 zU}z4X9I}^}Qy}dzA^l->AmyQ+eF?Y0ws=p_&|5E}BzZ;kV%hu?X^}AaG?j%c<{*I5 zb5O=YqyjnUL0gS^>Pv5BQ4e~;6$6{ z;_K;gi3-9w)#vzT*s8;^{xJ94_G2g3w> zXlIT>iB88|lYGRe_bW;mPS#B=>#s28tES7<4--Go5>i6?p?uRc;WC zs-o%y#n;l&BOGs)l$aQ(BX(cx($VBqile&LrCjC$=8EpfUH(XMt&alI66QlSRPQHz zb3FwI#BY}?0Pg#`j&?B+?a>4er)d(O9_;{kI-pr(#C*KI)avy^e{0UbzxrWq+37FQ zu;wrc&fN*)!fEv4k!51@mvU>2XowFyzaIY-~x9opl|0?hFb@GSf&0&s9;-U0FAP>R4bGShZ&*lk5d zbDGijh0t;#N{QnWdZ8pdS5lQvUNS6MZ-4mgHOUV>}U?V??j|aFv^a3 zQvzk|6u{Dj+$^d*@{x0c_~^2^LQ82Vu-4Fx7^eCiBI{EWMcf|WSqQlNb#^1uMIL|C z>cy*Il_Jiy!dYWlV*=Lw+gI@JUjOhEH{5bM{4*$*<;xc<+RjY(O5BQQJK5ek<9Stk z;+$MS5;@+bop!xN2^_;oH_nq8=%DwK0z`w^59I~osGO%uAkGeO+LPTF-Yj9-Mfo@S zqm!|t)PTj?g_gad$JCL8l&um=f0%C3p&O@z2EBW+;E09Rc-L}&b4mpuyEqi#Fx zmXZ}1&8a!2(|7gqq2_D1?K$03|KCH%SD?y!rpJEo{~SU>$BSNlE@%V3K974KKR?85 zeD92U)?lbbzk+|k`c()R`gboouBccnnIXl>FdD2Mw6K59H>FK!Ul9nDlY(r4lRG>_ zC4i7W@Ic7K;pBIIjfF)ou;|&6Rnz=|d1(D-&PSHIZ{3TM&s=|=cD=|xWz+n5j!Ixw zMV4|J?qMiQtVk(o{TXP75knluNUVzT=;(HTF(24#Mzmk|x)SY-ZYF*GTs<|3wO@BX z!obQWqV%(;xH~V4Cs#3>izto5_r_s$Pqe-A7gw#&iR7PVhlp$H+={w=2%QY zaNa+d7&$q|W&%*MmBAB^wk}fyiQJ?va2-=@@)ogKQ_|uvC@4eSoB*eGa_Q8RA$KP= zA>oi{qiBjB+_oSmfA5!RQ48f2k12vHG59QhKe(7EtcI*FPS9EYQEcX>^asc^i>+1` zxmo_5KBjO@3bl4(;|IZGBJW`?36|CeeBickSr)!eh;--@c@Rt*HeAn47`BHLXZ=_@ zn3~9KxPV;n_!~H;fC)&IQ{)DYTnJL*3UfK|vjS)Sc{l`l3@K-RC1wuk#|>_U!1AR- zH#n0^WiUsrRlwzE&L+cFg6JsJbz~3`+B&jVo;VN8I6>E`MVQpl4eIuylQJ0^>T8}r?eJ8=4(J)_$Lt2hHP z+*}SiJAng8(}5G8|ApaX%SooCm0NtkgdumknJZkPp&q%EIWIT=5HjeGv?=6U7Bv_7 zA8d-qiT_eI=SY2rIrB2Ex8!jI_)x>uVP)|@fH!IW7_pI`O<{K^q(oF1)rMzh$G=r0 zR^p{W!B^4Yl%$E8WyP4o+5I4B-KGyzm=g;zhf620G|x?gO7b^{lc3@#Uyn359EF8f zII!(GN&9CIL}=`R`Um73{}&!gXO@(S$)4^rl*fmNBdjhVcEIg2QSObVk zz7H*o`Wb(HH=?_={cal%(1e1zZQBc(N6`+sOxR)I6_jH%7*)1%5sNOh(+Sk2;FF;K z3*9mm*uoW2ygr?{7>HNT6?;X`mEwKtWBzzThMur2XZ+vhggYPj(Jgj=`jaf z88Y@+^R1}@Z_HH#r%{3QGq^Uk8(b(i8#GlMB(BTAX>mf=l@6G>;a{1chnTiQJcD+l zGqQ_+{1)_M9#WE=D!&UEPn^ z#PDH_--N6LN#&(+D*p?%?*4QJI6FXUe-yhca#2DC(oIxi`2WQZcDN}!H&p_b@K_Z{ z4+J>>7a;^klTBqRDh0-CWCS?%^ezDL?l^+0_*WxVv8*U{V)E)QQ1vn4)7bd6d2sS! zAdNXX6_tF-ycw3bdA2<3R9Bj$ZYJtTrNxcU%hF~IK(UmWA2LnR3@9hSl=SK~FvrIPY`P7bZN(P+WNb0QTfG0%yuAi1(;sS&lx83z-_v7@f ze0_GMv=0qZXV5!Ii5$`S`;FjG zGnjc`A>u%gbQJau5vSk@o9H^FhJkHZg<{~bp69h*RtE%>+m9Wkq$z^BG@(FK~w##O{2s%x-Q#k2#krYGp<)Wm6>jG3!%dt9Fb= zji0_ms+HVS!VF?6WW2GlA02q{!HnDZLrZMi@R?li*LE5GgL+~*tAh7z9X53ojVO=RaQ6OegF&ZD&jF`d%>;Qz+Y~c*5@s@+O^%sG}K^Jliu3%Q@caW|V<1=c~#RzkB~M z&@lLkCCck?P_oKqFQ3$gm!oE4!m~n0ot16p4d-xQY4G{|g8ZOmZQX<# z*`91Wf7jhD`K(Y`Np-NWS%I^k0y%+Rq*NJ>#E?)-;Y`raR6xajq2}X%Wj7KaO&7s25{3gK;`HTt+Qiwf|TPTr*4lux1??k8J zylX8ba@7;%mnu4T<`BjgEOgELx^CgH$!u>djbd`Gy_}uLR!|h4hgM-`0UkLR(=)+| zcW@K zY})bdQ?beY!7XhNOfX8JBq>%!4GWME%_mpci#3)>+@*r#MG4aZ&V1Rsr{wpPRU3tQ zv5ApTUxx&UVKs3*i&Y}(~0mX&kQF*u^UYaG5av&6;C}OqYW6%mdD_11x#{<+qG2Nys zXan~6KPl5reb-wDrV|DnKx$VsZob0QfE`m3b^i>HSAcD49`C39Da}_ zD9&PU<8>#wjA%f)O2fE|4U7yOcSQ-J;yzwrmb2w{2f9*CZS5^_GYBFIK3Fodk%dgj zTbe6#c>AA5kC~1SZ3mf~#Hf(lG_l#3%ZDK5r4^?2H1f-S+S+{tf*Ffu-jSrJ<-Bz@ zk1B9BEPl^peU}C|xZdIHTX(8hY;^AY3g_xWgBrELdX|!c)7~K(22h+VkamrACBfq@@C@kx1J$p7Rvc4tKJ@YIdEMO$<4jg(S$wNM z&H|PXmw9;Byc53sY(IhI^YlsY%Jb_yV8;ifwqGH@6cM5=PO?Id*2(^oPgl?CwN8mo zGu9cYd+hg+6ncNE6!grrmp2HELG*xw*c&Dp5=Vjg?5bBbf#1DHWj!gsi?;%3!9UFV5hgv35?=U*l+VOSaSAR=Vd2a3B( z6+A|f0snI`k2nvC_LaU52sJo_6ytSoqo&1wXrQuS;pij$bOO`oom-RnsCX!dAO&mD zW(1xeov>keGzPrsjQI9uqbLNgv*JUhZ}3}luEQT(X{=5(SqtYB=L{iuL3llHegs3B z=h~J<*GF*Z&Qf}_@a|u-1pr}N?7q7nU2+cnW+U@DAU$*3Svm>G+r(Ia6>8YIqC?Rs5Fva!WLQSv9y z6+)VLheRI^oH?ID?h_dZ*!5KQkiuT-1Y=8TVPChW7rt3P7LJ7!r3Y1Bz0*wymPn+7 zBtH5pLt^P<63vX7`DnRCwI#JaeuTv=q6#ziCM7=7@XCjoGdciFG!&uIvFt${wDoA##SYz9E#^NmEDD+Xf2g>ECT5% zBFH&XTi-iUkG8}k*(oO5w}@*6Fw%P&vwlR>3$sc)0D*&yn&aWfDF8-#Bc&nGjJlQg zx2xizzK<8yNzIf>$!FA91?;^Qr$j`F)=Mp?{gE~1tKLZ$^Acy`*Hh>%cI)kOJ53Hc zQSouQIZ~(-S>(GyilyX^9Ik=%pTegZ+3f{O+5L&C9<=#L{WHEPY;vK(+Kf^o7mY}z&KS=|^Dk2b7z**g*Tc3IdQfpK6 zHm|sKyf|;#i0Ep!gNN~-HF*BL$n#uvKEWSwRZ+H4IMcdsnHfX2!8^B16-pkJc(%g3#}KwppN@G zg944J>-dUhODexoXE&kZirs%3tO321KWiB zBVEc4n-u{cHjLR4M`J7gn zI|W_L<GFr7AKs+~0Ox!d4IrixH;JS?=&2-aNg24ggeuIV#Hnpu5ZRRRL5a z94p~BI+3GPx7p{Sddq-^;0LoKxS^)^Y2fbBJn-iiTmABE9mIKjyURI;>JsSUJbUzF z^Nnc})bru=K9p{PMXbDX`Lg!;k^%v7+K z0q=A0xs-&J}yy|&?hD_svp17ju1WL5RX(^xZ|`OQN&yeM3o46 zwfG4a1y-9y7!_)Plm?*|a{&&Dn|gd`Q1L*hvTk?oG<;dZFrG8SmO+8*j!>4kmP=w90F zIycxc5VS?RPdPI&Ed;k4je#VgjYQV2jcu&V2m_FjbdOY(iU*>Bn= zGL!FDhAd5ycPc4o9w(3`?Z8R?KALn3Cfg{h3&-nE$I@!9jxC=DsXeQxP-a9#XpC<3 zPrwPzfYyq2j|HZa{lpe0cO-^-$z@{r`+0+dKWJ6#0brKo-$B=rQD;&pjivj<#VnIZ z;~|#+j#dRFST>Q_M8R%fncA(c7oteonumy|ZLXxnTD|i+P-YN)(NyQV2nb0);x$pI zX4AQt#gWI6r0j`eGB0|mG9CB)f@B`y-jz7LKw}IjdpF^?Wr!*Q1MeJ8k$@>3T*5a< zqd-Gq1y*WYo{Lf2e<`PI?4nuCkq|vKKTlxhfV3uV3=+T+5M>L4j{)Y7@7~1Pr~TnegT42rj3PW( zXq1TBSBHNRI-&T6Rs3}_clFHN`sr|T9G-qIu^h1R*&NXQ0t~A7_ZQAY zqH-!D=FN)}mAb@AG+9oImavFtSzBIy=0Du4$x}@3(~qv6A{5dQz!n?%xTkKu#}3Ij zCoxVoJ?y+E;ZPZWz_uerEglF-Kxh43Cupxww?Xog7$hNGnPHfWV(Xp!KUwIw69OkS z7m6l_cOKh;xuXU!+ORBjsi7h(?Y|l97#5Ceu84^WGUg7PRT1d_)-r8r^NXVRETcFW z)6U69Zy!phxbkmy0^3#17<2yhThpDK8~e`UIN;db*x~KTQ&9s< z<}AF8zGrNC5Vx|Ga?({PZy`idb}Aa<&6XbWFak8i#EjrkkX=Wt0gw7oC_=n7&MP05uz zsSsN0v}XF9g1i6b{rjk|9k!n|w3VNpmU$xXOjOTDrQ;JrqIE=we0pZ}e zP}IGuxKU@rn56u9%8=ZU+!XZ=^+EiEe&!xEBr}m7BqiVhrVC;#tX=>!0g>b3^#Xxl zA9ZkS08>%aA=Whv_=?07kTHNb!bs#48>M6T!oA``kSg%BDgiaxQ;~|+&0(F|=o>(I z$^kd2E~Vf1MXpa2%%eAM!5W}X%QE9EKT*1eBg;}ka(ZB0`PJRA=7zs-H>cX$;=5YY zNn|B=u za&Ym)#~RLk#m^-YZc%8g`n3M)xa*poihI1sucC~N_$yizMe^_Yt;9DYAsS4fl@gi{ z09V}n*igDsATAyT*;nF!9T@MFpV;@{wXw8|22f}@k9UcYAaNG7Zu*45z10jU(5j@2 z>zHsfYK0xG;fv^2iH~g$w(T&;ato<;M}TKm;vFtg5VnTp|NIe}93u%RSh~D|y8d?_cMSWjcLmck1h{@ID~D4XB)%{?Xo&ljTzW8;%c2$6==-0Wc`vjP<9a}`xi0~PI#0TZhh?L8!-B)fw| zCK=I^!~i5Gkji`U%<=>UCUCSqoOl!Ue5taXkY;Ns_7&whgN?^Lm}y45h_h-1QL5;D zDR*^(%Foe{Mkdi|)|6L@9l=WUY8Qb@^k?FmYONmLcZsqx^L-_Rgy;0WttGi?Luw!% zWziDsTZ$?AgaDT);1{-_I$X zy<}0aoInH#f0RMp*JXy?DzGu)n@yZ!Ct^ew#<3`eX)Swbcdt32F#&rquMSKk3O&0?QJKZ@MKX>;9!}&#FU1V1{KfeYIf&=P zYT_GW`h1{58F6}cKA}L@C`H1BvX$~D8(*ttc3^0AS_Q4-SO2dVQ#KW&K-zl5U@P|T ztRJk{cqe!5gE@ky=3C>YOgis9cc;a))oZmwx09F84q9V8zNZtZg7ktf7p({> zEL8(;OWS_c3}*xzCryE-*RAfnV-dgln;D3uRPN8@?+rhgwK*i@o?XA3PkADC;b?ov zGI_0w`u8m}ww}B5S3v^=gX=$&Q7}H}rfpz+Kq1`%ec-sqfTMa&?uWqic%AkRze|Jr zwFHE$7kVAMea0xazcH1QbLMmLQ%h-gT`d)VPIj3Blqwl7{;@Lofcw9?IO(o%j8r0# zcnHTOrC#Vk)8U_Z#5W{2^hm44I6|jy9Sj8&&@sk z%Bqzzo5L?9&=fzWGh_~hK6Y~Bf2#M^`cGsq=>J3p|NVcF!Jke~|NqF~K~!>wptDyU z#I^t7Sn?1>OO`KNL`{Z}^`<5)Llw);@xrsvN7%Xf)=v$nXLnSG&z0rL`f}0<(zW8# zXhcm7=ij8!kl92{s*N2~r&Fl7r8vEZ)swSlFgK(xF>$*6v9Oyt2%dqnD4iC@x|Znp%2uxInQlZJqVM$QP8bFljd3-I+WlFp z#w(|kz&r?m+ze?_<|fnA3Q`;rh`sUjuT?fuj|gH&1ZNw4mohJxERx{%b!C>o`i>G{@py zcF0C8s#B+`IXCQfsJL&o(@wAyIpfVELRdP$M-~CxZMl(dEyxS)YfZsl3yJPcFSE>2 zMO1J~q)=SboeJn%RB$dNOY{W|1^x%7-O)U;fmVCrAC;OPzpYhBI;ktn$b+Zh8}g3@ zgI#lT_N?q+=4=o+6}}cTCaZ+<=l{js2|W{BC&6ZT%~hd6Xpl#cN6l3waOoRUl1^ni zfKR32FI{!gJP}q>sh8k;0#xeN?|7{aaGZmE%U(Ob%V7>mMzHMNN0)v|i2#2oC#2|= z8osLvE8UdU{+A@0^rUebX`d=l*1h_Y2c9Bh*$GAvH;&7wxe1~=gK{Zz%&{5^>|S5W zH_NiG0DC*x!wYAf{%gQyOM|aFKXPl4sRY^ZDD0BOAb}qT~%T-XT z51Wvi!&&G^0Ec{a0Hp2_Pq}4@1@W#*1ld5uxi47f}5Uye-{WBuhOvX`{V(C6jsSIpK4^3R=W3 zZtJl;=DR*xmCn>0$(sTeq=8QM78Jl%jkk(aPuQDL2;1!8^NTmC6^6&3sZCD2*=s`9S>=-$r3 zf}HMdS6D2vhSzS6E?rK^(~{Lx+8AX&`{!f6{+TNVdNAzAdiAG08+Se*M=Lg~t*|Q~ zRg_@MzftDDd=5`?p_dw@{%3T~5PnK+{@G-F#`#GGCJiwhA5^h^|h+Rq#HetcS7zPJSrE;wLmJEkpJ#9{^i z2d!ojQ>rqMVG6lI{#AihlECoV}@7Yl&q3Oi1p)o|k6Oaxn z80P~`x<(PdNS-GJiC2CC2eN%_*Ha{coeLlH)A@OWwL9!>uKW90ma6#m9IGo$h~Dds z3U9ZD^$)DyGq)Pr{yBrvDHWf!QMa)Mdggr|ZsGOZ?oSBjwtWFqX6tXR+ZJ0Dw;D~$ zCT<={;)0lvD-}^YUeGnRAEw)23ektox-j){yYo4+wcSUgB{laNHW&$pbu6<7sjMWP zWg9eh4sEmVHdHR?pS9syhOl!sR7@_50_s|%GY(ybCW@xEFXmkGP&$T%-dIaq?{tj$ zXar$V`QXxikC6d?3h}jd|BSIt%DHj{N}FJ${Z>`*%y|lumbgXJRFT!tFsIuq91Aki z6eGq#H@l%-B!GYG^(p+G{p;Y@gAv;u}QQYmR+l0Rz^dMF5 zE1^bNrBbAB%%OB*K^GhUhLfq6K&;&5rQJLqxHX)FCJSC+Bt%&9C zBa3Q4{$WLIw*;9m;EEXgU&&le?g^BpL zX=d~zUXT`3si z%(Q$vP>g?k_}`SsNb`a@14pExA|S?k>jxh1VY-v@W{8A}MX@cYE0NGw-wP1FH*iz7(#xAYV=V4AhGvb0(qTl)rX29W)U$!Fw`7OAJy-3;I^Xt zh2@yxO7YZVl!mB#%;Q=?{e8>KpB~3f86%q}0zXci)oJG-6PH-RxLE=|+fU(%z4%;N zjfaR+F4X90_fml@3|->*sF9Ljwg-#E3xe7}d5~oY{#(|;F;#XqP`X`%m!ia%S(ZTo zqZBTBY`D^b-n@^f>((r3um-}=Ia&EdO#O4vd<|8u^>ELoAZIAstz2QG*0kE%9KL8F zC(5x0uS@<;q@qSKfK~%DP-r&it59ax#Sw@W!;lkt2pUXo6d}agQ3L`sxd$TOK9S<6 zb94tLa*D6Fow~jO^UL~NE|@llzn@nN89-;(_OB94}2HDf3vOx zOPf9XFXP@fsK~L^A}iJb0wKZog!2@k*2)mH8I?j({+Q7XWX|zS-MHeAQ)z~}RP78` z?I%{Jk8z0~BL7lD%r6j$K+N@HfxJfdUrkyNvm z_B~wTAw+PtMT363ltKBjU>T4}h8xxXOGn)QF>KjPZ521>p88W+E8O_Xy0>jGx=us_ zW4OZ@C;R^4P6>>fp;%sN5WrH3Knww(dc$>m(02>mgZwD#3X$Azz!}NNp#&3I(hC>Q zH)Myl7(meguMN#KC74A$$)fOw#dRJf#;>kHlR`@91Fful@wSLuQtKNxe#gxBI;8omuVc^yUy`fG3QV;b7uQ3>1;^Q&`=^w*ND(L2I+75qS-K4zjZU0$iIMI<5u5-U%X$0Zqx+j zGe2j3ZZUE2_dF8SH0|y2wC{@qgw+e0v+A|A3%h?fVKp%x?efy0#>*l7iHpG62t2G? zX!Q{8r8qXlJYWE2IOc0KUX#C8CG94>>_U{ZL&tQ&={6#L2(cxlgAUPOWMQQBMUW>6 zAm^ybgLnMd5+N4@WmcvdQ}rhACZ$rP_uPGU@G%$w{0TS%T=o?RLpdM2!iPw3x-!*xy^z?GbRbIDyuJ#qA=B)`yH;iX%F zus`cVp?ibLPmZPjQr!R5Au#yI0Q%a~6ED}Pb>v=jU2Iibo$JMCns;eqPeS0626Keo zJ)iZ*i1xp^+xhD53pXYJf}XiC*N4O8;;P!-Wb@=>SI}qP>C+oOqim0nMbA`9BG|t4 zXWU(SAJez=oZh4!?i~!{fzAjb)j^bLZ6jFA!%(59u!y5UMKY90YlJS@9_;VCT8xT8^h`Aw8*5V*S*yLsLNMA7C{8M^zL2n4}oc`|t0h=U) zn-wvl^znsFqI^d|sQ=Jbif8V*CECq#*}3z&Y=-&-X|9yPmkTG2`bcI33<$ZCK4H8@ z6Nhaa!XdwX1yE~aBLAZhu+Si{R4uw?H?^;yHB*7);2Dnc^R6L~ckk72h-dLt~2o{|u9unK~%PKW-(qW5kF-_^qP zIe?{HOPNOkOvHt|=cIr%6Lys=?x!52bnADM0Ld!cck|DKmZK)^JLm3L1#;ZPM6@vn zfC<8gHy9A;m_X-%QkIPu9`vS-j2DWf8PdYojYhXby84Pxdq;KCC&$CPpf8gGQHx$t$T>_NdtKY4uG zJJ)ehV1a7#u#WXGpF-@nxrx;F!)fIl0NIm&#yLmeV$_n{m$!@1Ac93Q(QtH##Pi1x zhNRz@=R}H|@UBn(T3W_ri1m3C$ez=XRE}T%3nDGjg9jy448b77?wyD)f5u~THos#f zPP{r^l^l4*TB&3sPH-O(+UtM&WJ=^JdizK5mHZnx)+!+-l;$7d zYs0G#n8sSR`?7B9UDGD*?E%-zHXpo%JU3V56t&((*67aj+K;slmQ{_ zq4+`U{!on&hQA(FAOw`M_`8t{?KKx)hvz_%UW$=8g$QzEr&6 zrr=G}a1Z|8&z%rqGu>8?ZiTxB`Mzm{jzMHyS^1M<$2Stic-SXH7w<gHr9oejz}+CQMyMt~Mu@u#HV!(gwQ&;6Vz&UeWHBCeaqe9!n5h?3 z8W=o&Jyec`udBU-xzhXTk^rNaVMuP{!Jk-^vUe%ukk^YlGBh; z3XdQgBpamTSqQ8u*|YSK^WeW_>yg3FnBq0@cJmrwA+r`xyI*rDU97WHz?BLarZm(_BZxDpZTSSQPA z4cPv?$E$JO73g^ zF5ah{>CXbFqI^m9`8fMxippL3aa3s)Kyy|bSQEpNmC&CKjjU8wD zzbg1|tw7>v|AT1yx-*1NsTgBYp;=edL773BUqi_W4@g_;I0JKdnXk+`) ztP|}wfsJ=3UAZ{RzXQ^M_=1* z!>=RYKfpF$#1|5trA^ACZknGc4;gP=G)&L6NJqtpEZb3BP5q zS{=z(OernRF{^gcSy{Y%B%XqO|NWkn$l3LN(p}Bt^&+6rFfjRdm0T{b?}2AtlOh{1=%3mLr5jNP*}(zKLUJlE6|pHIK2ah|jd_ zn}km`dQi8iP2SS_Zt)OV=XxcpE7gK>-E(NDDdfb4gzWjobKph18u^o^IZ zaeJwQUcct2f3RF*4KwGes-t#%`;As^Z+a3*7;y|}v`6W2^SKRjxeX;E5|$rZNo2nh z)*ns7Vmafh(d;A%NJBDSY%ahpS|y=T9$K{#;T!9>H)^Z1Ca7A4!}{r_*Ejy}QP3); z`vP#)M?u%Kz;K0ABUn$^DJgHx&d>RW`!snA_u4Ykae1#h_s#8EpH+Wtf*au6Qj3nE zQm?;eKjQujDbnKPyowfIJ9!o!YTSGpD=u&SNaPXSj4YNoB|E{EinW-6fu_oUsOhJ& z++{90USY1yB&Mu_NZOrUq@9q%a7K*Stg~JSd;w1_V+FKIGk#gX z+UuqLuIae)P}jO@Zqn>y>GVVztdtI`3?|a~dD63-B4++9DnD5##U^M^-1a@DLR!66 z?w-742~(8-(O-p+(kY~=>?}8#j0!RfF(~NJ* zwR}Y}K#^v1(mAKn?ASC9{Ge)a&+Mw?S0|O@iDd6;^IXnbU%W>PpIYU+npOI% z_gz1Pe(PpKo5YQU@Zqd)*T-=L4F53>Ji9S`=?_J$QR_njoFzmvE{SKA>%wWI`g8Z} zmto_b>U7Vv>x48I?r|vLsB#+O${E5BXlntdo&7zP=dF`>({rs949S?Xcj>?{rxM?8 zel(Z6yHcmTGCS-0>u3y!dzGH5LS@TiVUdfzFf&4K zcd(?Sgd$UEEHTx_={_R?!M&weg?Yiy$>__8T@r?!!}7Lt=Lu^SFBW@$5(b|^gh2#= zlyHkj=T3T>mag8RLpMJO$Y{W04I|#=bE&YH_+0ZO0lpL zv#{f${VP?MexKFBx+~c}3H{Gqqd9_1h3GtTywIY{(i)?1Zfbm{E^sBaYdV1+`isHF0F zfU|>bK1Ayxs^PZw;Mf*9w)6uL|CjSAR`qH)LpRq0E!>+i5}QTuy{Fv7r1o=l!>xft zN2&fg$;a`}ZdIiQ53=h|HG~*%a|;G_YA$sombRqV%k5IR6OJUF8VX!3^nmU!itV*g zrx^t!@@-f#-}U`aFYmZ38V*bKAwi98|HXL#cg}JcpV@=ej$S5}6?=Z{G}G8i%fpt& z+XjUcxvC38V1>E%LUY6;T)Vg4_HE-cSr=rq|Bn2o-&8=*VyXO-gVN(fWd3*j(l%$T z0;*r;L4O6@j)5b=zB;uk5g=uxKa^xSdp5k&@-i@ArN!XEFgWgg-de{`)<37j^2(S_ z(749qgWOu0b=ya+s}Rbvz~Hjixp~c2iRRqtPZmIJk!&U0h#^evds|aCayrA=gBRxI zns^OAx)M&uAJ}qkPB?B3cKECz;rU}T&R2=!5Y##EVu*~@KgZjwDS$RfWaG}03!`LN zWIrhmssME(e3QTq)aP&ZX%~Y|UDWfzl#OyiOvEnQ_Gvp5I2W6n-3k6Ai&YodIgBsx z8UxUgGG!iBpof8tY1TCU<-bmOK99#Mj_JGbbCXT`r`FX=ML(a)=QZzBFbDIB+iu=N z#?XVX&5>mK;FJPv4FFohuQXTiKC@#ltkR)`$q^6xt%r;h3Nc5OzcflMbj~A@p5CvI zRZG8{-8%Bp9lCiQ$FDbf)t?CZL{;8QV+|=sMd!P98!vHhT;2QiI^CoWccWgoa z{vr)Q7ZJ0hFOK4qF1N>JmP{L?&1o!Wx9aX57kPf(Beu+$WAZVk?$j&13zmM6#e~1V zhqjjCoA%sS>tIrQ%_kYNT>b-`$rb}*@`HZA%_E1~;wOP(4iKXNqd@9|C(mV^sO^@F z8V=NF@D6}cz&WrpP%@Di8w@57G$#V>2hP8m1gP$NmZNlL_+#0J`mbq3sgZbtJ5KlF zy^+uT z%ee!+1oA%bW4t83{-SwgeNIrn86JO&V;g;odZUVeYfUo5H|%-*Wem1wVK50Hgm;W( zzY^Gl<=}m7hKqn8gk12&VY>aOCExXln7J7-Gv<@GmOOF&#t+eMCWOFSZ$`;8@o-8+ zYoI`Ix}5a~&h^VxU`XKLx2s@op;J?#nevz#0-Q1Tc;v9?kC1vC9$gIvv#{81{nq%5 zj&z=^>IWZcCa`uH9XB`=$hZ`pKaAS{CBS&f?HhRVY(4nlgou-Dm1!t3<%?Q+=h4>1 zd48mELJ)(=wz~qIfP8G4c&TT(i_G3ug%8-8vU}yGvVT?`9HO`c(o!58*jJI9j;=>v zeu^fSJR+QUph1;C7Ze&kLqTuyx<8S`HkTXo4`!=oS5Zcl&Y5ko9h))m>q^2p)ixJWpuJlgqal0b90OYh)r2VA$7R^Y7pOj4 zDI^QHKKSIhBiK==7B)?NeYrKS7=P!%qV=*lxj+#3C0_p#Fiuz6yJ7R+iya*lUBolC zYw7Sd$}R`JcIE^IyN{nNju5+N?-*2gdi~NZRi)sWK)9JQ4?RT)4sYxp`w&l*V2OyqVe8{|e z^VwpFWAZe&4@Xk>Ek>__XTVchFDrA=r=Wg+wm9c#p(}N`oT{j?$huqNu)l{hhjTQj z1Zn~9Ib-F|$!pCebG2o1?-najVeMoFF=ImQTC2BDvw_7ChOW5oa0`iO+m4ET6eBs* z9mAGbRw-SB#9Xq!vu3~KCN7@2fV%_ll*$#3*B^tODiY5VC(QAlQy^ZS6h{o<$e(ma z5rww0aBt$HprHT}m_cx%fjhTh&T4XHp_q$bO;g8)qZlU{d09-Y>G(cZE34Y2&41a~ z&XSRe7RSd3`A`mG7Ui#7R^w&5s&61BH?@n{ih78vUuZ``@hqJ=Rl{CkyT9Uq1ZB8&rH{1nRk3w`|qZ=^TyL zCiCfbX!Al2LRinkzN%^-6p30G$VYv*_zJ!%WHqKX?BEg`JUTI@Qz`%Dtd47AWX}x% z3*}6!ev5P95kE(6kc}DA#tpW_-G`GP=JD?b7^O+2r@VH{T7hoOQma>X-aJ$7Qi5Dc)kmryrK05ynjFY(^Kivy+cax_Dc--FTc~)F z{kXXEtCfI0)K20+=RulNCu50+ZHs zL_!!NP)rx5kbrOz&vZ~0XPHT@NR&tmEmJ9|D;WVjuFd;AvSiXRa}#Fs79SU zjymgj4xTbXnF%{_KJyGYVRn}+Gh)f+aEVO(4;9K@R$W-#g^6Oy9Wl|8=ZOMt{o9lL zc*LzAB5}PdU2d4*A|XNr7|*}E2)F@VTa(Wi2*j;lAOY}EI~Orq<2^KegNuW18sf;$ z9zQO@8wkXn575M{5Zf0)8$%-$9pvNLf5rve#ZGwzvi1%IvLrUpKCr+>LThWdLaVC_ z@EKnn#P(+^;Ss0#N+NfFcZ_y|6MY>1>7RdGAQ&h)BakLJ126CcqHiPGn}Hz`0;!ug zjTpGzTANAl%{B~f;O2z-zm?fxkCddz&=BBzWb6c&{jWTfNcgf50Vqaf;xttk0lv}- z7e~$Ljme)d|MJ~L>x@g1^!D$j&~1rWx^|&NE6@H~IC5?H;y}=)2O_LD`<~YYT7Adh@g=%Hdz?f=;ORxdS2E+vzgxm1K;FQ1 z4PRmF(lcWEFfwfV!1!kzxWIcvCIsKEq3Cf4a6;E#UDc8^>D?6O>0=b;(C*+&J1HR5 zRKZomj&!*T`gd6dkp*b~E$!qEzM{gVXBa8#PJmcy2S$P7A_x*UR5HWi0={CPyK4k| zfRT9ce-8vo@?QBuAoUZcU0vZ72u4bxKLW`AeI{E9cOI}EU0Z0(?ftM-0&S_}AqDf%^m`J4!(hD8c6{)!?S=2SJ z-)Pn<30i1#K7CA5(ijz=e_A-!A}Mi7@2PKaCxv1+{3PD5p5y8?0J%9vIwGXN#6T4c ze^%*zjM6Uwd(m`j68EK?Zzk!)gMJB0hAaN$aaxpZy#=9Q;hKsdPaEDxlF_zJ6XP)R zg-=3{;M3v;@WSWm6?A5lFJ8`iv9mpBk{W5!mV{Y&TNJgj@{7yOAIf>V~d?r z?yp+S_NAtV7@qrwi1c!PVK}>Q%a$-9;8l65d2AyARY<&eQ|B|>dqW2{q_Mwe%be~; z{A@i(s?5on#qE4yP3w7pUTrfvrPfUopRb$AbbH}8px)KH26<)tnqPhk!x~bwdMkBkk}}qn5yoo~ z=Zab4Y@lB*AW^Ng7^2LPeCiKQSP0cx5ke3(*e|+zPX7lRg7;VUd{$S|ywQ=(aO1bc zrLhw33T-v|sUdNo~JdVI?^e1tb)9~HKm-8!#O_EyR&@X1jr#lu6vH*`)!8E zw768Asn)kCYv-yK?g%jX)PVHEBl1|0;Uz3$N2WIkaeP>tSr1yfybRl}PKCi$l2AZyO17;=}tB z6=ATCK$`j;wu{Bd(n4h6rewwOR?Rs%;CUf0hq@m>S=jjxw9acUQLDzO=cKr~5>T%& zuPP;1=y9vIeZ%Thwj8>a@bjmgpKJ?4*eLQZdc!}Rdxb>aiJ{fP9S$tX&Cq|4l@bib zmS&y4k2D;f+_+DUW~Qi1SaU-oB|+plFhi64vGEQXW@ToY18a%6ST9!>io&V|n0f`3 zOkz50xi+t!I}+rWPYv#sduwHVc?FmbSmN!XONE<}6Z4dq@fFg=VDuM}(@0XS(??4u zN0JA25@1-5^1Pf^8;-a&(SwbV99Js6nh$9GT`WEc^HB#>`DsZ;{XBtCl*k&jIj0LW zldd0O+%!oRh21V2XQB-*5PcL|^%4ck5TU6iyM?CH!B{Rj;loi_L*i9~C&Z&ew6WEb z7!StmL7|SW-}}B!IV91X7vs{YGO=$7#wCgMjmB?~Vu;cmS&gu6K z@c!J+=1-%#81F?>IHFnep%!r27<6FpW}>L~jwEbs3E|fpF?Co-9UsX+-?=J2^_Xmn z4zba_uU(&7+{K!oBoSwRQg_6VESDF(2o2PuZ|^#|%!&~TqCuLs4;LW06XBWM(miMG zD{#W_nU??d0`~KrfGOiZX{%r&IYF6 z0>g8Yvdz@H5VAcNK>!>#wW#^ls=M*$Bnmg7-2{qpq9QHBcge>LnBP`S*OOuC)6OOC z79!W`7bzlYEo7+ZIKHT@cJQCIQxtl+^9{@!Ovn9hpbRg6xqsGrE@stu&VDC_wYguE zvpDacHteBwdtfH1WZjz%G@ZxC&2D-$niK_ihXf|lPHFsM1%NvLtPgtC`!!6mhO-!S zzQ21jILJBilapAJ9@|%dBFXmJz=w>vlgrqdiHnuW{;b;j?SsjEis!&D8`VjMtKgW6 zI4WDnMSIdZ7ydSF=j@4)7Q`H*=q$AwiYc2x%1}#OH>!X&bFmqQR^d^==F3q+c9S6K z*SEX+_SVOIet;zMVgfqBX{PT#~1 z86F>Z)e4IUfgOTw0rp32%CG)=wwH8`6I4+=<%lzmxqvtZ1Yba*CtiVHv~Qt*;c8qv zw9;|BCv0Hhr?|pTRcibWd%0-hx%D;uhjOL3;qr05qwxFmsRTF+0@-Ulzi=n{LK+sb z>y1cR?#I!EqyAXcC`oX1>fKohmmyGdbp&_pp;&f&5?)SRS$y+=&2Pwzf3k%9lhXf5 z?r)__n(H5XT-f0gu-wIgsd@%$O^) zra0g(VIooX-bB=&o;)^^weANasM;4hllcRv zEH?`El)&65c+oN%$eW~GbycBL-qVi-ecMsEYYlx*OBt(%vp~t%ov#h_Q!LD4A~y{g zmqsm&u!^*&sCD_up{Rx9gGo}zKWt~ZrcVx%r^SHNgKZnJrZ4JB;O*Hex-drRPM{Nx z>x4?s@?mf|5HH#sD)7bBPVyCT^iBchfBKa~Yv54qCw9Lq7dGYblZX=*d0pc+DWbO< zJ3!m{Wi??tn#+zxa}HwFo|dGe{SfNm6z9EY(i(5Q`6LF31Tzk4!oib=R(*rQKE$1U znT_y=PszC~{i)$>_a$dG8_zB)F-1S{v3O18x-gp`i{{emp!($&Bt^>-V-Gvku14 zGq1U!#p1-`VAE!{47EJeAnmFsa382_FxJn5bQgZ#9z}_`3cH^2SirF|tL*>kX~_g5 zWZ;`$3+PH@0O@cFq??Nz3Y>_!s0=0Ts~jaFOtr)Yppr4e-~~tFi0Hz*8gOI&D**ij z$s!N!Um7yz|4B^797kwL=^Dqa9~_k68%4h5AB01$8{|UvZ=>os)I1mMLZqX(1hTyB za^=1mf&TV%gQu#SAqbB*q)^tIL9v=g0;iTq(|0Pe3ajF)w)Gk^~)Cy@@%P zKH@~G?J^}hoEF=*4LZc>BmqkbhZtM0o9LjMP}3HPo~Jufg%g+-h$Fwlyvaz(vc4pU zihX{u%gu zpwknaK)2UZcvUs76{n=F!&CS!QLzbs(Qp^1Yk*h@jkAH-d;|JEH|h`d3Qnwi&z4Lj zo!Zn2>xrk&y>Bm$3-js+UAEu%id^Tpigm5bFiiLnGnFDRQk4%`UpWZQkXCRQ+b$S? z(TXBB8mfCJcrpb(+vDp%X{LE z_EYj~q%vb0C3M8~WcZKO$8I`V@W5y|>@_8{HG<=`8`t?of-~1m?t}n+=tTywDWd(Q ztHvUOEiBEHUF`yHm+TVRT87|eDUt|omV>Iod@a++`bh>!tdZSp-E7$c1_q8QQXkoi zm3#boLoxRf`iyv%e5O5YO>?PHX;V#|bUyKn8#|;2_Kh59wC{&_f7|1L+I$?%?LVSQ zT-D`nP@wU?>fszBtQxIvsQ~Vd94>iV4q(L4#io3|A%moZFv$yz$mujX?--urz6vwF zhsye8iBiE#kq|_==uNYlfqH7QAB`-(g}FPp?A*$i*(yyFE~B(Ey{An#GqjbetBbWs ztYs>>sH1r+s%goJbE%gZdo})|Y-{^52S=C{n&zINzLT1W_k1xe*9HjiD3D6lwwyqX zPWt5OpHV79eP~Zmp~7{U&GW!@!F>pWZOh8^QQM8WSF1ahd0tF>2^6AXEE;PyofTYf zHw`C#zVo;c`f|GF;ckLXKC|aO!+*1me(Y%57K2#$wQxUQdk#++JJ&*COIl4?$%j*R zua7L-??C@TgvbAtgQrK3Ns1zb@WXAW!#*o*=VGWrSWrVAEsZW#-oH`stz#F0-t9Q# z;pPT9Ma^Esk$D2aoEtKWybAugJw$NW;2q}6lT6#7LJS(pThOfhiqXzDUyX7e`-;;LbYLm(v+t86LK>Z zB>d9Y!M-keD*=J*b989k`L5fAAA{=GK_q>CyAd$nrq}##9_cLlR$z_I1~=^w(DT*h zJ}xey#=d|KV?fClMrReuA~aABy=oE>;X2ok;GC}@tWVDzx_GBF8!~;m&p%NPB*g|9 zXL9v}@*3>?%;^`6tQ(8zx(WB9znRtv@(Bh{N&RI2N#gY=1ckaDhlqVL^ z$$1j_A#6w}89+Jj6?H<#TC{m%K+t5~$axzoa{Kh-)6Ow$FH)aWz9(D3pa)>2lw+lz zebB%D)GyYKTWl)X@1g$7AevfqG5&u?{G!eCFMglP@UkaMSzR0{hEJ)uK6v15gmMCU z{M7V;>7>SVMaQiTk|=_8(=f^hmG({R6NVvhYMK2*NP5_UstU@Ho47E&JGfnj<%#34 zym=>KsJyCsBRx6;l_5==l~YvpWPEv_X;8`eV0mGA>$qN@sW>V~p?FnytoWh~qYU9A z$ar8m16Ej}`$O7GRl_&bb4wZxjU#|EQm1b}AENm3Xz9=hMUQaj=;p*4TJq&><`Ip9i=;f>I-;1>_q0DbIO_!aJN5#Wjb#4Cr4?#**X*j@=WyEs z+`%cE?xtT&f>Obz8e%Waox*{^QSWWYeCCQGk?xA~6@owmX3qw!fL2Q3+cf;U5XAtZ zUH{yZrzn0ANSCIX z4j<>6v(j^ZIqkw(hW!F}DGFYUNy5XoseT&qNCT0(P7$m0(er~vSAqGZx!)oplx2|E zyzEBrNXj;h*OFy^@8F3N`wImVRAJcHQ+*Y&Di^Fzv>*eed&lG(mj!lH z&ShKeYQQuspQ8E{x%CiFBEi5hyALE$Z=}@N+%=cd?+~0@njkJf$5)WChB+-jGTgb6 zwzyrZaI2R~7&Ue{i?U7gSx|7&AnrOnsv=yiY-a?N|I#mm&XRRWrpS^mT6CW2_e6gs zgLIp_;|O`HLW|u>A1|-BtEv}gUr-LU&m!!x3w)tpLRt<2-Oo6iSjbQl85)h5sJmH3fqhq%bk|TnWj#Aow+84?VxW0=u&r-aW>0uE87}>fVMOeNJO@ z67xpj-qCP;ZEe6M0(4gTU=`Vl)SL6p?ndWt#w0ji9fM_#)P4?x)YQU%%Y(Lnkms=y z^pr|1^x*Z4E`yuFUAhr7wa;R636kZ=B0sP9WckUjGZZ#=JYn|;P3z}Q|ReClVxatYZd-n=+oNlhvK)o49}Jm9#d@C{8gk#z2zL32NevE?i) zhNg~L=xjH64kiL!xW-5)g7YaAV1FqTP;W$h^gkphBgI(X0~KQT$Hk;(-(#sNLut$s|#n<*}2=?E%-QhGU$2j2Qq+RUXj9&k39N_Iu7G46Ri& zWy~vF^G57k81ok%kaH;~qUSYq=N+i4oY^p5+8eBFi5P+|H>KhuGkv09wkdZvKu8E=#8$%rJ@`sD=w$*V?IP! z&n8vPdlPVA2>e?MXksTMNU>wEn#?-nJP0{v^(jVjs529LPfMEJoFLOk_+mTDx%y~^ zomN)sl*`dvLjlW1=CP~RJIH?hU@F-|@=)}K+g_G*aY?DqO=|V+>_ouY`2|c45NPC1 z%6M#3PS%oq=IkNnm$+A#4@sKq1{wFYySaWUw_>;g?0*KvuCngqDck!+Bu>>3v;5Xg zt{fCE-MAF#V;J{61PIp#jB_IVbLphiBPci%y*}sed@sD5p);j!MvA#`^?QcCCWH84 zqxell2ICl+bH)C0*Y^tQd>X0HHN95YpT%ps#WIF$gu%0lC9bC0*SZ7}B`(FqP#)I1 zz;~$&y^x0Ns-Rn-bi-SF~xDOShQq%brE(?zX4eQ8J%&f8PFcl{9TQU~0ydG@9 zCD85~RBRx2x?s8(@%1csiq&YEc2G(Dx{O2f1T*>S&AVaz*kCdP{z4y!4f$!0-R)U?fCjRN(=|WK(x3^+wW5yp#WFM7Den6WW zXp#y-rbM922BF1LKf$NyV#k8Wg@Pc+d|&&9m0mIwD}p(D-0 z=(rrL`EQ1!z|S2fya!SuT?EX0FMY`}<}{;v;dkMqxvYj_$H~tuRGsQ>BS6i}b>RmJ zX@ZYp^EUc4Rz85BbdiXgS;zc={TO>zY`S%)4rQ^h=f(n>A=X&cBtDmp|`VQek(027rjs{2@; z*u`dthZZymA_~YC6|n-o6V8}g0GcG0T><_xZ6Ka6YOZRyt1oJtA~cEe;;q8i70Tid z)De2r?|Gukv1f_hjc_@i>jL+j3*p)oxXq?9WsQ{R+^!3G=v6yJK3VVo^3$At`v2-W z3#hibZe8QofF z$)4Ggl{u2N=KHLb^wa9B zq6uw%1J5x82If)+D$5?_Q8@*4W}V29IFUHo)vOh7Bvnx0d60wgu;}4YG$kl-g-z! z@rp6G-y50P-;tcBsXkP_EL89fx{7ShEA#uAb$|xZa#@}7e;DeM$nlEcV30zkAlCgs z*6_6M+&>j7MF6gaqMjOSdq-e6G?uzq{SE zY}&Lj8R7hP=R0fCT}e0O$P2%_ETPEhL^?z?1m*~QexT88n20sJHw8z__fuYJ{diu? zEK{I!`mX$EfJQW9W&Rubsbx@PWsw7v^P}m`R`A-aaF`P*S%xw|sLqz&jZ5U_8hj1j zYkbO!OwKMKeIs;V+iqnM1y0~kd!qFkZ61^^uy1lSfzu>TZ0E{#1d88$Z1Pj)G0Y$D zQ6i|7a@30Atm#-UXjq0PErgb`^3%$s%ea~h=h!w-eq1E#^GhG}BXmt#DS0*ByzhlC zKRCVgoO^s)@T9m5gF1usnmV%B|EA(rN2gO~_fiz%oUe_!ZYdJwiXY8r?6#!!@W>za zbY5;V@{f@MZvyArdcp&<;e)Rt?x1?wHJ5@vKKW8{?>~+2FCu3dnD2bZV+yxHIfnscJqEMNWIF zXMGVn(le`a@2HQBG3?f#HA0dvz`C+R$=Cbl@C*VhWSj3;uSA42J! zMzEA1U9oPo!>lE}mvBUVxzpznou4mGyJzjSqe$bf(;Z^Gul}2xfTSIch{N^MU_s-Tw)c$g-ZGtn zBKmzgc+JB3-C8`AGP|e1 zlq)OtM`)M8&>)P${c9k&(W1SEoRd$e!OGFl2!n7C10=Zf1}h_Reb7<$?+rb7Q&*O^ z(CmGYy5PsdP1`p$d8CO~ux!~U@=>;f4#%34jV!mtJfzitCyE%gN>+M>DxlEnwf#*) zy8p{dk|u=UrVsC_lczFLgjH5*Qk77-COj+UhuJIBF0@%==rJ zVe!e93UJT!$n`kU_{{(_QM`N?Dlem4pd-v73;7)|g8vmgNpZFFmn<$v`L7D2bs zmX!{mowA7ZJ;M762QHoEzKda%aO6!H9ukIDV^wZtmt$oY86VtOccCKIA7j|yUlFFz zeFZ1$zMgu=@TXPoq_80 z_NMmtV*p@pG;*o=wF>{pqoWD1;LavBWxIpPE$asa7Nk3y1$ZNE`>{AYmHNczYygRI zPJ~OEwNt1f`?@~;3`brcfD6FFmH3AIwcr`fwB51P5~W+Ay6B~?jYgJM;xkA)`|dsY zB$(tQPyA-|)K|IX`;)iRe>u`;v9TS@%LPLLNof67vksk`Z1%;%>uM*0--j+L?H8 zR>W<8wd^xkcfk}c=R4V2cbykmz$w2I&r1WF`EGcC-17j)H}91rmLITPvPD5ChrAi4 zvFC;%aP@RRBn}gIE~u&*daB!f5~tfavtZ|+#Z+sXmGYjYa~m<`YHvr1^#eZ zUon9VW|U|V3{|n=<1+5``gjXQ+tocQAf;=yLYTrkH#caWLHV^4n5J5-GV)Pg2bxQ` zWX_ijyvYqZzBP?jy_96cun`gJoRVgw>X$r#O;@GN06bI4lw#)LBJxmx#rE=X6FyMg z)bth2b)dwnUNUn5fO^nifxP;ocL|oI5a-Nss8T5|16Z}_2mmAGDzQ6rOos^$L_^Hf zVgsvY0)$cv=9rEKpyT99=R^Q7Txb?zTr0PUAi0uwF5_n;W=<$`&SP^7nm;(*=T@s@ z+&NbNBrc`T98dKU=7~{MZ@j;sxW@_D8bFNECJzG zak>77Q|t@c4`sSMLZC=iwb&zX>f0NJj+0>sW);p3M2k=@9aa_sQ`{T@fUMG`bLP`g zup}|6a0Z@2(8L7b3}h?-Y_cjBGS)l_U?*^>Q0o&M5@ga4u6uEm)B9NktKulbAk{y2 zHda3iXWeJek2--i&e<=%N?X? zz(v=0W%z%-Ntsd+Cf`4owo1a@=qXB8PQq@2fyBhsQ3~xSQu;4*SYFWo)BHaAt-4XR zDMb!A$~cG|1o78IbUl56VFsWag8<`-X8}dyFHq)JZ{&_$A-ng0dbV=@ZEdT*kQ)p>1>x%l_I5Tb`{oZxX4nj~<+8^?{_}g+P zr7~d27r+{#tFkqs2%GvXmp3B=5e+7x>o!rDaIOt=q?of^m~th2el(a6d;ZN4lEuWQ#iQ>+nKYUdCHi5W1+E9$QyW?=h z_dy$iDKAy{OEz(zHvs2s#>?b?zwzGKd_;IY-(i9DzMl9vxG^t|MN}lgOo~C4U0?{GnwpGxXv8^caX0)n@`AX%*^TrT2 z-vNRPFKHJJYn*iYxEfV@V&>bM&Hnu%E|9XLwWqD&1E!{vg;GbJ!kz4#Gs)_bYRB3V zd(+ThaV(>t0iZ(sEpUPItCM*qu@`JcCi-`P)lk8>1%%!koA|`bE4MgMwX$2z%LUF7 z%@n+s4+mv|W#u~T8hJVwojghO_A2LBs{>m6>3b)S3yl2hj?!PZJ;;>4EerR2izO+4^=_GtE<+SY4dmn-M43t$8w7$1&oeh-1K z0XVXfqeYZ;V-h0b@4XoMU^Epyuxo{JgP@3g+Ch<18$j}bS%*S=q#@|HV8iSLP6c=i zuIX|sVXNW#(h}}3%6iPZAZX3%jfGp)mW`SA7lfw^u9e@YkqGnUVkUQ4vd!oBc_s`l z#ZQFce5Ck6Yius#y`xpJ7C1P56T$XYLR?D}K?Zzs>?5k#pQ?g*X^X55ruM;Tns(hD zH6W5ESu=^nrGPo%1-8UQV1<|k}%Ritr}>SDRGRqOA#NpXX85$<^* zQ__4aN&7cr8>dr6E!68~s!VN!=mlpP{Xx`GHLD&z42A{PU@n%3c9!Q75XKx5u?MDi zCbq4uo9s?bTp<)kN4|sdg#(7L(V-&(>G5{?Ss~y1Y!UryI9zp0Iy{a<2KDdt4BayFr$_s}0o(<*jQi0F~zwTuI`qUt7$gyJLP_a<_S7 z>~cE8oVllq%fG>|)-e&{D~k!avk+t~>rQs&v#G$nAIV-MA|-Ga%dfRWe9-G3VhrvF zjN$)9j9poCAd#hqPq=&E<9^P~Jv!B+qI{%k zyM0p6!0gc?!$_<;7hou+LswpE8vGQU-}EC*ipyJi{I~B&x8galX-8_9?l7FwKGw*$rSN{6ozkw~x-q&e1e zl%+`ee?LTd_E@9@h;dzPl--r9S904oZ(>0kiG@lNqUxZ$4~4JTnF>d33Tld{>D3az z|H`EDPy|}yp5FSQrVvls!D1>L&j^?n-I)t2Fxt!<64P zXl^dWS+kwEB<;G6;ikXs`JQ@r8V18f7z2i(l^i7mv87PYuBGt$ z8I_ow%~|J4sP0pK!Xb17Os2+2Ec0tl?8F;-WkxcTFb_Ch@HEuUM_?*&J@!j z{j~|s#&yu~i1#AnrWowYht|%*whR6r57fr9`x#(zQFl*E%vkI&j-fO?7(CJ}OD_+H zIP!asHx79lltYd85|!Y#q;JR6uvZD}=^G<{H%F%t8SL4FwKF7FjZv<`WB3)KU(RQa z6)gNu&RL+8R&3sf&a9uCj*Iihv7!e(?zMZa*lUAef1atLvwwT$dtCQTajYGwR5{ok zoVw8P25s$|!9~z}!(I<3eS{1z-d42>Vlq8uO&2vYW2L?NBz1E>>->TrVdI?{WL^Vns*Am&q@Y;Fb&*j- zlB)zo-72)MsJnwQrNgj=du=IiC0NPTiVu_=;51!K2Ae)9*{9sY<i-`|S5)-!x zeP1A=>3p%S5v!CIyLoj7mW}9XzsS|IZ!m5Qeg!ODawJCQLr8f7_5Dbqa2{ApTC8Lt zPChZ&FU?XUxKh#8FJ~FD>aE@jz$>iz{@u@1c%r%Ekpj`XOl@!Y?_4LdbGlzlt3bK! zKDSzVQfpSS5~2FMfy@-z@O{9v!XfEiAE;)z#iIp z@BPY@MuuqwgrIDfItQ)Dvz-u>?bvi|8fz8xk3B6h_p`%J{D(jDyaf*aWKnlaT&1JhP3lhW2&1iTMnsTnC;N08oz%fv zLMC%N51N*rRY6K3JNZPKmX5B~m2M-T?2{Q%&aoe1ImS}Vx&LN~#d1_HLPq6P`Vs3d z&G7wSn!(YKuB7GuztE(g&!l(%qDi+l1Bk&S1ye2MrZ<1&mZOnmx-oco;D<}z$Lz8* zA|5R&z61kx`8YNyIFKDF-BGmLQ8X5}mk0Ce5G?(?jH2%VWFZjD@z=2^_qsF0x&hSj zfV#9!O@?vP_6jdc)Yn6gl}_pI?fT2%ng|3!4Bx9mw2Zsi$}h)!oHx&>8dFLfCvKD5 z)sz()*40P-W!+U@FbYk%?4itF)Z>7~BC_P4+MhqQdrvuc9a%_Pr+Md>EY8nww7FX& zeX6>~BY1+1%TsZlvEXHL-s5FeRmQ3ou3VJgn9@7vW*7CXuwF%YM-DFw6Q$ox^cUTWKT~gbcI!gUP!lcg{6csy-JU8 zg?$66(=Xdp$k%6O)my}XF+j4g8VzJKpHoxgXkd-MLoQ1?78ls z*HeleNYwoubb`5Acy|{ArFfh%){MTnrm$Q$Ei4L6N?&rp=kOqi!GcWS z82ZFY1*iYXT5*}=yf$hnb@J8er|Yg+{e)JUiuksz=*$rP$R71qtBhAZR%_p$$m)C- z0Ls*OF*z4_=-uK`$uhbrjVPL2;oN?^vKILGf%(g?HbiwR-{^da%+w)1$Yy3oIy2QY zQ%A9QBEg-8enQumk>PhfXep?!Oz0t(3|B86xOi0WJcWpP%l19nc}iI-bk$ESU~2Q% z>Eyt#t8|JF99UZ5M*?U1`T2jsSqogtPVf}b%iiHOSxq?8d z?b+x}C|VE+Us0{%*(qoFl=j2T!MlYTDM*C0csHa%CPr7+2jmP*OLS&pz1H)-Qb@Gt zJ>`fHHeXFy&>Zx#y^|g58Sfcy+D|hvNnKk+(x3Y3$T0UL_lCVWoR3TUt{v}dKh$av z76|x-`gR_h@(*dP1x0ik#ejLr^apj2i}r+pKVx14`%gCw>4B|h^wcfpl6UTBlmKRpz->~LRVH+KT@ z|EOY*qXE}fkZjwF;hr#JBxK5V$%Keq%<+Lybr~KC&g*E-^2Lt&+~mWD@e6efp8S0N zRnbnb4bj>~9+RKdwN1b{PbFua?A4iI-1&Ro>D2}k(8e95s>1heey7UG#0+HUG(7#z za>3U8HVG^)@(NSA%42>*y}Txbc_xlgwY(C}_Znpe)%Ef`1XF6oGqNmLQLu(WseIJt zNysBVjx6GB&^}WXm(6$4+)sOt z$Gk=+fJjb-8~7Zo*7>Tk%t^SDSK%=q_si^)bTTX!X-ww8@iZ05>muPbDYS3uiTXU9 zIp@3FzPlKt^*j2ku9F^|eLFiL{@}&yr!pg{yBm6zQg?d|))$=u3HS9B^TB`mDO_=- zzp-1Vg#LZZ+w%L_k@(KIB|q0b*9mi;CKvpBBM{2DwFzP{a_}*SwH;E4+ZIwUU@N#> z^L=kRV0Q8ENlw2?)?i{WbJgafnLJ@~E4!%*(H0u3^T6t|A^kc{64l?P;a|HqcnjQ29j@ z)z=~v%><=ChA6B-`!)0jPEvY`p3*WIVq555F-?bY83R;X=t667ndu%|`Pmn$R>%Q} zWX3olSUQ_dm4G>5YV+QX%6voIwTd8oI?+2k7frinP!JIA)LF(3B}Lhs6_pybBDDA8 zKzT}#BJ_R}Q_Q`=5He`i7O|dLo^k)cUcMBzzEhq`k3{UOg#}A&?{Us_O0O zak80FH~fCydbu9y$x-#=gm0*0Z6Erog_!BDS&DsGG^-f#uiB{2Xs`M(`@d5KbIBtH!hpB(E;{ZetR(PGU2h zv<2s9WF`OBw_0`Z=d&Eo<0<_2W)MiqZLlS-1i;dCk#&2b#??*xC+PcbOTOc@YnC|D zWy2n;)R7`s3SOk~hm}}96y=n(0%ac`2Y&F%3>(BP0~9G1pY7{`MZbeX>yquzdFpG- zq_}8kHHphmF05sa3jK8hLPCT88gmD_EVMxJwls7r47JWj_|$wDG7#Q>JyPDCwM<(_ zr~7E}y3xhJ;s4p6c2yS}Vfj_s5K&4}AazC>sR9z*68~7IvVlO@b>0|Re-BCS>L8ime_fC_oCGR! zxaDcfVnUa}P{Y6Mb*B;@RNeeIGlVtQ=KoyP`%%txnA60aW@xj-BK8qCWwZ)u4pQH73M!YXya^_oqBCvHuE$V zp80uu`;J`_~}K3TnNXF+eJ8dC>aJ zK-aL;8R5em{WBw_>fA{kE`@#A(s6hS*I5BoC$WfDV|-N~gn?o}FbTXxC|7QC4A({Sds+&xu(kW#j|FnWR>wmJwpKqp- zM>rA$YdDSp#@jQ;tu)f5yC{Ftz>JUtIV95`qdIIXM9zH-fF$AnCdcDdhkcIVEHo1Z z2{ClP2kO`&v%SM@cgVL)WMk(P zh~hbtlaRL*$i1?D#Wp3Y?SdS~h|6a9XLemk>=x(L&BN!7E(hAmP)g-5PK@V4M}!u4 zF28k<^$_+pBIxw-kOAZA{jqOX$0T%qC?8n3HZ7TJ<+pnVAc$(G_azHy>#ej<?9@;yZ9K{+`jD6xd=z}N3SuIE*FMib8VQgD z5bs?dtW3qDOv@0MFhxK=$3MD(R^p6z;@c~9We{xG;M%pni3c4pn-J~MfAiK6E=A=n zbhRUfF_F)Gmxo#zgJmKGc$XgT6k5x~>`vWI)ou!M#g-dn{@NZXK}bNDI8$5&Baw%i zg&M@x^o|#&UE4D%VY(PiTmDE&ijaqJ$5`KZV21{>I)Ke&7zZKUQcQT8{YQ)$+a@XN zqiHz-DeHK-qeer1^wGY+>a>8l1XehC$In#*eIU}e>PKn>MSEib*;t&+PmcN2I&IE3 zxlM}xw;pfHXZ=nm-6(`MAe7ykoul>aVNJv@>9j|a$!|LKT*~iZjLg%V2Toi!(|i12 zT|kZLIBsE6DpH98MGWOtNuN-SGg`FS=q+#{HcQR*8=m=GiUD6dEfmcu%o69mLyDf9 zn!7x2hn#dHFDWm{)a2;npo%3wd_A3Io)jx`JzZH542s4;Qr#XxDxeOv1c@FWsXPQ< zfwOqFq8iw;Q5JDh4F9>%W|bnQM2ArtG~67%L+@fE`qlQ65wj%vx)c0G(Z?^#^ z)vMdkWskIM?59zxcWHBGFy9yzLj$x4@8pRC@jxmk}kbZlc;W6W6 zW^9`eG>D1UV6%@O6l8Pw8DOzE8FWs>{Y4Jw>h@U|Z+KXy*1pNJWp(M+w0q6Qq)2rgrC9HP+eMV512tnx1^gUje)&Y^%RXNJutkI`!8g2lxJN|wQR?=;sWZ_3!p?$^ z_8w`o%>kI{=71Qo;WBE0A-IH5PG~cVPtY_ax*{(FE&m@U!|a#)4}!j;8OiIMsbN&@T!=B?a{n;uNiX}|`?aZ>dkL7n4t zK-P37DFHI6(HHs)5T?11H^EsFPT7?1Lq;nM5L4xq?shD3#9v|Stgrj`(qyavyfbVBCJNN#xT z#h~-{@G<6&v5Ge}4cg^7Fo{js=u21zSO)u^!&D6zsI?9>pi0d^b=~*A;}L{328ycS zKi*pVC+ty8^OC?3O?#_|5oStLBn#>UkJcbo8q_C$%%(%=eb-6ysh`rax&&ePyh$U& z%&))V{i<-_>-jV_yxf(YX=f;7#z@^zp`DL0{%S|NrImo-OqXm9-t{asby2 z^?&u|s;qVih7J#)SB@by$Pt(H|07_Rsu>IUf1Eu|#siD}Ba}a<{E_g3CXltxX3#~1 zz$1~Of0b(U83+!b3X%N_v`%J_*OrUG*>&i0xB1BVy8m=y^sVXNQ6(D=vvN6r7OTT{ z?>8fm)-O3-KnEZ+-P*Cy2yJ&JNW06wQcs!!`KwZ?eq%Xu^iN8-61a?##RtYox&y+zq!>MJhpi$#E^7l{nFcY{a>((n<;|Z)d96lM0xXsGdW&1W}A6l~n=?E(9K0K|o z_f_N+)n#YZ+E$Dy(6zLX2Cbm=B>9jB$Mo9uB!T71Q4KeYdWx#uoj+iAPIPYkt!T7^ zZ68NkXK|=eLD&MXoQ2sECew)6@?XAjFVy}d6?48ULh3{&v5>L#!ZC+fJ;qu}Jg8xm>K{2lpJ$x@7{g;hDpzu)oxSK7eMVVGh!PJG!Oz zK%HdZp`7)cb_l+r2EtBy(yB*66GbRMiW$*BrvWIyMznUC+20LeA?29(Yn~1DYE3@# z+Tn<_-{jU{4(yuyG;aR6@w9J+=&eL@7tjPXUxi!1^_-_7g51`E6ipqIc4n9BfS;No z*SR%ngS)#vjf;N{VCXIMXl)f)4Wu`czXH{e^1j8>z7?0zca8rr_&d`mWWk`Z^t0Ar zNyO+gLgkb#aIV|jv3u>%W|VjagY_^dUHSIS5z#8{;~wo&M|xryED=b=uVH1jWU(?_ zx%`2e^_b$V?HnLZr|bRmqFc}iaOnNXrrTwB6J2k{o5l@MyHMXp@WP@Z7VXn)0= zTKVzZq>A?u21Vr&0DaU~$p;RXpER!Hdd{u4UUJdn_#L8r#4mj6%a;4%HZ z?rj{3(T{0z5#1SduBrm7_xPv+1eI_OD+cf`8C5&0%_C7AS+98bbi45B!zgdeUlRNwznjNIW zy5(I(v+P!fvQ?*_+9hpGnmaElv=%vVHjB&;TdCi3r9Ze<3F~sbTmkZ8H13YR*s70q zO89`!`^Q<1tw!b_!n`~A^q3XQ&={X$dCX8Ao3c-g@G zy0HK}uOw9ocf19ciTf*>oYpMy`|o*BsC7R2_Vib&E2(oq9}xv~!3O`7ae)Z-z9-i{ ztIl4$og2sXOw2&g{CPRc=(jw<$V_NmHpcY4q3J8Qg!7mv|KW_*kA<|^(JxL-3%F}6 zZQ42TCSw||D`eUe!7Rx!EZR3N*cqIyHdC>gf>kSX*3b43bvDVWexvrjsom7xt7`_7 zHECDLW=-&daR+@T|NE*#dF!LLJ4BqW;WCbWms;;Ciu?uSV1(#YQIsO>i}*{e-sgRM zHX_mi;}^lt#4WU6oZ4ZBvyysn_)Ar=CR?g@XDG z*;rEj(wGD_0id$NVtQhGWqhqBCO%B&ip`msn{%b`#GD8G!xZ1dz0Nu48hHqQIr1vQ zER%bV|89v!*q;>=W9yQ-{qapjY}~19M)8`Eixzz`*|P8!D0&hWaa}}$Lp*cxX`+=p z(_@ZYU@-+QtyR!A_(#u7_R`DAN@~g9ahUQ^!r1K3??MWj)u7AeOI^yE=LPF|*CQTm zUqq|u6rzWZj4|G!#5Xc9-nJ#Nac2CKq9i+~?4ZcuQ1Rd5Q2%@qNS$f!?~MSc{{tJ8 BjxGQI delta 203810 zcmV)FK)=72=?-ePIg7BYCE4ga4vi(Z&f6BH>z_R^XAe=tBP)YkBN6!mo&ASWii>1{+^wK^>^H{IOpNc0&DnCC|764L zH8A^y=QC$xj{3KksEDA0>B8!3o4eYFJG$uiP{~l^yv#u<`ayCglA4RkFXD<$K*1p0 zli7-Oc5y+I>P|_ke`Lm_veV;Algg5Z&wqXZeH1*5tn-$9vpHgQ+$XeIFD|k5^yDr) za4~T-Y}$>NGKMu6m^}-fN;>oI_E-jv=idjvC6EjZtKS)Y)tY0s$8q6(4%#dJAqI2+CEBFJhQ$R09V@5sL2h{C#5>%O;U-pCVc z01+36y+dvvZp%L5BcAxEwIu*-%|Z~97?__@%uQBe5_0A#Zw*R*B~C^ zkX?sk9WY9)f5i?*c0EpX0J(6MC1G3`!=y7&2UFg7n@3~uZ)c8myd^pG?#7y4-5I_A zGP)2JP8x1!S{Sw}HnLlMa36Isa|L`U&gMfr*T(277z@_%lhSpL&3sBoWzvs3D;CvE zl+b&ESp84zz63e856`R%I{!#>N7phYk_^Igd(OtOfBhiYVUgV-x#00;lU||DD-3=H zKfr@VbI_=f6RtP(Pfql7GP)jpMxS7mdKOtb6A+HkE9sD_q6v{h*mtS`>>E6MiuOVd zABX!n&oyjcgZ=Pj>xR!!krr5NbB{OO;>*mO-0n)T!0zl?`KcCc{)n1pVy77V{v$99 zxBg~*f3yjX?y*sf?}KyCT^!v%$L&ADXE~lqqUTh~vL0zT>E#6|*@r|-nKsoXDZIvd z?LOW6&v@WH$VU+|U@~ML^$@3NypWw>4m$l?BDpNcNs;4CobrnajdC(pf{2|~rAWq3 zO_ZF_tAmhaW$8ZcqAVflO4EG~MwXD1`Upu^e?V3zC0h~6C+7U6h^fq9Sz5RZ#!DI2 zK}#HmtiC0?I4gfIcnNbl38=gcJN(@B=jFodfS)e9t-cG{B3%AvaEozuki)GsCkA-w zy%ANN6B|7*jCr|Ox~a>SqF3L#g3@&UPI3!>wVbPDMXiE#NLSbj*pgchEJIC31I-^Z ze}OK_eYnv|UrQ?uKx{ZqE7+9>8pmC39WsO3=kwkOMT0RI0|Q>hLEYiZptGhGlRL8P zmBAPP0+YKq&o<0em+?Fy*6i7dNK!!%cGjQXot?-U%+x@Rx_Y8P?76g^JvQ0}yl6Yq zE~Owrmb7*D{q{Q$cjT;(&QAV$?`@9of69<;%9|kN#vvuNMa0|~w05@GG!c;lzeO8= z-qSYzq(%!eI+hPdzreXqK0y5i;3!x^A%!Diw*i)VRI!_gF8 zF?zQ;Q`mC2x>4_Ld0eP>_sv{pf1OgmAP0+?X2f}_IdL`UJEQsB-{MEPTrs^Jn|Gsb zw?DJN=+YM2%9>1TF@U^bXzTU_PrWBly+F|xBbizQ6F>~Kr5hzV9qSQ9N0cB)pHnPB zU}OV+Xje;#PNrpKx*0%zhU+}BZ^7Z}tkVLawaJ-NftK#X zvL+ItL#)&ZDO1oCZ1A6!SRL@ zNuk?BKTr*x4Ne41FEt?sjz-{GkzyvM>40N|X z+QT`^u1aU-%-K()W9F4|pKD}74QgDf)#WH8qq#$GzA>H_42DU!wH!_8yzzA2^@jEkh!SKfxaSOsugDP_ZzGL7EQSg_6oPnyy#wy?}9=t*O` z-V9fq2fwX$Y&r0mQHp}6n?u|j;^q*)p+n5@_Wlq*+#KOLj&R&&8k2j`&a}bpvRuHn zMqQn$H<_Onf3j~hjp@9Quxvv_0XtC}q?n2Jcc%ViW~zu z>~lvN#&*H#2RHbxvFV3;PT3ybE)WgyzJQdF!?zDZeF&TUuFD37>hT~s@ z!zWq#lIDi^Yn6(YOe=gN=V6OHI- zL`Ne!X&TXy77QF+oApp5Kwe&e*jva%TeI?8?HOd4*%JM(Bh#3qkzf}00x}}Vmww;+ zzGMYWoSDwRu}eWORx*sE@3?M9K^PT@JUVMq3i9l3_VDBrZi6lB;>DQaXeOa+7^K{2 zpY*YVvtN^5cRCU!F>IIRP*}@&F&QYVVO%GW43nyN8v#+1#&aJk1}LB3rVU~B1Nc~}&pydWRvVz!1BR-nbv)eFPwo5_&sKRM?k{Uca{<{Sn0 z|AxGyYM|)?_hH|-P@{G211}^2at_ZF*wPOkyt(7Y>x;ndU3UquuQ&fXvR(J+fBsK+ zZw*o!Fm3WXxD<&IyEX#ZDJ=jUygWS?a#? z?1pf$M2&&DSo_8;cxUjMiMksnv2wC&$ag2i_9AepXm@{m>oNjjf3p_@h4c}ef(7i$ z0n6#dx%&+rfG@yX1i9)Ga4*2qg(>MAu;={dT`r^^EZ{DGC%=TZLaLk-t9Lh#@G9ls zQW66%3jhn>(hC7{D3BKBJ`gy`vV@hg#wsvK;8;C5yLHp@~ zUktUyeVs(>ls5PLQrk0y|)nWCXp$Ry;)VjhW7 zacPBjH6DpO*0>97ZNNt!HKYL-Gqz?(f#%+S;STl+zMFjk9xb+%fg&8cdxum+!^i&L zbtD{15H(x=SO&kATxw>+&%@D8vVQKLExy9IrQddci!_a$!VQXReYKi%ZD=sW|2c8v5fmaKeLM z)^fIXMVN*lL%>US19|0;RSIsx8DyFBuqioD?d^TA0{elNE@aO-qcIpSxtt*S^YCA# zj^GJ@C6YTHBdtH?Cu2k_0smEUpXP*0x5r#rZOf^pl zwj!N!BK?!Ke`nRIwb<)~s#OT)>J_NgzL4pE;{`({Zh|wZuOJlwSd9hoV_U~rj3D;H zCwe1;w+(f_kPH_C1s1#;BCd-8_pnx$-qR3jur4eNW#WJ_RGe|m8O+!^J=d|w@m)+i zk_oWJw{g^Di~;DZrA6|C*6W5(*e*qQVu{LYP6pN#6$BQZk0%;WD>W*O#R4?)wbY(} zQWMkY^*}GTSpeIoAGPctxBzWXAzj!$Qp-=BzIc%f_jA_o-`Nl=H*q&fb$=Y`B6m9z zuxepzaz#fg2UNALvqB3bT3DIWJsKNduo}-86VoSNV8$U=U*PE@s_7P2?o6-HZF*D20!nv{yix z(LqWmATOzWl+`?H(mGOiw%mnX(`79XFr7$X%66MP zk-&7KfazQU)45z)R0`9%0;blP3`3nsR->m`>P!LGu?$lkXSs^kF(8HOScR{6eN0oh za(zsB-2+m%&LnwjFO3tpIB9Qxj3*ii{TgX+D~L*P*=Djcyokv-F~<;!O0bWTZZYss zxo{WdFbpizFF;Gpfl;!7x;`-EG%yzrt}K#nA6|vX(Vf}5Oe%qG4LCXh77CX}(jmpp zNx7rGK^0bp?h$u^PPBsJ_~>PE=`4<+LM@DRWA>DB<};1xt4%o#X;}t;#B|o=Z)|eI zHj87Hi7HDV%0piv9dFbJs{K_2tQ%n0qX`zutw|?4pt=Is?uhhXnqajYZD)rbk~|4* zZ6w5nMaO`a-H{=Kc2`t%OmL-pGMsD2)s|hw9j-QGy>v(hVI>jsnMN|ayizoD9gxi; zei>L}%*diuM5Y0JBcT<4bsvLZ?H(=Zw;w%ut0N!MHGTQr*t)85f@YYK`(y(?7m)?!*Jv@S)7FB%-_yu(6=x!h^b7NYU zR~TfAs=)MV`Ac~a18b=3k{vj|OZ=|!RqbZX9fpa!pf|YiJY=7LYK}yGdSGg;-`p`_ zfqbo_!^HB2juW#>9RI=QP}R}ko&|hy+wF8GgeUsg#{-TG$-16gb|9J# zQ7dbDtLp&W&hO`8bx8DO1}M%+`u7%8xDcCRL*n|K3Z_NoFC57 zRqyC_c3lG08A&65s050Bw7~0xpzN}s+8^221~d{ znDaG$h#zibQ+*dcYsuf7*b-oUHxjLghPNi{itxTQIaq}EeThhB9ed&Pji9VSP+FTU z=9L!m4jtHGO=l#Zv{>}@w@=Q|hkyO6bp+lXEdRwnAg}a)ucP^67{Gh~{P3^SfBg&o zgYUJ-dq@9cjxil~@&8HID{r<#2SP!=N}wMa5dXQ6aEs;ex6T0MF^>Rz^W;PMlR<{5 zhz~>jNW=d%D+*+x-}8ZB5px(Pr0~W_Jk^|&I?l;FSh=(|f?3IAcOex!u7yZX%2Lve z@n>&>@W%sxHf$CA^37=SnYNfs{dimX$00ad^xF`5W&HH9@=w$0C(e`SKMQ`H4s5tE z23G$zjeye|K=KG80#+;C{Tt0e(|6Dk3-5wFeS{B)BgO2enk{*Swoma^SWlQBId$=W z;COM8F--{3UP1cWoi)HB{ky4&|BF41m76~@n22J3Dq^DaQw#%ykYrS@$X{KH_T4aF6-D+KeKN)ELn$nkX+=~VZaoG zH^Pl#Y1zz>@#bV`kQ3I*lQ#||r7jEgu^R&uQHS;DVThqf3rjxJNU2xU!QK?Zh-FCT zv4(AbUW{!Ldqx`k;1`ZVY*4%L+%@?I<}kp5r<)yog@aGF`1AlET7cLI| zK?tPYbF}oCDh=(~bkQFfQ!=M$GV0rR*05*dBp`DL-cVWzdN&&OwdpzrJ3vv4#YlxJ zlw7l%@fs2!GDA1ik^{wC$2)$a4>TvR4rT0ry&bUvz;EFM7C?L#2b8Vd$b6o?c3s<*4vQ2wRW>IP!VV1)Nc0(y#Xg}mJ zwY6fhmcS@$mn6l@BeRB6$P+VZQhyrWvARS^z!S)T+*8e|ukF-Z%kKfYV{Gg z?12`4G$`s*lmtW_i|T{kd0=|p+F7sNr+Z%(QO~js8$1V{eioL7%Qc22FgMeWG>53R zLj;+tTi?x3+hiwjP&R?Q+!^-gVUF8W&85jQOA;W@A<2EPVVu`;PJmE;aIe8zF81nca!Fy_Erx*u#LW{)0=qOv19O^75jod{BNBPClNJ zgC&1?Jg2lgvwz`8K8_I z_8&fJlR6Gu7x%s^xqWcj3>&?Jtu!nV&jqrErm$qIh#7`A5v(hhW$B@zJ*;J`?aBj2++IY+Mse#phvQEq_Ln+SXiNNB)_hGh}~k z^vx;!FIXI4{R~IgRDRSYR+*jVe`Q}I18nOo0e0+$WAC@?mj&HAOMxEa$RF#g+1FVm z#fE>b0sXlQ_;wB8Pc(o(kpX{P1NgQE@NF6JCv|ZB9(-kjNp7>y5KqIN_p$KUHp(AT1MIEyJEM>D_huqwZ(cTAfHR0#X#?5HEnFgvrv$ zbItIcYvj%=IB3Xb&@qgVU9}jv8)xBc93ekOv!Eft3J$9|HG0O>kduEzyP2Lx_wZwD zIJWCx8_q!-MZb$j^@*S|-0Mju*=1N^n_=VM=5Gsu20>43Sao|QE$clYh zbcI0fAKl0J*5v?7f~$WSS3(FR7LIfN^G`HK|K*SVXV+Z`IA%1y`)rzHUFOy|Hw?tT z_RXA(bh+Or?#c)D693@D9QWbO>hhXf%X#SHs>5j{lhDM!ZVe&3l;myUsU*|Sbh*HL zZYd-^Q-nmxpACK@NRTXA2+WPt<%Uk~!VP4LmDz+F$QaY*N=_H7G!W#a0lna z@o2@B!{n_-0N0Z>hc17+OM=hfQ4-IzYb9x>SO!wm%aXQNWW#E!!>WLYjYTbtxxIh# zHgYH+&tm|o9hsk38|X=_Ge~nqH^1a!M3yLI2%%3uw;W1hec-HC;Kd@S*bSQVaNsnd z1B;>}-E?&cceGj~&xzE^5aT@dAEj4CDb{y^qN)tPUXWs9HoJeSMeNeeFD3bQ*SCd@ zNGbki{)Ef73>xzq?_Z9zQxd-*=)&i55cp-_fRqEa9gjwR9wsFb+}VDItF8>7&g|l1 zKb12JrmYU<+H-$Z0Ca7cH#}5IBA9qZOI?}7HOzr>q70?%`cOEc&zcZK^t3R(s>TjT)S6XY#()COD5n}L72|UWdl9e0hCs_Sm7)^I$VlHz18=1)2>6SPKD4_qBJg}bW~7U3rIT9k1o%jBxVPSwl_LASIp z2#6)@F{{8GAfia)Wg*zM4zLqv4Q8JAx8f2{3^3j&);E8NH9pn>dw?NQI+46O=)tT% zwdjlqG2{~+kbCZG^BB1ps$=e%CTI*Hg}6$0%lyrnOI&nLZ!pRcEwv>NWvxC()ZbxvNaazQ_U0vSDU zhHZ0Nux@QVK+77335)^@@%UKVGM4iMWtNcV5js}7Xl_DpN)WB#6)4p- z>X1d*(uT4FIhM;x_&VmLl?%+AwDp{Z60nkofsIK?@Y7|A^0OcX)pJ8>XIz|(W=tlQ znQDIxpzi-FiHN$t_<+>n5#_M(Q7DP{en2~km5=WAM^QU8VUUm4tt4)vMUrtbjW=96 zKBlrB-9M8QUY`K_D@tAdizE_R-QKzkS>>Z~5mCaR9Iv3iW|Hh*&T9VXc*{LKoVFGj zJ^98McdraM;t6tc-AVBO@V`nX2Bd#N#6*7@*%-T`LBK==NJEgAw402ub)A)S@A)3~ zXP3elaRTk383XPbW20mBt*K?&EZ}GG|34}VtEwALrIz%zBiM7*P-a59?qEv;Cb7+w ztlfhbp;l6hj5(<=7`neV1iUm_qx)rM!5>5O>oh_w0I3%C%QLVvOeW)sfa*GFRoQv-Wn49p0QS{EMUuq?7!Qn!mB{GwiRV-1k>Jzm`Ga@sXd#J6k`dnEe&8x zvup&j@Lo7pT+FY&cVBHKzxJ(;^fI2P!kkw{*_8)*stEGNdGVzbw+h~xVe+HWsaHlJPBCD&H7^mMPQNyqkXZ-m zhU|o@a~+F6aKayMIJ*D0JKx~zB{yJTOg;m=QRlzR?i9q$fWHgvwr;#r=RpZBDsD_BY{-fhd^-^ zISmk8OMSh(`DPnpmwHl&TV~xX`V!m^quB&*3Jyl~J-u`{)K##*&Pw3Cgm7TwCP-Xg z9I(gAU}+UKqAh_jDy1eMImk|wk=c;yh27fAsfHAw4GCVPXS-N621KBzx`6JJO^q3U z5&Dnn?29p>Zh$R`N+PCVq3(#ZUJ`*kR|aV=7nLAldXxmfPwFC{po``rlmr<8jHe?A zfU5Zl3D8~jne7Lg5+ElgSYf2H!|so!Jbdcc6DiobfNV2AA^h7VfYQpX3rIKXr{sT| zhgq8nvM#TK@UA7bqJp$}NFdV2EAoMVmyAtFK}QW~L=38aX;Gw=F8&B#;ia!ulR!}R z+&TDzOCI!|2}fNZ&sE)lJ$Henpzb0{;=r2Fv{!@OJuj=m_pmWX;V;VZkHAJkRE?jqk-kA%3*bJ~B z)=~yxR+3C7#?Z!tdUs)(J>sajfGvUNZKjQ=>L@6nWiMxRQIn899C}*yxO40coRX)K zt|*~12c9*JL6L_FNm63B?krp2HT?Oz7RPh7MD^pUeRh)cHA$WL*f1ih2!2D_@5DIZ$Eq?o13BlGsEC{8qTs;Sx#9w6g(4vw z#|4L`cAYfAY0yg$oDLy1#~P`*p8F&*U4eq@F7`7Mg#-}viAK=9)jgWz3YdH24mHk2 zkWV#29>SN~K7XiH6#);8{tOVKBE>;_rV*|ACe3o9UC*o9R^bW;&I)nLcT~nNHPirYX~+o9UC*o9R^F&2(DoX8NS{ zW;#{5nNEc_(EVS~^@N?}FA1ixMtQPIQ5SC!F~s zHbAZb&zMe)?iJ~WEJCU$SQ8^Inb)+B&g@_pWHcdUjj_L|@y`x_9Qvz<d6W0ooI@ zi~MmYIj*B^KzW`Pv=ESEccp7-zxbi^fXtp4Ag6Q!z>2&i{GS@1CwVT;w35`r_Sc)| zfwM|eBqi1v6!pxZZB1{nKW~m8mXtqHl=6Gjv`3%|lZcN*^?jMwnCz7soBuIx7AZfI2I-OXZ*%X8iFSdxt z)y8v@he zGU$#bL+mX|I4Cae-rWazHo_{z4|=+w>=>%#ZJcb0vgfFR3;FbaSnDS2uq)lfd-S3k z7@=z{Q`?{8a=Cqc@Zv;2gs-Fu;Zz3f&_Oe}DrC~ZO=C{Ll^7>($t2O8swUByzp)~% zTGpBQm6W7O=9wW>CH}CU_E1SJYa&fV02#4C;*S~^w*uny`pP0!T4RFp zv-|8W2Jr6hsHw$&#PwZgEsdKZ{cPUitOK|+zwUZmOw7J%*nIeU)AwSb*RCWucCwC{ z3Vy2hwk(^xp0C0cXRae$CC11)BIID^-40xI>X~EJAf|?=$^g}vYoCCPXRF%QrwAYi ziwj-Juv93uC{<*EKu7Pgzx)yav`u(5oDBz6Nw9`s{P(Aixu%cJLZ#pDri zqN_R8ZYEZRo>co8Sv;7hnqa1Zl#~Pc~ zRmPrbTPF>ZfRi5$oC|C?l)z>&U0&p)X_KszI)5y5K(J91m9(~FVg0CeC-#7qmOhDG zxYDXtcN%@vo>9r`6}M>=dAvSq)IqYHam!yZ`4+i6%o>+E_St2W)k;ggbKm8)RTd$t z!jS>JB+sw`7w}B0mi3RLuBuDF3%T+aU5k&G;;p*g5z69~*6C{KDM}QpCjt0Gp94Kx z${Ag5iR13(`7&-6a#cM*==!e&Jn#GG;BM8Eev}t~Tweg7!Wv6sR$_`A+LD5U1-3wP zsD|Ds*S6P*+vd_E-xzS~avy?+M1l z@-nx71ao#d6RxVYO(ob4uEK4+$1Ep%RRhGCg;uzeD#R=kV%iz0Nz=801BnzE@8`A?A|#bJ7R8g|h{$=zXrPQ(#8ur(G>V4l7kUig8tX`NZi&AC#} zCMM})-A{jHOj~C_!}MI3y?L%T7NU!c*TUaA>v$U*Bv&GDxe@{JMR4KTAhl8%%Pb0i zlv97{V224Xez2588%@TU0HcqFY*^}TCgWRxHaecVkP@Dn3@#Zg*optB(ec!TWbn*@ za3%%HHc?cUg|RTy6>e~~NS>>z?r}sl zQ5)Wtl90QQYO*A}&610#>FAhEH4c7%l^G=v4|^Kj2!;rJQoTGQyZC3Bilf*Bz7`b~ zAu=69vPwdWR;?JDnq9D);fAF{Nw>Zn@9n3zVeL@Hqt5|+tU;Dey(d~XbQuH>zAG8@4ZeIB5qh`Tt|MLF++jq6dUHis=`t}X% zN*Ss9NpD^{oYc7!E++0A%nD#D#jdh&hP%e32bXvk>+B|lBZ)Gl>dtWVo`=@7)r&o8~zBRrxheih&QeeZjlm~J$_i0Cu#!X7l zCAUSYQD(@18@L+>bbm(*Hzu|X%&7rNzQF{fH^xE2^*$u*kydN>#Ob4C@{!nmAA9?f z#%qzoM_~H3lt()zpzn*d%Z|lKqTN?*7fr<>;9J_kmz$x?hAy6_On@tYX|?;r`#tV* zN$kn2`vh)b{yM>}q}=Y&#%o4H(nltzX#uSB@i%Gn;B&|O5vG{f~IhxE#rKq5qJS~DF{4Djls zP?@O^Bm}FT20`PoyoGP+%19(=tEN9tjKW|WL8>A3f#9r`_CQeHYL=Op64i`{94!T6 zSTzHUf(`;dK}bn?9N`>|`YHHDl398DSZ3u*rbp#hTAU($2ORHtdgox}Sw$m9*X@JJ8ro=~azmHXL}Tdf_E3vC2r3Mi~e7nMTnOc*_ks z`BuOTs&ZolnG(dgH%8tl5E`oSnZ4;|Emzyk-d;D>D+mfGG)%LG^qi|cm?+O`g#@f5t5uJ2Qqaqt9xan@1jfti}|8kcJ#3-LYM z?Dr$5@o0eI*U`j6J2vk(=1`}xfGx5f6?%z8b|c?K(E3zEa)qQZ&P=Z0U~Fl?NGnFm zp^GX+xwteY!(BU}hY=hi8{KfNq!?Zs6N?0Jh;+oZ<08cnP45r2QKFTQdg+MMa7uO{ z+9l$MyAHK~+AU4^d}rxa2H7`2)X6~Ak(-0<6RIL5trKK`wsozkyr@mDCSSlJyklMP z%1hZa%wk!KaFvv2D_G|`m<)dYkkBMXHnWGx;QDh8q^hfM;LNMS92ngaKvi9Eac7-q zX71r^Ri!ksOSCBvV3u0un)`%FL(K`~ZpkZ$^vU=d^p7d@YL>8A8QQI?mHwRof zD9-|(7*L~%J~^U>PeMyO3Asr-s)R5`?(pf+5Q|_^MTSbqQW8Zccm&b;5_}qtwbb;h zlaVO(uS$xRJ~ou2q+##Fu9R^E@J?&z{&o$2?B5oVq|u*BXHJ9{o)7yl@Rm=`Z^i6g zI(7nRvifLs53J$9_*#&-i`uT5Gl`NhaTnV;I`+_bEL%4b;fC}Hcp3e8#ELAq+Yq_N z7@xI77v*f}p`*S78t@OLv|MXQypyw`g&cO*A>j{EW-bn@{!k}5ip<3%sDQUrb#o2YBA0m*N^64q3UiENGU+HfJgN#U zJ@yb2B;NdW$+M2pK;p5txd=~=wMBh0Sj&}MC&N8C@WRS#LV}h_dl>?hvg~s-NM+X} zDLRYD(*$X`_Yx$D#S+q@rUYUY+nSJnP!c&QQ;XmhgH%%Qk}ax}J}7y2X}Ujk$_vH! zot|iE=c@uc)tb5lYW09DZC$R8J?dayo&*iu>5{nRFtcEC5vtue`-u%z!KNlPltQlN zVc&PZ#p&#o0``%mf^*r6V%jHq`&4&)xJpML=ZLg67C$kMWuc@VLv#=lx={ds(!jmZ zyT;U(o=`go8Kc`Z z`!UDuKfsU-n6Rrh6PAU%v-SLc#ibiOxts90M2;X6b!TSvd*Buu4a_OF80N@0<`EY}=(IM9v=G5TeWo3M^);ky!QZOq z94-|y??iOKl}0XigVi&WfD*&r$G1HA0@$q&wZNVRQ44w<@Zm0xyU_~>QEc3|dZvh{ zfrfpE-~#XpJEGAG!z4v1^N&N1DE|*>I}D?p?)_pCwVA9K|ETBuIEb2uVs(IZs5{N)8riiL-I42Q}@aN(W3< z2Of1$jRs5>gFn-|Eo=|SeK7@FZ@)1NLQZNWB+=eb4=JgZhAd)Q8j?D0=lAol8!UfPJE`Om zkJCDCyPYm%DvpM+om6zVRYOQ@^y;`pfLmIovXY8{lD1J|9xJUFD6)oB14UV+*-%%B zm_`b4KG4NMud`f_$tr3s&3Wu2w1QM4984UZuRL{;e+Z;fyg9{7uG_0 z)TL*Rf^<~4#Oz`g_FR*Ipd^2^#uMJwcEsB}_)2!=eztqpnLn0|Rwt&sca82jI_I8E!P60U#3GyNX6Bx$Oy!VE)Gbp@GZNGXglF)*uk)hvh{%fOZh9J7Hd9gH}O zNCx39TZoNA=@QT7XO#l9&%t6tQ@VYVX?>+oVdfqOkg|`C$#8#rcbE)L;tk_)UD7?q zrr_)a(sN~~D3hJbrbK_<1=~rlAOyJXdNxIRrfcL9mn?r36-!8#l!~Pq{mhIAbg%*85)-|T740wV1v)i{q-XANk?E!0<0}v)GR30M^<5Anque2pKAdRY-@~RJf4mb-@svS|54RM5DXC_vS1@O1jCS z{u$j_$Lexv5&OwLs(WT}S0F2C>t6c7z2lEVF91d5xwL;zmh1>5Ce1(@?2kIIOXG<( z0!8Jv$Qk>wmYkUF{R3Wt*nS4Qn2YK2%2n%|8fVAMI`m$|4mIG-?2)I%O;kVXozZr# zX&U#rT7H-gU=fT3gYM-4Z`xDDW+pV5C0^D8f z(S_fTZc)ry^pAQW+wMA@j#?47ZQ8kfR1W->e)wYt2a00Xcx{A?4ID5^TE|P!)UJ~z zW3kXnkkRW2sX5k24V`)8Rs>IH-k3a~Cpv+8RXeXtRj^jVGs8iAsu6K-b#ME@Mgehe z+_|&+qp1+Gl0!IhL=f$4gjE(aA0Z`jq@;Z8hoD*+DY2jl2wADalJlSR&Ub*z$^E^1 zxaa-!)zsTm2>VM#`3PlF%s^73INfjt_bO2%d1 zO-G;2;oarsIEPM~){Oi@(*E5Ab`!7MEC-o{X8M~w(oejIZS+=8^+JG|IMbDkmfi&1 zz^N0=Fjzk6ol1D&2hJw4S=Ng9FZv_!&P9fcT||f8vf7@z+B|>S;Mbaa{={7e{!i7q z+MYR{Ucp1=uxs_fS8tE{;G{1gN_{?5c33!ru*&1Z*(7o3&?r>VHin0&$<}k>tPt!< zHHK&?qcDxkH~9b7HHo8$Y7N^T^d`9u-1Q@+N`(}#oUdX!MA+LkVONXjCee!`x&*&Q zri!C*l!gv`cn*Jmh2C6cD|Rush@g%!x$VN=6L5x!wnlF@Bqb?|q6C{&2)5ZkMGnMp@cAuQpBX}v5+}Y?|r7fh*fib>9SEazI-Tt6gx609? zs971te_`Ql@4WYu}e;?W-P9FTs48L)*Lv7dgGJ; zy2p286rg`oE6?67r1t=kzY6$l>k=b;B7~>fFMo)xK7d-eU6Ror>vk+Z@D0DZ3IHKj z9A0%X8Z^E9@o{ulJ z$^0xOmFAbTnmf zI6z*k)*OGVfr_{uQE68qDs}~l!oAQ_Hx}bA-DH0(i?yhi7y+ynFr*eRaLUG=Z`?)F zJtUcaMa^JfkEz+k3YnBwh#^yt^&aG&yMR9cdbHYcOJc+KoOPlbUzIe4p4o#xk*Gvc zb#%V_mSLxw^W{VBc(QehEO+H#0aG$lj+$kP#jPgRK#-;)$+S6Yp$Usy+b60f+FlKw zxZgGLTER#|f-<=oE_)StVqV~lLZS^xGI-!ydcY_07?t2BlNjX)(5NobHrT20glYp= zX>;t%lkBP<221)K*nkU@5UU>*N)51MsWP+iucC!kbsX$F7neGIiIYUDHx(|2y<8?F z1FbL#@Is{nhYMc!%%utHeJ{*nRGbX)UlS!;CSTp1()hJI4P!cEBH!2Tu#K}}E6Dl=c zuo?1H)3CB6i8XhmrLDoqcCqz+dmg&(a#u?0e5}VcBR7kU z@0wwmhI(8xqm}dDTRgtF%sCHD8Qi0>@nuF%FL{gQso|`+(y@&?q%g=x23MpAiCd(w z2}y@qIHVkFYx%+;NScsL%NI61A~G~awEI~_L`jiis2@UA>Qf!66n~PWQGcRYRZ=>W zUZ+HEYZSF6wr(iWn?BXn|B-a_&=IVU!t}JGhltmd2fC$+!H%4y&T0ZaM>R@FCr(;< zg^tGpGW43fWJnm+n$EoC=3I#kG98S*H3RegTug@U(stS?xc9ttfV;@)S0ZNDAGmir zG?2ll01%R-*_j=QHh=TCJKt__LfHQJt9iF$F=u`?yR#{o5tfhxBK_-3m%J{YX~??{ z5t5d1Sgds}2a&y=9L#OKn9DC{0%dK}X`fh@s2w?vMA+JKP__*g&Sa%;{-UA)+ebJ#LRR+>rj zr&56NR4c~nqre!b<;Q>#O3rE*nrg|UJdr7ggCkiVb=qr>;0^$ScGFwcdwE&IEAR*) zLHqHo#ZA4GM|4D6Lj9Z(UD!h*Lzyi1MVk@3J0qeeD_7Nm9+2WD_O!C?Z*{I)ui)gnJq~%Qfacpy2od&nt*zwp-h_ZEtPc zwzjt0+xO1>)r$z&$;+{W7)T0B@5u7`VrvxRDi?K~)`CWmaD6wK^- zckR#+@|K;@W5jYXeQ*xRWvxx$)vmtJ>aPCjp!5UyF|4t$YnhgV=?da`H4kks=EZ*H zFS3Q-Y785f9b$xHbA`I$a{TMzq6AS&eFkJ&`!20e#DQ7;2ijR^8EW2d!os;8VsUo~ zWjy3sio$5-jyPKMF%Q)d^=cU<(V(CbKG}d5-^wi9_LAS-{}_9YY2#J}=M-V2-!pNQZ@B-P_&QSEU_p3akroTN@wEqNF5e8$V! zB$_9dgpw+b?ODYAT#<-V9_m7_5G|(`+;U_BS!i`$x0@+ z7mNBxK>>TCiFff1iu536()t{1A%IvU&2EPU2FeAB<7~ph_6FWs|wl=$+Ia7V`3I%p@MYu7F)r~5HV+si(y>C$AFV}}E<(z@xx}i)( zcpG}`{K=Gv1wuex(!+V){%{?>nHw>TyLZu9?!?ky^H68Kv%H)fo&Dy3n7AL02-6Eh z2G!FnH`6QeN)64WJ14nnnQto4Z1+@&ZesZGhCY}c6}{%7q%1D|@CWKgt`y^JmuD1> zzZB8?_4y>nPlR;>)Xv#v=>FfE;ve(>EJGABp+2BfC98Ym752xssJGI+aNr|J9W67S zUDlib>bIjc$8qqfs(8n=?&6|oC}q~n(}@O{RZ~AIh?)oZND=2-6GJQlv-PHPIWXPk zCq*QbB{sBH9Pm`4?d;kTfVg1e^o=-TA2Y1RtpUgRjsrqT`mxxk3+ADfxb*gct7r&Bb6d zd1g9AyX8hyk=`@$&Xc?b_+l3tS)2K@c-FZq5%s2=rx{w$FrRcBoqra8k3&hgd|X&< zn%<2Mk1}3MGCC;AOjSK=h+@33#|==wz@z7TyOM8yyFtve9BkQOG=`l)aJi<_#<8cW z3!rSaGK#C)f|oRO-;Q7F9jKluD5|WfIIwJ+QEkS*@2d+k`juNqZnYGh*fvFGe&R0e z+(^b{*?izRNS^CfV+z~OGUB^xgMX7mzTX!A(VznJu8TW15lrl+;TZqLF9ud(lSuJ+ z>NdMHP@#A?bo|;1=`$=nyo)@sjvOekjfV5gdgWYuw*Bo&{kxpm6PI{}qEK~4X+53$0OJJR=Kc8uO!#wM?WERaqvZ{Pd;5@m$1d;77P3BP{nFC>M64_iEq zpPgxuz@|Y=C6&%Y1bU^ZmI@p$h38|JvMTI-iFQrdk=Ly~2 z!~|aj8Jts1ft$-aS2^A_BdCVz#qObzHEZr?l{W3yCX4wFEa2HH&nXJyp6HnTruH~I zJGzg56$x`aLp!mc_Ih4lB?QU8!S#|^TXtm3vg)u^j^6p0q^up6;sbakIy5=0W-TDj zW|Xl&IAhhcj*?F$D_$yu%PjW1qn$SdoC&K<2O}*G%%^#78AKJV@keHRQu5RDtjv(F zEoQjUI9j>exFs=ILt(?@qs7*|wmdDjE8O~!$`s>|Sy&m)`hS42(PBE!>nr;i@({f@ zpy1h=Hi`YeOv- z*2d~|#F?cXG{YQ==~oMRkC;B|-e`#&E%aQI`rgK_tPsjB7-j4kxAc?ooI)>58+$b! z)wc8jykTTgU$dFA^2hh($cfOcPNQtHJ_iSj{%t3OJ!Kya@JuIXd&G;or>(V(;bV;+>gK6Y5n zO#ichox(O)$0g?mzr+0;xofadUio>gtG(+}H9@kJ3V0oSd61<^l+!Fzq_m`nwI)UW ztz{mnG@Q8r1N`U?izJ)HBNN*u!;W*7hmARUE&`rmWMw4 z4V5)aZIks73w zb=`21g1Cn~s3OF4lfQu)RfPV816yUb_M2t$uPWs8fSe}7%mr(i-@L7{NZ75ck7}+Z zY6a^EkIkU&+Pk8Sku(!_guZ4F6QXN7IVuBED-h1A5THu zHac3!3t*LuT=S#l6b-)D)L25z4Is6U3bNpTY6ud`v{tjLHcWu{d+QAN(^gQtvZRFT8U94FT6$s!Tb@D zDG-b|WTQ;g;)ODyq|Twmb*s3h5~rA2vzo@lDP7fTrxG0U zI7ONvQlTmXoaI&ou zDwiKhPrXRZbMhuidV(8j3t!?5JFNx0&rFoB%zCS+>A97?SO7nrI@wtxx-gTtuN5-@7eF7y}87S zL?~}^!U^IW6&w($Fo7hnPO9G`<^WU(%7C`wb(nx+X2xDMhl&f#^cmdjF6>P^@TXk@ z4RfT}XgW(bX2%Eq53!PdLSUt~@kmf5R7!9|;eeOSOR-AC?^!;JJdTpGEh<>XQ^)v) z8$}5x1a@@m%pFg1HRWV`ZMhvuu7aZih)z?i462C9CIOB4pAbd6rttL(pa9tDJorDU zvaL`#_<9FK@X>j&y8f4k;M+OPxN+vedLdtrNzX~eoDA}*ZtWnCWeIR1!uQmx5Z|pn zX@gqS%69ddL@+aK^Fp+!?a(FFV%YlPJZ6m!&;lt?2A#=R+5(!|l2k_nL5^RnDopU4 zN@Uvj4pkf};OZv@sa=m>Wbp$q((9pFfZ2;}aiwy7jwS1QW84?ET9as4~7;GbD#Y54O-iC2o5tG&$1D zTFUl(km#H$!a)+<#nP`9TN~QxT?>c8nDfH{Mn8+Ng9~}lHf=a|jrCzL_dJ6GDdWST z)4_>eiX1uC-%LH3x-cje*cdT`e)dOPRKb&EFu|H>w8^?qP=GXN)lH-@?G+7d!m+#= zYl+h!x%bx zNN#v(OGO5~F0!QCXLW=SU2t|Lr=2u1BTXYmm?C5RHZMRyWzvO$!xIQJSqe)Ql0B10{k?QyWR>Jn&??f6kqaD zq89MZKxN{M>le(o39dTSP3HW zza-cBHbz|)MhbGzTBPRtC!vSm(ocACe6e8qemJ|@R#c)atK4aNT@FdG6xt=5O4kCH z?ltf8m=6(>)yJc=8FkrN2Ka78{iWRh9C831`3xN|Detsw-46vjuH^G7LWF>N-G?yb z4HmRnnFxs35qe45P+RQeh6hRME-wyIMNu^eY<^f5>9(Z~u8V>s%?NEH-BFdA%^14G z9Q8IBvkyx!1BBHKloYTEBK$7%2P~Nm3Prj`X|NKx-g)e4p;8~sZ_!Y*{<&hr%JYB< z1eUf=B2peYe<)G$P^#q5Qf}vcc|Vumn28*G&Fv;q+L&V_)htb`4!b7rCT!HZ7EP({X-#A)X(eM?cCOW7j2!=#&0t& z1V^Qqn^naF6=jT4odoPQs_J_KBXfWx&Nt-kndRTqdsS8uBU+61el*>zi_=>HfnAD9 z>Y#gSYYW}P5RRkI)(#zC=N%UBras^J zKfhITrCPwisBOKUyj8Q6LBhRMBdM{YxUZBLI-37zkHi%i!;cQaa-AMML@ zCk!N-cv2!%vpAngjdE|RbbD6Cc;Z{PpM9e_3jX_I0j`1q%vfgFZ@(dTste+KdT;RLanv-Pre6%2^9?8;N;diS3R8s{GGM%%5YK?@ z(`;LTit)<+MicH~Xc!-KO7pbWgy{`nzNfKK{rzGK{Tb4c*u8u(({KB;#QFU#qHnzI zaw+I(Y%v!6OIl>?(6ovxH(0$8gbemF*cTn|VuI)~@&|lsd|v42o6g!DVe-RC>a0yh zkhmihW-`-j>7lJ^Yx<+_r8#Hhm4P%4VLb1y?uLHH#b2mzs1B>KO3W@>B;Pmzia96k zSch+resW!`Q%on1IHn#RrnO1O&-zY~6a4`Zg(aPM8@SMizi`#L5gAghGX5pDCxIBI zU&%vZuA6F-u3=+gFvBsNhObz^iGTP7xt!JtGNs}hvG*hBydv(wKgV-AhsSP$@X4(f zTCopoM%j+dFVm7W9SY(@S~->i03Pl8k!8scN&5P=o8F~Z-v{k?Pc3@qkS4zAma*>$ zKKE>T+ci>oK@z7XKO9;~opeFYFgU6Q$YoR-Sh6qg+XqsaW%7&&k8N?_B9DMKOQ9E3P#s-@ zPOfi$7(s&SprrjUm3I07gg!H}6_eka1q5Q&0(29o(xG7Za>7yn9CR1%mg99jXX?@T zoTLEf;vq`6scThoH8%L-4YCkxIuod?yUCxmY_dLOUJna%;w8Apk;6sbK&{vRKrAlZ z`Q};O=akplAZHl~^Q$CS%bdz*9#^A?Hnrs`PMFNKJ-!jJo_S!*c0M!~+p_7wiZ@cH zmo^og+VNKts}PPgyD=$S=}B@hdy4GIv6bdj^?|K?#tMsAPwWBTa>lY6Pc12D=KRoa z;7`zK!~ro}dtgknxfmC11jwbx59YS-W=F=x_YJA`9ti=X?^9PP5wCthE4o=L#28%R zxwb^xTp@FjA>}|hY-v{Qo^~=b@Wl>{IU(}}=AY?fj{jDr&>3sCnUn-q{4*vL7G66= z>5{uGi=*lqof@(ffc|#fSbZMm8T9jADFHt?YME1{8>`O$R-J^=5-M|CH6~!%t*aiP zP=9jBI$|cM(}Qt=4Ev?0no8g$Kb;4uuq}$6o@}b*4+Rg7Zl#}^$LYJNdkW;$#4X$0 zuP@&*dv`os1dAc(Qnv|Z4H_f(@f4MZbHzr+YXo5oFL<~=CNL+l3g53@?Hmvj3KFDAUGb&cdT;*_lhfCeUJj= zTm0`q9*jeUEGr>SDD=(8BauC7&KQ4%slP3@2x8LVtf##VWGe>3zvI@()oS zQJOZO2-um`Y-O3{^4!G!UdVKYjq&rICLK)D%4nU1MFU~7cW!WO0I4_{saR)u(#`Ew z8~f-E#&D{Gd##0m2w6V=&*a8wVlzR!g74Chsv}iU-L+OkvRJ_jeg)lf*8%d}w*{T8 zKj0Aln~N4MR}6cxq;(ZM>vUKU0lOUGcMS*y^+4g{mewPTVU%xRVR|Kb*Uy)S_IfYXDwyt8IHbP!c1hS~53im1} z@2zAStf2>3dNpoFa2702Q};_@&0?=V_(!6+p8aDb8eneVY>D*w_OD%>QV`Fr1IwS< z;yYk_@1g<9RTOz&E#?L@>DspFm5@i)8SHRO%f2;cSSS~A-H$CtZ`mP8src%_3BY~1 zTe5rDeJX3LKb+Tiv4TLpv%k3RN*-{l5OPqWIXW^wTa&PzBBftAA_u5muD*`!;yEq% zUEFuHSy8VvZ=c=Wr8uScVsIk;;e3(od;*65N#1xy7@dbYEUQ954*9{-p-e#xz3`~3 z4&1CfuW7){c(Zk4^}*p!Vlv;Dh`V0-+``7eN1NYju+s#W;LxlmUh=>Sx`^{St+U(C zwa9U}slFw8nZHl$>Zv4KZ&%?Far|12gkzZ8@Yhp88{|lN6~f$8XwLTQX;mH+YzF8d zNr-NKMtHAoMfY<@a+Hf^1mYyCbi!Y(mp-GRoDJ4f2ILcQW_0FBm!gus9sp^vhsB2p zB+6P}GHzx+Femgi69V&=YJ`j1FG7ur>Ljl=Px_ILpy+($AFUR9oBMHOwku{Xq&4v7 zna(O=%gWrgI}(4E3#kq*ggBATBmlDgRG{N>SLSA4gO%EbOjZ8-5r)ncfwlT4nvjz* zd$*;Bl9dbsAI9lZLz&z)wUJzJfO2@Zc&Pa2+i-6*kC?5lL`o3JTA%x_V-|aG*+J7COrg zY|{#wr>62SzvU>WpyB&zrB|@*Rw+f1szP$F8QsyG{{hLe*n}HF9Kz+e4V0w zH#uK9>^}>WlHv-U^1a32XqyRjFWUi=z%H<{)iT&a3zL)zvW1+pLVfg5!Ogx%IB#Ao zsAdJ0qQ)a%w~e{G++>B-Nj)1r7@(Fmxf88P@Rs#VMdZNZO!p87OkH9b|q*{ zFLABQ8qe~RL=V1}r6+l>ik_LI?i1PzzLqUlFZv(`l4~%nRElG$z`6__l^BuvB_Cz_ zNq!=e(EV4T9Q`Hg1eR|j^IHQ<(!AbR-69&+ma+k1H2fn9*Tor53#e#4?fT2~GzmK; zgum_~t4Q{}@;(=|Dd~aD8rS}uYFm9XgbEy+^Ey^g?I+LE6noxYq6j2w9%;k+uz8tu zTOmgtOP=TqRz$amg-{2#=_#uTL~#mC3)kbXzR~K@(PM8+FXIAKyhv!qN=RH~aBd1m z6jC1yqwuJzFw&fTxpi-s>47-&-WT(bbn5u4hm2Tq@?+9=D$}sSzs8 z;5fMG0l?s(QSr-BKX0C@AE0wv7_=71TowdaVds@QR}a5M*p48 zldC}j65croh=rrH^g(PXxLfx+Yw>6Fo`S5!SU{jHi=AWUUXBQMPN{iW-X^C?`)6U9 z{L7CxZJ|1nP;;_7PrTNkg+%!e#LHDe&y89f zU421|uj(&nOv8wV9;6jE>HD;k-+dvRrJUA%1|jMV(D-h~!9D|t5kRx{+D0r%P8#)S zkWa&nEw>OJQeSCD^H-B#_1`rZx&gSDLXS8$>&^Xw#4HF;U1R}gtSfW$Iq8O6Jk8&N z0c8}!LC@J0w?Bc(9~{O6c2T|M1mKF13p*6dXGZ0gsJkGvq-yrcd*#Tj=s6!0i0j~m+Xa|%N z>5M(z*;z!+>-mACm-Sp7r*ho$U|iLYcZ18CW-8r{ zlmB>Y8UOCNqB#$pd-BFJ{_VYUBIh#w*Xrpa4IpGz-0Aadg+!@g;GwBJ&ta$@JaUYk ze51^u&jCGiNSgnqD4-_-B4OQe25qbC@mc*P(v)^P3EK32X?NV}$EqqD&F*ZV$`;Uk z!0f8|Z~sEr)k2kR{B0$Fz2xR2oqKF~OSp5DYSL5i$Yz5~jnkXSM2+V6{etcRp_B>m zuO{2>ZnoJGff(dWRliaFqi&Ub-kuoA;*qZcreVz>N~ap~$i*dNNhaf8X@N|JNwobT z^8}-Bp^>#wk_Xa+Oj66J^*H6wWY>v#=>>E8ACz{uwn0*iAm z)<(AWV)qp9xuQs^r-##-Aj6U)_^`02x70lzt>Vb${=Qvy&wA-^R`bFVv;S?&;{BVd z4{ukYL)QG?tgW(YGl(OL%2N*|A6~mzjwwr>sq}xRsXe8OHQC{}X)dp!__kG6{Eeom zHIxtJ>ysma%|@hOkmGxa5~7b6&fm<+BYL`xZ@vuPO-Wndi|P~)^KnBkvQFuLX0faq zCJFOT@qgTYzV&I+wIj{*KV5Xb&fV|q5nMSU;tliqQA^%@F+vEt;Vs7i?v@h$MT@XyV$ScWLLG->+qdp2#@3U%=yX`^nUNL|N@*E@XB2M&L`8{#S)gG^TN zj=D>Gf1sA%2U#z=_ECANn~-gzv6?#a@hMt`odt^`@seM`9S~1_W0TaLRUJf_f8;i3h%Xj=r*V|G1-}( zxzSi-l)V9eWE07qp<-mIL|&8PtRt8@?0o@Gi7Fe{b4rGF)|xlM;BNDN!@vyJ^z}=F z?ew+b-@z9242U`+wwBSEy^zd@Zg;x%?{*%qX64}ICW>Y-R%^}ckZI?>Kyl_~(c4Dn zQAf2$z1~=6k|HVa@49e?INPzz?twXS^|iRX13JoFc~k7brxvb6J2X$5BmK4Z`)mR# zi>XOZ#&r^hM57A8C@xdiuRqE1fH)2%#w8E=o}kLFu=dq|6Zx^VT?!@%FxUIT9V)1b6yiP!smo zgm2cJVRPQVLj@7yAeTL1U_%+4ow4oF`+g_F6LQU{)_H^Tc0yRm)6G%z%eLI>?e`C& z0@|@JHZ5x{g=I6#r4lsg@%^y?C0?yINAT^87{$w+OCFCAOHU?w%UnWpmuGLha^2k6 z59+R7o6#SD^!<9718@A!`c`$VyYz?ZfplEfhj7Npg7x2;opcM z#Ni(%X#ePpshv@!Z|UAp0PAC1u%xekQJyvPA|^;JluGbq<>Qe46t{&kc+KM@z9;yzcFpZP54@3eT1WSFvp7Y2y(kt z-Lm{`qE3&?vpWuU^$sr+FDE)=Ct$$+_nFeb_x2*&4rKA-)SR0OQu7^JS?H2Ar4YIs zxNVsMX@t5<-02N*bmKeTmy7nl10G&_0Z7#oZC3>>wvFr;s$Qa((icgkY6eu*B&?P* zI0@O+CFrba(^hsLeoZASoJZTR9J=2>NFWPv$U^s7am=#s-fr5%Ba@v!l5dId8cvUy zh~tLv$?(KkIVkmneub1hfls~V#z$jP-{9W^2QMo7g1_mDg+yjm3`MtQ+%dN1pFKob z)5c6>@ig+)*)NKd6F?hwSjM35nLj5%+VYl(OE<@oVnY=UvrN3(TMg5xlLl~Qzg0VE zEf_@Vg6+ijVfHz`lRQrLY@~9-U^SZ_c5HOCdcEsBVW&-RaL;C@ojqZ2KcC?~XIDG| zn+{e%{0`lV-Om&FleY<8dzn!Se-K-`Na*D*W=%Uh1lrO`>EoT#e2m;|o+WP7h$^JYvSf!3V7Kk)0AcJjN4zCN$f{+~26MhwHk)PDNaB{*h@E~u z{L?Ztwm638szgPcj1#%=?dc}7wziW$!rAep-kB00&`J-UpWqlJnH z)t`HrSj~;D36X($-q_+VsCGY{jE-QiIIhCGI3)*rixG}9&W`uF0&mO$TG{LX5puQ{ zIJNARD)t`KYec6;>_HM0+pY)6`l)K9b*<0gp?j2Sm6efOQxd(2Z?y!OfjF*&_ItDh zMUx$ua_b&Q7i*x5Q#Jd=n+LT~iS_P*#$^FuQy)7ELJ^4`kf44Wttih=XZyc&P-MWp zJ~dJywx5epQ3y3TZ5HJ+(IrBG-zUKQIAHBLMe~kNsiD&)V1sV0jS# zzYXaG^z(4AV!ywX;l!cCiz*jk=H93V-CG3+E`Ke%;|aChYI|Ys56vQ-)%gS87DlhF zzboAD-SF*Xn_R!AwNPD6E`ji_&r0FdPkye%3J0J6?ot)~9atG2yq{^|!(I~KdokB0 zpuC;+fe}Jl`s@Htj4mimDzpCK{RY2Myt3M%Ed+h(_kGq#H+NB?U(4=iD!$d*jZCb^ z{cnyP`7+<}di@bkiBNhD!o^<|F+XS)UrlmR#vMzndq`EOSY_iJ=GFJnU>sZ2w0Oz5 zYG1n|Op`t&@_|TB;4fR!POjK@E0!8^xSR|8j|n`ew|>vd2~}J*=<6Swys~Q{DkCnQ zYMQ@pq)OFpbB9Xie_>3DOIr%rxmtVuh0?mvuj6+TNDAu!`E$gW$_XC+UbW07S)Iye z@NW7XmTpf<`5MmWE3iJ8$65^rl|^Y^e3f)_l{%dzLk&3PJk>+?`?|Iu-)^S8{!Y1G zrY_NA&gEbJ--L4h|0R@(@Dfb4h4AJ>P!TS0I_xD)by)xd=<+(g|q~+?_(Mh1bB8Mk`@Q;fI#zFRPVaqWJfLk{E3PO2KT$T>q~a8;B>Xz<?81;UPsw;SKU1cC9h3+b=hxhEiz=-%I-d!!Vu|ICNy51jCeGR&P6+ z0E!&ATc|94nWmlLABSr)ss7}LGbVAdi)fx8JW6&Fu58M@#qDXw4I5iEbwk_A| zE^C+%;%@^O*|3F?7z9ye{2*YaS$StE+ zeaNkcWF!#_40dTNeoRIn!SgMK!|e5HyNdn7P~H)U(g2G-tNgap+rh1x$}tA%8dSEO z>u(aC@(V<(fWV+m^li9JKj^{;lZO*Y`mm)_fcPehLxk-~s&vEU!^8>nwe%e?PNy~q zb(4T%UCN>NT-rfsqLr+WN9ErNITL^Jp_7evmEHaCj?S^h>y}P%F^=iHiNU>9cWp!g zl8<_Tx5{yIv9BS}*-LW^7K251ad2$aT?2>SYR|-`y&^KX@w$%f<6&^@1x9z#GqXZv zqdd~+eqzn0dRyH_yUZ>e9AUn2RMMmULy&uUd20krlQZ+&23nz{FaaH z1@Wwx#XkGb6&Al_6H)z;{F&R9JUe--RX#poV%Fq}zwYQMcSs`JI+ z)#ZUTZ1?DACvlVmHr&TVuTB{fv+!&vkw2*4EgKd}58TH9 zB~P%&pubG@n$HSjNN;jMpz&Tg3Ys6Jg=A9%b`q1hXlcn#scMK4?e7Z02Zzye?m25I z94h;TXHhqs(QFuMhwwJGs1C!=x~gsO;e#g!-gIviEMoX+!rFU8Y{`Uwv=5(6+81y) z9*NRV79Hd&$GmSR@R!9Hj=<}O(1u$9w@rB{j{Jght-$n1Wq)0FdJ>d%p*Z-~rf33EB&4mm5Z zw{#Ca^x-dl^_Z3Ybv%#bAT}>iP4ii=Cu&$s-jA(c^Y#Y_=g>U(sjpg%yORQ-^BHHR zXMXVh9C2$p0bYoj1v9g}_+BfjQ|;KqKdv6Ky>3!3I{^@Zps|NcGcIX5w}%xwg6SqL zX}dknkEs6nDz9;NxAZLC4AZu)9#=iW;yU(M?mgNKtxB(dkYhU2Nq0nzTS=&tIBZjE zDH)Im5||4arrifg>_2ua>)?S+$tJ-)6kF}yNa>c6Pj$HwbM0P8Hw$*U9sVh;`IZ2j zWcxi7zANF)mVnQ@pTGX^(x)1dZ+7Ek6`WSF=eOk)9*o#xKM%ZZEpNBB70lnJB0pQN z`PnH)WTkFEN?5;ol9INHaftJ*Gf&x{JZ8%Aac{xkso0-RdjRltB0XWBob105A4i6t zPTqP`OoOdku=mm;25EBigfdmqD} zZ~?neBkw@b{!7r|mPhfs{^y-5wYC2gP^`o5Dgx_eTae``%v5yJa_#t_oTh{w?YO64 zdlx9CXMPvRUP|BIB4l2nc7H!|8Zc9FTq7FUNOHDNf{qT`SQyNgbhPqDQQ;w_XN1QSBH-ih-J$+ z)OdOa-8#nOP+PvkxrxN1w@@~{B#bO{*-06rOI8pVJhK*@C&3ne%e&a|*sSm@k9v>h z-C96#0_n8ile`Z+1Dd@2&ya|4)mG$Ou|Wiw(cSvOA>-^H*cBt9dwZSuX}wXU{$FA& zo}o-zeC>3(B=NyGXsrsdIB3uJHu>M-L*GIm|Xv2{@WSu2hl?U-M`=UM?beN0~=ZDnK>dtFO)KUk^Iyh_; z;Cpa6)=GhnNX%n`y$^B{5o4Tb@c`wr$YdC44$%R*8tL8dflrMF%?$){SMKozV_z6f z@in46vdut|JR+i1(i~jUASv4t_Z~$2cN!37ZK~T>0Hn|SC= zgzt{dL0+Cx^>Ivf1akP-KRN6c$?b1--~OKZulc(D$^ZF~zZ`A&DKYTTN4_vPQgAPq zO=MZV`@aAlR!o1({}&+MNr*gWGjXN`;?HahKP{8+Sqg|q!h%?o?PiSZ ze1x(8N{PD;PL&d7!Z;r1R&Df<~h z43PRFu=?((+Hw|eP&_Na!IScD*XELL6^BdiGI+L;t5)b_^-XBJt(D!RPr;aHY@&h) zSl&3+u1L7w7^h9MSvVc{lDO#fC*7+I(MmtpNpe8PPvEKjI2|$>tC(G7t)hK0YhP2G zUU)Spvhv(l01R&w)ahJgIvBKpozixs?z{)K44*q<*i{J)6Z?4#z7vONp-9ufFhlC^ z+z04x1JH88%MnUxN;e~$OeegnRvnO{^kMm!2qQ9a<}20u<%*zf0U;6N802wdzxAU8#4)qtI`B&mfDTK3MJ&>Lhp4<0Do&Yk2)W$iKSE$*Emf4DXM|r zL&7N+D)lHl_&l4x@T)_-%cUQh>W0ne@(#2g7oCUT!oBr|P!o!8JqFQMqBv?=}a4ad?&C*iBi>tdI&0x?95oHNa7eCce;nfj3p_lK0QOl2BHqDZjK zp#~BCwrf9ah3Uy0^`Q=8XBosF{P^qb>|kD}185n8U#w6g%h3t<_4N$79LDOS^tXQl zz}rKgs-t@hdIWdUf!Bk+vutgNz8^Upi-CJ4$ZaDuNxwBY`@^;NLDAE~Zm;WgjF3y# zIT3Fz&Jr|Acsuy$T7Gh~C`h-%jS-2NcG*efTe_N65^xrLOm^T^$!%5) z_X>t!$;M_yno1KHR$&XVVbGGa;LG$380vV4r*=3!b2~4aJj`;no79PO;Trxhb2nqS zJ<{kYv+w;p;0nvHWD(p(E~fa)4&Epa1(UujbN$35_f+&tMpcYw*S4O`uNiT7DX1R4 zv9jSK|vUeYV){$(<{+Gt#tPo^gKDw-*FlNBr?-$Xhx0x=<3_h~Iwd ze-TizzE&0$bTJdO5A28XR z&KUv2bHAXQqF?68a?s|_CZ9R8qBv#UkNM_CrvLK8#Aii*h6`uWa@T(+fAwAIMdDDa zS{yRUBzCYl>@_Q>R+=f|{rc^ow4&w(d*tHojO~3CuGG_^<*=rOw~C|d8mMpW=-5cV zZ9Gnbs?y3k+w%ago1GLcCDeB(lLnUpM-Ta3jCl%IiDI4z)oQ!%R30!G3l~*Mq4C#H z1HazIZeLgy`%=;70u0)n~7&BSqRu zWZE3$LZGHZDrU((_p0($Hg=1LgZu_5a<_S-pvOK~+p--Pn%@TN0K@vUMru=|jpR;b zG(&>SnAnF&?P8~-vn1)XINg0d$;rd(*h-J^ecO?+8cYe-qW%_#$?(-l*(l0t-}p!JPoTSS3IYc zS>>U`*sLD2x#`oc0t83?!O!rSC z_(S{4)o}Ii9eu9Xz_&%9JKQK{DG?)5ecF)LJqVOzDFqLohYs6bxGyZJ!;_*E19g1< zHQ`4PqeRN)2hMy)=OU*YQ(dp8s>wpa1>Glx(NS9 zX1hr3P9Sc=?(9a*Le!+b@}RwU5iXY~6gx&!y0F;$G0!7ce$`a>^T|?LBQoCU-|=)M zI_riQn{0h}gS5h3#LvKExDVJ5>R+EG#}P}@#2#tL|0wR)znqdv*6@L(}Xd^WiL{6=^_bLQQ^5%kM1WY;h^^( z&v~zO(J7C+m0HHOeJBPiF8S9%`$iEUu5b2N-_ByyvdgJ3Dnv?^Z%imn7>504p8*v! zEpj&*(lM35ar88SACVA1>W1_}awq=P1^lK7azAs0J{dJF`l0M{n2hfyZ!{82YFD}1 zWa)=RBM-h7UUO*zD)Xth*7KU{xB!LakKFoK z!_3naUJ6JZQ@0RWGVT0>a1p4E#W;>tXC&g{Rwg%xwDJbKj6udeVO-{hV@)uijr*i1 zWyS1~AA3h|@XVl@q!T{P)kvh>3>YDKH~eD^vz zsqA)5HtOV3NwiX<$iG%@BLK98IT@d`VGhN0_^0qbjE*5MoFDmh4l5YX-Z$axRwB%w z;b(C~P>fw6GLAnp#K^HQ7K!4|YCuWiBV_8*Q}=gXVeFQ-a1bs=`O8~)4*D~ciiTq~ z5LoJEMiKrZ#OjG5_WerUz^w}2vG0^&#o6<0m=r2Cg?PjMiZt*LU~uj)rRVMTlIL@y zeEIPuJa@Eepctjy!Lhg25zSNc_M28SDUr8-I=6(Ll>*7jSGKegNywwD93xL#^zipg zu82D0f*TV6$$Hjf?Dy~?@5R$B6toX^Uz{H*LA*e^uqSkL$Ed&LidKv6m@QTDWU7e> zZyd{Ux%E?ODgJte+RuFO3qX|%+OKq7MX57#y}1*3s#cySy{3J&bEM6hF|hlE=8 znHvSc(bTJ%o;7k(>yN{`UXO(SN374*XWC}iQy$HVhRZ1c#{!uG;s?b)(p;%!Voi|- z4jL}Xf-_4j^+sw-O)YKJF5xbOI#hy!tz#o#m#JGURFYk!XCiUI=^yKFHL-=PDfN- z^*^HG#3X&7Bq%!8A$*q|B8Ym!99*Bwx(2ku(VFDwD3xqsPSLMfNaf>Qm#dz=C&5#T zW{2mORQFF4q?ovxpL>73)MG>8i9bf2$Z2#j#Jt z&LYWz;FHltarxxq=W|M#Cu;Jea}rFC=%m=r^O^wjgnfnR1`YM>VN;ia8B>EKTHdh( z0+ms^)~uImbf^bsh6#QZ6c!u8KUVKsqe@ZaRfv*OjS3^#yeKnch8F92Z`G?$>IlQT zts7xI74ig4pD<0){SVnTrmy_n53$R>hRka~m0jVVM1qXVuI2H^+DvYb-k#Iby6U6? zD|%pwrrtZCyBA^!pK17w=%hiWhM|FHFzF?F<2+b9$% zP~0i5#ogWA-QC@_Fu3c+-3!It-Mz)3xNC8j^6lq+&&ijQoLtGyY?yjmD zeQa5&TD{;&cYPZvX$>dmI(V;P#(zp0b1rd>ldG@n;bt*Jo-I;ezQWn8xOx65HoUZp z-n{|SIUXtUv&ONC6rX{p_z%jx3dpF|C|=WcJ7!3^2tM6~7J`m1F%;L*>XY|L)1Fzd z^d@3mvYBAEiBgwUK7|Ng+Aq_5j4UB)SM)Ck<=X43g&k)cc4er)wAJ^W^(PgnZFhI< zofA}nJMboD+=#VTb61Omu@yYC8kV!F(naSES(q?8#Pli3xl&Bc)XhBRG*RI8;3ZG$o%3goJ4=;e5Z`&_an z$VZ&gsjv&f5?C9D1zduUNHv+E9h3S`<&|6_^Hxk8L+5rwA!WU*^99ZHF@24fI0+%_ z$^$hLu?sW`7STwjj+#$&CmrX6iOCk6V##%Y)unu(`TMS3n$-6Y+hVgcD1mON0cI5~ z8rbR%7hQ1*+ia%s5`oz|@A78CBO08|U8&;za0Z{CtaSQ&C8zFFslXCZ2~~e_=mZbK zwS|{VO#Z#_HvVrFf*14&-uqlM9Dc2_7mJRSI$RcJuvvs|{WcHmyv05XL_V;oUj^p? zS`Oa$1o4@j4Z*P#5O_9O}cuxcha?J$HA3mHsN_M!Kc`oXD?pd{nYHz(Qv4a&|6NW@| zD*xnFm!S@ebvnc!u#7N3!u?D-#aqi8|6)pojt9;za6!i_(&tZwm@c}Z`x77_YwJuy zSM6&Nz}}9OMg98_-c~Nh*gNt$t~0~Gj7aj03h-hdL?crw9Yy8%+YS5G&c^|G=uEe1 zDYytec>d}$MDD0W;i+Y(5t4=6VBlCu;5;H1F@ASrN}rjz52L3`7PYh8I{j92DSWo; z?e9|O#P76`RXA-X!+tM!M^y1oVW>T4SZIO|vO=TMLkeS>k>p$JRQ-A?=nF1Sf(E9& zQ=@fzz&5S=TlNS4hkLh^tlT3&KIW)XYCAgRh(-otOgt8SoPoRWNEQ%hTawPE*^-#W zHtb)U(rQ#)Mc$w2o59BA8iyalI%R_oI}w=H7WZ<6Cx;Tube2CB=gXQ^R!?%)FVzvu z9X|7zkRnojF`az>0mY+JDm^NqsJq%gEfcj{fHU0BymmqXLzkPU%2@=!6F8K7sSjv6 zaLqKQs+8Kg!;D{wzc|HG`Kl1>GxT@dAUo4`Lz-><_||hhRqQg?+eG`AZ)2Tlx69}( zTmFkOK5e;!%%?wV@eU;K{EgqXe%tq8jVNtdbq(pZK`Jde`_y2_qoBOrA{p`#ELPe2gAiV}bsI zgFO{h+9{;MyG!3zIx(7S)>!USOpM}xUc_L$p`by2xD9fiv+53wf7xPskk1MEF=`+- z2!g`<1Xl~Le%NY?7o#6>L01w#>fqYhfsH%Aw>>F%QX00h;%jLDCS`$+aCVY!CsYP1 zy_N5}bLt>>BzSW3_$G7ez|VPAD8`@GjpysKDN6o7?Q5eyhG=t1pJqY2&{S77;I15r zZ>9(>G*+JpmTn501JRH?wl#X_Cg!(+u*0Q_vdC6I>GoKqiCq`+IBPqJIweN^yz5E@ z4QAtkn-Y__C_M#W>mz|d2$Ql0x9)npsRJ}{x29a9=c$NZ$2UGTIB7|zsehaqDiu0! zU1EJe6;Ofg}l#LA~NFuLQ- z`?KkVc{?6P~v~IWL!wT2rZ6}C#uOYjK#DdO^JojpE zq9-%=5xQ9D34QN0Foi=2r!qe+#rkX`v;lv~dfhiT&DX-kBh1R-1mkAns-6OE{~fH# zvPSiz;ziPg?{4kfl-;D?*Gsvw;_6zoMpG2<3RJA_Rja6JKH}V0-}b`wlKHGiHgMEC zeo>&bi9D}pzzI1iQ&B43I_je6=64x!s=0UH|D1IntP%c{lNK1${6gSymdu4-a1Zb= zpXghCdC1sHQlQ2zYYJ}ZZ5GX)d9TN&_S#OouDfyYoyN9#Xb`g0wED!SSIQ$bFcYi~ zAqMq7KuIX5*o(<;cs$`1%KgQ5QOnWxGnrNRt!e|Kz^Zni)cTH|JV`|P?t!B(;!Zp! z9qTK}USFb%-lxEzpdc5w@jxEH^yLOUk4Erz_aBJasbps?^^k6~HsFe5=$pCY3i*f4 z4a-$5ZbM7s!rO=zWklFk?RB1{8$3dSx4_SgYC#xAApOp(lTNc2x<2@E5FE&M!3q0T|o zcZRpSx`^}A+THy5VzSDOjs)V_lC4>D8qfx5Y5WxVVt|7_jeQ(Oe<|YW=O~slF310# zri_dnbOG=ANBK1;%=5x=(rk6o$!THk*G8VJlVl~TNF{fR-~5iP>UcKHQD$Q~<}^1Y zs;~Vq9qLh?{EZt`GcSR5);cxcJu01Z#AZ(`RKUA`sgd6Bz=l(UX|gt_K>pJ&oQxwi zbLb1?3&-Ps8Y)APEgD&UweoZ(A+?^$Rsd+PD z+VE-y_YD2DNKcu4zs>TUBqK+FV=GZPaMo1@`%*l`vNUOjBbx2|2980?Ec{HKSj;n0es9PrCMH*g`43Ifju4j(n2?d1YX;iba(H@cmQBF3dsiL@gH}pO4+t>zM8HDTKW+L>eX(!H_^p=x~TO-39g3j)V|1urE`VSx@~w0+m=3hM6kVS)Ki{ zqnYext@-iGC?@EDHzCdE)!ZgZN>@nL|G?32_?fwPYEDALfHD5V-R+G_hE0bXupAiG zrEk%*r7NHH0gUKvylWfp~Nbjy*26GLow z!AV5JK}^tcDjxmktU&^+i-cDVI7&boWBp&uN~I?s8YYWYw%@J(d4h_-Q4d$O!r>Nk zaqn+l=nG|2iy~j!TIX&v4n7?mO3;`&_ipn67fEaqt^>h=JlQYvP(<)?3M}{!CV6`9t-LIIDc#~J@a?c4y!1`D)X;HGKIr34DiC{?)Gi_w&tNf(1PMhd6NXlPvJT?86+T&eJ|lb z5-6;Q^o#&-o0U!9^4)wD`vKcT{Bs)16l4oL`r2=F$SSBRx3)?dUIt9neo@-CWl6|a zU7y2bHwIsGEw`7IZ#=f&U^(e{e;yfb2{-L+Si1a5QOo`^?L4hNT7!>pQMi}Y$s6aP zt0mUObe@mj0&c-c8j{|%TCU9cg^ZcEK!&2J6I}-Y4Q4&Qai|=U1+{;XMaCH{@19Kq zT6})nJz!-e=MaPzb&j7_Os6eepBmR&ohob?m^vR(x#qw5HY;i@A6$lJ z(dn7{UB>bF@X2NtN@chEz{(;9rQ`m#bVRz%b@+i>)2A#;F8k%jTyU3!;#goCYF=*k zjSb!hAjXSAbeFS_W(mTs9M`2A{90JpI;~Jh6JWy>G%J6lq)ok|{3UuPk8x0w#{(1w zyJ_%E_hsrvTJ^~i>oY!LnckSmeQ1o$7Cjn%j{EgTNeoRq9{JJ*zR6z67sZY{jOw0r za=WOcE_ha-kjkXLyPah|_&cABDVNBk0F?I^z|15KLm&BR!0e{Le%jDx>d)lpZw%=a ze1Wbv?Y*bZi0;0I{#C^=*hsiBySrv`E6CKR47!k*?@mDG85E{OPEci>TngHUaSv>K z+n*I;!x#5vmbl^1k;q5avCE5xWip_fkC2b4)x(`a1IJfyDVXT@AEcIuw3g>Ia@YsI zfUDSMoYYu0M^k{OumX1?QtDrvGPh3q5iCe@FWKZ4FDcaT|W{ zA+&^|AB`*lK?+Xl30A87Pb$mX_J0BZx%b{jm$0lTa7>t=ST27*=>RG68LHf?G)(wS zpp?swr%f>L=)kCCZflcc=(ELwRQNM+6Df6WzeIKQA8r2Suytz#{!qq=86tM)HL?D= z3~O=%I81ot!n7p)c@;kn3B5M!C9i4Ea}?u81Fb=>MhlPXq#UV*8dx?b54HAb4cY&D z0G;Jp1X2{#EiZZk1gJy$C#)z+Yy89{v|_;yYHeb5!7jK@%)<1c?DdP`4ikts6!}*5 zToQ~CU6dX9)`8K{tauM*Bbw0E~u^yb{Yba~gvLWQA2(ChV)K|zb&qmT*n;;FW&}i^%Fbm(f z3ry~6%u9_+yPj*bE7b=&AYpZi4 z?YR21v+?{e7#3X}sJ;_qREMOCw>TEK=Nj}BDVQf!W=O_ph-#&Scgp7zjxMGw;xAov z5$sTk8L6s&E=(T`z9g24BxtW0=6%J3ha!8aj#xLj`i~dot1+u*1L)s}2Lxmbl z$knQIme%{nR1ea>#wFuF8@z@G*yW&xqJmRFW^Yq|{u*H@`L&d0-KSCtF_>B_EuU1{ zhQ)Jyo}K6rLT-`60bs9fb={eF@;9&lh_{aQ6fyS*QV99-xvCMX_j|MaF6C=iEb*MZ z%YUnT?xoNL7vZdY-E6E1H!X!jQj|pGoCbSLOi_!92$JSs-Cl61;DMT{vSF~A2c5iulv-cd9OmMapeww8f) z0++@_0;ip9NbE$b&L;k*X>x?Cr5y|1E@XlT_x#)Yw)HFfv;G687OKnC$JG03!6A~O zgQMR#XlV`_wjh%(equu^m>-~IrCx$)Vq)=MDt{Xt0Odf%eM}Er{8u+Yp|uw3L(J;% zxo_@d3@RNrabGFOrZ{uy#&wIm@W_4SKGX>PkGn0Q$aG580;RtQmwaTwZ5-;wL}R;u z&ZQth2V)MBWG;_~d_U^EIrH;pkufBl0UxEH1kHWleKcOnH=-8_@~n3kQN~Xfg7DN< z((b~*{j68&pTYG)PNx;6BRkX9n{aZdofFGu*~WnPJU-oh$ieVFhM)Cgkwu)RF#iPh zB=6EOCN62niJseZOIP$~%`6IL4=jb&U99vbS&EqE`TyEcMMyQu;cw4w&vuO;_Z9aS z|2>(#D57Wl>QS2ZE^v`^{P^X{ukfWi4?X+|K)y%XuXj=E|96ssdWMBDo>hTo#}K66 z?o27SF&c-6fByJ{)9Gj6_W=h1(m;R>425pHL?R*Ook3-CMM(MuAuR)A(Jt=>&p&_jPcOu@V zzatnflDBQu>^%A}!@I60CY~Ex-oA*f2M}wG{(5(ZO&GOFKAxmW-J>KI=OG(Or2L1T z*qcnYm-yuYJ!;7PXCNIJOO#fX_hM%obm0Q`gknY{KP&PAs{~L)X)PY~f>Z`A^5L43 zHXw#p5Z9mf!OK@LP=RbpXs(f@A)$$-qw(K?z*DBc|K|e<&1NZ0kF}Orw(JhdR_d6qrUE;r z8y&Vr^dyz!OP*9gwa`X#GC+DAh=JB^+{Af>aGHZSXX75=o-FQS$Zg#*C&$0Euj9MBu$@!xSm;2Ti|CrPi=)E)ZGW!S?O^j)P#kKjgj$q-v( zk-iUweY~N^4a4CV^8KIx0tjYxRDV)Q$NPiaT6}=*2^VmKVZ`I+63NQV=SkeGq@zqb zB{{M7y9(1D~Et4*Em#r|~t@Mmo`9P$h_kzez zp?P%e%GYm_j9a}a=_zvhc>)rd`2=}YfA|>%E3zC&ezxnM|5EyG9`mfxzkst>65FOHNekZaiS`vL-efG-lb%L`WAY)lXv>Arn=@^1PX}wuJ<0s&h&>wl%lw%twQBu< zY}Ssh_KQO{B`Z`26LZh@nM8^d!enYtA>s!qvop>FE&}f8>>jJZ(Y3vQ9wYJY=tl3& zwc?i;J}OAeh|kfT`*7Ik2d{;-nj|o_L*AuRHhr!Mcp^}iga20kvcyqYlK{^b_#chD z4U*_cT_(<(&fg%%J`?gW-ZgqvQ(6rJPKoUh{X{?2iFn$Vcr7%4MUjs0$h?|0Cu7i0 z3JX?ahVIUEozPA!jilLUVG=QNqm(7#iTgOaTW|SQe%h+@=ooL|5spV%X{?&b3>x|a zR^!=D4EoqIa3~}GhXIeL7Lx(gf(+&OYye^yG0c?v zo=kV9a_`Y9c2eAmQ<4wHn`){m)-XIVSHu&R<&}9j{LK12wT1(ZoKf=RD-^4Fli~-4 zfl8+hb{8QSxs=+Y^F@Age79iV*l~Povyb%gCKqdlnk@fJcz?>SQzL_ z$4=fp0x)t4jb}o=He9bfh^mXw`-i9QoMU_t`V=#aBhcaa*In&}PHeje2rfUX);^&u zbIug&ybC?Q{Cbw$pJmBr{~2KIe(^$M+L9O#Zw}~q z`O>DR?ecGmsnK1z%Z?4wkhnAwe+ji3^Vtxnl zGeRoGoahrZAvec)!g~}&927oluKEXtKdTG^jkCt@whBz>ZJKSGI{>kyZ>xCmoF@7t z`)K*DyxIG+HxH05mTwS}pbK9-Lb3S|lPrS)`+y^_bo*S;+Ot(;2I3EcD=zxjX5B%K z1qLI``^?SnyTB$BQQf#Z?R{pK_AYWC(L0W{xn;y2q9UVi*4(nL{zyctPX?$q=5mQ3slFa z4&Sv7h+_mWcyZlx9WQWPGRHXvG=dOOIpia0C!!@>_(2uIKjO(Ugo?TI8zh>1W!YZT z|9T0872C85XW0*zWcM8(dfMKwJD{j)=^==kcRPQ^`MJv`0HeN+C#VE1nVl8N3tzZ- zQP=&}3=EwQE>nFiZ)5Aqlb+&yy*3;Yt9a>0u&tJM9^?IUVbwWd#Y(A)u6Y8liY_ff zLb+qz6`UfD>q7JYylsspr$jRyL8FOs_Kr&#YNLrdY;(M<Wl{KrALdVe*|4YwMzk#pTIm?;eq7AoNB^R6s-I;IkW%~iH-J?rD(zkr z>kvbX>^2ptp~I?w+X!|*croGZN|EhF)?UqF<1Cvo+5NeEtb=-x2>!uuQ#XAq5dbgk z7zg0?m@8iauD`AX;I!h?MBB3OF8J%I*Pgd~NTbq8h-@BBv2tWTR_fTfce?Oc)%>WdV9gVRE|RW-UMyU15$}F3-+m|h z7!XCSi-NRXYWDnD3^J2-4jdCMP=T`$HEbI1j9Lvh$R{d$KC_~B$Dr6aflY&E`awek z6L;rok)4?J^DFsmcNpVPCafNZb-B-=rcGM@EpR57<=-87bG%{HYWY}^{b}@TxfvyN z5rRpgiGk0`< z79P{+`89AJcg=>*1a6Y^;&IDp6AbWgIFl>t^k73DfHbypYy59Mx z&$r3r_Y)=f?g7>u?LWMNf2KMwwaD(!^PHkth22N(RP)X`>tq~2r-w96V`YzBRAzP0 zWmJ0d^kEEN>NM@*59e8o0D?47P=;2XZJ`*1gD5GsFDczh%RUJ#&?Rd>4{LcUv42usqC>^dWjpSmz>ubTpy4g==Z3zNPSGEQ6V?S%Q7mofd!Z?? z3pfe>-gCd!#6;yCn%M2LN_<>|Q>xu=zCLQ8sE*DN>%Ow0UVI#dI}EwqmCS>Q`?KI% zkI<@uFjz*%Sj*_NavP`M;}XP8wL$|i|uV-7BprEb9`q4`nUt-F82l_zIvU4vG)hk=cGJU}9 z&@pi<=2fVP?|`HzeKdgLoREPdh(g0#ax7XYN+y8=mv9fSUAA_tm$ChqyU86V-D+Op z0d-niYi2|q>HAl7K?aMR9m7c)N=`)eI6!Ak~LwWqg$EMv2;Y22EjI_3dvpll~wxt zAdu2iT__N4g#@6uvO^KEibx`8tm}67bOGY7y+x4UY_2=JsOu>(s zlseUSqLga7(7BUBltQFi{$wNktd(9YTn_M^CJApwiNNY(9D#kTot;&Va}B8`8jsG% zk`mW?(%AZRB~I@3-hrLVqt%wroVpSRz2gcP?f-o%%B*Ja_C1zG=xH87EmWWAiCyRi9kU0_3ESws7(; z$;}~k7`?mD#M~uzr>=cJw@dZZcT4O1wOYs^Xaj6oCLD2O@C#-M_6!4Nd0SWhi76#7 zs)@ThCsod&`IQKAXqw-;R!47@NXcMc3tx7>A8$Xe+kIjwgpY3gr6){J_JohJ=#aG zy?}fiuU#$F|2+k&Wwms~_Pv4kuxc7PW3;rz_WfpzpQucyAogTZPoFPYh=DeyLC_kS z+nl8Y1c@o43@wtsYwZ|rt*r08kcqn+R48M?9~HB$bvhO~8a7g?%8_UC`&9jxm<&6E zvTOl0%qWQ7w6lyMx~c2FoD+y}W0ujaIs6?KA6+Hb>A@MrDoNfxD$rHzF{9F^qgckb zNjv#WwWsdWEnnIiMU!aY_g^Da<~GzX=E0oeqYuP^$o*-tr?IK4gnL z><4xMUJg4KQvuUOnFYfZX$D51pQhTfw7u z9>HeFu+B!8T!wQ2HNiL7@=9igEdVn^%`Rg5%ACY;@m# z*tw}aI+@D}PlcD98bQY3aJ+>3dtXu&j;rx}<@%$7x_}d~FT>m)YzQWKiQ_T4ZmDwg z%Gu`6(@OFr4Ls6tj(m2G$mm~&5|4Umq@i>h70BFGttr=zY^~|k`AHAm&T1@=^p|rS zKGR!zE)v4&#tKNlefI-xO2PZ!-;uMZv-x$BDl*^yeGKxeK0TnNX~L#~+E=kRP0vA% zakdKrj~z^!U0xm@`dzSC5aM2yIG)$~SZzN0i2hvnthw@3CDD|F0WXbFE%7{xI+zY( zS`4IrKaDKj=9KTLxs6n_(UwCB?woOcWSv>!!Aln`CkNthQq^^9Js#q{0vnD_eeE)9 zx613Y8sk|wjl-&^Y9y^nMPe?we_rV`{r=o!l^;gRB4S}22uHxd+~>F1nIP*Ub3}^7 z6a55%$PWR#Z2#_#U)@_ndGv7|KLRJ|OA!&T_q6++v|qFav2VZaKptTUbSQ~ix4J;j z=%d3i;R7g81w{I!KU^47`5&1cL1)J*fEbBSaGzU^{9$+yB2waM7)0b0&)y-oUBV_U zHd5|bZ;49cUvg~?z{Y^(256%#_ab#8J{tcPh}ImQ$x+|yQ$i?#@$9T>PbR`E+gDzW zCw4l@uYwHFoiO<=0vEpr^ZV10_9oY_%!qeAdH}D`r7UxmlyJQpDWTdGO7u1k;v;O8 zXk7T=yDt-jQKQq#dLCAv7Z0B{)%Zm_Fa|49$yNQWy$tRS|Gtgy3Z4-u+6D&L?Frp{ z6^7xrC=4dVQi4<@%zhU!fZFkz{I;D!%G8aL^(o^kx;#%@DQuAHWe=Lw`$dnVP%mr0 zx&yG>hXu?c`?^#HbR$7^@4^ z-Yt@2?9rq+!e_ROSQfzFNphG<(Mt$7p!x8v`!F)H_Rv4fA9u2wUm277Fy~hNCx}G? z_T)$Wm1yiWxRu}1Hp}jdAIEzCV*m7R2fmp~w`GphskOWa%-zNAy^q;7Af;RdY0|)c zCo$y_GUa&^e(DQ(=@Z&JVETqdb-V{B+UZlt~^5?zw7Qlj-}0-{{X{V z&rU2w=H#VKl;m3>pHF>C0cjtU*RHGoG;dv6;UA8S;jDyEk-IHp*!{pNM)xI^SQ45b z!4R?hrlA6gAkYx^Nrvp^L%EE*!qwPvcQbY28f~QjnMt6eTX=X%Y&!Br6MreR9Q{qQbh;}Z~h3V6aB!{3p>^*3Ncl3yLkCWX=Q8b_JC=z`Bd`Z zyt=KQx%iP>`<~+@N(3<6GGzaIa`k^%PWJ*fdS1D^U+%6aN9WJHjDBc+Fz%m%Y3{1~ zy~VA*1GC|Fw*Ls^Yr1>MD?mLBS+*3HNBc~(`%$rEO6??5Iu zqMgb5 zNk-o&kq@E@2D436Qfa->MO2DvDP2eHYEU}soXrImCUx~RoSpqFNtE$vI!84;m8rK> zLj?j6`a^h9fL8ZOV)lP+@{0C_#qXP>HxFSErlimsjgND4>J|87>a!xOPWnD0T8L7jM-_(;DKiw65ESd4C=G-fM%P zU#cMsrL}4gW7u=YyoaI%ujON`1uh?6Ba&%(^v&xSL5YOW$#7IVq-gR)%o!=wzuS-- zq^Mg7jikJx z5U&_K@U+S)>+X}>3*@|dOuguA3aR(f4`Ae*A4=yopppTh$Hrhj)^qHE|4-blC0?U4vK*gUrAV7b z2@-aP#3=9)`A*dp2Ny+`<`xOD6p!XgnH3aw5W`?ALWLQ7m5?_ z{cY|jsO)JxvFlz;eP`{wg>mhi%cSubQ6F5kegmWtom# z<~apF2^VE8H&muU#8fmykNz_Wj&&z9wcOBr7Jg7bfER>`xIsnDQ<>}tc$%h*4dx;j ze?Cl!C3%s&6M#iVb8du92eA`9XV>8FiEuGK69f$`9V@UfhD2C@bAQkM5p2~ci?zL~ z&PELgK%XY<+}@R9dvkiXsPL~bb@S^f!2H6lvwDTuFdwySTb`-T-KH$hp!cQ!7kQ$_euUtTaS&Tenk9fm zd|$@;GW{tH8D7q70$R})La!HD@56p*iH`-a!wj-lIxo0|(^86^C>PgyFUMaK{#(oz zq%Ygpj(IF2WtDt5otH> z%%D?-+AQ95ytKHkx+H-@L4=KdnMl+`N!lwwUu7$RSnZI`^&8qZ0m9^=UPw`n0T`baSMuqxC7=dTqk159)Yq3>YM~ zAa={Fa?dlWjQ6oPs8a2K2HtM#=nf!4o*uoomTultQN(hL7DmLfd==qm5V6C%qo*Jl zTj&%jtJoN#Pmoa(-VM!H@K0)w(KAVf8ezu}Nx|R#4#+HQzSbDLz#ID#mWKnP7%N)m zVHGpXi9)Jx4jdayUaTpPnOSVm(sC-&MLy#jB&W$lrPDaGkSsFTnQ8-S0IY>SiZ(eQ z-7}+OBXu<@NI{)a<^SRcdJJg5F$Mn{Qa~T5B#^8y#=MH}Mu130T5S$L>fddvfX(s# z%3zQZL?k!=pAx*+WRho+3MLsYFS(fL8tf?QJC`T4;bxq24W2ZS5+dX=V^STSX0!OS zS2|aa4{xltspVAyw5{M;y?I1t#R`h%w?zqxqP)U^lXiz|p?nuZ7H1_V{^^hYvKRc% z3se0(?e?Psh?yUZW{B5`on)^GwCR%kjLx=xs*UbfVgVav4k zGz?y6HKH6)b7?cKe6z`N8{nRm9$XhL!hn?yb^|%*QQ3g?RCpYm2$v|>QYR*-*@G1z zcz)?@w?E+G=eGBWw3LiSfHb%)F!)D@F@)nAPCCf})j#?{D8BKi}pCiXqDi zgHp|2FU2vLNDsaEZtW(LPNt=y#L8S8khx~%g%u>6Zo-q$&$O}!^RcaF-JT6%E7yII z3Z7R#HRWm>g)*sX4No?pQj48t@ju)86@^(PK+n+9ty5b5yW?82KKoM9+2_CDjp*_J zvN_D|vkeW|Ugie}vwo^%Id+*e)rlFm;7|R?Yg((%3K*CXkc_bDl(>{%bDEVJ4EGyy z{u3XA_&A#Oxn}o!?}}SQv>JP$4I^8Z*f332kjD3Q)rJ~tuJ89xSqyWrY;TuHTzm(B z(Mo5YeMU5b+ZdK*vb;{puy{fZjzC8_Pw`=F7MtzNe+LBSET_D_oXf@7x}U6Os2@f% zphBf-w%*SV?(WWG<3mbZp!q~#_&6SmU;V_{M;VWvd_*)dXf{NP8H@Nq&v@fo1_~Rn za0*ZVaO^ey6sEoLdF2=Dr$OY!Zvwlxl@b2SyINY$c(yo*2H*j>jD>K*4s~?}&S1kr z0bVOL{mMUwRviKcVvLp_dLGl}L^6Jj!kKaHtiQ+jyLl9~IVepRT@4GbB2Oq#Y5Gco zR;L3HE%#v?M5(@*XWu7<*x$24gLN|lUKu6O=;+eYvC+g&DC)m(PU=HMcY!4ARva3- zTXK#cMG=;MIiko&<%>54g;$AxdDG5TH_oHg))_B#PJX)uQ~jR20xymH6hy29*n^}< zWLQxU3Q(axKsg0Ss1j_L)0;J2Ui6czY#N-eKjPbTxxaAG7_p=)PHUatAK|J+F3v{x znonvD8!}y>!0G#+xSnv?P5~zO-SUkR;+qdYV!cOqEW@B9O6$W1r@g+l;aiHS`a~xN zYu2+um>-bX*%)iE;x??a=3|X{_3tbGLe=A%9HUN?Z?x6f-yo~&T=$>AjcJhtBvr|$SQT64 z2oXZdoHN{^h@Iy2zIpSY7WCiQyU_YbEP&8-@#v`q**$wKtEoedO%H_?9SCe{n|Z9& z*IEm)#_F^SHcAh;)ll^c_>zys@vZgv+cHJ5Y_Ji7R(1{(}joJUz-f`P`s9L4PC65i6PJs!0EP_k%@Vl0n?f%JiorR ztE5-KB?O5lk<26Wev@2&V~SfoV5|3oQ>oPvj7sb>mIwrzprfCTA7^-W(1?~Vm;~N` zJW~ixL}NYAs!@M3UlBZ_DF2@FN^dgxOms7E1yY(LuhvQ;+-S>MSais7b9K9Jh{e9P zCoZ1n82lDx!=%Z?U<4?z*LKr_eeGpVZ9HbHCB`WI z7Oo5A$X|dnjJBMgvGe_q{TsjV{_ zOuN4by)rNly1?3Z#%w^r9vj}4aSfp9=xMgQvK*|?G?*CmeY{Le7re`lk{k-eM^iwz zQ28CBRn*m{CLj){#~605UNF-4&w+9K0)Hud*F}>88cyxzuWeGK%PM( zz@H`Mb9Ygz$1$Tif~E*=WsT2X;E6+!&t71Sr6jA~cgoZwJ#`R4QR+yTF66i0SzCMrpk%{*ynd05YW-qcb$H<^*Qd$1`jzS4zI3Ed zQ>y8n|3Ij7N@yrS$;V~^u6l7ka5}#3xgo>lCC*}&ob9F~#F;ugA)744mEGwVT!VGq z6^uOBsu;Unsm#e+LFU)hfy9O|T^-?zs}%-Y(fPKc-2JbW>YF>K4rDI*oerHXz^JB@ zRRfdLgP+!y_)qGeTi@Sgl{6g|`cPV;ZcdX>lOu#%G5OGHdJw5f#o%V}K3w9i7R0bc z3U7X8IbN`}C~~b{mnPf^Do@?Agtl6$KQ&P4z$jmPQL%FPC+ z7BHvMVL{o+bwGR#(Cw#Z)LlG`LhF2;}5-)a79By;69@vlM$>Wh~TfF0y`vPy9%Lf z_Aa8(&4cRX6HV&aE`h&38Y2GREEcM)Idt+C1cnxngbACU?&tyCMr4z6@Ti5OQ%!T( zD%pgduH@#$o$(LXyR5Rxfj(+{5?_Lj*cCUBluc7q19;w;loF{XtbF#7yyhV|jOy_( zzXHfs6M+2V_d`k*FxT#+S9}zZ#&19EE>j%S{7HF(9-a1sv2npku^`t}z;o=-TOKMj zB6>!X>5q05K?C&-?FW6+8}#ChSz2U)Zh(1>)|Z8c;{u6MrJ2{*X zgk*zPx}|}bXn4C9>DVckWu z%Wg({&!<(x2f&8?=z+N%1i8^(-swxJw%R?7ZXR?soQc5Zjn(ansYTVXY{bsK_^*p`#v2#P7&JsKnSPf1+=V6>ZI8_f48dzE<&)*T`gbWF-3^QG*GbW1 z<4|Wgnp#`+go%99CM4_n2c}n7ESe&dae9o-Gx@QeTa(6goh=n5|0nC?BEzY7j=+K> ziTkhSKvo1M%~8;d1|9hS-)+H@n^V~3Fx4{m3yxc|MJg++IvbXmJ(gnZRSw?UFk*;J z(|~S2L&|IV8NSWs6(`oy#==Fb*GO2yEpD*mqtPuRAg93nr1$-l?py^^kw?9R(pn_X z7g#rT3*6S+xuJ+k)A&@MyaoNU*d%VHzec2siY$S`RJEa5xA5z6VhGwM0GPW89WK{8Q(s~N)z`;?@QXp@@WV>XS_opE0_!oCf^Cvcys!D`#L<&{7 zeF9`vgK=qGYfvd&+5wB+We~70(iX7>C*yK!;j(^^eCyGx;+w~D!dE^rCX3h~`1t7O$3Yx>wTG861Cpa3Z6J2~(TlaHzH$2OEa&(yy_EUYkg z6}OH*s0Olh5wLzCOT&#_MG3>y0TP%Si7KYF%|%_*l5tk!QP=RnnrVN#C-|yc1-5hQ zCHUK$yz%&PT2SFg2}KxwpTrI79whcVKCG{8A9f}Cr#hIr;cPM_<1hb%m`{41{`8Vv zWQjV^>I2>B*Sx+zw%&B9p^(%^|Hdj_X#gVR9F`6lNaCQ%E)MI%kd|u)b zEr%C}tXZdhTZa(iqv)1@xAE34UiOGkMk_*q8nH_a4vif*&pNaI3UQ_3VT#GNj8dDo zDURWgUhZdkdzm>?m3ZP|Zl(s^4v57CPib`D{b1kWhx(+*Q*q3(bEdl{gsK9?Oj?Tnf-v8MgU9m0jT>i8^0IWy^M%M94N$5iX+@8Gl=UT(q ze->B;&Q)@_rY#r0))wDuNo0@rOI8j~yO1rQHoUm;W=jQ6a$R5)mY26u%*Ew zx-Be-Y?RT%gmb>>!&265)@-qJ!ToIkAZZw5{6QEljIm&Y1fF1F49Cv}1-Xc)#|l-!Q*eMP zYz@x=>&Q0y?@3@*h#_xW7NiX_$s+z(>_wt`#Ix-CbpkD;?tHG^qFONwngvpDD!vK)`BV=l)K{R*MjT= z4x3Cr>FHQ8+Dm+b+Tdvpe93#}*i8wK_Wzj@E(^ERETt&jpPU*@G;Nqyw9jwcqltwF z)5DY@BY8gP!~nK)zl=YEw?4+){|cHMvcU9V17g_%{Y3`^3D83kISQuXNZ$U#gg6={ zTFHu?mjZP3&2>5z5H3+9Xpl5`W{qs@E8k}Q3kBQPdEg0WX~Tk~1}6u4C?L1cw$Y@n zB8OhUM!CwI{X11+{BqV@es>wpdHV*69LF8&HHN5l3X92t`FB*~ui? zfeZWa;AfWCHtmRRxXXiW=sX}+L}F0P^^if+*+gyMVaG$ZyfEcN-rBnTwnR9;b@0ys zI}sj1Dl2EJ)nl<$SZ7!MfZU&c_BcKW!T8g8^Cc zD5+UC zt0Aj+gMW{8R~GY-I`vlR;t#w(fmJ~Rswj`*Cz0nl9c&TtqJBQlyas96WH+89fah(} zF{-zYgVYL4xm67>E3x4Sw~sK#y*qbGI5OjqEp=!PtDWyF#&;3zqSwo zxnT`RbVm&LL4sezg3cuph`Ov`FbEPDf&HF+%2v(D>}zVKPV`fkEoS(Czb>Ewmy0+( z5U9`gDcumE|Eo^S=yd5Q%-4~!L*pJS#fqrx#wZGWVNmuZk|=F$(8R$j-KfBM__fPU zr=F^VvrN;{MyL6ZIXi5YN!SPqnJzsx`W&TgRQ;)2(%MW0mAgeYQr8ehF+VkprkhZ; zEn-&@tCCQZ-|#3!{-d}7|1fTMBb~j7qNOCT@}H0>XMbM)#p!;sQpGPU3~{5;^I=+U z^%}Mjxy2wImBYM1pn%2OPd|L_JF|Wbc^W66c2zi=8G$KhMIHI8e<&)aB z0dIz?x4pj})+eWXxEs7f6QZcLD8);LQGH|wEt*u9581E!8iw75EeVUp;kc83#2e`Y z2$%=C$)&v4>Sck9*M!b^&8p0)C|oQ49hXMgA@J#ir0~_j4eox=b(yd!EmSkn1oDDY zzY!fSkc45!(r%g)F@Q_us#s%Q^s4y4r&m70Oe}IVJRP&(XM*2AMNl-0^woT;b?1|b zxiFH79ykZK-T!n)9m?u*+h|p39I}gOE=?Nu8N<22)+@VCb@Fv++n=p!MDM}V^&RmC zdjAccBa1!{Y1*BjZDs4;mqKe<;(6308i(+fsAIvUpH317K$4cIqhA|B7Ar+@JI5P~ zIs;2iwuT4tR1N1gZQ01%w3CCPq^*;KFK??x)_yrCc{JJgLY)mHuzIw3Z~5xC)yyYg zbL9iIjMPF)u7r99%8b+WpBKS&Zqe4eDLYa5L^wDQ3LG8+9g4gg0=>iSIuF}fsOzQ9iSebzR0*e$<7JDPNk|@; z`q(p$&!3?GkTcnDc&oA4bHF%DV29TeQvT)r@0P5(I6E~@UKx7&|DhonFVC_DcREPsB`SVzSUlivqJH>!j_AIcir5H5 zQhrmmi1nuTq#>etQwM};i1h%a^4E}iLO$+uYv1XXM1A;GLIsEgC^z^SeTeXG7g6aM z$}OYpz%xM@3FeD=cZ2Meod*s_Gq)MYd8lY>GwVKG95600uJ{(=KPV0p<;}r-?i&p~ zvixFkNS}Y>Bj2LFn=9YW_bSW@qugRpKZ_KX*khqp5|ns!NeEfBi4FjtackGC+U6ia zS+-9{I=g3VWsomzJ_qyQdexZ0&hpovf{!Pc&ivKL#4Ptpoxl-v*RuayUo~_lxL_Pq zOhU*Q90HLCjI7Y>p9l16#k2>Y_bC-@Nuj|vW$N|;B^QZ3V$Zcm;Q&8S$sAO-e)zIQ z?97G_CdSLehDx5*AOV2NmmAONC}m^=^SAn@6_K45OFqj#U|zAiNS1n5h$Qgq_<9#H zg5b0M4oK}oTk&+%d`A%7;i`>vicSI9&UU}+M`SQ2@$oqeQ#ua*x`^sHZ4CC`P(sP# z^O_uQdRpfNf1zCa0<)fxEa zfr~{{`L+;%$}0Of*7`nAN^xdMiPuFMs6^k8SO=-%%Q{2m*Ijb@-1YR=Bej@KeH09@ z*>avir8}ZT*!+{6zMr1{D>)tgr}%#kDfd4hM*KvBctRn;9UP5n^>tcmeErb<)`~Z* zW2str*0l~0aDgCD_zzRZ7n5=0qDzy+jOI-azQ8&JW6mH#hO^+vO#(+E2=1I6U_Ndm zyyI3IkNEgykc26sL}AhXN00wmFK<5?PiAVBTI>fXc4Pd0%HVQPFB*wE9mErZRWeo= zMIz-cC_be~`}_JM_E28K+(&(FCpu!+^r+&{KUmhY_eevI05;8`*AwvQ zjYC)cRz~5JI&R6I^S&Q?JunvO>DS}6y?%OCJ!U?WQznDUwRV<-(Y2ATPCMcFU5N%0 zBwTLL7P_L$a3^GNHSZ?9Jug!q)0k|-KxgrfKJWu>?Az0l;UVM7RYj`5(qZfT(T}ZF zM_>;lhOB)aeeLhhj zk^RlUU_~q1xKS{f9ujYGBA72ezpqlSnx*bwJwnT;ntWEjltgU4YsYP*ZjVQX7Vx|% zGBY*#!G7+O@v}vq%PT}QE#q8`-$6x3ol9_)->FmB;>R9ZLbVvXY=TYj=BF{mC$-2sBBT@ z8!d4!dETjaKl%3kvC~|O(!Yfh2`c`(wV=rE zm|I}h8QTo^*l86s6RYOEgzgl_j91D0BE&y0N41 zL)0-2J`Fm(nz+OCM|CrskHtT1BK4;D7HP;2!4XfWS#4(K`BM{Ml7fhnn1MRpxSH=y zP5r8FIifAjG(|f1#IOS4jsNAslLxz*CjD}yy0*MZ1AY3@WzO7Q9y9$^hTr5tT)#B) zU@4AElo*Y>_Bg<@VUwZwC3Moe5q10*vQ!yGJ?E~s$=>ywoZ`Z!rBYHkgHVb__Q;S_ z^UI{Ls%!gletrQkignX&VT=L!tw~!9D$YZ$ILu26q?2msXZJn3?m|E8?k4=O<^|zX zR9>{|F5Zdf5OqZNa7D*BN^CU{d(wEcV@SV{Nfqq8N78S7F{Q5pN>@Z28}~sKpEYP)9b4% zcVi)l(2jlRCP#?lSOxj|Ruj)TezMzNd;yi?;Fbhxnf&?#Mv$Y?;R8zJeMY3Y*}^3p z`6p39It4c8pAEaR^EUMq91vbUIOl=?0boK=C!-33CO-P&2$p869e0MrqZj0aE3p~j zq*9fSC8*J~3;55O#b6+cvapDT+9IcR z68!~thATW;Ur^G~P>Rm>DaUG9Ky}x`9tb968myc9%r%KGM-1n{)NpW5%6yMno6$z$ zsjwEy_d88pj7(u=v6sL&UC1Mg{MZhUZ8jqJHdHv9q)?%|3(OV56*)!<&Y0}RM6yBn zCFw}P8L|e-3#JSiJ975{gxl&XI{OtUvCA+V%&-^6Dyb8g@r#lJ%u58JnM#8{5Wo)n zXBmu_b5!fW@^VK;&@$=8jjKxz#mf2B6&f)g{2COIM=BXH!r)~Zv}8IH>GNK@9CS*iPjlGE)9jv)D2tFyn;SF|jPq4@4Kl&w_jkZB-(O$q7L zoerIJhDZyYI*)O$wS36I$Ik-RBLb;)Gg#<(c~~(0#L){YK zQ(Pr0+#LP*PPa5Hd1aED8nB(=@(uT~D4rv_cAa7=Fjf%}1SPxz;9gJAPmST&e`(sn zao2~DT&|%aVy<*8qT(}m&=ejBqfJ3)V?Sgxdgt^0i2tIZ5vHG50`m_dh*fa z(4lzkEwsp`)XvxdYx?jyfCt1to;~3sjPjbgB)^FzXu`?|O<3WDNX?5zAd#)+K_wD@L;j28)sU!|HAkr{$Fm7dmi^L&#HW2c zMil~ej3gD0EH#Ah<|C}?r?VOVW$pXP!>mhQD#F}`kZG3kNGqY_W2gJr&&!f{c8FQi zI=c~mK5RC8psjuTLuyL#&~;-~xrhJqY6{HN$_6YC6+A)GWhO0>p0faj@B!);{1ylK zS$WEW8}-(*>vg{*ICQ;|F!>8AwKyDk3`DY!^gHoW$l+wttH`zG(H_dSZ8)UxM|`7p z$J*QT{^8BTe3csHr@3h`%ui^aXs+wO3DoSu;gH;V00mz-H8aSfjj6-KbP(rxa)N|s zeX(lXF3SlU;f|nQ|=@fzF(d0&(u?+cHy3Xe6D0B^XuFB#_%KZ+Z2H~*$KRK?0xoe%Tndg?o`82IQ`<@ zEvIRj#H%nKgkMy+S+S|!CQ)?@=b-YVysdR30YPF5Ya1)VB_@Slk&SWC9C6m-q*s_dZHDZ?&;p3D7VZ0+0biPFY)!Y(U#hG0gLvKq!+yWA8CAQ=`k zMZ0~TOWM6|Hq+xEzT(i7!r!N>tTnJbB|s5cx%n5zQhR)k!>!`6HCAywMD5Ur@e32^ zDMA;S)0P&C*GWTF5gy{1(^t1JX9rlqwY8;UH28GOxtQ2XB@!{;(26bRrFn!||1LYX z<>#W6T91PIbcEuv93;iG$L9g%rRo0E@rO6S{sVoU8g>^GFFc;TjhG>BR&TBTc0%e4@QdY>n7{Ps*sm28N5$A949cK5L%kbFqr1YXZUROh- zG(AqLZya!MPDGM5T|a<-<8?BqU26HP!+Kz5Wk@=F)3tJS#FCz;2+8+r%ZrZLF=WwO@5Wa~ARF zoRUU->89Dkq2ab;;NRu{5EK~qW~l>3GF!;$5uroWz9svuz#b_h8L@7Y_n0og$u>S! z^i42@{}TfZTVjf4!8DAvPSb^b{D$7>(wm&`^E4Olq)iGe^00*UL-(nx+z+*&lbE#3 zxVk8FVAU1r6?W9})@K4t65(?(&2?b;Z9IYTv$t`M%E_1%G_9K1u%!Sc%(JT4roGF~ z>nLb7jqjEtAo0%s`;y2ZjR)59?qkoEsRQoD>YF3QM*`DQIpE*!#U;?&p0#G+|NLm~ zb9Vu;yYZjGyZsrG+vBVA@Bb9uuj1VZz^kEMmcnAw9w_#bUh0!gLS6W2%saJlgk7!H zD{FLLNCtY_zb z5ge`zPWw;!`sM$DaP$A*GTU+?FgMixeW4yE8$;O544euu$n=dy6*sQW7bzveHO+xo zzX(^Sk>wAPa$Td8rqWdR$9Ut>FK#dGEYY~}^zu@azaaEhW^pbm>Bz`yFP?-j{EwtQ zD!QFT34i*PJghf(jmjRdV)XJp<2xoAH5Y2px3F%JnrZa+Cl=i0QlfE%l*M52fx1H%YHq4W9jf)=hsd1 zS(AL+5C<53{meYYBv^9m_$fc`PNQ+8DQ?a`4v5FAV`V2X)CnEAS)wOKosN;p^?TWW zzT7H2$0`adY1eVWrd3NZ74&uoQf!V-F(=>c0Fl!KLB{FSviH~sPJdJji&A2f6{M13fV86~^Ze6IQK<=KZwTs0VwN(TAO#_4Z zL&`*%UI{D2`z2cw@eiKqds*_5YAU-jf9Sbe< z1UzxQJ1%7q>ovI8{??x>{brivI~apeyu{=qlO(ZZfhl3VNGEG3(4df~$vg#W4raRu zQb9OftFF*eQlG3#99o?kXX<@)#UkkWbmTnjf0TV7N(YN2E4#XaA|&>8BF|4;ao4ty zeU1;0{>^&!F7L2c9}5lHWjKkeWJ`^mfb-t!d_e98%=))ASKJ-KPB&O*lpVrB0Rv*A zL4inL)Q3jXjq`VS|9SJgxlzrEGs zLJ>ZM$0f!g@OKG3u0L%8w2t5(FzRzq?-Fc6mlqX}t$h#h&~wG_iVQaN6DvUM{0DIoqVD>@0!8E@}&vBs4lmtC4TQ+KA)bRc;fBmAoCPjj7? z4DuN^V)$CQpD%8?H*H2}42P!%!NQ7x_}t{M{{{9xqYzA+)Gm%osWJ=J9jHtx5@hIX z7E^R~otaVM^0v_*FNy@0mH5)bXyjs_JT{4`U*6F7hACnicCS>p0md^M;XEt17c32xl2D zkHU`Uqv^ZAcSabkz!d+{T&9G=XT1?hA=vS`=ICGCpN`R$76qMsYM_g(j!?DHm^DM{T~Y%hd28i^i(;mn z^O)Gy#NhNU@K}|x>;~_W%!FFKPt?#$67~hpb7C;mHd-VNIF_-&Nuxjwk^FB3Xw??k z0eX?KA))Z{+sjnK4i~VL*&yi5SV8{2y?*0sa2A&fy9Q&a3QB-TJ8j9) z_CfaXYlQsfoYy;s&N9I`GfDZ`u`~2usJQ*lvSlN(>UYSRiRwB@~2>w6p}#{b1eJRQhC;DoHM!LjI!YXz2pA1tRO zXW+fXlkQE_GSVHH3oUPf&Bm{z(^w5*&NZ9mO8>61;n2C1BG?T;FVmQvEzpn!DhDc? z3Rgss$GJ3X>%O0<%matyG1zNyex^gEFLt>jF(*$~j}b)|RfHwYpO+mnF_@l0M{ZA# zzGctQ{|R}D5hxRe(?bnr^mxyc$PwHD(>b;_smnYmQVx9@)*4uzmiYQ(xB55H(GjXP z-{2kR8RJLL{C*cT0~~6OboChv=r^CpuU9`}0;=U&rH@ZffCqFP+s9Hf-VeGX`vIya zLuxmsjZ?UO&xpr>(T|aFZylqKCvz+TtmW$OV+IV~VfXRHyx(&#jHj&=;UmmM^ONP4 zp8hrUpg4?zmA81AcH<)2q_XGn(&>4;x+dz5f0WI8I0olXkbn@}g6dK!o4JdsRVvXA zclw^3RoSB^1%O@dVR|Jmd!=lEa=vd(U*WZRc^or$==J9KzWrdCLr&_3ppZ!kN~uG_APW7{~>s_j}WJvs6`5LuVv z5~wmthk2;MvD^mbSRYdrg7^nIpjVA_;mPms;FYzD%#WPt(B!toR{p& z>HXcN8mn!_HwsTFOUHgpuqzw{f~=pGq&&v3*2qD&hw6~5%(1AJ6`A9nZb8P@)Vn9+ zAV@XowWYsN-Zbs)ccbSu<|I(6$?6n)_RA!&mDEpmbj+uW()bRO+PZV%SZMc^W_=IT zc>$nSddO^7RO|edB)?&9=hw8k{ZhNqC#`9{qQZiXyt+yTmseDRvm%X>^4d{kEJjuz~`RjXWALrnjyz7AFhSCN|&|w zsgOc++*oW}XJSl|cpZlvGEQoA?Ep@tGOUJ!4$FUCVI>pFd0?9Tlljn-!36 zni`kP#J0Y+H>uijcsDm-J2&l6PZY5$6E%&U$Gil*1L^vKvN*e5@rAF_8Mztvt?!TztsDXrcf)d zXvZ$~fV{XexRf$wlqk!mZ47i^9MbCc+!&g$Lb9=3l&y;R#vF%XXGQY~vu4wmbZ&ZT zbm-9hHPIqQ_kJSzd2DN==*OX+bcE|1%YM(dRR<63~aK~gl>AN z-fxMBhvdcnrW*#qKc>Zhh55RuJcVj~jqSD&Wz|cI1#JmXiZbS;AkYG@XLPu}Q(DP^vGs{E;b2Di~;zrtQ~%O+>ADX!ZyvhO8= zXP9p>j_vF)X0Ho#)X075I1r)5PmacWr!i>q(k_!S$N4p(K1C??+k+S-089IU>8|5o zh95`ZR?`~O=g1jqWr^&UvB6X@q0cX9pCe+@ z=uGExl(Z;}B2a{RJ443jb0)|Mdi0Ga^jXlH5la}u^Ep!aCV?Vg^Efh|R2V_HPIy!( zg^lWSL;?xg0Em5#)-MV-54Fv9_1tDw7ae^UbdRp68z@Y+tWn;=9n=1Z82um zzPaDh=K{)`#{?hQiYaEQIcLe=x|dyb7?5ka-9$-61vO?58IPjd>w4vMvJ!48r(|Rj zVhR;R8$LkakT2`pZoE}-;+YVU>dyDnu0P3V0tBo(IkC5$Jb%b3>z<*dqs5Y4{+reQ z(vNKw?tZGRet`NFB<6BCt-#*9B|lEso@eL`Wa3Qkyo!CV|F~e}m1-xn;xtti29F2# zc!HD3u1X{;R>ggpc4w~xUnzK^+oLz2AjvWe%y~2y`-66TN)P{rkciQ{SCY2j6Ectl zfT`|eq&BHyJF-wFqUSqTrM7#e6<7g~SVI!pNo~FZzmF+*jl)FPdCP^-^^!w#%apW% z4WXHJTU_#=*ilD_j)p8abKB)^3m5&pGSYjSfz^+sbh+?}TJqs;k2C~zjpPTQeO_dA z1T+nAhoYQaNpbOm%kQovcs;))6Wo@o%223DM*LYy-E|HE54#QSY@+!I%6qEk#B-iW zv#FyS6>LJ{ZWoIWaC4ro!_&C$!qfmm(AXFR8g7cY@7&KE))JL)b{DYCpvrrU6r4^F z44}(G`F}^NmHazz7&KrUgN9WEyYcj$1?=-5eU(gWcEM_fZ4WS@ zbEJ}?4}Cyq_J(xoBbE0gQVoD!9*h9JT#8oS1HpF(XuMj&6LC}K+&slt@fbQ1eSYy; z@;|S7fpxm3+e$GM*gGxoJbJe~`!jUK#6`6{e9g*l(C=#LEMCg^1;eHgkR_tPbkU+3zpmC{rmUT^%6IG}x8xli+zjsC zp-i=V;GrzDz_jxlGQVfip>C_szbrrFFkWQ8e@6SX^OqPbP=imEkPpV2UiG7YO_+b{ zzERj*ZkoSq;ZA;?d!Ox-YrMViGEXXoZ=xay6W*$U)zLrRg# zXVD}>sQ`k{Cxx^N_7cT0^W3{{u31F*^STWE9|Sk5$_y7`ThK_!jIK z3NrjYt}&akHc5t{s=QgFuP_fWr`oBLj$X=y|3qAyt5^gn+jx-oaXPcYz+PlIgVWud zQ-nH&0+|x6t+n3d58TP|89~-vytL*iT=#Z~G{QV)Jtb*r6j8Cz@PY8~v{ZdGCAW2d zieW$AHMN>^(Wp=R7jcrU_XEjdx(AJ(4@^92PrSa-td88zL=K`nDHi`CREI$qSugi~ zbVGn&yWrdD_|W9ydS^E9e>1Cr@SZ9S#x;hu?_lS9S~(p5QmdFkDi=RLQU=RjiAuKM z$eNE9bdd|4Rjq0T4FYh*t!mRzDu@3xNmXOwHe%B>C|D1#ezrJ^Hy>i&SBh09^u}_@ zg;=umi5^}}?A?(}q##>L+WjuHv3Z84qoIbXuU*OoMAkal2OBO?5_gEY?K6KDaSKbt zpIw~ohAW~I*NTX(#d_gzt+f{3sBGZ&bS)MU5C+fjJ?=--rQ<_u0{W*(p_1!HGC zC=mj?b%vxnr7g*)mo|BM^_t2QaHBq0mz_F;36^UP?6}*W=CsdMfbvFMUd(~XWY17?4 zU;ODT%Cq1=J1h0$q$7j)OBqj0KA+PFxbiKY2s?Ar&>v4bL?k%-7;-RCU*y6UFJ&TN zegD@6>#nG3H=@XTlQ568In1@J$cwl}u(Ev+9zJ)Y^4OC1usunqe9;KUH+5E2?>+oh zIgDEnNw3Wn7))k(OcfAE`A4g*;gP)Mw6L*lDTjUj6ZT{ z15VDSLHvQ+gPmu$d^*86*KP6Q8N5^5(M%>%y&LPOFJ8EL;l8D56_yKs5sKpOx6h$# z>~Ti<6jw-f1WH#7?3=I29|x%2fQnyevUyISyL;AnDyzjqnryK4EpDrc-kmuvWktrk zq1fxi=Q0x^Okp5vhLQ8eRsWemcs7UeI2X|42H>4~JWXNcO7yT!&`&D(^lBe2_HT~m zjjoN~Vz!yBktiBoe>f*eY_^-!A5Om#QA_A_flUcR81N0AHjM21xlYUaQZ@3FN%b3N za8GEsX{_CJPE4b}Z+=Q}-`#2u(|gY?&Efa`CMe-r#-DmGoe(^L?EIL%OOsBX<9wWa z0JzkagOwBP-2U@UJTUgFw@9xrFLmU=1o;LJW00o5n6b^#O;@rwEs>ntZ0yNizNUBb zB--Yk#htdbPT)q$m80C*xfb*--HJ4V*5WzKLQDm7 zYJoe{Rq3VOaK~aWQIW~OZp^h*t1O^ODRr1up5KMrDYxeA&O$>NPTtzPKO0}PYOMrU zTesQT%xg9^NCN+ZRru!2i=+kc1OnAw*Q{7_s3Nr9+ew;mUb>+V+>zeY4a6z(Mj00U z>RUz_D1iNR1PorW!cUi2m#a zc1ToY>}M|~D+L{u4YxkVoX+>1p!v2M7=^mWQn%Q4nXcqe4TZPi7a0z_e;>^0@})HnKOE{(=S9o_fdk%Gmm*tQhS9z#2 z6Z20&$<*iGs&wWH7)4-tEUH%LXA|}pV*;|NpTvaFxAEob4B#by#dw8Aq!QREz)Nbx zo=IcB-XCb;?pcssHY0D2m!hxxVAMCGt>$l1|EOUH*FCN8-nMR%EhFW~hGCnPVH|Kk zgFN_c5+&iD+*(^8tO5ToZ5?&zDJ^H_TN=%WEtm80rn|ck}Z3t4TGe0cC+sR=j{tmq!a#<9N zy9lovEGP{GmWr=*8Gz0YeI$^B@F3ER$-5b7DE;fgVA8inI>D6TI?J)!=+|mXe0nRq zxIs2H$;adibOSD~*uSHWOSP#6IykDlU+Uew(`EY#`I-!FS`Kgxoy6E2(#|}2>6lJZ z4&19s#4z;Se{750Jb7f%NsUBjXL!n%9j>OgGI6#Ux04`bb5+oQXKQU>(^m}-t3@mn z6m!uG9P}R$%pL4&v#fgMA#&#z0xp<*fUtF1# zG)uLw?*35F_W4+~HA_Ol>8(N^DomY@WV&%Rd(07lR+)R;7#7g4N#@g-hlp?IKa#b zsOs=94}DUaTtM2q zYpsWsQ%Cyb;tI|SeEObOv4{7&M3lm?_z|M>A!oTef|OqUI!L_EOhS1yLRL`y8YpbQ zNb{?>m7pM^?Nu3#_ztLF8;`)!K5bzXC8NA_gAOAAD)t8Ql+>?Dlpc%z2BuagEB5{p9 zv*6E0kUcwbYocgPO0y|UXylOt*NfpOf0J9VdQO`sw`&fj#4jwlvfqq(jCo`{`aE`I z@$l(avZcB@m@a&C^(E{mH$SSahLcb^OEFuB^Cb2cr_{EgFsDKvQx56j4P`ea;(Dy5 zHc~v+Fk=60k)7Xg6WvPm->;O3^hnz+o^F)SHk3_;V>mawJAW zE%}V7hCULHvhR9EWT}PXyF7nC4t)_hU9sS z+@=2*WX7lDK4HSP%~}}+BCj)}I3xTHPK{PFom*eOMWk$XvTtL<6zOs(<8Uw=Eh8FD z4k_>@b2>U%I3AxQwPv_@qPY4Z}i;#0kpB*72MSc zmm=S+$2e?%`J}%sGXP=;WF(hmk41imW@s(s4RclIqwNW$GG>1RI!20W?vd(?>We-F z6zqIHrVcIgXF9L0lV{YlY;jd|l-Bt9b*&NW!>F8q?tEU2gX=5M9g4nrH+Cz!{DkSyPkG5JcI@Ig#;HEH=fTaBtl1xq;@o<~)z zC)Jd+uidoct8fsgKa_a(`nnwhLbBWv1=K&F~YK7-MW4F<-G3k9wXaKJ~| z)e-L9Eyet@Vq4|GPuqB#1@pBRZpBpgvl6G-C)+Ixg8f?d+VrSDnF|dG9eGm)^NQw) zAvVpQYptsWR=4A3x!SSYYPjq!3MhAy>@U*sZlE-=bw4YY0TVAPp6G-8i0KQlDIUdN zB1uz>lWaK@gC!D+Eg*WL=x18t{I|0jj`<_zzyd7D&lF**PVDhFY&WKL!!!8%wB5~^ za5k=fz;7K%ZV0%j##5Hi8qzR5s@Q+OokQ7AuaA1susw_v=v+;E3$dRQXh6B;?U`m2 zY0t-AI7_JB2I`yko!<&S@g;JFT85G-BD)RBn2-Iv{zM6z_r;^>{t_VprH^FENMU)l zy}0@8@)pyB%}Z(iYiy|%Vo^7ZX!pR}{OTLOq*SZq70<7OC5TpG@kLMY4=kxD{Nxee zUa%@0tgDi?!k}qsdtzr&cF?U9Yg=jJ9A);J6Fv{35O^*c>i*iMC^!t_Bj3K!n?t`U zOW@X>$o7@H^_8f4zYdG$SNQj}VXbqJOWGW>N^bbVWzSdn3F*bEuR$wiFZ{N;0W6Y*hEn zjP8N-0=B?VXv;0!jYGcUaT^O!O@;34jj9D%PP#IaOZfuzg8}K(@g=N#(z=e!g8|_= zpayI@sggV2|FQ-t`u8Juu8>3*1zWcmjQXsY)gV>O&duh&;otGr=T+fuhRq5f49S|4 zLv&^cY4Up?J862@I;yk#=+0K`!c6@V1hs?82KWSCCr(k>YT*ACOAe~atrQtPx1{js zd!)B5GRyANhra8Ge&gfzLMTI#I}$n@S}4Qu&eE(#!#TTtoYtW#e_u>(EKaRoJ$`DP zX@F=ue$F=$zrJ-DPG30~2R=Yp!NZK%r}h1nrwmUnBB8imdB%?^fhaz#TCe@ZeI`@~ zK$spiTc3QE6d3XO@?QMKwq00jwu^%R9Uap6%bL|m;NDBBWqF~rV2T`m<@a?>*pBUV z{NJXW%OrC5ft!AI%?Q2U*ay5##5sH7%02M(h*Tv7)AN2hhHoPF;sm%VF@nDy2)-RW zsAPR!Im2W88K)rIIq9i+AN+A*O0xS__oxGALlvG|5bB zlRejcNhLkz{Rx9?^Sck`Crn4CY%o$N(%ArvLHqXxaa z@t-1J7>JJ3&bWGcn^N^#Lnmn{>&U)C(VoJdUj2YL7|n?yzbk&kzfMK$SRolaCHlIw zFFvnWyo6g5_-91F3#fjKHmsLG?TNhFncjQi`mhRv>13`@%6*Q!Z$swt#s%UeOM-5d zepjQ|bPx1kBi;yUzL&l-<$RIgaQB8{4S;1ux<{0@HYqN}_#r35JeHrPgWnLa>R6Tk z$q?ws9o4m_LuI%f);W|eP>n<0maRODU6@)7s)y6ODz8)@IPlGyWEAOqYT<3WD@XF; zin|AUrJ0Ni_(iBj@v9_KOc=o4TpIM&@ckOm&PjYP?4RzG-fW~W&JA^cFn{9Fc3+R| z;V*s`#Zwjk8Z;oE@<+V^A$U?`5(z3Bj&ogyTC6_GXr5pbx}P#w0V>;L+W6moG&>I@ zPO)uKgFTGD0e8e@-;N6#82r%!o(TeMzJ|FgE!gca2NLDaFYwzc0$0LRrl&u^c;8$i z-KuvSzm-`uuNzbSvj{91-j3G(X)!BfD#KC54e^I6cHM)6saHD>d!?^Zy~WbO*vk*F zt8lB!ORlyt79WjIDQY_5|c2Z5hea2&}IpJK%fx5T-H1*VsrO4Q{J@<4I;=!A zDChc(62s!9w_hhh)-oLVT<$NU$m)2ujYotKG!RV+%TMd2&JEu|MCUu1XD-1H-y;_^ zU!>twPX&nXzB)qO{kU9ecn#dENg*G|Mkhb|jgnKJje+#xWf<+|h4jS~!_)&+$;)CG zd6&^BxLJN#&i?EroY324?Q1vT&Mje$kc1kG!R&Qb>1tEoi&A<1G}Ee>yS?GyF=3r= z;>6b7$MImVEMPKg=#yt6Lz(rnpdY-CrP2kj&2j%9E&G>HnYQZ`YMQZOwv z0fhE(po_r&y`s&{k1`V*4h_&$53Vo|Y*zSccq5V8l@q?ryDhl^*=v;odBABbXdJ`6 zC&PEd5ZqEkD0y4+-Tb>}%>=%DUV3^vT-yePJo^uFqIa0{2cOEn$)fg6V6TZm`GfQ_ zPsetYnkuSS2@H03&?eofATesY>a`|6khf@KQ<14hWnLBjfZ^DF;$q)7Da%e_T;Ry{ z+bys;Q|tSX((bfAJd6e>2OedGwkC2|9*Ovg5ztJOyPVaQcm*iG~gYVe-Ihr|Jl!sM&GM#$#K zyfY@(eo%D|>eG-mO@RC2)jPI+wNL8Xkobe>2B@S?XvKQw*G8GumHl_0v1M7%5f-=G zf%5omD5*i-@>-qMj>(XhoVx}Jrv41Zo%D6BsIPO;VaaAT&^;2^$H2%QrJcY1Ni*Zx z)j&nNbqM~tD42FQEWkrBsde(TwzpbY!AqXJOI_RN544fn#0)d=l9Np6-u+POnJu;eNXcQ|Skn5Ob92DplJ!hP0RSx~O}j zn+RxccfSx}bpRxJ_Gs(F?=1FKwxNM7 z99D)fH^IX?Ram&7R|$Fk+&iVtabPzpijVH2wC;0J!K@mexfSJZU_x2k#|B5XJ^+?X z0$+a9?|iv^|IBp1reF;isBHX8#3=U0!s*L(ADEy%v^Dv--yYVKK5N5|SY}_J!9EbN zHLNV+NSV404X7+kj7nrlA$)Pc z5CVQZ&ariXD#E*s7;4|+Gi{3NSCK=wp#Vwdtkf?<3s{UpawrW>Y#UZ1?*7u63}Y)^ z%MFNg&?mFYNItT5kb+^_uqj8oy4v?2X?T_(sw`oq35l{pTs$kU2-Bf5Jt=x5bzaF{ zOn=thE93Y0&QtBK!b$muKQvPyOSn3{0o8^`zh1s4rB6kZaE;QT+~BXL>2mNE*3R9L zQQFkWFMw7PXg)(f`OEK>t!kss08zy-{1V+gi`80gPCwj1k54PHPii)7j;_M0Pqvp} zP%G?<8J3l`_EkCx4wN-08)VC-%EB-i*MWO!~q_104o}vY#iTO43LR2^H&o~k%-z^gxq$G zB9jrU5v42MgynW|_z;4VXoXNxy%H}fHrZ>6C9<*~IENRG3q#K`iw%V&$K<*lwbJU? zAHDFzcbKTu0(5PhVNY~fFs&&Q^c)fS^rtr|=yPCH;ch2|-S~j5rWR0-9~i}U&O|X> z05LX-2} z6*>3If@fPy(7>UAo#u$H#g4~xtZK5xu)M}pN_U8U_zw_5SMWFK!T2)OO}6-r>;wxz zVtLo_ky{`Fo|9vN;~sI=^wde-C78%+DS@EaM59%XtVOAIQy!y+wvCuixZV#{RRD}# zPr&<3=eZ#LXD%$?R)ZVaqcz6l_{w3l8Cve7;k?oK!0pIE%><(C@G9ii*DR0z7-zYe z&o29byNwkE|CwBnoUf`gR~(%11_(hIeQ@^qDpadI{*$88`ePxQOUbta9ULj6YwTs= zG(i4hr^c&@1s~G$%=85ymvN(K1^5kS-jGAeB1ta6p2I5^asy*vqBJ47NLXW?5Z|xZ z!p#&Q!Ng?}DHhGF$dIsOU0~D7Zg7Kk&?@45dyvf__2cS9gV+vrAXyyU+?97w48(fya#l`53E&t0eZ2?<`~~9 z%b)m4$M!1zOuqm=j|@MzHm;I^S&Ejexen8kt$^5>u)fX2&Ck~vV^@ql@@VfQtj+V} zYO6l-vryySkt* z*%4L_%+!AM7l@ztHA6?Zg`ra(sO#lzZEc+&L8TJx!1kjCldC>!hY2%g|Z`N1^X1q>{>al`(s`%6^9n=qj}U-t5X85wY5IvY-qVt2+A8=?%Zudl~S*4d~h3Sv(iO-y0CXoAXvVSZ`MR zYxT#u@AR$a8pvm^Qqx(YMmK!*#cbZ!9)Sois@CBoyU~^Fk<1C2i@HtkV>Zqtv(~XtB6_$#FkcvQQZzhnPEY8x+ zgi6%bj1os+j}WN@Q4RG{WT{6Trn=BVUBtLKfi{~@@ z#71UH4eTsDVhiJ!R3gZAp1|C~ecSpb*LFXZ4ZwIOGYSFyEyJto8#S`sV$j=s6$H(e zjo#yp&}Xg6{Ty+G2}C{U?>HGWt#teYNNsAI@ntEm8icM|b{GO;X1~yS3R8e(+Yj(~ z9wYb%Y0UMLA{%aR_Xx-0k0-aNvxb->`GJK^Tm6M{Q|SY8;wkIAbn?GaQf7lYgn@uB z0PVv08+|aou)t<0HcBhvjjgd=NNFIT6YW#E{f!}5c!O}!voW2jec*8B>KmmPc6Z^r z6z&r+>Qf^qOGOx%FNuk7Dc{vHzWTSqt4821EQOJ3YSzDw^ztgYZ3s4-Ddf)FsYlLn z*_o}EoQ|4fRR>JMIze=;!+~nM!l!=|(7(BJ4&349Z$qCh$DftBpmh~$3ap+ZG&V;v z1H02(`#p|}(<=e9D$u*vMG1gza*10I&0Yn&I3X#>8WV^1ZicqoZa`h};o)pwb_smXpZ=?X$5_X-OteD3)Mjd8O|!!6G|f^i?I<*aF*am)3fyafvS;9_#`yLGj)!uy&qjo1>Az+2kw3vizo!w)9vUUJWeF}}R!aB?Rsc6onB?n+Q zWKWO=BZDK0A{+K)Ox1)^Yq&!I|IT zEfiF_Xl6YXKOT0*cM8}Z6HTGNRVf$J@Wa~1M*lqSBz?K&dQn0(HOSTs3S*>qGtRF} z*B8mM)?mLY`f0!S2LZJ+blu!JAYthktC`h#w6jilVPtu+`u7w5s^_U1@5VCD$3k8S zkmbD;o@4tvf$qgJ63)PwsK&}lPPp;Ce3?JXl7*uta)Bbt)-<5t=j!dmk5Gd8O!w4< z)(r#`LTK55G*}@0rq}Nh*PVn&$EX3uFwx(&K@1NoX_*O-bcJ;l)I_IK;`4GmW3H@; z%}XV?6*&;vD|eQH3}1sie|O1xY&~(*)oki&GDxE|4s;B3JlgAfsxlgqX{@P-r5s>3 z%WvGgl>YZfOEP7(up~8Fx7=@V*EVl?eBld1JJ`$RXY<)G z)N*yWa&_{nS(UmckW4FP#cECYr!g(R>#k)I0>t-SzKsv23=ruiEz$~*F?#I(i7{cFCmvDF819R^t|2mgNMv7EX`MKV5MW1# zKs>q_-7-9V2<$V=auo-*#YX1-5M%`4V0^0W%8z}qkC|m`ktnu9jp(|zmTtq+0VO># zHpRsO-vfMcWrNvu6yUYYvHa&~VgE1;bbFm}!y6LbIi>2rrr-wEia*s@9=W3!iZ`}` zB{M6eg7>XaX16Pi(C;P7jY98m$o3xgHo&!ja-YD^r|hXAzL*nVGUjgjf>Ubx;M0v; z*<`Q{pCD9BmI9x%H*?&B=7Mh@84A!=y3rnh8C+#^Q?bXKk^rl3$x1Att{6qB zD=J&f%kx9NE8BgoRrqfZ)cppyL0p}pG4(YcuE0yXqH(1&g>W%+XRLvK2>$P7e~a&> z`aYn9t7i|e6PK!v?P^u#8|Dm8O!^EnAZ)6VW6k~{)2GO@6N^6BB!yI27DJ#%56aqO zaN!4qb~;;ktRck2alJV^G2HaMV2ejsx!agpMQOGjAEKFZra9Y-X`1|zK6T!?QMIbM zMexhth8(f6mq_!fELHKp!N>=V$P~`tj0^P-^m>$~dL>f`WRr!9X0;?m_fl6LfSIS+ zhoGFsOH=V(Yy8O50YB=@GM4t@ky8=1OhU|+#GiNk%EEkPctJHBjgN6mmdd19m4Y0( z5URG!4EBXTPO6^&sK}iO_VJP@Ir7X(^O$+sZb@#-OQ!4}BS60AHXm>Gnn7-=Dp#K% z^n79}v<2FBe3U*tPSqFSd3=5x0AB8AnD+hxn3x2Y;gKXOO zuC&^AQ-zd2lHRb%g6971yq`Ol2XAtrv!VeBb`{N4YfXf{F>A@TeOvf0lk%|lCkqG1 zFk=nfcdWf<4Y22#`Hu42X!btiL9Mg5dI#D&O&gC=E=bzB7p+T9$Y+WG3=K=*ipV(? zi|oA5M}8PoCLz*I(9^h2u@3^;Mk+2Ay$ZD@i>~#{M2uRB zQ&+cJk}lMyqr=Yg~ zww~Xoc|n3vUU5}4_kv{XtKBj0V`frTOk@vXf<~6PCV;-!u0REnZzTK3?JEZ;~~=g8vu*Ia9*#>+@S)i9jv%s6|i z9S)u|j)T^#Snq~4s@YxP@}eDCo*h|r#(N;Jn$;@;k5FSn-t?A3zTfpvPcwioU70Z^%MQi?;+>6CJ(qCoeBz*+da~zV=oaFH)!FT^V)eK-YR-<0)KAN)#fYI&1D`6-Wb&AHG?tr;-_uFS@@q(a^$ zo~qx|JIOZ8r^;Rwaj)MNJItbcXF=WBdNp!nExXJ_ZQ_e#+u-Hb^$41T>XvM&E22 z6DNl-^~u@lNjkH>E@qC2;V#@l!56W-^O*F%vRhzda8M7m<2nYodjgbAV8G?Q(jZW7i?qa6 zO9ac36Fcr3gqXDDukL@v?K=mM?y=H^pZ-%qA@>|uFYge;HF^@OpEy>`Czwm=kvd0- zQuwU)=Vd$2e}s8R>v}T%1RQ7gRG)OVmI{6T&2?lfFzat<8pKdu&#BA)(3u|bmAC;< zCooz8S3o|tl}K-_%(k6z6ogsh*D(kD+Q_9qYl#%MTg$#c{!L)loMY3y&^q5uHC}A#;1v2420-!H!q)TC7=(O8I@lGdRD{b>`)L5M%f|lgM)7)}W({CP z3?eTfPa_WBi=%Fn9GaJEi~U0fpPPQwbT8hA81j|zxRUo`uIM90fY;>ce%D0b@Mjon z+q~T~ViDn)q8u27izqqmJIt;61Do!4)~pWSJO{}VuJ}W7f_Ub|ojlyRHYduNJohv& z9W-|>RX$MeH6;Tqm*%lHQ(HGvGjT=<1_pUUBh*=Iw%^4;8LIKM`BCnDm!%_vgRJ7r znI?UgQq=wW#({p?A4(pq1y90FJS_~B(AS;hKWXBKtx*3oQK>JvRNkWXs$_IRt$t?&Up2dKlWxneu}lF$ga4ybZ=64skCPgyWh_jr zSd}Ha{Zjnl$aXl=IZ+ToB~~S7O(Zn_?rmp8K#}{fiAd}C*iCUFGG!o@50mU)X??4E ztveawG6vY7HoCEh;&tGYKPfND2&`|WmTof?Qb z%532Eq+InZ8roQp@PzH7C#m{l1hZS>cKZNIQyTc5^X6G=Z5R+8bU3`h>?lETcuk5y zf6R^UF<{Y?IfeciPvJOd_3{wiEmnB}XHwmwvVh7tztyHPLKT|A91lz5`*U_mno{1O zIIudXNTs?fO@Ljyd--pedMGIH(P2>7JJ8t&XbC52Z?yswZ+0Ksq$%rQ2j+(W_VF`z z9B~r0fwA{oF6?{QCQ@3mLkR+M_785!lwCn()y~C1^WOftHVtalFPK_tpjZqFr;ilU zj}|gkjyF?20!?}#DI(-T%$slwV=F_Gd-(f37pb}`#8GL#i^-=)@5)*_OcW;C#Szy* zRkG-uhxGYM%b2CgjyG=>4#3nf73zgC4**i?tu?ZM;qGn+PT@Zt6rsVO|2Ooyv!z0! z21!)TxQRdbcG%E}l<460^@R;iAX-Mj{jp|OPCh)Go%$@0em(_W{C5fS4H$6v-vvt9 zY^GJvI>r58vapFUkyRZgzpz>B+9o$mC`K5Fz9&+sRRQvlyrT(Rp)kIdiROdJ#Ou)t zsF)7}v6RfEx#bv%9UB5=#=!lv=C;K8FYXM|Aa6nESg&Zb^Bf6Y#Gsq}>k%F|!4%^` z-AewA;DmBVeOhOHSADq>xibFN{Z*Ls<(aGg`N;eI$s1|ACi@q2o^FK) z_k;mBl^%kgGF?n=ZPO!-;PzDQZ%bTjUX!ikI*X-54FL+loi|c?@7=e80JQC4ayG3e z;)8AcwS9bb6}*cw+kJeenA4JjW zDbf;hKK3LD^A1imgOBNphFy1vDt69Xr4K;D@|gkomp^F%Ru{=kcRnxGAzYG}Q`pB@ z?*~?r*gMYf(z~g{aZEO*PF>-+tC zAG6~drT6W-r^`DrcMbaJ2OIiW60pUqdFs#!o@)N7Oew>I67S8}aM$Y_kGV(*%?FVoB0Zy5qN z5#%~)t{TGYq0d<=U#Ni*AjS7|D(ng_2n-)95blX__^VbRuIhwbxYteY2p|q8756df zaDo|7Lj^VnP&Xc7rlf)kui>Vg!S=}hv@(~@=_5{QF+eHP4SD(Xn^&lx7YK0pb+umA zDDs7El`v(^_3O9{Se_l?xM#`o^9e`wU48mr3>Oj+pP}OJ*(vyiUls6EUgx)isq|U;AaLX!2EnYEiGIJ%0*#)$SjX84^Z^R9 zm@s;Uj`+|gz#M2G6( zQ}!?B)JRDX#2*PaaAD&;*RJ6l_S;9qV1elEwlpqJJPu4jeKRM3xfvQpK{5qD&YG5m z-Y}i5l)dcKgfxo%4KHP{8gs{2lcx1_-ZU9Sb64J#nTPZu@nFyZJj!(C7B;d zB#vs95}RyA8K83nXiiS!>XUhKph$h|t5%evCeEMrt>_j6raVBwvvk^*Dy($Hz5luB z+}aA}+ycXc$Ez@dt)d2nm7#{({BSQE+Fxm{vJr~h15Cz!xQRA51g+U-qHlj&8ciCo zs202XV1YQ!1pIf}aMvnr1N!C0vjq6{8DzbJN6hhS_jG{V3sY6O*AR-Dx}wflmNUfg zwt)nqIvxT;i0ReIjNGkroY5u^NT#YIaZk2|dBp6x95f*#t$$Z=Htwe<3oyvoN?z{* zfYULTn8n2)4VM5_KwrVnM;KW-RF(5lrMu zhkd|V_|o87Cg*hNRVuK$*tsE!A-d1k`&eVYdgor}73WgMq#AJwE99L^wh$Pc)0<;89C-I^h zIxJgFR7u&GUlbJFmZuZPr z7}n7#>(5u~B2t~#fQ0ZdDvc2)*%EVVU2nbrO`Ee9a2qr9Q47vUg zwa~7u<|@Le+bj?{F;}Vxe*Yd{P$25C+5Z)3_+WEPtnoLE>g!H}`J2l#IzWC{Nn&F9 zu;qcEt}zFwO(1GyWDJT|j=CYgLWW9(S)1hb0%s&6*^q-h`H#Pt=ZT(`jT(=k8~5uD z6*ytyYDIqak?ZlzRnx5FQb`xw`h5*UAGpJfkrXt!b>jH9@ln@k?2(n`439t1IS=|i zlvZecrk(3ANAbb#&+j8m18`OsNbV{1a`TJ+U74X zW&P+o^#sMJs(b1xu)2%@-9{A22^gWDz*;7?Z$EAWK+g7E`4_E#rII_*_Y)66$KvX1 zhp*lB%lzNU)Cxu0RAhL`+}+%Xs{)(vN2B9={)t`lfeADLoypva=sENk%@xqU;s1Os z2#|3#6o%^586p{txv~ZCsSv1Ayj%}lg?OlbT9}Y*zI5Q^gS>eJp1yQ`H0Aem#d?Gm zHkp3X29-%ymzDs?2IjuYV}uqWZe%d=j>h&;3R@Q0L(UCBPp!Bi`kJoQ8-h@F+u`cfTVQu?>$aKyN|QS{+2&UDE!B?Y9}-1#GD`yc?7|0m6bddzV3hNBe>%6JN=)dI?)2l;T}-5pH)Mv zQx$Ak3J6peNifXF-Uf6PU^Ug%Fvn<&-PAgTbBH3VgLVFQ)O5KN>hnm~DK(yREF(wsSx;EtSNd?^04gFb4mD+l|Fz5M2HOKm7kiwAb)?Tj* z#PFCg>?|dPwj;J9<}A7AEXG@q%iO5&&_yf9ZJuvbr@tij?esz6Mz@sS?`BRk7v5^GL>A=!jme0T!32Pgrclqdm*%FvV| z1jx@`L%F`^mm?YA4kVhtEspXS8NeWdLe9b(#k-B|RBPF-9hseWx^?0Twfa~TBr$K~ zLO9MV!9$=f_I70>q1yy)Xj2#w%J{Sf0ttbE@Dp41s?c*_7W0N|+NBVj`hDD&So$AT zv5Z&Z&9&!ya!2&ezX2o9tv@YI928bQ(YFF9p-D_9>}oDD`u2<6*|I{Vyw+O)AOb=5O8J=PMK8As?xE`C{bKZq7E$Z`~tiKmsVlB^`y5mhV$IY;VPHP6Fj)yIr4j1}#?mr~l$ zDIW+%sO&NhI|~@Ob2l1KRv3Zq_x`9GuXr1D89~CItAd$X6Qel}GuG2=<@;JRAc2dQ zkaNHY83`b#3-;H?Q{;9T*8T|w z*SwnQ>R4D%SuxfL`17~v+fg*K{j7o((yKEtG6q0vW}cLA zdja(6Y|3#slzD3%Wf7;DnFGGkpXQYi(9_aa+_@vvmDQEiS}9-s9KG6z@T;zqCsT3f zT9tFOw+KO}5t;d}^d)>gf3}flWZ4rgjZ$>o(t-R(Rrl~y>vsp=r0>?M1|!IKZ zunu354K&f%n(K&dWaD3UQj9EbBu}FMj{1q_pGEn{p6)!J9ntxrtef=jS-H6;_o1$1 z-=;85PJ-CfcF5nqs<-+xPJ}vnT+=;0))NperMjZ zXk6n$-t9j$*N)A{F#FkiQzASSRGPZLmKR*l$`4`Y(V26kRPXV!Wg27SB$iAxB64-~ z7h2yDEciPjlb|LT(~%RU%ORE^0FQHqudCaGT~4OXZ|K2e0U=`(P`>-QDmRA17#)i| zYBs15;FBAYoK#-Kt#+2}{Ok~8#K-Y*bSW{g#6-bPs&Z8MHHpr!kIolt#d@e49bvsZ z5<=R0sAJ2;j>uLRAUlU#0O#gk(uu*>o0V6RRW{=Hs6wt^Qbn)cN?I4NfaKgQSaund zqVf&Oh+D`QCBxiR?~d$@-Cou!FiNeVP>#$!bzY&EXrJWsBd+MNS`_fj#~uA5p<(22 zpVgsRY5yu&{TaF#>xCzaeW@{3Ae@>}S1#-?T{)9yDs}&rt>UrtVoYNq58kd53tZxY z_z%=a?&A3?YJb=xRuTY~>ouq&=D67J=>KIwiXLFZ*_d0bC>2*pk-TqL?gKI-wR9F& z_oJj}z!zjeeJD_v-fG@*dhHc?IxCXvo2M(hV@SxPby5RVU{s6uFj&}p^eQ^ z)z#k_QMP)~)f0l0va{ylt+32fam)YmwR)UXHN&d%YVrx z(3+_J6D-m3urY>QXa9XUm+@orh2f0u$mMl*_FH3v_#2!}yduvcL{vau`pTXxsaHaR zAB}DwmgoJ1y5Y-#Ou1o=-7M28>-s&Ntd@`%Tfo$OEqjxSZM?2nq5z-UeqC0ZBK_jj zW~WYLaXSE=sMTLl<8S=)id^uOOQck@HZNe}M`E2vrad+;4i>86uyYD*qrM-=z0(#I zXpXS2+!%s-hOBoqzgRUp(LVVjo-|Cg%C)sI1Z9IIl<+&9*6z{zF?9Vu_;mgcK0T}# zbcYo8d}o=oG)5WezrA6|Z7j{>{wr1>o|PvGpjY;{@efm{YcdZx)z?TET(}EvSyJ`f z6)OJWrw6ZzJnKj|{I6A69_BaCSG58UXOQ%FCY7Mo{Jfe5SS_uXI4Llm>&fLxSuIueg3-E<~zmZ$#Wn$#WEf$D|8=~*tR9; zNl)oc(+#W=AH7_TiB>mK{zHO=N=Fgc6z0lpU{0DoTyn<`rg4}*PDi2!DaGdr+NJLe z^Gfs{%<$9uJGIyE4EGXXmFn_!M-o@moQ99b`7LHV(L9_(h zOeY}s5=@}cSokg0%_8EvVcj4Yz~kIf_XlqX5$By~oaCdMFi68vvO0;*L%XK>E0CsU zgbj*GkU^6s*FOh_gy?S9yOY-X3>MLZjcMp>Ltxm>gf7WO4def)+Eu;gCfmH$ZTAZp z4XvSQyc=pQwL1FwLU|-|9~xqZErqifVs!tSkb__WI!^6m(!O=dDnKc{+1S7BO1BA9 z;*+#|(LZqkX?9GN@#w-m>6NEpXsCP{#4m)|7TAk*-UV{g2^?9A`!@reNO0d*jph}Y zSIh|Isi&&9jeB?y_E-gm3dD=Y%eCz|bLPTwmwwlpHplUW_;1p=DrA2(9Y(tWsxX#6 z^K8I}GKf5B03cV5>-N!ljBfb9Iobzi(?A6_igTy;Xn7ZGpV+0LQ0@G&6$7;*)yl2s z2D~H2i}K8PIMO0xu1*E-vOnHNfx%FNs)k9SQ>aGLjyMe^*$6qm161I@SY|mJ5Df^# z?u$m}%7KbDr;c+4>xs<{f*L&g53SZ3dA{yyZN38?DyRn ztSdokMD#akD0k|Xgig){O^=m1`YlltA8K)+Kv1ak3L_0|F8w7AL9sPwa zl94+Egw2F)!=_qnrAEH4NsEM!0Wp%lzPF9+d9`LN)toyW62>c&26(Ahxji$|wNDk( z-rt@{0B+5ZVvm44`Z)1HMwPubM;{cGn<6a%yua8yFH_!Il?uR%K*^h3AQx4mqt@GN z`q_d|?+*vYt7*rc|4Y;VMgDK*Vi$(o7n)eab6a)8imSQfaU&MwB1t#@yhct*5T*raN|np*pE^w9uXU zJ86WJTk@6r*R*(VP6NsOBKc_!aBqEYy3H|5(4zk>XBeghKL#I5F{kYj6M(RwF#6ar z9AQH1b|6}e_Oy*jwE5NnLqz+l59aJi$)`XeU(E3Y+_l64%A zYGG@t+!n^5i9qq2pbsL(>v|-5O5$0fLXu^MDJ%;|F65jxY5TKOep+QwGr)rF_ptR& zd@7z0Zlkw<3}ov3@#e~W7j)bAJ>3cI^I?=>ygsy6Hz^L%4aMYH$1jS1cBLu0A0VJh zpTX;f7}C^Ku!H~wa(&;@-de$TV?}H?P@sC`hYjl?t1`{xm{E^I-EI zV7n7;RpnwHz>sJPZ}oM9=KEtd@}jpwL@IqpupLdOXDuIiK8JJeluYny{q3Ev55ux; zK8f^f6YGytI37b({iT0DqGp?M0ur#Yvlw9vjb{gKhRY0~7kbW8T#?AZinR1aPQy9i z3?UbT3s$p7yT_(Y-$nQJ`ws#yV=AWQbQwGrQ7T&juD3s}b$qStx)4;SLd7<7!c6AY z^4KU$^>&hYQb6ujreGylLm1hecX=@a&(S;6r{N)e3#{k%lZLD(qfH3cO%+OXmTk;s zTg(w~D*{x&JpugzD4`l1PYfTt^>*s?{kj@EmRai-&JbjIL($b%Yl^<_Eqv$0NU-h^}P z{ELwN6OI(J3# ztqzcGmFj+-%hv_d)70A2gd=+hH$NvO32M1B^R_(Qe%SSCLHNF z<#f|1k`Ccnem`;I-kHhs{*mL!+DW;A-*(kHM?0kC42=ZxY>GL%_Sc zepu(T?-5|LW!M_}9W~b*57aeBS)(uyAO~wMLQV91?N>5cuauJ#E}o-(BUNy zT&plgGG_DiG<4%kAFruP3DA{^#%4|`D;AG6H&pH5nUZ>yY6jZjV%QX0Rz7hl7EG8Y zK+z-gaP6&uob?GdA$(7&yV*_QG(L>@jrm`@F%|gkiq^LBV~Q!4wb0(%x)FB)CZ+7g z-#r<8*N0q)eK)TRYFS*%uFpXdk^xF2yeNY7399b;HmaBG`V+mue0jD=NKzb>6M9tI zI73FF0!*1D$es4r{r1Y|;9(;AkNeIi(FA$#^XQ-|QH2Rm1u0C`BB29SyMi3=^ zrVY8Uh|ALx*)wdjAy!V*T$)@!ha^`m$yVH?@b<7bVe=h7?Y7K_kCMIruS@4`VVxc9 zdrTTErhu6{{2>BG7ls>UEWyelnEmP(uMDRs*y6=QmzZM7=t`Q^)3&mrU#5MRXmH=y z@vJpVo=NH2cJ{J+_a?Mc^x}$=6*6ZWFS4%$O>_t_A!QaGgoclDqnt-qS%GpJTfKfSZagplDZ!qj_w?v$={{`&wrc~;{!tHITQ3Wr zqIg3CW415d96^fg{^LPJdeDMGgZK8-YHKIwQBlen2ckMRfhRHp4&5;OO`NLXx6iHc zV4arZEGkvie}n}{05YUX-{yc-3MG4?Ohfw!yUg23i8AUJ!1lOgo`~8`N$V1E?-H9< zjDtUcetx^sqr3AN3CMrcqq)r*D~Z;I-g0b!I}C_3v#NEJaiRe4wGBhyCcM_009mc( zDJ!w&%1mL*SH0FlNpB%~Io*goSzhZP zgiVM6_xDSYPZkZn@AX-Y{xB9dVH{PZYPy5ZQPtq9j?DqMzgCx)FWy zmp8&TMVosdR5i|i*fgqFV?Ek>_LfyZt1%s-Tn|SCC}DRL8`XzS0ciGpTR&sUN5#igY6iP(a@|$n>p&?J7vixid0a2f!y}{9+O}MOqV+*2 zAu{E4#!re(D~Ve%lmVmXYLBP`*Tq@-)rC>_qBY#E8$hR<#ZpwTHlL}Gd>{z{tiIew zVf)=#n?mm;*KCd8ZQ2*m5XJuOz;p)s3}n+>Kjic38_MSvap<;VERgVfQQm2ZFd&3w1Avx)NJ zC9;&e2_SU@j!3e<%OtiyO)QgKMHef=j`E@2r94<7T#BYV-0}KRt+2?4y+V=SIR1?{ zvs#2Dc&;Ha<;khEv6}Liu}L?3y+l`Vu{h^W^BE2M5Pg+szZ{JHSwJd=M4@>YG9@79 z3D6bpQB2#UzD!~m3Tjk}kk=3&VPo*q7kxq@`^UrF%n>DD#pnxtl%w;7@y zeuf0-6KS8A-ye}2IbvM3ZTor5lo-ml!Zo{vIGz_eR#8H=AQ1Svk1R8YhIcmLEvn*c zI8a_Dbh2ys*NcT|d~YY0A{+v{ftGy*`EM<^!8z_KFE1^E1MD^j=gk9-kwxFXs|at7 zSWpKz>EFsYbS&@i{EXimV}OEla5jg%-d{;ZXn7Z<#JNDsF6g7aWi8zCHKMjhgE2o$62gT`?&Sw+9iwgKEGp6XtAj#*Y$tyN`ozWjn}({@HC*1ZC~4*lo>3-BY=lAewNf8d=o zYJVvsVtr6%aswNA+YWKsF)CFX;DfrXkn#>x_a&gGljw-L2zIEx%!6tQ2}=_=%PZD> z4SsaT{LX7Wb}m8v4J4AjYc}268;^Z40qY-u3dOX@BfVKIw$7;`EAx)B z3Af+~Su@h^k2x&e2fAY{F7Sr^@`65oWKAnGcLrKBu9f^lpu(jdZ|zUv0RH?hcXoLR%0Vp(qlPbCvs{! z&!{BQdSZ#GJ72Va^zOwuV6e`Qsl#iXZfo@ZL~uFrh+rnt6iRe*8(Y?A*R^ixUn(Yu z-24LsDfRWuy~Ra8Hn#veGUy7`5eoJpuy>Fj^sFBdz}d1pYl3E{&RVj+u@lMd z^QOcG2!2bH73$4Ado%J*?FDNcqG@J#PAHDza#Sq+j$YZv3tSe9L3{{K0J{Kq@{KHm(c zj~#5a`?s6!L~Cy9eFXX;#|BzZMuTdQ>6QzLKXzZjhCkWMNDHi_O{*es#BNfl|D&lX z<0FYPp{4QcjuKB&;gaT z5BJ@H^3&^@M2`n!-2q*d@PtU9?rZYt`hnE%oDgdWC{Sw%Rk)8ff zT=0D0_E(=d$TBSU`88h1u`TdthE1%iyDR%7`Nxxtgx>-6exsFo4(Udpp3f!9E*9%9 zGV3l7^?2)@=KUw#e6S2wvJ2WWCPl z-*~$BOe9C)wDm!HcK}v6VwuSo$r-JNSaHWG*vEq_+G9#{Sh-Mw2A|lO6!xG3?@Bbc zL328uA5lACH0+_wq=N~Od76(y@mPY3-E{_IBU*_H=d&Z_2XV=V9a_&CdlYq_pe7_x zbsK@w7?G+4(vmHQtH}J~*5?=m^9zn|9QH5sO?-ZDrZX$XPk<+Rmpo>uFq(+#9eDpj zZmkR}R~qZ)3^%d&1Bj)TU&pD=LB1AzRNFb-alR7RO`Cp=8dqOGQdd4O_{&I)>@TE+ zxTl%vmQ8dNSHw zXUtP#ncwmM%mOG@mLl39Q&g^S%4s+mXG6y1J#|sX4IJNuk%vo+l6+I^sremJ_3S4J zWnxqn=&u`3XUx#d4S9`OgU6_Go^LzwPl|9kWtv%7rB_gB%)|QmC8BCI#j{vWd9nZ-!TUtQUzKJ_y zhnX9YgM=fzrsL{uVoxgDvaB}mQL!UcY=^`s1))14<@3R^g5;WieRn5H7z zkOdK($W8oo+na;$*y9r@)HWKn58tXja1%V zM6SxO>dPn4dpD#NkHd>axStIE*lPqd@1s%h0y2J)5JybHOFU^Gse!j_R*Pft6yqim z(q$W~Ot19&%-1;E1$QYm*P?DBObKtldoz(42K=kO>43X!dkl)j z;At<_e@b@u!n^8@8gaq&0Q?8{Z2i$8Znk>5KHwbp{XF)Q-vTgz^QKY- zH4nTd3|-G^m~CcLb;rS(rekz2ZW?YCR-IH-wibb~oAR2$pzcj7GYe1U9v@{?w%?+C z5!}JwC)>?4R+!`5M#B>fXs%pmq3qCt%=dqb!=-#qqzxbPKBJXTP-s0WD$|mOfpu3=ff+yHl}6?K`!)=oHA0K>o`Rj1iHugXOk%3ySma2BfPxW| zcue&|9Z7oSnQ(K|Ekc_3M5uksr)_Nn1xE2jK8)+4Rh&m|Ws&+ME`qE_P1|!e{2Y0{ zf~j%rxW%SqV8vkXVwkSmP{*$os9tgAB?U9YYaN!f8egHGQXSP{ z()FKcKke=`WTuZcQ{@5s0V3+@YtM8${*XaA-*eier?WTTX@h)`_ve&o2sWo5&8DKW zCh-QgF^#-+-iwU_mGh#2a@QL9v7#plP(eK=D`|@sX#KOQvAl_$JI^cIv_F#Jk;-e) zHOvZc5tk>$DtYuf*oaB(xuH+DtlW9^@@4gMOe&g{D8UmH8{%Z&!iySQJpL0j-b7+S zv;yFdY5=_~n>2yF^-!7=R=QtUDq8pX>AjCF@aD_{ef#Shj+-O!p>o$=tz*pRYWYut zHwbFz^M-|VO*mB~V$uG3G09>mFcnhc4S&fpj}ozr#c@pCrZ%`-A#SNOqsFe{qMufn zjY7L6PuoXsS1$X^d5zD!1=7TQF~Zrkiqect>s79j?)=LKQR>vMa?=^P(=NGU@}fC~yA1 zB4S(zR7k^oyuBVOT>S2T6gmxRO@&2D{#?lS8~7GnB-c_Qc%u9~#mYssuGRlOw+=bPTfweX;8t z^}ckuBLD|bm5I(!rne$zaWG4Tq2Pa4d*UqE z+Ddr(z;kN1^9>#9N44XoF6njsN?L~XZ9|9naL2n!_PwlwyDIHcDK9L{jPXA?EUlM` zFHOKRj3FOiQx4uAwmeRVB`bMMd9>%UyhXuZ0MXsrpMGyYfu$C;uNh9*ZQt3{#A@wy zn%7f!y1~)i6%%36(b0e1%%XxW?u6*>wc%(=r$6zQmRs|~Wy6AdHK;b#@j|pq=nGAm zP&VW*W3||`b3rM7vHiOUqa)H~WK}ZfXVEeaIf`CZ*9Xk{W`)10BnyisS~v%`Mj1ST zW1MCe@UyLvU#0w9Qudj{&Mn<=gPL>%%XcxnR%hjEv-5i`)Gs9;ZvW#!Y!|JtEO%Fm zOk$}l#^cd+FaFZUgfIRY5-$FDhUlN>BrLrS$)CE-k1?+#61YvHP$?%ugtKH6M|=2P z0sm>blj*uct^d+x{8-@ml&w07X8D|_oZ<<BcJb2_`wYVZe3R=_koScA8F`(5{CMdqG zUzpmkNR@i54Ii3MOc;!}JETbr;WQAVEn1DtK42a+V0T$^e;JS~pfI3DE$++=r|e}l zJ@}X1>+6O??4|?B4>(DKfmiqbSADNzbGB0K6Ei2!hA00k29Y022|syp7jbKk{CC4s zQOZiiALn4&+oUx*>8l^g{s4EhCVI!%-@!n>TRvQ}M2(+Hw<}7_yDI^%^tfacxMT`f zf>yHZLu8a7*^`6N%^cg7nO0fDr-nIYjkf;te`G|eU%1-)xc&aLK*c%bnW?*Y4kk+! z?vXn}AuzJq25qqVS-yToo(Y~B7xA&@*Y<>|=uP*@H?7G}ZG-l0z#xu$!q+QIGAYNEW+4uom{njna?{9XFP5yEuDk^j^rL>UJ$eac1(=14_9=lfM)x zy7Q>Aw~tU86nY3e19zt5gS`Y#j!ABMJ5)aBR5n~}gfTE0t56!NGt4E2riBw}Irqwx zCJpco0PYT)#X}Aw)j&*sPKsk0-qK zrjIja&#LRxKeQ?*=B_|Cq0s8kQA*vDs}8g|(^`TAOd0dlDdIbojN1J3l`$Y0nOn0{ zS97{^k{qjA-qeWcD3RL|{{5i`<&~mC%fQq1?9=F6*priO%;7>0UaO1|eoK%=?I1@vwNqZtb9ChNg$2ej6%c|C+`-O%O|Rm?jXf2J3aV>)7Yz6w9rqLI8JVo_#v zYy>pH2^VNUN4V356C*tp>Z3X#`9cng`3#A%Evunn#tXx9VeAPPO2eDHTd`2D!Hr)J z6qF1d6R|_*Xbwxznj|ugyJzx(EOd&yFscDoU(8xxOf-yfW2eC0 z$Ywr>;DVwjW~S{RCF{Z_y%2&eN#85P8;#-&$*64YSqNldPb{;zA|n}JBfeH2WjQhomtt$(Mr03v8P4lm7A z?!3h=DvoGZ*M&jW#ny{{Ms8Oq68x3GM+|}D;S%ZPZ|xOl-lv-W$b{k%4nE&H-mGjL z5o)agw=M{>Ma}#(u&T6MoJwFnQyUGI979@wMo^f{q<{~SISyV?vEBW^0CqDYtDuB2 zgBio>Vgvm^dd9m9q>_tims;?|s zwO$680J90J8Z<1rSymbqKy`pOxu2dMc?i)DzQwY9iH1AqW!EuA2bKSr<7ft1j2BPX zkItjPr%f6jM~H10XepMI?SM~E8W`6_gSvhh+H_HaT%I%ad~cJ*1HMO!+`dlx`$Wpg ziA$`ah5vfw?RErKlQmBfJq(X?CqnI%<`<5GylPlZi&RHa`kH(n@DGbR0I46&ZBqP` z6I96?ItLI{3pqFT#WVF!NA8sW#_+*Xo*!KwE-GD6Oj4vA>W}zlq|2vG5wK4zGZ>A1LGAGu1dqBRm z{C}0<2mg~!VvG|IXN72f;_8$v5c{ZjuzV|(V$UByldWt~wTZCe483wWk=4xov3xnD zEl^3$PS{%U7Lh?`<6P--5VFX>*HEX}zUsNmj`%eiXb?u$S%P0QpD=`@akSgj#+A;k z7o(*$Vx-Bl{GC}&MmyBbh`Gu@A}xVp2XA$JW~jAM;-6V(M(y2&^0yOO%YGrVjsaG* zmAi}C8oY|Itf~sr8;xSXnZ^-uj>g;u+ZIdlci8DCiVAR5r)Xk*MHp_=v}oa>_4T@d8 z>eD{OEwZ7y57kq!{50#t4RGr!|Av`JTYd_G6cR7P+xT*99pjB6^_HP|^b-7DjM8J&}NJa^0;!fZDl&?X(ebZZL>Z=!dNxdtt)hEh-O=Z~nRjj6;U zI11SGqKVqcs0!#x7rlZn3K0XJp;nou;O5`Q876c^J7>qb zfXJ_^w0Xv#mny$5_B)(+_-mi-D~7M%-JXQ;*lh4BXej8U%G&8rh;d_|SQZs>e8-rd zyR>$gS(x+7T3F3*$Y*1yK97KHUdFPH#8^3ZIp-Xi(rqpknl!J77~=rU8H@(a6Myq8 zF9XVfDG+Re?|yN15}kP7#jde`dRq*N>X`YwB{TfKNN-CnKLX2k`$q$XH^P$I zI&e5^u#ryj81*SA@e`kZNvZ!{%BmO~RYOZFl-MGb5OW<=o!)Cx3 zu?1pp;UEgx0Aw+uV*}LD?Y1=CTUiE!HxC**4evBQ+)+{sAw;=cZd`MsMtpN_l(ePX z(g?h5Rz@42y_%JRe(wQu!ziMJD5j3hDEN5^W=a{CFBl4D!!@dCSPYK^T{TQBvLoR) zq{xga0jJ_a#g0ni%1kUgH+A=UDDxk$UH^mHDn8oMCH(SW8DLY2JXL6QGB=~8?Wp}R zoNVdxZTa>rqwV%(fvzUG9&?<|wLPQlpS`M${b{u#8F(J9DwL{}K*g7(B1nN;Id_|( z$cZ!01_4`4eB_+z8T}F>f@ zys1TvY&O%#?Mu?jWQ1ftsdg)k69xDnYQL{GbkW| z4Um#-+>(@eNlURk5cdj4WY^tsrTEe+sY69rrxQ(f>hr>0Vt{~!jIzIl0PQnHbzeCpZSk;&Vzbo#c2T(c0&(oQL6 zT^`Vdk3YiBcN0;3sg6+GJ7vj5JsVwL|T*QPEM*yGj_DL!d#=zrP8W)RdO$Z5axE~cY z#Vi#nBZ|=8on`eZUNoCo9dnun7t?p%Y&p{Q;gaRM8m(7&qj#z^ko}p<-m699aSulUPg(rOVV|FDPV?aIWHsZ)(M6ky zo^Lf=bt^cF=U)vodT-azh-Dif<+7RY_YACc;LqIe0^q=~GYupF@d5jm4*wCY#1EmB z_V=Q5IdEfw@!FmBNm)lpkv5z|8!vKd$%ZasV_vgNyH)G^tr$P;Qzax5CF-PWqX_4+ zK%KscG^<^F%~KN%piYy&8xh*1dkAAEr^cG0VApYSo`TyRf^h)BMbD&81s=uu^>={g3YI z=?4{mh^enVn}5;`#6WUM{wnh(uy{3fBRJ|vkCafUn40(M`It_Ts!4YK_Hgqe5;3c4 zzuJB>e{5)tfVqzp>jG@saQP8gJju@4zJA&EO?LN35vG^Bx`2cjgr&eakm|uArb$pt zru`|@ph#hERi+E;MLBb)_*Da<2rE8Zm>4>OlC;3~&iIYGpG<{JSs`O*SaieD3FSL#X_0Qmjvsju;}j4E`=FIX%8Obaw|clQ zHgx0b%_LLW9V-)Vg5`XA%-1XnZZm;AO#wO1*_s7OC`Ek5Tc-8Bi{*BDl!xRhx~tLd z1NMLS=SrV~{x{#r-5Kv8zJ=vwaTLS(zlU88TV5_|7nBAIqxv;kT@wtsf4wSYL|Z)o zG4r*F$)*&{gPQBl)f+@Q7osiRsa@++5O#26WQTD&qzb|h&Eg=dRnhNeZr>n#9oI{e zy>%zMb%!f$Ib=Z^s5D#m200%MOf`m>iqEBns!mnZ@Zx`V)P5S9+l8FaQF3F+(5y&) zEqo}B_Tk)DkHImJvXxhYvYiU>->51B0&N<_Yma1`RVT0>LS@*>xFAxYy`U`=DxT^U zap}=?soPWsoXTrLQebnyKBj0X#G(eQjQP3cpf6!52yd<@B5nI|Q5rKs~Q4&d6|U9R>YKJ)cO4p;sLRT0%3!fQ$4IxVk040!ugvZN=lkAFLtdOi1ohF=ge%^@D;ZO#lGq}h?qSJ0BNp=QT#+Vbe(d-=1ML7b?A5|H7^yr=`xx}2Z$@2cNoMve`MNJEeXQ(DMfGJ&h4f9Pp^ zx))QxlIt75JP7V^$&({vxUNJGgCb?o#&gk~!@>7jum>Oe2Mz_{II#+@8GWR~NGpDl zuL>kkg;@d3=;FYHM8uZcF8AQ!lPwoaCc6zuy@}nksiu(gExWX6_KX&)_--${Qxj_M zamJ8Sov&^CO2aD*qPh=;I?g=!&0{@WL*|WpqI1$jalF&0xLvREZF7n9g!>wbiOJVX zhmeuS38;`35dJotxPPNhe_hVIzT1HpBIGl9I9$k}p$&NSf|G&84hzIWJaNK)v6Jvi z!Jg7qheB0`Uu~KyUAo$?;j`Tj#x^njdWa!J85-QL1u{2Yw|Q)P@51hZDL0C`dE|1$ zqp#^x2H6@KQq|bVx!?`Lpo5s$9n2ym`}4Fl{s!Ro<;CTdHraN8AFk{&gRz!Rwe^@;K1GO3aAH&ebyx0NghEmH+d-lYwH{wym#k zSf9zdIboJ8q>b23y(8;PRj>a$qHym->ih;^Nq}>B(F-K z8EJeRnfC&lLbOrj=P!Y}&`Z8KRi>IHahbeFrcW4-Ip=a^`St?nZ6F=1lt*vfgDm?0dH5sV_!(hZySj$-s@4b__k1Q z#n>U0%I<#D2$;+PbdakNM0qy$pVfGm4%bca% z3%2}S#X?v?_dzv~S#*E1=;(st0tKPLp50z=&m<(N(Y#4xe-C6p7LL<3hw~&EulZS_ z{KaT5PS;h2O>`S1teJ`^!+d1`BG>{n_?-kVlYyS%>eL`r8$dq1*_dxpw zl{zTCUGxw+UB;9?zJ1US_&loHf%!`8a$+%z{lCd3KXek8=Z^G=e?l-bZNn^4CWQt; zesgEY#K!G{IDtYS|B+UKe?^D`{Y-T%TVdd;KTV!YS#WnxoR z2u%87)%k0!gm`GdtzQOy^n(UGy|~l8X^8InL8uDn|B=v5C6}^|*_zG2doS{g4@jR>+Cw(JEY6VE6$U4VO%AwM;)yLC3m!q*62h+s zfnsSu!8G>ZJS)8fI19nw;_X2naq% zF-sD~0O&1>C+WW60~Ym~cw^7%XrA(Tdf~^k6zVY{92MW}CYI($M~>>|AeOkrd47p_ zKq`vil^B^yE1lN`@ucx$ge_5`dBmm(N8~mU=Mw;v(s-Pi`Nx0DR|jtE0weJ_rCI=v z6R+$M#-A5&6r|iu{Vub>RLx4XC{(r}OnA`;loufe;^YS6WKaaPX0+uGC6|@R|BRWr z^5F!feJk=22}j%?fpzb#4#{>SS0DzV-OWWFkYb{dreTC7_5H~IRCWZGC;g|G-P~TA z(M&Z%8m@t?aY%^^VGgD9Pkz+AcWe-cSa zBUf*?h!1$=`i;(4aE#pPEd_do2mkmElq?d3Y?27%$`f8VOlPsO{lKtbT_k6*Q8YYC zjiLtL_jaieId~muK5JpeAYa!Y;FPxy87pNp4znM572(Q_M%s7l?esKX(1TW2YW%tU zvCdg=%NsYeCsd8;YuL5OJ&lGOmnTUOF>eSc_9XiG;o~;U?@9OXx53;zBYZ1d-*MKDUo}LH&_B0f;1r6si;8 ziw7bdy39{B#>i#hbULeW31~cj?@1k#e4xq>IUhs|a5&{4$vti$3cvci9|+#{8aF-Y zBa3eAm~0T;eLZW?OyyG~S8a!rAo?9AWaCeqjix4hCEkdq9~EoUoH{`WqbWH|`gzHG zd)#io5O>^V?nstO>kmUv1^|6+;20c7<5Bw)`2H8{@7Is0U%>O^xbKf)yYld#IyZAV z<<4Kc(D$|A_e=L#RdTS3l5gKv22Rs7cQRkvIGcDL<2$tcGi7;J$Zl)BpsQ!piuNv^ zr0zJ$Gxk^C66q*?(rNK9$`!HJhWErHT}L7BWbE~U)wwB}2d}vfRKPe|=mw7|v}(sO ztE0MIaS$_{3DJabxNZ|lEc!diPbP3>NU%F0!7eA_qH8m zCP$Og$i=JEevv5Wv|!26m1sS*D1z$H%1ezMaDFQ5z67=x1x z+JSuyvXD;#A#OZr9SoWvgvne^( zGJFp*OI?(B1)r@XJuBorE8vEcUnFjInw886g z1NE^aKzfx#pc}uOmXwHt(C4_&gwpec>Y%Z6gfo7;Ek$+RFpBYeHQ0It#JV?5U9knCp_M9xXHt@mCIIBe24^B*ilpxuD6^l^h+0KnZth2t>#UjoW*U8da%NL=&IC zNa@JQF{y&4IB_?$MHwztp#8SmEs0GnsQ&Gf8I2O4E@u|<(@<&HyBG5haCBrHrDz5B z!oc-5!D=#5rG2AyK3T0;>`P7Ds!7Q75ALPc6D0oD1XmwC~W~lY*^Cd0MDKT z0Lo)RZ&sQWbUTgp;jKdsY5yJ4EojY$2vBpyazzXmtppMLy5k@gkm?KKWz7J~}9DaB#&(+FtVNPu!a@8HjBQ_bvDMfD= zr$Tuo=qm;L2X=K?RFAnQrjVxO69#~!98vjDetP433%2#sL+QF!U2=;s&kN?wflCzZ z)nze+j!C<4?l~(IR)4t}ZohXHkbzsglzX|cHk<}ajY#9KV`Kv2X!JEWArJA6T_lg^ zl?6kZDn;gcW(*g^Zt)eG;Tl^%e^=cEPt-Z(*YLB2D9FEW!$6(%CyK%iX9vO@=@ETW z8E@jqo<})m;Z-kmCTaFezWz#JR!-$=mU{7~ZMN2>Wt6ALu38wYn?$({gq(qCVYCp` zXJcpOjz?U49ll_XK=l}9EZ>XNv{%Y3TeAtx__j!uo5LJ%zkXuY_zRvfCMbiNF@`aQ zzB;*&wV$=8#j46IZwaEFoE;!!(R^zgJN0iQ5=;MCWQKc-0}3&VMUN=)hHl(ig*JP> z*&#ZJL?xd)M4UfZW)u1WLJR+>5BEdszRSs_8Y~YcFXw7!hT`9p8g{ghpteN1hh1;_ z>%eV`y`P|O4|{5UuiyP>ni{EUMd5^@t4_mE)d4?z7}fmj?2_DL#sx^x9Y0tn@X~_o z$}-br6^ezSlTwm^b6~YUvwAt{Ac3tE_$x9W*^gyqSbz{nvHU#;$BQ3B201DWs>Z*I47oyE(uUg|N{^|Gt{16xzmTinKi zxLO&m3e^|fd9_+~>LSCL0Aahuxej$&(czJcbQCejFmpej9HaacMGJN8-GSPg;w0t2 zVxrAYt!gXOoj)D_1rIp(J9fAc!@*L(9x1{ejikLdo;FMZHOGvEg%LyUv@JS#tiOG+ zvlL9uo>?zCxk5YQ2iA*T4pUIQznV4DfLBud0+*`}JM{2ruOkiJ^+$c;smxc}h~4$~ zh8m_n_vNS#)F#F22f99ZPc;b( z$_rx4m>S3djjJ8FIg%76YSlEhT!ediOVr%OLp%6VRudb9S8WlVvQovl8f}MsV#wH? zGH+8Cr;TD)rYBWfF20_P%|Bg!{b?kOw?{nytX%^iOEA)b$G1vIGxD zp>mchW@*ingoN8kM;!qZoIovSh1we@nH0tm%<@e|J-LJ;Z2H`PlNfBI>-7cE?$Zsz z7}Yx@f4Sb{HNqI~2e^$TR&WCOJ7nY{^S53p#LJwY=xd*Ls!d^7R)jmv|J@u^YQ*Pa zu?GVQbdxWwA$|Wj0MSQKhBax;b`eCLHCzP`(~0bNbCKAxNBlgp zEIRSGzZO@1nd{;SuG^qsFO4JH$&37@bsQX@r<`v(4V`EvtG06&Ia{1K@ZrIvx;#IdIMV3b^7Q zN}vF5^|dhT@GmK9eYkwy3LDmrR~ep~%qZ|O*$nqCjXQZc%IEdU6G3}4EC;WCUXb#M z;mwS5H6fFrHf(Wbn~lHO>RM(_twxZ4fvw$7-|!KuZ8>MJsea3)??+3PN#+7K?7pL0 zB@TUE7HwH6hG#%mCQk7S3XO3(aA{QRw|H6qZQ$7MFUPwWbz`D_4p<%hqt6-lt^P(# zVSB!a;!V03eh}r$KHRHJWuRudCf0Lz^BcbCoe(E{No@MTBKx100bXJ2)Y_@qIcSoM zFnFdOe<;W1+|-?$X={g^_bAk+*E!bcLa8)0CB7 zlOI~9r)`|85zf&|*gC_q01ZrG2i?Lq0~*GPJ0dU(1{$xZc_n-Cr-_JD$`e`FBT?B` zpKVEtq2agEOC;P05!D>+3>GHwZ3z=aWQ6G9JW^gR6Ikh9zgi(q%cjPLq%F!t*trQ6 zObDuL4OOT@tFmLYX-vqpej@9XE!stRZZaKD`Uo2;URNTQ1BqV-fJJh1iO#P@BuPDg zDZO#%`cZLW_jY3UgUWN}u@(t?*az!Wqi~Vv*6Xth529oNhDiNntNLZPWH_m#>4~JW zIoSRXt>$wlqsYEWPWCX{tillsC!@By68dxMtk6WI7B^Q64eL(42_?su{a2A z#{``Ry&Ao9br)<1t!1eckZoqRPAnU%_#UvAdPRmCJBLK@7tRk7>N?NX1Q=_0s*swC zcX_zT`nZVf`YRyg9PpiV)0uH{DWQidjztH5U z2WAnfwI7eehLEM8Da_F2m4(E=rqhUid7tHY`1X$Y9tX`#Jz7TSvNBpoQ1E}lKDckm z4EUbjU5$hgWn!xgpA6*2_g@m6I#kLH42H*LvG<*vSu$%+o9Vp=*~f|0o%x$TTedg_ zIHQ(uiVg~2EBSQg$YR{th6e4Jz(=(dYpZe$uO-GlR0p~XSa2wHEGRS&;A%s@j|(ei zmSI7j{}?Gt6x-@Eo@7YmlzKXUH`>H}1bT3MdK(a3{nX&VgU|hZ`;^Xh*t5uPmh0@r z7GaI#+C~u?ZgZda2&2}+l)6Opv@m=^p|o%Yp`bskIAIocLzm}6PI8Qdv4UdbjSNC` z-N4;Us5L#-B-<;;N2-n0JS;m{N69Z5oS`+=mx}TPK4>(6& z|6BB23^N8rzRlNvqAW`b(>JkuuSK4j0$KE(HSvmd?v!;Q!rK$I0cw-&W~IBSCrZK% z7mBX(5gdx{#WQYpR~PQcI?I?V3#hz_`js&2jG!_tO=OTTd#hefm_PJLkuN436^!mB zkE~7F1P}AZ#c_ZoN1DInCR~|zVSo{Wo3K3(#JHv|pU@9zHO~e|;<64l%OEg;1%@2{7)xn#80(6o5$pzbM zYYKPA3&{ce9x-V@>a+5!W$!HDt4LVyunUdT^t zYzjB$##{HMN7qn1MZ_y!<%ndy7fyvN8O5uANA+X&f1{=DH&=7B9XNIUK95L?l>#f{ zo7A-5|u6GrZGj3SiP2+#eDU#GuRZED}!~novDrXV}*CJ3zB7@S&`+*EBrd z($#4L)|K0SBznRI@73ePWmpX+XC+*XRdNr%nJ~o?!=|wMCs<(*jXrAMPf|5{d)nD` zYPz=@N2BK^U($u;?kY6D0KrH^WekHCULntuc%|y~GEtO|I}fM)TwhA_KYF6u2~ zhy}6YV_GD(<}uZ` zVIk*oe{8k?@BisZcA(H|Ud4*TJegMevj)&wjYAUvSM|!sSjDp3`dxd>%@sH(lm+ z`L;J9mJyRt>u-v-m;bo)iwMIUB1vq;ifHq7Gi-E_pY>(?$pya?L2Zb8LF=&JZo|8l`VzpUJ?W zA^l4?ImUvX{i*-rbU`CEW|ltK`EI4I?64*wgrZb!D;R! zOS|%Kb<`v*@j;I5X47Aue{S4o^+WbdiNl6kVFL17zBt2CTI>#CDL$CJk-7Kl3a980 zWJDJFUw`Cid1tS#T`{=kD0}V3SuCE{*&S;R{rQNi*8#7~X5;FaGqjiAp+kVftd7Fy zp4?O7I$-Wll~>{tJ4k}zNgttf_D`aeY z3mRpHrllQDI)B))3uoUrJt(|k%k}hH{$`}v9$YAD^w<}fhw5=2>$AGi8d_S+Tj;0?$ zW0W-=#Z%#%FM58)>65bxiCz$PoZR=ef>RiTG9U3|@6LoFkTTwVNbUBOqUP(}=4D88 zuyO8~)0XmUDkTDeC)Z5jDemWt%I`PK5@vj8yzFy1F$Jt_kP5uQAdpEUGsn%~o(;N2vx7x9tWmIFV};o|uu|BlCZ8-jlow&oEh)%!G+08Q8n5jBWpO zzWV#uc4AX-hD<`R!$Ag40`W+V#O_+;DX%3Gg8RAC7#coHP7!J zlb#F|L$_Z()Av*Jp?>a&CHgfJ<%rY+H>~uQG^O!J&Ij+}syV2t`HVrRGtj*k)+0#{ zKs&RVii4gv))sRC^z?kLX$_1zI_)cb)Y0aAyIZF(bl_|ps&MfAl(OsG;_V`}9u+25 zqm1}4B{-YDK?A)?CRj-lI)9Sek-oR*VnFK-&$(9ol7y!r@Bp22t8#$E#r0G;H;_^x zTwnqnBp9)HWdu#Pvs+Oz9xeMABV-pMph z4RU*DYHx4HyQAI_M2x}Dzt6{iD<+JXr8PdjjD+p+s9kGF318aAap7;gqJ`-evzK?y z9=SXz#9idf8-DL_iGQ#VwqzA5j94?fXT=HI)9YSeH=qZwb$jQlDE9=@k`*Q^I$+TU zMzoqH#{fbyLNY}nmmlt9dW-#8Y4BK+;x^d#Om8WF<2?v!{9zAcjXElJu1d#PW$!Lg zwddaI7&WWh0A&02A0lzJ^T8j zkmeDXI4=B5$W?~sNO6Pr3}4cUb_|_3ejK*L<^wko%|SOI{LlR_ZX#I{pt0-@^A}t6 z?gHW!buemt?DnBf;1M>_8(Vli$n%-yX#Nn=K2F@`E2dnO?b9Em^2RlA3d z-!N?E5#BU*;(K@PfZpc8Lt)3p5ycM^>#|*{Jq){fmn+W#%*sb-CD@Q!p2R==iJ}$g z03*Xk$bshhWw`PGA6d})5ysrn#`9HMJM5krcBYBvJfMEE_%qjLjp-*Mq@}hHm-e^~Y&Ao+%s8nqen*#1&JRap@znxQf zUt7%O=2uosJdkEc2>GH-1_?c~R9Z@ej@WFpvY0@1H3?E{9fP$+=Ktb58`sZmp)N^5 zX+lq;aS#a3Z`m!bq_VxNX)4Y!o7j(Qf1y%2OFmS{MCv5#dKpYP_G{JM3Y{oVyU+VL`czF}HX>8L<5Q4JTCL z2pWFKnk)R+fV0jpD&1{5-kGTfo?mDPdA54cF*YzBWs_xi_DZrlCUs{miML2|lcb^~ zY_zlhHR??6P$i=kaxjZ3p%^B7G2HdQF7=7mo z5Cn<(YN;Jmb((ma>zKuRo*G$ZqQ4EM{{2`Ics~-0`wR18m3Gj>_AOOoz-Zga zQq5F=6F0@*!7T!Iie&t(*#C0BDpTm=DN$;Zc@7@*92GEi9Jvh4bD9Q+QP2(=Yx?1Ah z%Lu6Ot=M|%ZoMs)H$00r63N;z%+niWl~-}>a7yJ`7bT2isv=*hCTv0r5^}Y^-$@ZV zWzJW%sP?osoIo#S#>2)|ld(K}GYBy#G-`X9;)XZzyu{t|PE*s-OGiM$Jj={?0484m z2yl!1rCcwpvm7-;{TW!ob%ch?lpkn=9WdM-V1Kv*qmd`h$a~sgOZsjlM0X}}jmiqc znS7&|q-_EygDCf0rP`;Yeb#cLDsfH`{mS3u$^M#q>Pq#Tki&?Zuv~J?ky_y0vBD15 zVmz&SsIxw(b=5Da6}Vhu5Vq0NhGn$?`1P3g178_J$Pls(bWeDL57R~HjjZNh=Msvm z{ZC@8;$ptd<3i{ix?TOg;HI3!t^Da8RR<>1_(X#ssIh_H3)O=)tA-ygwmboVU}Az5 zTf3KEQ$+`RA%8iHK)|a?UH?7;H(BV%?{A!eQ@NP~>MQNN*7Uy-4l7{%eXJGRt`HdQ zcHq^Yd0J6ZCaVo5EN*$Om#K(R6X^ZKHs z1EZftgVg3QCM+OVVwCX;XCe#?b57@u1HJe3 zgFBVs&o+g17HhTw0@kc@dOlN`wF4qu2kw~q^9Bs*3}9V*?Q(?%TTD8DOW2>mTgDOI zozoGjkJ>-=b7y8j`+qu`zn`p)RLhXU$G|4<{NV-s^qrV~zfRl1zTf(VG<$?2EFySJ zVx#~?yC`n4F+KH+D+SHMZbin|dz6_@c4YgqccW{%THR>Z^_R`PfsfQ_kd>&ZYxtAA z1%ZvY89F1Ltp9Jfy!w@fL8XpueYa?T>guFJ2J589w$M7QIU?1lz?Q` zQX$w?JI$^UfrGX-K9|}w4T9gSJn%*;=Z+=&P5;n$QC(+ql+%E}eDNdB{WbR^XPTL! zY^Kx-A8M+!JYkRU&9B}zy&=7}uc6l?=1f~f47&n8JzGNBlmUfhgSA99ho!K4 ziv^h{84u5Pbs@Pc_F1mBOzuyOActP`?H-f+KZ;`R2F@pS4m_q%FXIYo?Tt>sRFG;c zQGr|!QjLfLxU0+ZEcm=le=8gGSXeir~`mttg^-<3lNXJSqHwA1_4 z;tnDn5CQ)_MJv2jt8y-YyS_d7=WFVH(B*4pa;aRjp(5MA1-0khTQ+c$@!>7!-K!bg zWubr9w#5*-^TTTr-lrFpViL3*~{QJFwd_XqE!Y+Iz?f3rm;BE%q zy>E_y;T6U^XPB-bMYq9tBk3SaPF2tdf*iMJT2HXX{W8sb-vGDEi5p}r!SQb;4Zd>u zShAIczCF$KSa^KzBNyV5#iF2*oU8s!ux&3CJl;G7Q!)9L!uRvvHv@BcypMhZL`>yQ zkO&vJP_a3<3fa%AeI|*#Jibp0eI{3jsT+O3UYN!C@BEKyaby-e-r$v$I|w<~>$?BG z>rT0>VnQJ;%^tzuDxphhCpjSR>W&Qgav}1z(>H`LPpl`zBMs z=krL0t>JHs7F@k;yK`|=eg*}b8OeyK3 z+%PXy)hXM$3(jJU7%$XK73g#?6VdswX0Lr)JpF%My=7EgO|UHr2_D?t0|a+>cXx;2 zPHR!En?5?U=v#T{Rlf~jfo1BMtDUw&9 zM_RjPX(Cd5;c3FX6N2@mr8-s0PZe-$CVPzf?vArTwu{CDoF>)cW)_u|+>wifDX`l}0_>GTE;1@eVwuXaTN-41N zkV3PT=sB)(noJz}ZP%SqXVjJzE2(E*Y|RB%6MrvLLx()(z1Y0#a9?`ceJGm4yKB~a zC>u@bDShsHEGB;He7N(nFf}$1YsxldM3c97eSEjOFRKBulR{(|YmQHnp%Qp5)Mf$| z5+>w%G*UUxC6v^d;E872kRM4j3k#rxy{^r0&z6>aoR<`(SYN~Xy0o8NHcBinSly%u zfSWt9$mr8Ro-73Gx8s1#*WBNYtl9C5r-15HgY9Hu2%LXU?2t)Ccv)lTC+lCORa1Cs zZ`T=5^E~8aah^Q;#nK}Y{*;QjF#{GD28-Lw@z-VDEyY3}ockoCScs4;^?fV@AUytBYh{JY6 z{6&u-iuv}&>xpc~Pp%*%e;F7ML|}3?i)aL?Bvs*Q=`%H6p(clAxNfQV`sYEQO0{7RzU$0EfFTEAAE zDq*Xn#Bh4Y(_uQ|udvxH{6X*3)NGe2t92$ZhEKY8EQlI*Lcj z`Q~o{nH(7%S11?0_COCt+x>D)PnC@m6o1(**~Z-~+2*(^>G~tkgb6h=XGjRYsB?TY zuLW$BWHa0^66u|L4i}f&)2uXqptjT$mRUW4_Y{7_RHatR&|m?^S=GpkpbzqBAwRol z;k{%bHPFY|%O-_br4=~GbIIQ|>C=e{s%Mip9^mMex*?w4mMhDsnBp#@m>Z@Zy7UE) zovDY^-pF$pk^1rx0(eHAJB*;YNFQ*_VBlWIS+|U<6pDeF=deV3l=~jX zdgJn|$?2bQ`DPIGSU7^|$X?|p1gC{Cd<%pJJPRkijE(>18BFi8axG8o zmo}P4uC?k+BSLOngn2qQ+_0#xkE`U8oj(N$O(_EP6v_?C@9MeVkN3sHCr^#d{r|_9 z%-!&NxBzb$+L}nE-?Phth6h@N{WwLow@GQ1xZRp&DOU8~IR#=>xQ^QdP_UppRQ+KVmJr(8LBE=7)iZyii6p!ZZv>B1UGZ;WSY zqCj8BYmL4=L+_pXkuT&{$N6bi=nV$PDa^|e5@U#Lj_HyEU0#Bb z22DbxIeMDtoHzQo`i5wI615>pf2Fi4<3Bl7xD{sPxnWNhp$y+Z-qJcX6)Dd7Yi|mj z^m@IKnQ*a@8`Tl2N{G6)+E$IInst+r+g>EDc9dDUm=G5EC!!IlVcVJy_SZ*a;LHVg zdwDOjxV=Hg%R-aBg(J2}m(eIvkG@{-msy{(x2e+*Y0y9cOKv)AXxRQQ??eJE9>cz* z&aKH`8Xw}u>9D1lIPKAlQpBpko#gF_x|{B}+yQD`+^%T0{L@bfDF*17k7Q_hs(Z#z zZ70@hgDa$GmcMT-AeK@%Ax^$l0p4Cv^Q{8DF`^_T-`;l#!ueM^ft}W@0+aV`i0qW&!VPD*q zQQzy>Z#0ar5)6L~3ok>Nyu3GncACzvNC@?arwt2?HvR^CE!-ms0Hzp{Ms+S91 z1J(0*Cye7VZ1C12@H?1F)}4&N2Qkk}gQE~%U>Ain!chBBFwk1(2-7L=;S%^>&2XZM zNf*qYd2RDZ0N;tz!HwE|N@uWd<0>WZ!W>ngeR|#F>(X;Fz_E+K)%^Lj6r<3-fyNCH%QO`YWhtmm}xV1s*~JLD);wxZ}b ziiP^eTh&{zu;fN;uJ#6{ufjst%QIt1ZiOa`S19882BNMGvhdXbYlSykl1_ziW9o}J z7ymlJ?1RFmdutW8PJG<8>@_BGU0WZ~5;mAEp?Tl{5EmFVb=?vEKi+LlTth0}+mNU6 zliI*J6`hI~^+)EJ5u6~LEw5vfP+4=QCOnK>iDy~yi#(aQ>*TI8=-c166I0rYXMx8T z;>`3Ow)YHM_ByiXQjzR_agT=%o5;m?Rw3*4ccsKe;I8O!eeIv)%lZNQujgB_sgzD^ ze;mTv%iSzKO;K(1&Z!vsZ?{r}9wPhPtv-dBjXMRODV7L*#(BQ_1YX}thz$Xnj+Vkr zD)Wzf%d0b~?uVi;7th=)9e;d#I?kf=FR1ubA|k>`q~pO^YAM)FIIV4(9c^Dh?f-CQ z{2ko*TU3WVhy!G<6iG$|m@UjqeYvdGK`>Bt!a8jk$DB}DUU} zbM5l}R=Bb}X~`C3H!@*o+583n#>AHuOQ~hGWv0QhejG@EbWklQh-5Mk;@Ew`#451pnR+06X1WDGMR<6q zHI6^T2L`Ej8vZ7lz+M{rX3k-(Lc|8!@x2aFSq-W+ih=Lp^wZ^D}5#GJdW|XXLQhckaICRdtfeHOUhCmdgiq5N3YVSTbNUDl{yW%V}(A=uY6@ zimZMo12%^=58{EO7|dYE0Im|%aEl|Di~7tTY-d0eLRkQIY&C4THvcE8a-UNijINjsYp z2WT#rxvG3#+&liRX|5)Iw`x`xZ_tN0;#T-&`mm2gNP~1#YWF9cNlGQS-X>hRj^}nE zGsiIlt)dKB&&}|}{a3EtYh}GZ=k59gnWK3?UWIO1{J;@KQ!K^~6nJ-{k4(B-+HwQ)LmOLAr2@x*M5w>fWTS!icj z8d%_9HH;G6U4Ldv1-bK?+VpVcS~gk8uf<$*tt9Aql3|yfE)>E|vZv=AWg{rif@xw{ z#Z39hrsZ1StSc6)uz%NMJ2%G7%8jmR*!*1I_~}rbdPp6(X8)wQ>%q;T_qt1@1ahRt zqRZ_Uq?67>5+DYq;Z~;bg(eyB&iK_MZK(@eVD;G#Si^0OCrW$bo@;kgOe@mAFJyA) zWPE4CW1<=T4Ha;NzUkiR6Brzi#Bro4JJh-Y0M(N&`rFVv%uzD_%eO2(p5Uvo?d-*%2zR5aRd7=@w4B1jA{fnti;LOtwD67c_8?GiDaDl#~eZrJV$e}6ew;mKS) zQovQR#W#p8DnCg7a;f^`Y-)yGjI)irjzd-AQ_f9+62I2FsGFjAi?U`Hn~AYS?1>Ye z+a!Pf%fN)vX=jV3;|jgU0^k?mZT#UF+vk`|*h+O~=3P}F#Xpwh^`*w=aLwvZi+xhc z`!FY8F;nP1KbvAMEdUk**Bg{4!iLj? z*kJ)Zeo=5RPeunH?I=lRT$xjATQ||ZD&z2TNRu$eDcW6Y^o{~m?d6gby8NK-t2Zl* zCM5B*w}8@F5Bv&*{qrRUeFt>MoVFVGJRh0|#MFdW8(zcuB-2}@>;o)HOQRPx?XYcT zc}{bixvZ8AGp|*hJOGdIP9>~o>~PP*?FxDrG$O7s-{;y89Z!8$n1{8LFT2DQFVN95%}>1CM+M*P_P(>&O6JucA2 zht~r8G+J!>V>N2a72C3+{>6RKtUOCIUD{sizz2M%kFi(_6}Xf7`#wFub6%`usJn*v zd4_k8)9CFH{C>pIkz1qE8@dMnQFi{D)R!7~4Ke656ROIFIl@s&rJ8EZI|l_O;k<2g zMoK*SvdgHW;}(m)G3!kA-I4Ph;l#62?^AjDt0+olN$C0gfv^yyx38Ctlsk7>_Ad-S->n zuLxybfJ$Ol=4UItyHZm5(Q0H<7;Jx`i+)hcet{tgn8pmF2nVL8`GO=|flB(=>q23E zuY@hRbd_-5;rk7gUgsOC+nWdE+t%P(c#v56|X!0Yzlk@)E&jF-v~L^X~H6nh(~;NON$;RpJ7$9S;hB|nM z7nDHtu<<@O_tqxB;gBU7Ej0o2!jXx_ap-PV#lpgKcdI!9!`cg)b?V~5N#d-L#qFOx#L&yv}`GF!wV zJP}0A6;OL$h+1)04R@GObpNphx{=ZD@0SEKhvOXYL!O_ly}Z^|L-=*{g5GBCUb+U< zF6cIzhD^MNi@Lc7gH@cbaM(_(GF>>u z-S%I0YCQH+FY~NnIq;XmYddXOMerQCW~tnxgqA^OtIpd;i1x&SbpcS{Qh1sXG*)#J z6s|%fC^ctN*ArV3rU~mUom9G_!r zb>V%Mf;a!TISiFp=5)t~O}Kz!wYMS&UvB+Ax3IHmfMqz}Q;D-biG7Fx=xNNUWSUiN zz&~TSQElFB^QPv$Ndf#^-fDWzR>ERCrLFvWjstbk zDxW^57g~vICn=8zI5C%x_)rj^0{yvGvN`{%t#jvmR#h(ddHy|v;@QYiazdoE4pJ%V zkuq<%M8*WXcsu&IS%xNU7_Abzka5)aJ!AAu$Uu33q2wWR7o|j2R)+#Oc1ISAy-bvF z%*@+auxEU|{#0=x7$_Ccb?3M3E2bD%BMVT&*qT51a(<7K&;h^EM|>;Z-z&}hrjpUN zlERVo+g7+W1^DQf>Vhe`UplBiioI3fS_|pnT=I zUZ`cI8FtRN)D$s6Suf(kWhW4>z;s?JuJQ`O!=r?Zd1)X*-@Bz%dPboC7mJE5G>vCn zzcUYb_tQZ_y4yH+<4^0oG%~S`499opq%9o zE0ut*8}kWr(^dr}lM}Ma!WSDW=v9Na%MvF+g4yk(B0u@rbYQd^wp6~14b9@ljox!~ z>e;v^DG-o6D3b#|UXOPM)DrpD+T1>_Zs;xmthS+66EB!;k@rX7HFKTrW5(#`P5RJi zs>!?cduGa!_sj9xri{UF4{6)jz&Bbf<5W9tuS{vj+Sl`*xq}gxN}K1*4Zu||?L4tv z_o8)Oi>!Sr&-7khEk8!?k#0dP6LR50CG7+-1rk<9uQlnIWNr^s>c)*4e?_x(HOe@N z>Bg1lt+G|VUp*aBEd|W;Eyc~0OK5lKOA4QP!b+Q>q)L4*z%-rpzPVlXJKj!PD zzg^HJz1ooJ+1l0J=rQo>Pp&@aEm_gEhR&9MtenW%+VJUh0xzID4kgW%8t?H(m1W+i z0H6hR{juKpy3yI<)^p7_w|b%TzH(&xUrI0 zYksnOSvkmDZ#zavx;fwX{I0Vw?w0WeP>pkhcV4AE5MS$q2O>>S8xT7b-otqIDaOvs^slcYse0>1EpKCYts4oEkN0n-F8QQGQh!L( zL9+_8HDM{aQE^)qp=@hsbsH*gNsGXGRuCF(D*#VDBL0t^5A7-(&0M=T`XM_2^UR+x z^&J+Bu_4{nf5i@0Sc7A^r$&EM=MuGmQ_=Bde}C@o<>Z0S+uOm2g!}TuFI)Btf*C7_xuJ2%2&sI|U8huO z8(n5|L{#r7)T1=Xs_@voGqv*s)%WM5Ub4OYg-qTyB}J9wF7@7hi(#3-lZIihmvyz7 zSJO{rhkZh@h6$*ycgG-~MpXNIoWk6x7u}6wh@thFbMKz(E$8U|11peb6j_k@mh5?G zoh0)&kD;HIt^Nnm^Ie$tdjlQC*d6^4%oKUw_f)bS&)e$(<4SKFa-giBRXJ3b-Ij4ppjEhK zY^!d#R66l|7U8QfPY6JF!mrKLvhB$#s&GRK-krj*=|bV1e0Nm1#Vm8}Px6%Sfu(4P zP@rD=XJ{^sdI}frIq7we_H~2;ix#0FF!w^zG!S-Rpa$q&uyR~K+To*}6`}#Wt{y&x z)9-vwTk%%bfg1@QPCTt}{!_scuXXj7>;`G{vY6zj$g#(h(7*#J=ayT6K0A1(K0(?W zrYF5Gz3(N*m#vId{zVQPSzKxyK2Lf>=6~Q-uYe<{3J)TAeqn0Ral%=lF?^|!KC8L#9KB&3IYqxwbN21$ zqQpetG$bn!f0tpN=JE^beK9&Ra-|5vX1V8@1=2jhi+6Yp@^Y~@n46MYQ|w28o6HE{ zgd*-K<_SsVMV2DuY08K8y(5;;7-=I^5kK?-%tzSMl!zO@&&8IEWZan*{yc7pq{e}~ zW+hE*kpKKpeDhqUpcd*FD)OtlJVfZ6_qacly7d-NILKMM%ww*)(p(FPk2c&`>hO5KXlK8S{{&Kly0}koDZ^Ln8bS`9 z*Ms5#@<_0j6pmR_2eFZTXzSi`l^1Y_pAb*69=hbM-8I(Ybz0wAA9QA2US<)%dLT0H zRdC6B^fU6T3AH;(Umh7lc3SlxjSIe3d1GF(_}Dg*w=DVHy};MqV~>6VZqBMm7LiV& zoJqsBx+8@lDblNQGx|==l&&rWnU7F81UUr(PGTDo&R-huCw{nhyOLt#=?y|0H5fF5 zNNz0G7Q1tUrOlhVL}GuYgxG7oQ8yv2LfL?^ai-zi87<&8mvPJgBE{yFjHDL&_6v-| z4_6?PP%N4RRDz|@AqPs#*%zG652q`FyLvPoSM_s(`Q|@LwVq#da3mNL?MVKc3;<*M zV^Fyz`o|x|h(tjDNh-n{_TV3*V^prW+lC!6eVTuUgGaM%bgggGSNpC=7WeUmb62F z>{u7ZlHX$^@OG+OIpsA24cRykK>Y2>Z#5_^b7g{$L>u_Ma!PC6xGjI>@b!=dO)t>q zKd}k@9$xbGS28rs^FrnhTl1uV1d>j2=7zrc%s*8>Pvi(Y^iRI8_{aWn*=oQK)S)dW z_)lc_7P^-JJ+rsINmfY)vCbS%?;4}()!6A;CA33R5W&$BQ7;>8e; zIQ+5mJ?bqYY}N(ECsCSkb>~BYSnW|)noHR3%2mH>W1>fkHw9Li` zvpu%UyvFviP$lle^79wdz6|O~z##mFymL(@I1}(-%FiwvJqg|x%cGsqU>3(Eb?e~As@K~AEV`X zKl)H5@1lJqYZQ;D*)3Her9-!e*>Y~RzQ#JD9Q0)133G_@r8l>qR1CbnY2kjD{(LUQ zE6O8YKRt7#9k?fLRSR>1%4|PTkXYE`#DhdQK}YGW7)!G>hJn@*(Xl9q*t|)gX z-!}lO@NS;Z{i>#IdD4WoVDUA(zaF^(AEiO_L=#$b53)RQXG(=R72;-V=R|+LYl z1-i(g5J5FqBIs09)q=!OM^!g(5p)J5`^HO`Emfc;4QK@HD3_f>yuT8!5Ixfo)}ZDD z<7Vt-_D(NFAr*{!hgUf{8|;Qjr+}0CpUpvcoqn5IwV%>v<)(GnI_UCkGgfQ~LZ!0kwe(c%c?*d2%w#UkoDvyc3--&K+ zDic-{#%gKUEcxolP#*cJl)EI(`5vw3Sd*F@#lv{kc3{VkvZM zmM%|oO=92Prm3NBkuLh?aojQZ9j9d%->g&_;1=vI(4M91d@dtQCrp=w@lgG@O*>A6 z(?FL;&9YrvRfggY8EykDCvny~^iU+3CkNw=CQDbIuH>}baVkXj|3*%ZB}{u-JoQvt z@AmKg!2cg2q3sd)*hAljMg)c|5sjQk44zjmZITGc9$Q*~y|hSOxRaBJ83{hR%+iy) zk(`e1laPx^*xz61Aj9Y^eKaUr0FT=sm0Y&lgXY$!8@%$WIGSgUJ zFM%KVh0X)yQ45F*))b8h4qq>$@d+`sO}0=!+t~Nzd?O93p;kv%oHzFbgBHsBY*L4v z7ck}$7$O1zqRXNd~Ou+9B60p`sSm5_?Jj+c^4prj)yJXxR`pOUtkFrM-{=?NAB; zGF>fmmrU3VbtLgzlHCNC2_1JJ{HM)u)%-dSodLr3BQ2(P^3kBm8$Hb0+QW#Pj!u;NKUo@QR81F+{>p=)F#`TG zI02i<+2=L$PHa18O*Yz%C+J@m&WH^Qf35NOR%n?xMjVhG{zJpK14)vk<7)4!tIh7O zfB4qKlcA+fFFGhQcowDZt(@^PVE68BpLrISYL}LmynX#byp!?72Us|F`Bsu3uX>RE z*{5LiKYdeEnF}^4V2SB`5G*YIw}P4M@|T3-nPmvAH(52rasr4*d`B8CN+3e&yl5Xb zk$Ns<=a2nR#5G1k^RCSGGPsG8U{u?k*Fx+En?G02w#swWZO_vThCjvoHG>8$L2c$e zqW1&mDB@86t1TXo{W9`#lPK{x@PTQ>#5a1t@UgOCe)*pH@$lh&W%z^wHNkT@@CD;C z?%VAu%!E#dP|Be;Y^1En0o1I)=@<)aOFlkQ`ocKrl0)*=lQA}Js(0N;wq=6oQ6Ipf_Inl(D5`T>r|@c|Y6WwA zm=~H<7WHA!5?%3v_w#>1vQSg0$YbX6P<}t~2A0(#B1J8<4&Z`z_sYr)@4wMS577pvtYA%9`3(fC=sVysw z8b;A?{Q&%Om4_qI5ooMLf(|L2E3E&Kg^hD+o%eU()+T;!B-}B+9S2t(F__{AapgNy3Y*oJ>gvec==f59L8H=i zt(Z9O|3z>|@XO*}YvXu^rQ$zqTfnN`LJQ6`0eWZbVl4mO$t-vaj#z8{l{S8Xl4lTC zc^|vI<|P;2PNHnR!LQH^3i@-?W^fc zyVug^F3ik`jYb)8BOY-3cS6fX*y>E!azEy^Ftd>kD0t7e=|TOZ9*d_SPnWnS1}_?-I@hxdH6U2BBIyg;D~EUiq+7edw~ zJg?{in7S$rr zY1L0>vmP`~oQh5Se6gxnyoRL__-rF@9Y@ITwKIbJLuG5iir`!n$@G#zx{v^gP^D0% zKdx%4&9LbLgq$E<@|De;g&0ARN-7jO3amI-Nr>;YlRCKz3VLE* zcy~^c%Lzs{M0cHYaH2Re<$GQn(L%SJw=G!B+Nt@tyPOXK+ninWF%i)QM;y< zJD>dt3Hg)fD7jiQ%wB-1nfznLyuneA?!2~rRW8;%X*`!Y=0t6Z|6L&^WKmFIHKT~tI4()H*-En!8&+{TX$Y-ad%)7tWqjf;bSQi2`Gx`iX4TLz+aD)9z zgQ626DqVX@-XSoC_D+(@eJSR9? zazFCXOxzDtJ+G{ctQVM}Q*>^jwZU>r)LAubCXD@TpJU&oNtwVe@b6&pA?&V@(`oFk zg(uRjE|)wp0DQ)9z(KKek&lK}k~|hw8!hN>(7w&Gp5h;(6FhKT!GFL=!8EcszY}e4 zl=F;+1Z?t$hXMngxrE}&pY;^1FVzGv|Hs=lphRjh#(ECT$L^9Ts1|u)MuVPPASj|p z>JUY44J^yrSS&9^xvgX&qdyM*S_O$L#HIp+=mVe(!6Jf)O)nvW*m4@B2Z7uQqkxoP zW{CMuf@qcsnf2$2Om-kqZdU=vDZg)5=ZHOv?D&62f2&eb1Z##WU11{;+5EWr$XWd= z2`1UwTtf7!LcAU%`y~81p)u30sUM_5R+{4H zh^O3;_MofzQ5N);0<4L-)`D3777&2>2|GM)9!Mi^`=`^vbwjr9`Fj|8(q}(}3SGd2 zFC%JqX_{Sn@r--FK@(s83qR{YgRXlO0C@d04L|$BkiT^xj*aB;RCK)jx8+YklRD1p zIfQ5UHeaizC@B7(<3VQ$-?6)-d9;iD)!$sTKiA=S$lyPS)V9-X<`2tPWtz;5wDbAI zrkUeXy4|FM47=SEJwuBxH-CD`8QBkh#jJjTQx~X1h(~8nt{Pty>eYVMql{qy;=c%s z;{Kv&ke@Am7NhAqiZa7_#b5qL_xsE4mdfaud%_wk7Yodr4f6=B{S9dEm4ukh0 zjSSYuqHfo}KYoI{WrIRxi-~mvXZ09YI{dcVp^y^_F$nGcPSgAM@6Sz+<;i5WYB~rTg1;-{tiy#7be0=Qj$8v_x8SB z`xP==E^_fuL^4p;>wvb@peyq_ek- zNg9`RXYn}CkZAXo;+w^v?eTD~o2~?G87&Un$ga!jUwqQL#?6etxg0hm{*I^l7Na=N zql}O5qTZ+rjmtU(6n^UOvirC$1zm~S5OtyGP8I8Oc~1h*>JX>K`E;Q;Nb)5m=VT;; z<0y0Rc28el5Xa#E!}xG7a=dc_D6v2Ky>>;N!_&F|%$b!h^qA})W06{tY#5H6e(^!9 zUD#jyp3wm&!T*Z|)weBTduA@?)`RI&irU%?G)2H9*k}L?iZgMtxfib3$CL6&xoK&s zk?1$xCv*~juMIF`n|j!M=EvShLyy#5gz?fjU7j->b0b9O*$dc8t2-kWom>4Dc;TprYqQ2=pNAJuzTAM;#C65WaRmTmsf-reQfgZ77fT zJVD-@!w!?vxqHfj*$N#5va^gaAmlZA4nZgq(r`VY!lw6JyTUvp95Jtquwp+HaW4&xytKfP)Rw$R zf2RSzuC6V$TQki6BL*;gL=63;&tjlrpd=k_YM}oco3`c^BJB6q52-6eUzna)m^ihZ zS%aw(8fjomUpQ|}JXJ+jDQQB%t|YDw%bZEFG~HNu7KsQcy(99_DT!m@_^h|lprMc~ zVqxE!U8{Flb#@qq%_6iew&+4exn)NExm@EN6^jPRW~Ce`3J|}FxLZ6D{j!~{yO1bK ziTMkbBdCo^Xg$_uFrDhND08$}>Ym_y!w)>Q!f4TK;;}oO6Z#=s0whc)kjX_*q7kMl z-qnqXga;p%AS)#DSV$&S|3kSNCYk7KGUc(3e`NxSq%3>vhMAzckj($&;`XvOxHiK$ zHZ(nh1VaO@zH5JN#!YTL4cI=}6UD<9Hza5Kp^*hr?Be_O>tdX;0!{}b`L$3UV1nU{ zTw*oo^i|t6RM6ECA@DrxhGb6iQ(N5*BmZA~h)40xPR03Pe>r*F^0>!3^qzmi9J*1V zSFj-!B#;HMGsTp#LQf)Y&bQGynXzLoXa2ki@SZQ89>FhtpR~3Zq^x9|!<$9u2_Vp` zn)f9C%vG(C$3Zt|qWqaG!Kv zS2f%BCV83v|7aM0JBeAu=cuc;7A(?3r@<%D8Tv>v1NhtP#JZ~vudxx-4J|exWb?=s zY-jU_hU1r&*0I#^q#q<8Wdb&YlBPGKaevyXXUQUe!`t2!4%IF}&nXj;)1;`Ot>@9D z&Ldn-K^#Ab-#psiGDG)I*{R%)C)B1e=%Q6y)bCLU6s;My@N7-FjpmL#h1{gB>QgyVZLgwf!^6atHoW%!l*z&s~pls&$Ll#H3; zzwH&v4A&wmYoVJFeHNH&K~e^PR0C5%;OCT!?N3>FQal&x%(!=NJi?4-zk?{)OKC8r+aE&`A0Pt*8tbD1B-oEa%mDfI+ zv-=>{m3}smu}|aXZ$AkwCn3!nSmIBAq=FjCgjBuaT{TA76`)zwRhzb3QOah@J9ICxtrxnL}N239LlFmr4LKi5DG7N37vgS zjg$!Ot15lzn^QmXe%4AwfRL!#%Ah_itY=kMxkx zjnU0~pyVAao$1FunqxVtCzo@tUmEMy*{YzZj8+>gy&D1n`A|4m9>d+Q(l=V zXG-TyNs^LJSIxp8nlD=AhB6yHDHFrlGlz)xK!<3GVe>4-1kGW=$$gCwt=|R12E(Qu zh6BSM&lQsFDUK7B)0ONoL>ErmY6~OI7043E0;+F7^kU6O`G!PA{rUY<@2sw>!LYm8 zk$i&!Llijoyt4!Z{R4vFpd(7{I00NEz!|d-cg_sk=FlVt1?SvMEN!t0A8#7R(0QiL zj8=39s`V!zc;i`<_o1osyAkdzxo=48Z&}|USgE>v} zu$m2ZRvsb}BC`9vFH|IrMvRb-7#r`J*zl4V9qA{kM3_1Pk~z{e@%9Yy(CyKu(nRZF zX`>0QHiFfhTHei>w4L1{?VCOMZc=^^KvNO%(0vd0o4u49sfA?x_mmkcB*_SaWKXbF zx;;t27^aMEB4PdXs2UD~OR$N9n%i;iQ0XaTl%!K6FDnRnU~EhM(^lU3PcZU&0uuIO zsUuu1=g(Eon=lb&iH8fm1jeMB_%La z-q6*NH4Orl!yrPJ7gR0g#MV$6O;tlgt)@Y(AA?l{B!=IJK#;UTsy%wqdB0OphtY^@ zvHxix)S05sBb3=PqVNTy1tl~qN#YSXBnKnBkNej+5YsGXJtT?W^+?u?RYtzTzrsHt z3wba?#M|bv$A-DeK=cWD=mk!HZ1eCbdd>HGT62ul&aH!a&^cxm?-r zQ_^GSb$t_I^j^p05}r8Y=vUlwCH619F;jsi@DjRBDEhA*zKt^7Za}N3Bedz75P`>B zoyalor`6drYViHt>MPft+!WTmuOoa({w4RHTH0=Xc(QM3SKuJ3qPud69# z<;v5ze=1VRl%wb5Fc0w$R;>?^>aNatw_UiHX5xOsyr0WXa&z=KrA(3Wf4YpZdu=k( zGgyb}TD!_c;CN66-iH9hC5@;lTYV!Q(GPG@RfAok#wA2+c3GxKr6j(lNG|PzNUq8= z2nqq$T1S+pUE!Hc1l)s|NCy^Eb}5&%y#@O8;Eh4@<#2_%SCk&axU$Oh$GTNn@vp2u z9oyGsvy9LrKmEneWHlH#Pln%l0X*3;Jj$3evhb{P2w@IjC@y;*MzLMbacraKleFYf zuTJ@L`4TqK2dONM^m+LN!Lex(e@mmr2h1BPGN*Xs7bDL;5aIp>?{LxNWYV6^M*~dj zztMnXF9-%tbeN*UVp>2quTH3dL8c*ypVx8}(&>zIfPN-=_f8D*vkBv}V?lP;Jkn?_ zy{%csd6g`XVi76`GuKb)_(u+G6=>uOqEc6D{Ql>m4y)wI7^#$}d|!8-j9Su~Y2W zezcGvIIPF|4@uwFvK5?NlOgOwE$3Qur^kmd?iCv9I&Q%rN_)p(>?+uPEBDd0$xxsLu=XRH6zp_lo_2mLBUM ziTkKb>PkDSQ}zX_olkE`goPgAN}*^#`GR5Y%?!JLiqsP?&%7?&?FSK0w|41F@Q^db zxI{3pl<5U!>$jB1YT{8VnLx*+yQ{(lv$G~H1H#+fYKtm+^QC9#(!3T6+x9Qjo=QsC z4;i6F_ko{m@ShHU-Tm)b#HF^e0ydE{%{j#Q^}H3M0#IHXhBtf;)1sMJEhTLb)HJdWLy*(4=3!Eqz z??{>EtR1{+-l;32WH3kWjZ(kKE3ls6NOE*8M{WlB?49hLsWo)G3DYAGya`a$Ouc~< ziMcB)-kRX>h0RrbMtsJM+H)+d3CqXmE2Ey^@Xv8ZpW}#j{$VKk%Kg{Km6a+0FMkDf zU({b~#6}>_9(BG!MLZW>)iO9Lz&BfbyMtA+S&0j+1UA+m=vRE=`#1+HE81VaC8>~cs zUs3euVn(GN{^$pG#F_hC4_pQZUElkQ23-xa1p9^hnFedZM!||Ltp0PW4>BHKpX!P=Cf=Y+N))W48a%YbHcdG+Jf=7tQM?vpy@+HF&d8Ld@bUSW3y%;G2T zxgm0`V18dH>X%}DwHx@F_!-W0t8zv7>lLo5O=Y?vBiUIoyU*->)0%^Al3rQ{M?HxL zs5zJ9F8&kgFnjzl0W47WIz`!3zV|$A1 zXUAU&j5B44LsRwd^TSpZyoht0Q5T68kJ^v^*C>RGS#K(Y)dIn4P6IX{x_|4d*Jx?s z`?OE+4fCVK{#k-jYjNG_{js{|*t|$3L+iRAnq zxUvZI@qKWZzG7aVb!JF2Ewp8LGKZ()cZO&di|4_NKOl%6lHr-3CVeymNoX;A>ed-r z@g+mWvcvoqP&{@ZSW`BZo83v6;H)O7-k2&}4tXnM0qOP500EOj`-)YaiRiPaWO$ES zok>-#C#QI7>QG2zE7bY(TM*>ds}ruQs3VK{;+!y>FDb|x!>Wsl9gdXCgFUhtqtskf z`k&+Xdah{QXYF*~WSb>V7^brZRLAh-^Chc-iLR1rU^+eK^Mng0;E4zB2+6(9k8uDG zb2j_-g-V+ZIJKrvBQH>0(sOJkeC!;YqphX^Z)U2A#Nq zO#5mVnsO~vKY8-qG zhTLO}z&lwmDpCia*62(Ft<{&K#U1bUcQww9>dRefgTky24a1Z|{GA3Acl1TN6VMw- z&gbw0+8ir83#QVb8dSiv(gatj&f_2N%Fgeix}AI5w{<6WbooTK2xdt4G_QBoEDVkT zyTZu1ceJWL)|HUy1r~ngkEOQ6f>f{BlGn;AtoXd&`^iy5sK$J*ahSn(+@_qk^FQ-J zeeT5RXR7cCN+Zb_@~Q^P=c$an@+zrO!R@BNcD^H8Ej{^W^o7CN;r(mSx~=&P^J zU+)m8o*70V_&Ebl|7-{FeOn2&2kbvfDGE5Ec}E0o5kAj6Sh{KTppN?AG5h_gr;w>+ zOj-`Hr(O7H{FxgF$1i~(d<%AsBRspjhJaMRAt)p)!mb!ngg}AEFMLAM^2zp1Pexom zSy3~8_!CPU@<~Ngeo%Iv^EaF8PkCXA1a?dElZ6_7pr{2=Y9|Jh}o!r)P4? zC(ku3hRGEI=_^O;x$~J+maFtzfA&J6Q^sJaTUwwh**yE_zjDDF_4;0~p@7I$|D?h@Q7t}RfscqvYC zcXxNE+|cj0`@Bz1PIA^~&+hEb&Wt*Pf}}ide(~)#UdbZUno3$!vYdVeO%^6IE*L4f zS(f0y#FwQkDH4CCi@o)?#Pll&%Er|u{ssQ6GfuO7rWrV#1hs!d==?`=v0AE}Hlta2 zaxrBwP+()cr82s%%CKUj!LeTc=ED-8^`kDRh$*G^mVY~Ax~UR5)535;z=f4niL=4 zx~;03parQakEx2JXCb_13!yjIYO|z%_UxW0k7o7xjHC6R2etjzQd1{#VrAp8s$nqBT}ROg}3s8TcMbK25j#+m2pv~;H?mU$@E6525QzO z5j?Z1Y8$(tCOe4yb z0g&23ikt>xyPBOU_%15>F-?_2&s5yIal7MbtaAi!%Lyd>Qf<4^_P}E}cyzSmmSNiC zc%XGzSh}#s`e%z$H@4fDFH6!xm3ZV!>e1EN$6~d&^fbzW!XdfY=X)U{-_*+G+#ZIh z{*x&FSU4$dcvm$CCePyC}7lctKUQe}jMREJ)<2iqZbeSZb90RJ_lrsWj4N znmi6$xB1L6#ab2+kQkLHr&__B_1}(x%aC&Ql6?kD2YRjg#az7@bW2x$1T%-lxpbxg zxtk>bW$|JVwHjkgQo%?0TS_^`f1%~&UYMY#z z7hQeq8{BcY%lrE?3Kxj)w~1t})p|uk!Nq@r+?Q#kCA)N+qy5H>z7+Kvr{G5c{bleV z)Sug%T*Sj5t61oD&#oJ`@EljVfYgG@xewleK7HHBt!%g~A1}N0YozZC%ldLH$?LOJ zz4v-}B8Z*@yx>cZX}lBT&RzLE6pd48L`3e|H)b;%{cD)eHE(W$n4yd$q?7g6b@>-+ zr+4@MENuWW#XHc*ECvHXl|~8M732$7c8RQivsof6#lq-dQ|zckGVvNv)9_{vUvrR6 z;=uvTg&F>FacSNC%Y?Of)_LHd%5@u&+WVQy!vS627RP!P@001`&hsv>4;aSjpNY)Q zERDmec^p)BHM}TY4aR=Ee_}IGK2748qp406JJ3fm;QlOn>e+1h$QYMo%%(ia^Yfcw zqMt8e&xJnQbAeg;O?N;wq;GggXt=Gw)hFou_7e6ztQxX;^kev2=%?>7O~3q~%|(Qe z7l325*t_C-o*NEuCzh0 zz>35TxbF*3JYb3g@5KHEa8L$!_Z%>9AnK>Y`s5q+ON8%WwPMvvDD?XA`z)S_?ubhV z4qEvOdt9Lv3O^fsmfcKZe#6VL(b0?pUt@-$v&vRSxMRU=B1ZOrdlCwr^J2Lg{x%=o zq4sd(KD;RdjX15q+ILU-gcCeMIT)G(5s;Qt2v80%fss7Wl0}>c2;znV3sex~s8g{h zuvDdDWnic_SJ_$#RF$2XG226a2rDpAfki3*lC8YSUgRh%DlsG9L?i^5F$hxN@W<^( zSY$*A+ODTeUgI^Clz)>LvC(Adh&3++H| z+r`e!n0Y!4>*Sq`A?4`$(`;IqtxW5Du#Y?G(+F#CnOHC-g4$D^1qL<6EMd_0kMLsI z1TvU%3vRIj-Gt(21jqv>2JZU=j5Q>YAhHvWYMaEAfA&V&-l^#WqDwTKa5B%me4lUk^8&rh)1ezst=FmL!fx?+M{?q;eCL+BA0J6*#bPl zv!#L`&jI&6<}-pncpFgBJ0!@L8kuz;^BTc>JJLx?SX`L0nKqZi$rIHZaFGzZf!n(< zPE~8uD4=B>&lInW5pUX?6e0b4;XwLL4zaNPeA8=}4iw|I((`lr`x4MezgH$Ml$nVv zLQYg5v_jo51FH#*Nph_sz6?btqZ)%>O~Y*5hKNk43?($32~IQ*344^GeRVWJv4vF(W%0q6H43>pG~N*UHx#KJ-_?ZB@4a2n zCKl^L=&#cfiSt2{6aWgqccEsb;y09F5Q$9VMhj&voU!VZvEm>Byr{cpxY{hfnBC1(Zv2xg6qhCW~5{JDk1aVqgt_ zBzl1EQ>*Z3nH9egt@`hN+Z{|fcodMccjI-P}wv7&Q< zu2xbAjJ{0{)a*8@%^{+ZqFUyFk8~y|b95#VbCTNPw?w8M`>N}AcRZnF+USH}t_0wh zU@k8=9Nfumq(l&{#e{@qEj}L~b~fTDjDZsOBJ3aiA!|?#-gBLaQAfOBNw9bfoo#6gr$H8XnU91LBf@`d?24QpR+5&cC*Nl zHqphAc1*o;K;ae&-fU5&M2ruJF9@Vr7%fs&*Zo$`m*#3y>wYC-!+r0rNUXE^@fDWn zRb_kINKjqAD9XIyH;LD}u<6}{WT_6fLy(eNT1&7}WX;Mr!`L%B_m=Q@c`m(xq$VAH zt3X$Yk-ED^R#yo|DSgc5GxcIJPViwe4{TO#(N|(Sxt?9=Ea!L%b@NjuZyBI^Y9V}v zcxI5of)|DwT*hIu2JenDB&V0~#JMVu*$3YmhIt%YByi*)MJKQGg%$S6kMw-WfeK78zgNo)@xg7=$2hBW&QGPg zbe0R6PGvL^y&Gl?Em!?bucca<Ln8JuZl{ zpYoGT!pH4>X>zZ%e4K?ikh&aZ5rP`v4~p8hH?SH(CZTSh0w;%zoDXw>Gla5*EvEuG zDTQ0|T4zx`)#N6Sr<9PHMiP%4h9L+?EUJxbbZjycOU<-Y35Fq2KB|m92s=Tru1i{7 z6^1SddqLEEFh>?may-&j8X*S^r4TT-)06}y9~ z1xt1=-+^>nqq#6@m>+*C*(ob zj+QG*_dMoxD{-8sobG9cYRbU|LgS>C@l&VRi&WUWmhp4-r4}S7`I_;?U*W%lF#$2V z1*J>Vy~E^fDYO^X&+rZYZ(V0Ul&^_y zCgdy&z5w4U_%+->=Bjmq?Ab(%W$y$|F`q-F8euEW}aLq zk(Wd~eq`Ts%rh4Ln&&&`2!y zk}lU>%{%yG7SZbakppE;}&jQ`bzN}@OnpFoCu7zkW}6Ds(F z;2q*Stqr7DI*Q-t22@jQQw_zhOBc<7;#+RMO#*}S_xQfRiPQ?W_Tg6knzH#wMnRUK zUpF3{q#sNw79TQ2m1y&+K>8xV50YkqyVho$>cbDZL(B#4{e-4w)gG#&^UEBPmvp$P zeoMZie`Z#Z=W15_Zd(UMB5A{>4O`4Hw;Mb#(W$9d6ei(i&2#Pk&aAd>OQxNdKuR;| zbU1_+0t-pIABu5Rf9#Q$@fHNj9CyC>11}aJq0QxqIc$<(z7Z`y>U0K6Jt35uuYp$a zqRfsEie(Il9EL~a4~a>$PJbxw`5<#_;%wsV>9IOR#g}204*ZPd>#eYp&fZMhI-*oM z&?YLCvHG*;kuEL}>MD27y}2ql31ot*c(_75gMEI3ih zQT#>z_HRWp`DE~{T7Z+~PJ(MVy4^cajBw!!VE8ZUsc7Z$x1;HMvkryS7`VVrO$X<0 z_&f(*q3(*f_}M!%gifUrSPmNxtZVgPZ!|7;DR8!Ps!~*hZ2#X0pz*g8KtQ;2yJ7QI z5{qSvpIdVpPN-Ez0k`#5I4~#Qg$Y7$`RFM{ee_D-hL`x{+tbzWq&>M7_VEZu-~EHT zy-kVCAEo5oD=mdSbweLf^uiuF-J{Tbm8P|?AsuW*EAKaV{rke87nL?F+w1Db|CX%X zZUS^mYmYT=yp2#sf8W1&@+QP1r<@y=8R&!jioN3zuJXeRzRu9;&na`;9G<^Z z&hxJGu0_37z%R4=f|*Qw-GXcgDc{&byn`Q@Q{SJPk~-ENBNy@^^<}jj)%*o{Bh+Wi z1*BNnS@#Ok!K-h~J>fMtasQn3Pz=Fsw*mdmx)Q1@%$66}UqcbT!q6)cSC^mLU>h+i zoSH~clm@hFh$_F-irMC-8G+-gZiCFRA{y& zy72%SXkFZN5F>0|Jck6UuEBi3%q);P1AMqCj7bcU1BNgNMJ$Y5BB-6gbij!N(2JoL zL7kzILCgpQJ8MH8n-M}V9?)R{bb(YDdsI1oVCW&R)Ys!{Zp_iweaMW7z6=SX_<Eie_B^aQz9wcH>FebnUai(O#S4zMUo5z8=~U0BL(ClasSFa# za08)e*IsP@+00=L-k^fF&Z4!htScLvjpJb!C8D#oVl|PjYW$(VZ`qE!@70trUhmNX$SWt!9Lfxk%ktTTFRDX0A%5w9yR6g6PDVdpq zCFcMK!d5mWEtI({)p8$rsvpsaBZ~r5&7Mp(lCPmrdoiOFFfAaxGexY0(GFrt2){ZL)Kj+q>_33jzp*Z7!FcYE4-}+XhqED!nki>YG?&mwdKJ4FDMg(o?NkG+|b!& zv><#E%*ZM+D8BKsz`x9FLEa$MWXL#-MG)tLUb&cJlB3rq;RkkYgQ;z2Ty`2o@VeTv zmViHmRxXoVktadzFAu!kB@D2{LL&alD+h5>a1GY2;Bbj$@Cm?MfD^p^JWah9(%(eA zCo?*ccW}Ifks(|5a;amS@PRikWquRRoj5jhG{ zdvDJJptMosh#4?W8)Bvd>+Dk1A~Ke8y)BL->XBmxBxBK~w!us<0FMHeg3>As;Q9v` zB3yPUJd8_!f;2qsUros}4rF*FYXM zkz|dqnosA^U=EkLv11O)gc*ks@}KB1&|d}--Y}U_`L1B z!xG6gaZW*?9fsEvv1tQC^{$7HFoP>1p*R=U#PsQp1RItq(}v_Zr6*<^f`Mu0H`;hw zekL*2$4c`0_5b-h4Bu-knhylW>>c-5@aAgDc$MXqXE;EiBYE2Wds%ky3J$&&n!41LoDYK-0SyK|2-<0;lH?SZ zaKJwo3ATVV!kb*p*baSKR~H=+PcZ}xq*f;%3S1W*5N%8bs$ny0fPi5o;*R7#oW{uj znV`9slPHZtiUUv+gk-!}F@)d>+1h2LqSM_0 zu}2lZlVqeRtK}<^qm7l>Cpr=${EEifj^sZ!76Wr^yZy4_nfLIOttayka;LiOwMUcob+%R7F}V;kO%<_WEU}!ic>V8vTQIl><%YA>lJaCN4$VU{ zse1s0w9TUK%>*Ob*BD8*Ats`DYD+9G zAYvxbU}X1KnQ(&tUtb-I^V%AG&7UE8$;-YQWbK!Ag!`m~WJ^H)TQ$yn#&)g zXVb*n4&<|D_`vr|fHyY0X0$PhwT!d$7A8%sW6%)AMR=9Rffj9(X_714=ALLTnCJdI zVcsFMvv3Iaw(s)qhjspUQrw}W#ZzZzUy?disi>u(vG zyvFn&axI|2$b!!=o-4~QyJd%D0HZt@lEJ@W#ETc)x_%QLvX&T;CwAn4Y$@^gFCTOKapX8u)t`+2W|4d3oGzcId4)L(+wlEIjsV8d~U;?=K;_Z{@r8b$_NKVf+8@9($V zo!7_rRA-RE%#=z!;}oCT5p)Kc)~lMfWPR{c;#x$tB)vUe&6g57mf$vq}EO3Po-ORk%&CK`BFu^2}K=tH9nfX?T zU$?2Kn~b=n*gFTl6q8F@T0aS233Iiha?WMlUL`s?f0g!`nmoqLj^diM!tCywu(G0| z-zdLjxOhXk&jkZZgJM9GdL)>u44v~VSBdtTa_+G`g?DsojGRAjQ zzf_hcd=8#6rvJLftrU?U_qHY1Nf#7X&9JYBFupRXKgZ%Go)M%jpdfbxf~o~}6yL!X zc~0R`Fsy$3Mcbbx$KD@O!lyo%fAATEOR!2^D5>DO*z+ZIFCIdpC_gtv)t0m{b*(V0 z{BaLZ@dh-h3cfjaZW%sJ_yY3mO1^=TdZ}99?g!!@Z^sI%#ke|2-7xD`-?Vk?tSbba zdYeDdg7P%Ls%@b_aj^f&+Hykpq=`501{Sv0g}g21NH@BET7)z6sh?i6P1F>jLv%jf zz9QZM%>yTmNUN4-W-qU&Oo>Xa=yhR#{Mlmu1({UQggMn;s?CM6Im4^#mQ>v#dqV3# z6qsR&@w**4_m}Gf8S`lRvd{>(3Mv`&SI;D)ZxCbNXF}hAzOu*>cp04P6hr?gyBQA; z=A7KY|E%Xoh-IJD)$4_rMZdxnar;6XT`Ura-Ba!|0<*cDkAUVRz$=JB2aHf3bKc}q z#)pc{n`=8LYr|?gfN7@nOcG3jbihJa)@&=c2wbP0IxFDK=k3apneNJJODNk=+}sG{ zl@G`aMNhAoFIyY@|*Z_`?;b24vzy-|D@*)1NdlscL*AACvca}f-Vxvn@Js!RX( z#=xd=KymgLyj>8FSXQ3mIPErVRMzrmMdFfR9#tHcKihQL0`F8XRF^{*O>@v6_agVH=W6 z@_B6Z;bO_g4@RbzPeN>BY%B!$3K%iSjf^e7V7~}OQ6k{!_bXv2(592$$G}d!t255G z6Aeu@>WT~;%hm3NrjkfPkP7RA_E|8C#L(jM4fz@Jvm^ZHa-i81E}Ch`$z88$h*O_w z$RNU2OqSElOw+ZM9x(emcQ_nE%mJxlAXjM!Vho9W8ciSm6kp~Ktw(c-qTQOrkew)* zSk^v#Y`mi+)sWth-v033Wrz9Zcf$83G?(#8vblQW624~A>LxJ)QY(*^pTbo4Zq>Os z-xEC>O-atXUQ)2y@*bSK+6wUKTMnURp(%!!BrP_6L$`Rnuma+t2H!KjNt|~``*ut8 za^!@V<7c@#P$||zpjw_-z-B50MmX2}^?oIFe{zRc9on@amQ67%UNY{(6h7sglDa5^ zb+7vhU)5Ack2GhKBKz|OsdjDb$lK>ri^2C3Dc`#`n0AX<){C}W9|Np#4q{ez)?ECt z_bS<4S5f3!oPW;j3q zI6r~c-}pFgFPTnFxrIO`F@GBHn}?h+VMIj{>|I`qhOxceKRyNi{zvb%PY;!~YrPx{ z_aV6h9Cz*KCyCgQMZ2;DUKJ9_Snt}hgpq=Tv*CTq2}_L-Db$GsJ zfqj6Fb52=rV7Z6zb(!dOzhejEl@?hf(wik$j#p`?mK}mp9g+Bu3QE+wl@fxl-zRwH zvQ%ByLM>)a8+TubTpiToL9?-xax;aV8+OT2;U~M#^rWBYn}L1ZkK4vRL4wD$)^1|G zo#*@^%;vtA!Ne1Sue=F5LZj_O776Dwi+1rc$CKJkmbrc&4UpAz)n6`EnSU)vW-E{m zBVLMKm!7r5wYz-nm#X5MtqJ~t+t28*w58?e{#ED$$$Q93bx0eLLX2vu!g@clu0Jo^ z>R7QnA3o`4y)*&OM1U_Q1Y7Ba%nI)lDiyNYpV#p6$MnrNXB63dQG6X-cJ;Xx>LTEO z$C%x^zc$qm3;8f}nnm3bnA3A6HxqD643FBRTP#GoRfMS*dEGDzjjSl`u!8MjBa;4_ zaAvuZ_0d}F^c{~D!vQ{=zGTI(?aZFGY9Ku7AG}*@KY9gTUYvBI?;b?Q@IP4;01ZN- zpW_|5e@zVanjeCg0f}2{F88Z%rWbWi2<`9d2gKXg0fR)x#9c^;;Fq@?Bk<9;QH@o?n1=$!}ajPC6>$Y#Ta@bjK@epYyIYNsS8n#ka)rQojclWTlhgqKMfnSF{Ws;~(B*x*#_$e7HS)ksr> z1m^$BCqKzfLZYgfdC8!Z2YsaYxX}210KV4>f|Fgm9VfrDQc*4--d=X|14^P|1!SpP zYz{=_RNKEJq8`+f2repsMy(~}?;%e(o^imd&+ay!AM-!1oS?S@=2*S@Uou2Wy?dTP zsC>PB*{e20`MgXab=Y%=99nSm^ONz(DTy^-r7*U@;GSFi?^iq3DaSi5bdpZjMscdA|CK$bj9X_wSTOQ3TPxiRE{+f?{9%ql8zP?Xq!CsG)oHN3NM}M}a zn26vm4%sf391%6(dBglis8QXFKLLf^q}JI+3k-JCQ^T6RL+prrO%jZu3Q_vw6&ep! zAKQz*WwH>QV@^%rP5zneeS*;>`$773oT9gKo@}Yyieh4J(Uwu}&g7fjB=RHX!4`om zkb9}j(+k$dr#oeb)jR`HeLpBF2P}^4`J1d%Cl2gXdKx>6Hr0{9LxJzv_tdk4(b&?X%10kQUu0b0 zi+(ycCxvr_v$T<^-3oDPmm4mxB0liYvkb4!mR6VQM*dG~lhb*g8QAY8`7F7K-k9-+ z9+oMl)<$@a7XmgL3_#{S@N=tsLwHEi6C4y>CW{!27)@w`W!q}sdzcg`QOdI9+Aj!< z#oD4l;8Qz8xj*s}0mVs?Lo*ta(+BQJIn%?mk+P-Y$>ngHacB!xt8IIxQX{+|>;!D~ zmocsMpaT#69D&K}J7TsMkUyQQh->G&Ec6MF`Nc0mn`ECi@^3mCfg$#D^3YpxPNi&( zR9maq*2@&9N?3RQHkVH@*g?hVkg4YC)3o0fb@e*7`ozl{#iZSBXjbsL82f`=^W=}8 z$6X|dWx z{{0cdA6S|m;7d?vLj5;JL%HC6=Ed6Q zlY#rw8g~luN03-_GurIq88A&_bIm(9-5#8Jy8L_T^H6cf_$ z!ZLp{#=@CX-vm{`mz*U?M~mTR5}tM}NPX4JFajMk22JhQ%@%7q_&9adCJ|eiCyw$B z#cM08)x07!e#mVYM@vCxsGFMe0Yokc>TMVtShO594G9!}NV7a~@cDTDz|={8NH<0} zqHHYD3?Rf13|jpX-?C}p2ESx7;xsXNG9o<$mKs!4Eiwb-42FbUUMd5mE#y~UDF_WH z8ANiLfE?&~ewDKb><{paXc%fxNHquykdh;0YETsvVaWj;Diky-xXCKi0hEC{c!={Z zyYnnZ=~M8t+!A%ZV-Pv8$aICU3nO>aDUYsb13=H%1rn&QI~=|ncUhg&@ic!v-!CiD z%jbmDUgf!(NsU5CYCGu^Q_Ju+zM7aNUfR2#^#q9EN#iHu%0_B1p(y3(P9!r$E#Kdk zqgYQSID!N~0u3g@MM_kv!PBY+hsW{6wBPn{1z1ImvH=r_t3!7=1n!`5#t>>y#?La9xk1nEHbrx+v4E`DK}$8SIntU9H23 zl1B$G#5Un0$$GIxI+@d7xh@6il;(&x(m}MlejKZmjQ+{4l|YsRCNH$BLkevR)>0Nm zxsa*ThT0c$T7#P=Y2FNlsAD4sdO#}U18_2IGdSd+jz)o3_yx-c_hIdu+OalYuFn_4 zuAFCa$FdMLnbA1L(mfNaFFt59x$HGQWulVnu|JnW#>LjZbx=#L>w86DcxsYT!mQ5p z!G|u5sr`t}Yo&;M53^EX6!wB~u&-y~3%TO(G~5QRwvM79Q(c&%i^iI-oK&PtpN1r&lg>knV)L&YyaMZ@^RHR3pZd5(X9BuQ%SQ0l z6*d%%zicSHTUXGl&hGVU6!8u?u8VKI{c8W4b5}qIT3iUDh&_HbIigk zAoa{aP*35St>ccO7y8Dbaz)aC8wXTXKOVWPeuCp>w;tIX^k*{U z;q(n{n1or^<>@KZC;P1Tw}C=;%|SGG%~1J6_^9S*fL%teTBl_O6NgnyCG)S?FqIXbGl7q1UqOvs@7$3=~U|=+)5g^6%p@P)O_BGf1pT6y~V6eUB z+L7#pbNqlx5Zl%5DG1E8gAKw6$E}3XT34p}sZyzBmb|+KQ=%3c#Rr?M#_;`j3|xxr zcx{1-m^8gy2$GucF?jzNkF5-tCs3Z3s>4_|v{QhJCsy=v+yS}KXz#h>V)+`H9ob!C z5=P|_)x0zStneo1J{3m_ni2OofRv#fuGETeLbxa817Di+eV=35<>TIp0+W-`)QlUsdM$&F3oy5<_uOuAZdR&i5T znYL{cDYE`~Zq3Yh#AE~%Jl$1qoqgDh1C9^$CtBq`VAVAXuMlczg`Oy-VVQVAXQmrE zE3cFpA;;{yEZAwJ#_H~>kk3Qpe43An7aR*jWi{(g(u`2Nlp{Jiz>6?bbiYg&0dPKnr_<5-|KF|(^(qyk9Mqmcmo zU5t%N&4m4Sc6ieD%xL9bsJ}}8vzh~Nh1-ubxAyt{pAM`BW;Cv{I}9O}z-lI~SyV&q z@JsmnA)Wi7sHShga%XN2b$yz0J4*DSlFHVXRU^+7uC_WFe;OoA(h~+(4F|H_$g1y3#b(p3fcMYngIN3K@V%kUS6?T zcc&n%uTo#l4LY$^=2ZNIvUw?B+g^TVyNYNPuUS7rf7?CZy;AQta>M^3I)$wW=#GoZ z^G;_#6svVJA`E$~pXDsbthMzF{ia3kkoNehN)WIgskRflYLo5n7(MSU*B~u)C%8AF z{mEL$4R%Jyl{WOb*hg^^VE-se1h)gMYr&vw|>4BdGNvaLoYc$E-gQGsW?V{ z0|pKq&K_n2Os}@AyyhA8-s_(=;On;r@k{hw;K7S9rUSpXhznHhKa9OP#r6kl`)w?2)8tThOnH) z3K!mu(H$F|FKnsYw~5|f`JJbYqiQjDwQ~DuFZgwy$RA(iPrN4Km$}nCpyn?@NH+eT zeJ(uh8`Jn-lLKr758Yz2a#=8zAda|=_@Uw#r$q3VTU=kX=g@ZJ9;mxZ-1nMn6we6t z{ft~2F3Q&a(26l~<_^_7XBhV;?Kr>x%tSBMcgZ$U3!=V6RlzM?Ig9ht4e;o^Yq)~y zc^b4xGGE;_Qi+c%6})R42QtYB=Si9vVkouR9%|eEeC@=!>Pw27IB^SG$z{iQl?Zb4 z#p;eSXE%QaZgbjOkk3nXD+gJ%?yG9Uh3I7hKX|0upzaOtS$f(pd2>C8%7x6)iJy)x@15;9eTWrbJ zrrL1-iY}M2Fl3!nFfb67EhW#0w%{Wx!p|sB&F4$DocH+ViuaF*hE5qH#ai=LS28)s z_$->Vi+Q}c_3%`LcuJaAgd5hs^zh8%;E0=nSpt)1`Y=gWRleB7uk4e7GCBY9M0)f%w&j zk<)hKy{eYXh}k7SiM+WGc^;@G&CK^E2B7+(slupk9 zenyS9vb5?iqbt0ANHWoD^6>YwLRoxF%SD-Cx^VrBCnTKqIV)I{1gTS4y5_y`OTkH>!hGR`-2^hBKM?VoV(XZYY}%wWjyu4IVmwEFyo4%=r34+?h`{Dt zOTUcXz;p`ai*snEsJ;NerO}`>eOOfb3j{4S)CgDs{qxuk=gZ2f<>kWubwh%0!5Y>S zfx7Tmz97(=+EcPeB}}gs0m}s+qMSgcN zSr>_U5Ep6c2*d;xg?HTHg6shhG(Q@V$uvx$3dD)Abtw>i20y27o`5cO2R}O&*j2!L zBwED4t_)}mVcEYM6wikK2v~%r#GKV$t_|dWJz94q|WUBhf*6OGVMm$Op&Y8P0wT}>lMu3xe%K75#_#Lrq zi)3QRT)on@v0)Dp42b3I z5jLmUW}f}Cftu`BGmfG+$mPRUSG)N9kh&w-hW$qvTL2KhT_IX~g>Ei;L486oBWF;B zqrf1oy2icJ>C}qkv!Io-cV7k!oi;})cvvJ7f(v8i5PaAK2H|Q7M75` z4$%~e@@fM*L5WOweE)hQ7$ry87b1r~FJZrj;=K|bxkTR70^!7mi+3`vn_D#dJ<@?n zIOFuLSRmXIY*7Bh0cwhpLxih0m1HR|Fb^A+izsI`IUgHDL4I|LouG6kJh6X$nuLIe0|iRMrFm>l;wx7sa2|*AmYZd{cRb=dS zrPEQx05(M>YJx?^Dn=uWl&30M2$B{3l&&Zmwwb!xMr%IsfC>;8G#z-LACH70idCZF z*al})+SGHS>kl2PQW1g%jm5^UxeX z9Mjcys>y?u58y^Ap7qF zAl8m(SkQ3z9YDa(Q@L;|{Eox*@to8o9*XF{MaPsM{9E7T#4FW*=p~n&2u+BUBdpfD zDqS%DL{D=o{8p*|w0H=LlLcI7pbT9`4xukj+g}>X9S=ira0y`A{FB(nq_@O?Z`7B= zN&cIf>RgU6Cio-!?StR17HmW=tQh!&YnCbnct#%(Q2eoNgd4zJ$#~!+J@TZ7UCU0W@BP}kZDZ)UTpCVJ> z4liiGr(Yg89vL4rUl<^jpA_(wEhhjaQfd0O`WcQWr)aVB@^5Xia)#=Gux};*Oy>{o z^c>%@$zZ|V3rs=4F^nno!FFp2rxE8E@NjhasyBz}+jXV;8o@Q3#7ou$Nqy|q5wdJh zBw?&JSF!Pk!j`*JQ<^p5mRJkr_)r2XGH@PBdI6$gvdr%`s0M*V1ie2AO3!zFN)}rc z1rGVZbCRDRUpp}X%vbo~H+F}+;x*lV40FfVF(eLIXcnFmz;bPk&b3$Q-Ey&N`5fCtj(zjb*&=qik9T^)2Y>j$ z6KG?6hGJGnz;}y7zUoaWD7(G1XD|n9{H~kcw8HtMZJ2I0)=MnO_k0& zwx$ThxX94Qk`S+CGq{ODm;%aS2strFC^mH=+!a{84m_JmI4|wS_7bJSfN3uq{K|2$ zu6AX}VlL@kcN4^Yf*I6l;F0qu50NK$tHKbWYpu%18IV&0g?u1m5A%ZTD4A|tgs$f)i7Y`FYm*=_UO>8;P!_rJ3lNe2B1MMf{erqv~X z11ClsB@}(vH~ssFASeuAf*&rcN(A+nQ7BpsZ!BE89%tpVSRW2Ex&l0kPg`NEC4;5& zqoOJ?VP9an-6sk;P!KQ)OGbu$W^XL;b457211%Ojc&^OSOHdcngbFLsWB#(;F}Rn-7@A#P_{$Fh)`^%c-?#mfD7mK)PQ&%#F}8F$2DSpQv{1`{YOfdfn^h zPtPip2g;i3+w?R@t5;iPm<=>_R`LF|Y{oRtgZw-a!h!CuzXK8m_}}KK`C-tj<)8FOJMosLn;wc2c~hdkuDK{aR~xD z!|uYM?<&-dwFv;S{VdpdY9RLwomv;qp%Bp-v5^~TxgfwjU26%1$q#FaG#;r2nUN<^ z7N9`RuLar6iB?|_NT>K!qE{2X4Aysh5H}Mo-vp3+d5yS3Sx_;=ul2r`8>y%ufL5Yh zabO?>3dn(D*x)GMdXyzn^uu-Ki>0qn-HS$;%;unP`@(a=Siua2iVP7w;-9a^1&Qzh zGMpAYX*46c;cg3sLS}vrEysvd-9?y&1-4)AyqrYOq_(8u_MGQVjL}?da)<4-Cbk9l zck1YLDAVko?4e$N6*!XZZW+`>qQFL&MTtqNKLLF)El+dkBq!tgpm*5~J(~%JK+e`z z+mb)$v`*W6vFuTx4z@26jTUHidL9|`#7!o;)s0-9@Uz4X@aZH=#@6~WYkVRxaWtH; zvgJy29+?a}(v`nmYq7<|6vIq#fQr1?MKykUEx6FmVto*fo@M#4dmZQ|$a^g$9Tm7( zh7bH^?tX3123oN45WadPHc$j}Nnx>rtZXHN%4{W@yaZGC(%YOauYN{Wg!?oIJ`kQJ zdxCjhrd+H9b@qzQiB(*w`0WOFZOj_;DN?5_8JVIhJIqFQs@c(O?x7qrQ&63of;T}m zzjrqz`h84=<6nyr7<#&q3V?X}K^Z1XDKxvAO6<8zUlI?#uTv7rBVw78 z%bJnpF^Yaz%Uytqi{!l{KKoPd0G~e^G=5!Np?-|R)rbBO9&AtBQ;yyZpl(SBZ~6@pX-jLQz3Y2Q<0q?Ty2E@6ICp* z^hv8{YQA#j?4*TOw~p36%*rc3BM#l*licx?f zT09?3l=kQoIvNpygkPS^W=ePng}nZLz&@Ufi1yLeoZUhLLPhKNj6$0648|~sqL#G^ zk^Oh^C%FypYg}apyD$1Ui}MNN?7#1uwi-q)bXap{cX?Hs3N^xJki?%cz&rp*nEh#f>i<|?YNwU zFK50Ah~4bXeEjlJQW9R(-#^t}86TlJy1Og)mO)ey=|M<u?GN_u|<*@MKRmc;G-Ez$Om!N-&w)rTZ$@6|kT}fHuX#dOD}T(>E#5 zw9P>KfFoJww!x(sIV#j3DrV+b+HhD*x?(&AyxZuaw&y*s$XYZxv%LOO!Jo9#`5eaD z*xwiOKD`sVj|r}Z-RKhp^MHz>Mq;K^boPVO`LK<3jMB3wE5 z(1ew|?m?&&=>!M(DPvLa7a-Z(-0{%S|GMf-6w}vpawFs8F2FXv^7~ILsMkb%hcoRO zAVX^k2?!OlPXfPvp%k_RVf2^%Rq!B%Sc*F(2%Q&=^vQXe5j&t;m^afIPTV4Smvl1T zd?RYi7hw*Q7_)yNW^cSvRa^d4TQ#KWzD0E{L?LG2sA!@# z2mDW@xXTcpEWwn!~&YfzEHrhI8ykkn`-w51HA~0d-8w=vbzg**iw}zR zA6J$6$KZdAtNUrL0-l*)+8%0|fNPpwBZGRnIO{ml0fmhX3cv|nQvyQP-~5NYk_W6N zE&sI~7y20`?U)aZ=Zhr~@wuGEF(I=#@9HR*0QM^dG+lQsd!%Y5ByH`%_Qh=D{MwZ1 zqie5-|GAmOZLhVL?il7n^~B!txzNWb@a3EdzMN}O&~XkHVI$Z$l!-qAoc67U4MCIN zzxvmF8`on?MOgwHO}KbdsD4#sj~cD<8Qw8!^6U$wy8OPUPI5FRpz93#Mn;GsL@-0~ z7|P)87dl!~%wxre;`8E)!Io*p2~DCUbsT1xr@)AbpLtsR3`(MhJllcWn>X z4_tof{g+HX$EaKT0>=DwdCV-&y)j&~be+r;26N~%$}{|m^r9+h#2*NYa^_hFu%_-r z)6yGL7OS^Yql9FALNoE3{IX$ywA~ zyuG#)=v>3G%CcWHr}zh;yJ)f^+9-vEDS|O)WymG(!Xd(vD3;qOM7=cpEH3iH?omZ4 zjU{Q8`K}#dgy==E)9l}+zS=Iw6IFq6RUbpOxLoKKYBB`hnIJ>^dU*K3? zy`(mmkxb;<6?*6byyhH6$u#9(eC|Y+o%r1EVgQzkDxTj?MlaqNYgt!8w|+9?G!7gs z3Og!|I~aNZFfUj6b~e{f!7R9`@cgD8PzQG$xj@ytofKYVS=kRS>UO_G>GXJ3(bW-7 zB({**|JL|uH%#e*%Sd#E8Pe%v*H&2f{E%O%8!nDIvK_KVn&(#ix&zm_?RKM)4|||M zv<0Jcwb3iqd}WZ{J=v1y_4B@Y>Vps9!TD_rKR>y4^Dq%r}yKM7rNr~pUKQSen4zptfePgF=BfJ4aY zfgj|u<@Je`_j&M2!hm}{<}rwcfhnGWVUv4_xtz`Y3h*YN`ZLI7F8+?&LEBorvFsx+ zqDvRxJztlS=z$|SOws>&DsE!GlgkvcN`E^m(3GZ<_D;$!b?j};XLdv1rGqYH_X2o( zVR<8FH2X9IJOfx4-*xUI_T=z#p`q%0e_wR5u+U8tCHdcBV^Ag{~%r6ux%f3^i7OZOC7?6l7?pGnc$N7T9USaUR7}kLrGyD z^E~%yZt)tVrsnis+6B`eF<23FRyb0$gpZNmn2-P&Uq?LDOxZupVvdX-N6BI7RQNVIMAu{JeX zc6wxNP*V?V`j2k=iB}64mtldw5k*Z=)whqXuK#>Ts;jKlGN7P;ZcUbQvt1Cg=D%ee zoE=$*Sjl>KeBzTW-p82Kp|9c_aH0grl(c8d-=jj5TIa)?S85|-qGUpFF*ZjF#XWo>+KI>t$1`7I=($FqGM4ypatOw>u_z%wt;fbqTeyT zC8LCEFYblghK;JaZZL+! z#^J}8)=0tv-XmvJv|V9Nfoh|RswU9V+y8i8s9SP5G2ErOgtOpfvdeS|uC_la$zD-j zN9+A+MaoaSTTGR|^&mj#=_euI_m8NEB4*h$)+utU8M9W0Lertnx4bZt!k5=iEBsMe z;3N)Qy9IMMiiR0H3s5Ag&8AT%s!dNl`^t9hoRA5Sb5bli?p0gCtGrfAQV|k3BkUr7 zAS4TlZd`#>F6R8kl&@%-^9{SS1H1IPHG;kfUI>w#&bihnOA*vigQ4kNLeGW{LQ;X} z$&nUTdr3!69?TAOjn-b_ohPF6r6o7zpicx8`yoNnk~s9j2sSnusm!KXNAF*mw23Gm ze9bRLr3uoaI|<_Jyb3?njpIM`@;oH2O57YSsq@mb-Yj@hrQUZ8`M^r5#6(yx@EWXM z;r}wp;p0P-rp~>AqkaCPa6(yY7=6j2q7wI_IQ8rEpHMc%q)vFD5m)>&-SP~Z`>Y}W z0-6~TtgU`sP+2r{j;jyN$v%cYmH=p?0i7Zd4Z~5N5();VA`nU^CDVY*cJ~9LYg;oH zZVuDxvbuOKL#3_+9_lXnJmt$ilT)leZLI&IN61I!hJ-YX%8-c%zUlzVlTT9LS`K6nGZ@ABVl1)negZ5%p!_(h3OMWv2WD3N zo(M4nx9_3E$#1AB?5jfbgf=Tt+^dXcjb>xi(BSgcBeg#Uo+k}dR&xI4kScx|MOo4| zM17=8^&-Xb&(#u~sz2x$@$p}a7TmWmP}#c8Z1feUFZu59uI!UoX)}d=OcT)9_{=?z zCYX{e;Eoo{WUp_(;?Q1#@9B$gm=JRL*-dt^g`;RAfRXV54cZ%abLCcZaJPV;u)90W zdeQS+JMHfLm8-h2?HreD@T&5At)YtSBge9W>{ZZU-*FieRg-)}46&um*F4k)wFO_8 zK}8)Vmjs;#1~M^Q86NbLv=zXA*?+l5nPL{V^|P>zunl{+;XWJ)GlpF zg*x#`<8eBn@KW;hWsbGXJ5-8>pjxJ4CYO4qSzNHxp*_M%neJEv7ybVc$P&4P3EM_( zL4mRkwk9aI0@~^WFEXx9Sx{M0+$>HxW$s(=Q3dZjMon}m67ZxQ&SWhiYJ9Q_d##5X z*!ghFIMztuoNN2XN;HdU&t<;6^S+%&8^1tHEu^ZlgGFjAWiw_g#%N>3$GPeJ zU16vifls3vLR}~z;?1W$Ph-I#NcEv}D|1VzPD>ofNL2f#^f{S1M9HpP>3hYk#?Rt~ zNCh?t7$1PSToo6)Js!?D@}Qx4wKr#LF!QxB|D zk22y52Lrwf)~1*N5+pt730Zr*w00$8fmgzx?Tc@i&pMs;R!3L>_EM z%Wq`@PFJ06L--!(q>JcK9uH)a0r2nWf*Yw4OV{j-GLq12ID2tV!CgZ^7`ID^a%0BTZp zu{ve~wauR{9VMk>m2DTQ}o3aQDdk2Sr=Nz^(Ui`l|xKd8;^(^AzL zdUtUSg`3=Cw*~gP_*1xD^IKzv3zrlgWT9`d&IX$>+5YQ2ipBbX5bRhPit1$hyXkf& zSa!RhGJGn|QbN1rHRvi+^Xj@y+4S9s1tCrc_FCJ4UT$SmGNJ)w3voqX zPHs~;+1kKkc5>4%*|faShb5-~K2h2nN2QuFT>V^Jn7g?o@v@~hM2v3$5z9?9f@qEn zey9)u1SSPKtPlt$H$GPkM!5|E2ALc|s2V1BxzGfLj3xvEG8Bqm7y>F5-H)9S;#>Zi zDhzYEpK7LVgEpk_J6tGqcDO+#1Ss@!zhX>kW7zy_0z}Br(klvFp;A=bZM0L!ZYaqe zf}LEbGDxx%}CA|P7_q9;b>?DNI*e#{miRn@w_r1q70%1 zPAK@Th4Zrk`d^fMj*^N+YM`Q{9vZbE=sOYh&n0dMh^iy6mIs9qHj% zf=b&7aUGkiQ$J0&?X}7L^=6{z&;iKb!M5lqwCFtfA1qr@o46%~RI4xP4Xu5*D@1KU z221B}4&;^-(7C$YIYkR{!^^g%hW8kk0SYS?R-Mi$Tlqgr&;fk8AD=Z7vho}_)@9&a zc369S!o-3Kys_CAW%06ZHXN{QrevV*Kg~kT#852z1{A|oYFEP00NI?`-mo;;^M#P4 zzkJK4rr&XNHdu9s+~k%9sLx_UyQ`(?CF$r5he2i8bkS1ueIZhhK&XLixH+gP>1Lh^ z_YXu+g8V=ZQl;A#3JgWKg7JD^%1Eux3+k(-g6jJM7dnf{4-<-jequL=LBS{kt4_k7~Dz>-E@7doS&+5_9QQ8 zYEZ~8Xbfn0JtBc22xu526#Sy@q1V&D7)j4Jrg1+T=gs(DKm52TVVIZ;=)&I%KQt)C z)n5dFAyp9aJK3@rJSfq>{q(oK{2jIZ&*bxH7-X5cnB+pLoY@k7#n{@KLgoCr|JL9? z6~;xc@e73ocSJ)p+LTQro1xL~>gQe1e_HcD_5C-uQLAIy2-sr}>x!ndsm6OT#n=m6 zQ{X>Ub@$YXzE)2Bp4)!A8;`K|HBq^`m{|>niIG&Dl;yt-|K~s>A)11H*Z*`!k)D9{ z&=l*UkETyE`adn!^eWSLH9a1`54hy#pvmW3ep0V2S;3g@d`z*jYrn5)@*N)WMp;5YLyDdz#P9GyoepId8& z4$j&e4Y38W%H}LzlM!J0;Y?#NZs)CM?rdA5O8vM>`zBHh>u!7Ex)f>O`W-Y2YU}WjiWN8RFj>y>{md4k>}b6 zQZF!)J8YBJe&xtq<#7v4csM0{U>}_0ymx)?nrnnd+Im#C1%9qb5i{rzO1aifyO#4$ z469H_8xAj1#xoi=8V*Y)+HMyuG(C9Nle{pUEE21MOJ|~uNqIZhBoa&|gU{D_g=91o zz)Ns#6HnHlOkHd^tTnWeM5v$gN^Lv^Bv|%nT%b0#**3n|2H*xo-G69OZb>YU7%KSb zJaV8c-YKwS)gEKLJti>N2KXb={J5Ou3#6<1L6>DdnO`k6v90^7{(=w&3k{3KZhKHg zNA2nNr`Na#%q}}3ujB>MYK9WqZfqw~J_IZ78Og|MX-(E5SJyE^6+$hC0)2i` zQAnl8iqfznT>a+>(l4~wZ56j{zfzbH#1r@e>!lJCfIPE+3%BVIy z8SEG~J=LlYS@t}2=$qH+@nnA9OqWsj(RknVqrc-|`a6L#D}2j%f(qCLZl*my_f|Hu zhgOwu;bx5$?ySFe8GnQi8G~Uj>UjBs&ag0!(|2fjo}uvpW#v(E9xbvfIdTUMHQL5F zW z;qo#IBy7zmUx%=w7RU%kKp( zd}XMH7mD3mKbG9o4<@Enu<1c_c1%|s%{acb}1S2Y{WDkKDdQ?m0{vYQ($7Aa<6nB}_f8Ff!v;bh!+t*OH@ zBV%^%-*`9;*!tejoj8fUpq21omgih(JM7*~#U5JB2D%~CuN&}9e)m)T-XSJn{ZnCB z&O9zpF~f!x#2H{wNC!PuDqF|5f(ByxRvJmGf2qJJ$9%Q$*HV{!sIZzn-o*4%g~^@1 z3A-JGir+v_&=|2xaqNR}SSx{fA7(=swKn|#CeHXJd7?$Eq!?`ulr#c0J%R!g2=UtX zt$-@}+;H*2fIVMwom8FfcwY%aOO-gsqpyRKSy@yz8HiwU4CZ9*3g;FfuSPd#hotVq zr_b*Tc5{P79(k-BHT_)vJZEw7D8tM^j?3869;jJe_y@bja1H~+sEL?Mjw{L-dfgzc zCEn-n5(cZI77fdwi!imRh(6-avPz7ZV>qT#h5&nliPSi2fLmTYBSsY}i5_QIfI>;p zZTZ4f4j`$6bjYy#O36UoaM+dP*yVg61lTe^3h=-9V%DN6kkok%vmTp~nuGU)5DMuU_<#w*7Q`86Hv4c!t8rdfxpnLy0Pp-NT6kMG@V6P!P7`Yi&i zU0^%XOq1anvi3td7vhaR*UkBXG5~kqAsxyw-Dy`|u6?!eHMBkZXgz|!?@VlN_hxQk z;en<297RGoq%*hm25F1PvZbFPfNtnm6@$qNo>nzcBUR^yF+{C7SC@aU{6_;sa_e;8 zU6rmat${{nPDEy%FJx_rvmTF$%3KAkNrH4Eaczl|#aLKviJHrj>RtzgA|O}5HOJQo zj_!@0i=kkrDN)F-q&&a>^cf=5=)fjLPNvM-t%+3ZkT{l9%#gUM zf?&okyE>(WPe=!MtA#7>(?%ZO8Hoh=Vee<1TTiDlYY(xD-LK;=#!^X_m2e4uK$%u_ zt}?6@-5uyOeP^X!`AjtuxEt*!$T%6p3)M24D`!1Tnc%jS@*v!~WB^3*H07;@LR1DK zPkizUqHGYzpAhu0d(*6DC7i9}^>S3Mhg0yqO|ah@CTwJeP*|5#SXZ7+V9C4WjlIGr ze)9Y_@*596^UKuz1?2-%WhcSP_(NDzir^)%Ebwxd?jZV@^4U?az~IjT-uK^+F|5Fo z$`yV8ZI{{3pHHt7Z_mKaT-jlk^6&hg0~A}7Z}8Pw!Do&?8=HQfG2#uF`&b&UnsrV5 z9tkGoBCipWr?G1nD94*0^Xl*8J4kF;dtpW{>=eLzqd#?3-b^oJw=Q5qAQV;j{KP2X zr)X{hrZ5CxE9t=Ibwj_Uu9yzm*LC(L)UW!ak_t3qI(JF?IF%g%Y(Oxk0PW4Sja2ri)hTr>yPfiM zyV?Xe?7M?EkSCDGaX(z#SaDx*zet{1D7DOtBYRY>{_gLNVlySxVsg{3Vltdz8EBuetB$IsI^pIavy=3GGzm}e0U?hgp5h!ELX*lHF;goC@z~0y3UZblu4r^c~$jd zkE^If#f+WADlG#3Wl`!wxpzW^#6;tCKMfyHA>mbVdm>`Mw3ndi7VTkhj2#$NwGHAw zv1e5u_$Y?xsJz?00ss!_6sytD8}@fUd*AOz!N!VxV}#!BxmtZ;H%9*B(FIt|W>4)% zg@G|AI&kC~hH>Jw)o;c>i>L(aG$Wn)%Mz(aVM5=o#_-YU+mz?IvQj=@FJ=6$8&yAE zDLRxrCXOsbD;y&J*_VW{vv7s}vqU_)AZ!gEBb!nv3@FX1j%+y+9#kr^e-_+?H|45jIid7Y*y2FJI%g{?kRE@1Ow+^U6c*O4wW9<`0=* zRcnxl_qyLB|K`Lv{Z6TxkBGO%J+fZMn3bDZ>#L2nl*^Zuu9zM}*2B3)*UmT3xgW2~ zSKjwlx_PfBz&vr+y~IL7M9j`4(7)p>dQ9sgQQ}n)2_e0v#<3APYqcGMQ36dWdR%%1 zALr>q;lent&ZRiW2~(c`g}MV&ilZ}iLP})F&{{fVMBVWLyHDD);i~&@0(QB z?PK<2N9!>}(D`C$^d*s%2*Sikf~K&$J_DK3A@H}^nSYx-@weHTStO*hEqUX_eA83Y z8PxBP)d!ZMPm#GOsgKj@!Gr#H!KcccA>5NgIffW54KP5`}_i&}B8 z@ZezSHZuI-7XmC}$rmYNnPW}m!FXN@7otveR^kZB-?vbRajmVX%%aEOu);V`pkXB; zXV^>alnBZN<``iXqnJ`rB0E~B!xJo5dWI_Z^n+$^*@CyjVTfoE#325l~pq@~+)+QliA z_)00rEe7J2487fP;cWZ$3;@0j4gKofE8CjRUwb=C9AYi{>SvTo4#uGIH?+quk6%ue z13m|T{_wn$-1_JJU@`+C39^#oO@HWqXy;Iy4yER!TVZT2gIvkg#;hE3OhTDeM?21; zi?>-YBZ;>|o44u_gpPT44`Q9*6ZnBOa7pLlir?cXw0aJ0!q|}G0T^e%$~yCYe-g4E zwCuQpvp4>=t%Gb+ouIQpgkf}G7sEjCL~C`V9jVY%#HCQk)e2GP*cV+od$FR1b#RGB%dmGEk{1ZX%Ow0_b=5Tr-p-Q*Lh56>$fWFEBh zjL;)U>6J(%(_h?W#!Oea84Q*@&5QhcA9t3O04sKmAV$tpg7V_jjeFXYzBH~PJA^sO z#5U22{*M_rn`uSrTkW~+h~bWzaURnVs(o6Q#Et6+sMc_+Xl?EEHQ1IPKIJ5*W`bKZcr^ z7#>V0U8+?1KB_S(7_CeW2UI!_Di!jQM4&^UV+4^=gZsWTW5&zeBtJ1slPsSsKQr$c zAD<5A25(4`oHFS8;P?^)kxq?~#u>nN2CLNAz?!Smm_ykD%_DoCNsD+FI8TXovXbwD z*ZO!)8jQq6m5*%z3ITtK{}sqAz zhTBe4#VXB+I}}o*N^N+;oboN@L9zzu#`iTGsw<_SZ9jhm7a^zakA)*=XIS z>lKk@L|3CC9Ob8D_&NJK$7^)cN><%Mk&SbFbEGdyN2*Wtcl39(G|q+kRU)XlE!1p= zT=ct?%cJi*FyX0Q%XLFv+a@={Bg~Ugcu&Mbvv%CHMF&cxIk9>W|CN;spjnon<5F?k*~(j0Z>*yi6l+;;yKDi+@o*-g zFJq)>W^sP&PtgCpb^F)4x*{R;U^ERuOdg?XTtjEZLvs~*Vn4~5BcF5I2u(gCaE!#6 zl3w2EeUQMdNlnc|5^CI06^yvsam{d65Zy1$!|eZ!W6D$~{)p#AR9J(!C>W^~kY@UX zsy9bFm~N8B-xVoS>8xHhe;MbjCPS{*Fe)|=*}eR$6siK9tc^PWKTWSth zz@$vo54{$t_IQ!+Pi%$qNTi6mu=$(*4mY zjM7DHikOwQya$sk8KMlAK2KL~PZVBRO;T;n2+Qz0Y|e!Mu@By6p1ICfxd!kO@nOlS zMyRhE{etS83!a-(>9(S1L1v((u@fb?A-7?Q9l*U=$ZJ@C5d0=!3gJEMs?A4vne@)P z$$%J2UqjF8Z0%3PkG&z;@743YV@3JKtD|M1HWB`JOU_J1*t*DrP8TzhOphV2e=3v$ zf)sXR{S5IDf6)5(*l-JfoW&xglz@rSc6WdyXy8P}AyDI~&Q>am!kp(J%vNG}50jhf zz6MMe?@$&g5o#oL{Dz8?Ra^WZQcMqz8)(^}Hw7a*w+d*?dEiEj( zHWfGMqlr!<{W_l7R~0gqhaLA-FP}#;|4cgMMr9R_A^5*Hl|l>llGs`RG>rt7wA`nF ze6@G7Joz~JI8zKF+H~XOuKLadpZA zxyC%`9H&EC!dm3!LFqWCN~MuH;=iQt6mfbi4`_eoU7%X8YfT=uD3U7OX)d^g>{Ag< zeaSh#q_fApMdtYIj|Bu{1tW%F*_L7rcuZb)7gdILn6%ksI}}Sz&4B%DsFwK{tOqer z87{(L;Ro*x3S5htw>N{F?yX}V)Nved--14*)y^SGE;A-d2`{0c7$2MQOkVdfS`mj@<_AvGS34w$;g-}*inJl|}`U0|e~ z+Y1>+05zhDAi!LHC+X|H0r$R-vQ*Ll6UX%`sv8`19|cYPfE_!9Q>t$N-wDAfQrd%^ zlCVll<`qjqtRFw`^Z>~aWj_VgP~P()$82dPzxIB_arL3Pxr?YY$SGs` zAZIg8X3Q>z7O`o&7*$N7K8z-`mgkbsi;@Q*1MwnGj-#|`!k1p0$L@_cX;XKk!RZ-N`~w z#b2wxzQ;r~2dQHUn8eA;F-uaJ#F52S_u??v#7e#>V}y-|6NGS&SMdBMF`@o&j|TLr z(^17GB7e?~{a4YsvD&5c6mzy*Y|?SyXRvt5qF{JT#D7E=DC#e&%pRh8qNc1$Axxfw zDP?r?O`2-&-R%{9T&!qmc7zzYa{p5Zk#fP7Fe)Ms6>UDfl_D(_W1TQLhf5qb9Th@; zctPy;(j<0?3F_A!j$D92xnGVQwWfH69Cz@mVZ%-N?-0%GAe`fYG%O{G1C6il$LTi= z^F2uM_p~FqvGvD`7Lv=nWUx|YNa2e}Qx;MY(O(qnC8yP0<8Z>&f0sjJ+Yrb4=c>Vq z&6<{4GsWdqu=Bf&PvxFMgyWh=2~Evg^kaoLqSAt<=5Yn`Eyw{2a*LB@JVG(};}na0 z3&NCKn-U!for4T9ZbbF3kCVPvvzKII5p3GD%a-u(6zfX^-4yHpisOJxxn4~i-XHg` z*yy;9VpU&>$k!hB>N;sgntarz?vN0)5wsJD*txr-QO-)XzGVmfm8^fZTF;N%{p@q_ zI@2?tCXU8YKUr5)o`aKh^w)L4sjYcuqrph*py_>~>C=|#3%)(d~f=4)@@!p&?MC)bNh?nuS2=Q8WA*+?`B50h}BkPv$5 z1gz$ZUuOj4jjIzg8yIH9X2jw-`C4`*cEG$9p7O$2=}h0-tn;bP#_s1)geQsNjVtR; zhCh5|tO<9q-gjB7?d{JCTGjSFjP&`Hv*Hit9c~CfkU(F!(N#UQZohw5Fgt#q!A3eh z2bsu0{?$^rZBG%LDMbSc(#28=4M%HOXkn@f#a-)O9}?w{glJ4`@3+P)?0l$uGl0|( z`ld*+)r`sqVhOQgU+ZqpsWIE9F&&|gxzAR>2b@qE`Y%=x~HT8VD`vO(2i zP5dWJg${>kj>{ZdqT~rh1yE*;2tD0eybv@SG^;i+)mc1iGgqMB)I;c?*bPw<;kY(K zIQIPg1oVGoY()SrGaoc7*1){{G20)~=6&qEn6}1UJ#)B=8iS$G28xMG+?-l=BsTG& zWfyyN^cU%$fk?sOSE$N(4Xqa4_Ld1@&p~UrC_r9F(a-&3-u2=7($Amlh(ACbS8{!_ z!N|;6Vb*$)?pW^l?RKD}K$|eX_=icWAf$z|x}YNaH5^jkOgj94Yclm=5kATcO0Cr6 zZpLM#;J-#yZ|fif>*vuu)xDxY~kuFb~; ze9+Cu+Rex66}m3PLzqutR+9@36)!A*c__4~b2b$cpai&1=5ly^S$$dP+c=rEpW85GPixy(i7hdgsb$}UfzvvMkL|tu3 zmaNO2wHB#G6(x;#cE{{HuAB~nCLkU9Oikl#uJqeIi21_9$;0d8nC$u43tV*O0s{?9 zNt+EB3^|MvBoz7LY%9rEa(BZ7>k|(Zdl|7yDH0f3ayhlhyysZ}*GP&om%m-OoyGX~n8z z3=JTQq71Vdw}fc*raV%Z$}p9Gyz2{vB#pJ^8!E$^Ozj;t{E|4{?Bjq8|2ay9XoUq` z4T3`!nUPMNf(D57CgIV6XRD%@j=>^RYnfyn5hQi$aPP$lWkwjt0(<6Y$`xU)7T0p&!E%&ym9nP+ zN~DhME@Ck&@=ncFb)217=VOJU^0hSm0WnCK?i3c&H3>1DOE7G7lIMl@RruR+NW&aG z%0k9YDn5zV!-SuNmRrX{l%Pg@@AVT(&eznOmLHqduie+uolff{L8oxtU?VA_|3kPTxsUO@Ln{6Cn)&Cu&l3Qj}&|R1!-VGlN3z zw(IQySh*9^MZ4|_t)?xJMB3l>&H>t=IZ%@xDf#V)H*Qz^84&}w^-YEWQDK!@cu%@7 zJ8!(UbFZ$&g@+)AYqV2-`xE2vR_m+TXuQSM?OX0i0}@fb`-(eWebD?TJQ00FXt?ZM zKZ3=1U2jN7+IRKm7R7pUuIQfc0;8o0{#gt`6L|9+xB2kn&ey* z2Z;sogdAJlnAS6?iIiKoJl|WuoA3_ctcvl%lB(4z^N13=&5Qi_q?Wzn`_TtAy2@qc zlNGo5`J&FFN-}hM<=U;Y$O*xjFc>Y=OihGVbti8JpI65pnOhS1)QUsMm_x;$>yu&U z6t(?%*znVI2&LYM-10M*lnR11lJU+2?c!m8z@j%4r$qn$>VvG+u@VIDLdY3lYu=1j zu<+4tFzD#oS6=Aw+OZyuXt9YhV8`PDmGG_lqGuBv-w&W?ZC%!Gd>Sxlh!}o!Y8!cL zg;uHz4B)4QiR1hvMoU8H?LqQ2;J&~WCq(Ya`x&A_O@F}HIlJ`oEUfQ@u0!SIQQWTdIJ;YjhDG_d**V!3KDpZ%M|#ZH`z&GcZF*^Z$vOK=q=ExLK>6Utat=lx z*6S5Ld~=18nFsDZQdq2|#yW0UFn}k1Qe*6yuA_dHVz*3@rfY8LKSiIU-AkMtr<0XrAw8+>xBzz+cfW#yD zLie3>Pv!D0ZZvMB`OGMr0I{W)YNbC)k|kSYH)+B>wPsvbpZF6Ow3O|UfYN38L#2Dr zXt6-@t_C}hv{iNR>p;_z)?Hj&+20DETlontf2gy3gwg9)P3>~D#RsN%b++=8`&R9c zoqh&~mohoZkgw)U=ATCAoLl-v2vCl3AZ|ZCv2BeS8Q6xwZ_;N|w{7Q6FgmCcv6x59 z3@EeeH4Q>TWQg2*aA$_rHgdZ$V$Ev}=U-j1tXnPv0;;2(kj{+3RVb8BlVe7vwpwVh z49ygirZ<;HqZ@~_uFkmb<9V~SLQPz0-uuYh9c9t;2aaa^ryE0zsG7#So#VJ;G^k%N zvChd&1}v&;APU)3M?s0ja*&$Bm}VETNnec5?=|sx_iX~!dZkX&1vtmqPDjO3WtBEH zh(5;w9nl0jqBUL4@9_(&Snjs&XvZOj2I8hLdplBCP+uP4MFtr~hhtaI>pt8vylF zbl$b|>B~~YN6QB~G0u+PbDRAhY3nDl?&Q69bE3hv-t@il``cnD-nHI6;K*r5aO5;M zIC7e!7)liuRBG}4!eY)sF4|>E+@PkVsYszdb2fa{b|hIKQskm3p6u784IYSX$qy3; zDER9=I@4@1@4+eL|%svOHISGPms!@6Rl#Bsk|P(bJ$LoS3bR1frkw!%VU) zTX=lFqrp$Bkm|RK&3>;Vs1i9*urN=n7y-3xq-`UTEK<_`h%$toH=`9H31+s0$$PiM zWc*9X36h7Z?fD1DlhN^E`Up7Xh>|z2GCg#@2L~PaiRWU4lyieIFhTO9>ljD3Tf|Y| zjp50oUcSGepZ`VTbQDb=34mEeU>*&LGZG>gE_2(70xk!c8p8wz5j9#kKQG4T%nafl zib6(-(x7TN@IvAvWeEC^O&`s`6M#2jb7qRrvH>s}=YJ?S&bemyf*7B?vhvxyvSODg zzlrCmq>hsO1tWpkJqQ01YyJXj+`u*cUto=S-zZ7fH}RrR;Jp8kY5oVp11jQDz!9W3!kIp*&!Q@1If^|6eu#a(#|&<0Ok>l%1au{vq8Q zeZdFUABt_(1>Bur<`DSh6xjc?tcdLde7M~VK}@Ur$G=RZ+0(24GJ zIEoCDWQYHOB_%t219Nt=ic>ojfWFanniBAz$-U(N@}oe(nouKlWYbcGFvj_-y4soo0wf9Xr6jc8E#QoK)r%qQM6@Ji2#RlHoBCR>98%|2%#VZz0p-nf9Fkx}^` zZE6U6O%5`d_g&16kfvX*s=72L#wsPG+Y}STn%H++l?z5K8BcRa5sF}wvSAEHa|TFo zyjVOreGuAvQK*Bmv50)+_dQk1bA+iPhHgVQBC<4AsCnH#6QXHS9az(Vy;F)wim<`I z)HIbXL%T^rlsmhiybdjPKGxNdX2es*Xs&MsS{8Vw42q0V#u$b1!*nAOim`ActmiVD zd9c2SgC-PRbBddi{c*NJGBCi;lI)uNJXKVR%g|sn0Vr8RiV#1?p5cazDD8@5*K~C=a_8#4A1HLx7CsSyJXg31$y*&xy zxc@Cvk0z8EQJrot3>Z)kqxzndXf={AvNi&v=J(&HNR<@WFN-u z60kUaZ26F6!r$TqeaRGTN6wjy%=nE+DOTV8&nOB@3O;jlm(%DAAQYaAC*m`ic}cx> zzpL%u?)&0sJrsM*oEB3BErCVgHWk?tIZE`77Z>90Bc2l(H5*1KPB=1)_l@tss{N~> zcB5C-j~rDK_namccmapU%L7*pqWR(`8n*5&J+=&tz8ieOtdChiV4P78m`qUp5o?MF zGZXTo+wKyxgt7Go&}JIZz@oL-5YX~PumX)H`8xP}N7&TdK%Vc*%078N+n>wKpkN$@ zR)woor zor|m_keOsiCNn#GADass{GOG>t&r+Ta$74W^-Ao^^qaw|5C*np-j^}kFPqP2 zdJBI2_2Ucdx+T}#M;j9pH3TA)rXMEQI0!bu7a`rD+IfBd6YDEz0YJSR9{*`;Sl*%g z>CPoD{GRfvxY0v)iuULQV%XjhUQ0-hE zj9!SCq)mbtgAPcj6}Kx^)-1;S&%YW9NQe~Rt}R4lV-bQh0kA?|)}iERyXy%xrgdnC zvuKPOrq+mwX8UXh0pWBD5DkR|-aI0z1qnAv?ZYthFjb}bI5j8xV+s=IwK{cnNG}z< zIVW>c6WNC{()3N0_M7nGQf_twUkGMZ(qfliig3(exbUn_l?J}@d-M8u%w16Fw25=y zZdxJJKTMh!1NOqYT1lqKWp&GHl-}mg6Sv9!__ZUSC9jQTovk6N2%)>6s1FcWU=SjD z{Ig#ZcV|3+q7Cb=I`-eXLOl8W6KKZqoO0-cx+W4H0-wdxI4KUL?0^mBsXpV(&ZTYRlhw?SY` z2)5YjzEzZUYKN?^%RP1AwQ83biz??;m@+3Fm4Qs`?V<9Q#Dj@6=RJHhG0=MAH2evz zP-Se!2`tjMh|)G>I%VMH2+4i| zE+jPChm<1~NNrJUFl;(vrr?Nw&y*_JAAz~sho-r+IQ|ZHqIK49wX+|PQAqk)IY~}g(fUZ|XzVeG~Wf<4TYBbU$Mwy6TP2rKp$)BOa*fF+p zew@GZ`7uc6MQxr(#>*4<=;INGUD;Q=&l$>{Awz#Z_8z}t46_6q2V-g+FpYmq(FKm; zxnDQA^E<;doJ;SY&bItM?RA3CWo%DpP6KwCq!S4=9F9Zw;TVePGu^R$#w0|_aCa7k zAU4n}ef{u9E-SZ)D0J?vKm5q=bx|u#=b!|?-vn`Q{Zyy2r@sW0&%Cc^AjTQqs|{m7 zUo944C(Sr04DCxDXuwvm?vr;#~3 z0>$jjvb+^Tp0qNn&cz7?mAv=-i#sx#lwF&9iXu#|e1uPa^bt#W|3DE50HQ?(f9$&N zwxEa8K7R^seHNvOHWtyHZx_nI{DirrfFksGDI@T6u z&UOe^72LeH)&yd3M#IEzqmMO33H`<(G!9LYag)N3OLF>%e*-Xlri=S*ClMux_dzF$ z6P`Qucisdx3*lp4ONJcNZ<_ijCC+rQPDC1081wrMil)x|UW*Y7f;61yscO>`@zlw0 zP@RmhO`P0KBFu*rU`8fshF3#WTpSxJ=40mq;L>%2yJ}9e-B}W2jWLA+;-6;XkT@O(;hZL7Ge@mw0zzr5Zwc{c(5}2iV=6d@4nBM)*ZH}DevDtpqRTmUIncD7*GG6Uir)%g#1C;b%nIg=adWirvDnoqeosM$|b|MBpsn3^TmdV=A$Jr zh6XVgh3yyJ?CSWTd+72DYl6?Q+ACfngPky)@j=0#LMVCNj*Hr*!C;shO;lL26N`<% z^vayZ+Dr|wDQf2@&Z-^tFUGko477-Av7vX3oGS$P-qw3((CbMoPrzoQ4AE867RtEG zoTRO$h8zw{8ke{oKE?gW`rk>@)t+|*-j9aZLlwA1GN>Gnd=J;`@>_5RPBaO%AD?_)y zsa-P|b1usG|H3-)o$Zcfu8x6@_tL4AAAd>3Q@GACE9pDxoL|^t4%sbD8~qJSNBV7& z8d3{%p_4V*pel|7PpcpIFEOzT`>*Yu_4BQ2VZWpa@A4vR8Jx#L%vf&|QLiz(^FsQe z_{X~)4r;FlxZQ;bvc;q))#t1Ip8vX;gJUhSzIRKBxdgeNp4%>xsr@F-WpzzCRSspdUj`@?g|M+C)F<7to2QY=y&`qXNf(4~sR)5m=PnH=8DyUW`>t+V4_apZr+4op5-DU;y;_`)^!Bj7B*i?P-v z(gC>IGG47FNlM0PM-*_U(9wl|8xRnL6;jm!pH=H;r~h`!1KjyLe!oBZ-RIvd*mK6S zt4xuXZV47405M*1G7aKe&&ho6;GFi$U+4az!u{hl@J8EgFlDi;;j=%)U}vokhkEL3 zJN0`Qh>QH8{#1lerd7iJm`|B=@$1MOo`v0Nxb~|P|LOr6>Z)vtqE*n50DD80??F2w z0Yw)#@tu?J9B^HEEU}rgKYIt(8YqDEbInkMYbHB>`P)i_(&>F$*3i#cWVdh40f+9L zt6eVF&4E6SmsKg%QCw>lYUkk^IRt^`sKq_GEz^2oq_OXej$2@;WREU#jkNOcEo+6b*rM+f$w)GrdKaKpEA2IUJJ-PmX>dKw4G0M8}!b% zaQ0>#R&M_M-nL!n=5Zh9S>fSp>>zo*n<5%+$AlOI&?Mz1^C$TmG*Y@+n&-u&K zxwwG4QNlp4Q>VHg-A+Ot?J_Zez)Rb$?`S{VquZ{R6<;+;eupdFaz?r_(>v~KNILMd z7f^n&e-moneu<*^29MlqJjx)w@?P4`f+}Ud{r(Vek2Ne(M_hl~!E|T+NBZ?lb7y7! zlMvahFUS=tpo_?9=bG;Q)t2xY=N~W=*!hcuat-Sn&WLi{L-SSQLmdd#W)wQvaoLrL zOZ2+;P&~8~dWC>2zSVso4ni}1UX}ppgXW?=uF4a|=#Tg=i}t93c~$ug!E3|z+V5>L zuwOU=-N+-42d?gW-e1$-k+GZbW)$9gqV6Y{o`5aMaxb$j0Kx6;$E!Ecd}FlwK#N`(wN z9uqi(wlrR3`1ueI>7JPX5AFmQ?)Ef`Sd~#V`Z5RyXMnLmP$HW`A5hVmhDSq$W{6_Z zlUY_sPR>?|OrkykFh6k7ADf(-uNYEhOY7> zUSfTAS|IpxMA~XZJYbu*#7-otrxT$;pM4dfp~j$$Sg8>)ZYEP&@Jp@oB$qzz)W)Mg zU+@chvK+voM*vn@g8i#7^~AU%p)ghNg!;>g!BTLJ+U9QMFtKEBP*2h#vbXOWT*- z{AK<~gWT$Ue|xV7_#79PT(1S(uBQFW*(Z@pT3is1v+IR;hku9nLweUUdXJvkbFQN~ z{oy*+&+OM+&ZstPpaSWymwZwaSgRq~m*2T7Wj9i!ColUM z%GxgLqo9@pCGGqInhl87{;{$k6s_ip|KLDa`qF#SH1`v@QV#kj-szO(f8w239`jy( zr+LWzCrKi@8~+>cByB=ZOBpy)2h$x2^Dg{;nxI`rPE#&nH|D_4_m|!Uq*A>%23e8G z(4A$oZ_)*0h6Sjj?&;c6F$YR)@);~^hT=eJ492>ToO*mq8jugWW>(P zQ;oi$P-RH#Y)HkQP2!(U!&Q94_n|`Pw^BKXMr}Ev=wM6rU`w^2!jkEuD32*AQ14)EO0=NR<>W{7g_+6nA#+2++7wMlKpwq-{_2H+DklVdt_B)uL5fBp zqC2`f`n;?R4V`*^v+Y(X$bz&;ft4c3&w@taf$3RfomGx)_{ZV8@VsLFiRR1^UYk@> zc@)0Ki-i_HAl*QFq6~^Yi8RWPQXNuOgUIZIY)RTxIAs-{&Pa+x?YJzt2Yp;YWFjTs z&JR3HRgYKz3=<6#%{JD00m!K9i@1`8175;v5@;T;x1DZ^0$Rd7 z)@JNKC#4>Xcf4|*4D<>(t;Yz1KMP%YP}P% zmTWOb$Erm(kYkJv!O>D0PTMc9=#tv;@HbK;_#<}n?yS_;@}HrI(gXgYnPL17!Fx1( z+X$%(Q8R}KdM#H_um~jveH}YM3CN>~?q42F9|r%&qls#($!G>oIyB*NZ&v&6zaCAr z3Q%E#7Z10+>6hE@N5JdViRS*%BBJK-U+*2}><$zGghDx+`_wBXv?|))dBM0d?2fdL zl&&v|hnkRhP@(^HC7zfGv93Y$resIRz=!AxG{?uVg!2%6Eng2X$96i$c1?)3*bjz5 z2FxFIi2uf!R{8Tjrn$deWu140Shr{B3tg(+hfVyc)tASD`7K2E2{Vx!T#xvzqkG(z zIRjTY%8ZfTck%1z3XL*xf$f@Xi(57AEbFsY+1Xiq+LI3M=6Q}1)`BmKO~j)P0I27% zF4eOJ^&Bn9puAf$R3%^NXZ>;1WXD7h)c*Dya;5Z~wz^N7PcCq}R5DaGy=SA(f5RfL z1COGMDph1kqd$OEmcUz(ej)vms3E3Sx!WQqwz}odHc04pxCLTB?ORShxb^u9S$1ik zOoRx7UJpziovms5SX^V3t^mc>_dVg!t_!~f3U_#?oY8ULxK)^vMs*?o>D{;Fm>QPd z%gkYza0a!p!Cl{$k|t58Kw#H zDhGF<7$9;4n591x;ja$r@JXg#8++=q-k$l?48=#E4yTloO?SaqVhUDuA5(WRaJv;og>twPCAekq-S`DT^TLd|Zal`ke2`qoADt9Fx;4 zj?+s%NWx286ZiTjpeRO=MKDA)`;(%1H1tr)8FK2=+9+(+_i1`W8%G((l6KXZI8N@4 zd5Wox<6Bsibu_(=Rk(dqc46CbGMV6+CTU-40-g5U%33#>FU(t6a%>b4+%q)qXF{GsX$-dKo8CeS0!p```_5Oh zG|nZr4J*shapGAFfGh9F-Zx??#m$#V#ZfIal!oW03B+mjki7*Rg7`E0h|~&hQInq4 zl1%OAoxPnsK$Qxf1cl^%UZ`7>m!!u&916$C11Eu%*yN=T+V9w_L;`oK$_m%$I|V-4 zkTznGuk@AkKe`=V92iNp}Y`|f;BbsT7FTCKWz15STwHB%aezg`su zYWb&i1c&kII{mB<;35r;Cr{3I-lOCN!*P?Hf2M0{SWdWe zgM?v=kBT1xa^8{BNr;QpZz`(m1M%-@Sg9WA>-!t)~fzgIe_%Gz}gM4WBrE z7RhAy#5Sijr^!6K;o90W3FA<>wYuPegZE7`2!ZNOAeQ3`%NYi}iM^AQ1O>h)IRLrARN^k9tPZb;4 zv1`Z72+akXmofWU)!YT657%1l)&M`EjK3<7%X(HcR*C2DYn7a42%m- z($80=Y3NxreuJv6YOnicKg)l+l%3qEYh}WMD^y=A8=_z#&_f_;b=*<4$1>f@ zoa&0@gJ7W0eR2;!h`N#s%jdRv^~Lf+w(mpIhI~+x23~o0IW<@gpVFt8HiGlTS^~@+ zYE|v@TnQ7BD#Nwv@_bVBjed1yGr;&rg2ptG1k&{JE9#`=urF&?kVzGp|V9k_{N_?6-eS z2^9YAo5ETJaqvRU#%0*^K6DyLWEG^-iTFU@+lG~i&n9)J(&0uskC576tb#;2%t~9G zY>b;q%V?rfbXyUQn;J`pNl54*6eJex`)kjXRAsl53vxUU$wLvfBFzA9yh9EZJ{57_ zUbBEy1(g;a29?%|8eOEIMiM{)8#mbAR@S&gEyw`Z=n7tGEQT4kgbKl?ox7X^w_tTe zrG>?Wga?NT3Kp3YXU-Lw1A_vJKGT@Xu@kAx#|Xu_i;#(AexSPL9}ACsqr~F9p}C=X zNXdl6dXoS{dE57Y#CjYvK!Fb!FHyDw*}J?q?yx)u#__z@NtB;cYJk9mMebI3)#{Nk z16mwf%|}(vYHsmre%t$*(5z(G+-Sc1%*%}f$@*|b%?S}U`E(zhDOt5kR_}~#7kpw% z?(R!gzn$v-0XjHB;_BFLc&D{5(f%QCTknB!V1Ijf~sq6aXDkF_I=Ad&xN7J zsVnpf!&SeS`_r1@ngSW3zwxodaiyGayTl`Ye5L)$9gBwA98MOFr;^-UrTzgQ8dM-C z9^7P>mG34FWyL*w4o^xpIWE~gwV9tu98nx`PefciE@haNKbKh#_g`W}WQsK_RZLix zF_AH8l`}bd^F|MwISo5|D(=tgFGy$3cM7l_Nvw}O0!Hjv`;u2uEUaR`6>GBJ$P*{H zI`d$HrGJjuqTc4iaE|ere<8n;o%_#C;ZnM5!P(D`<#bB@O)(zKm4C^CwADkl?lojn zCMq+;AzJeXe$i>!V5qeiXLk;2oUJ0dVyKWe`s;MQfv`|Q$k&zpsV6zp+f453PBCBo(Q4 z;fmeF&XPE@!|~eXK^=s6TgPcjvaQ%1F{QIuYql6Y+4@`J20C^lZ(W(jpkX(B`T#)R zi-k=yCyrje=VY`6`C8Yu)BIeqISum;d{;LjD_VYOd_3%YI;}2zKl9=~$@DU#h`f0E zgnu$}d=I=G+@6Ly!O|s&V-&!d-?1oR=v}k>WtRshug3JwE)V8K1{`m4q5Glxk+stYn<0kU0A7H2$Al`Ni7Tk%VBP= zfpJ?Z_+R`G_l+Ew}U;jnjcj&=JH2!7rnyBemd#gOAKCC(qv_&y~ zSM@EM0vCwGR+>1NL+al0-k&wdcvFZwA?<5ZKlQ{ivs0yrIHL3|a#=9;U!?LDPmL8h zP!`cnjve{nJ=}>m1yx4Uz>2njVC_|_1na;8h}mB zkg}3GYSk(tr%rEfU!v3TGRpK9-6Qu{2rNTaLWf81*3tDa-;#Poq! z8xL0>w3l8+Hj#fv$P-XtF(vOa%Wjqn)2vXj5|IXnyarQh!8F&buzD=$rmHImf`D&* z5sqg$WlG{rLWzf!cBkzNrQm}%2>2Dh#z;;_K2AhJ45=X%g>#D@D%dIrk)VS|b>#&9<D0 z5fWU^+vMsA%ts-Tc0H&iZ9NNQ?ddtK>@5$u?heO$Q2IadK-2$(x9M}ybdADOt<}m_ zxXMpti-E*|k*lHSDb3 zoiaPyJBOOB_c!P}!mhQVGrQYIkzvLojd1PuBD>pj5J3_WfVR?%ZJh0SxY%2L&@iJv zWt!$A`TA)#=7ajTWrS9tmJlNx;qjut-;Nb0_~N&xejW*Y=+kS`I016e~u%gCifPBN`S zL^DxQz33{bJt`M0K`2uHuuxLSf@`a36Gvq2YMh1yj-tj*HC8F;~7c=Bb z1WE<%O{W!AR#;QMRD-(ZSRK}4ICl~ZLs=g~?`LGXgvz9>)Dd@P$#Dn^>I1e-1zDe; z3aTyY!~+W&`XfEIVfnhydIFx@Y;YuMoG$Pb$3r<;nScn)#4%&V% zDGX=bJ9HKIpThrE0IFho+0{;omYcUh@OU4bop@o}%sB|r%?u|25kBcpuxC*#>di757p=uwN7XSGl=Fip%cJyv;D7 z#op$7($d+8ovQ;BgTw#2g8y4eATqJGU!}&5D0b3bjed>=UBbUK@-X{??gt{oUlHP4 z$O%viG&e_aaMKHju~O`i{g2p4YpMR(M6+_l^fnif>K6YWEqDlQnb5Y_TsDMBhqtS4 zqwSK*ddvJjlCa-#u|9-^OF-mEu=u`RtY0qS zylb-jR{C;Tuvv2PcKy1`a2xpPg)4Im&24OF;MsFTpTDY*!!Tzlu`_mn#sldVxH^63 zQ>)9<<0ghN3JzrTQ8K(h>8nrg{Nk0u5^#X|vXz{`GUBjx8bExPpHAJVp*juS)#QAW z<0BB-VX?0LZlPOq(}H8F@(s zIBU?*h$%TH1}G64`ys|c;>HGkGj$+Ul5%Q@()t%rq998}Y>bKT@HYVzeAaJi`$79b zm(Jh7Id+1?njEiY02Vc;Tr75A{EG$M+|ZCsk(t;%VOp~ zFxL~nG>pg3|MczydMMSkF$b3$M5n!TB}9Uj7Z<6HK=$u#GE35!G}0N$&dNaoOcjJc@elQ`q^sK>IC z&t+e8i!OYQqf+R658}>Bj-kEb!1=(sG@>2*7{PyeV8W1hct$Hp(11QMMIPVzJa=hN zF-0D00CQ(@a}-+>cp>7hU-NU0gcavq$EE>j`wgw5NgOi|n_R^#pC0n0YUj6O*&Y(l zE?L|qa4%1^+pEl#3*f55Xe84bn;D{;{_;SArA$2Y4Agaod;`Z>S1*KQwzMKg#=&52 z>K$SXSI&=-C9-N#>9`bbSFDZv8yt?Q$nLv z3qzylVqvk|x|T5MEfIVpP0^Xqsi84KqWT8!1_$+8@1k{Ut7hq`@rCq;Bz{n8Aksr) zg+z-E6_~29(Ww%s#wxM#4P`h=lxHA7F-ovWu;CBIaw>ANA-pnW;r>esh>Ed5S^$|S zfh?lzq^IofpW0rq_a1Mz>bN)awJiGiKN_4Gk44#)73v8O+neM!iK0@LSr>N9vbck? zMB>zGR4^(s?L>0Yl2v;C&}5dpy5ryYargD4ic{1w=WAUA=1{H#V>Ga^#mZ7|xQpd> zl3r1Hu%G6TB$;Zo-Dxa}N_C{oNY)#;}DObB?q5YO^x*9XL)6)7=16tVNF zi-<&i2#;b14gl4)J(MtRQ&%WnN?Fdh7uti<_sSkTZc{67RYGpowK&DF-tvMd%KlBpq=p{DF*%jXbK8iS45j(Bu$8#Yv;Ht`zK% zle)QlwrboK89g$(7dkJDOEiDOaROY8N1JL%#)^QMVw9Mha} z7fZ<;w^6clVm#^JmAx*@_L;w8qYJ<^28sz60$A#5>i3x=%EvS}DIkGTEsVaqVJbA9 z&h4Gj5ryD;;Oy*|=}iTzybZ^pB2Mf>&%6 zP-nhH)7<&-Vjdxsq#p||)&-$j?w zxv}}VtZYg$wS&Tb-Y8VuejXEnTo$xfR*G-3ui6}D9%xZgBpcU%7)`B9^}h;e#N;Hp z7%nN06-_|~+`t4InK3!{V7%@NF}7;&1#X~4+lq-jl?4-a#D8xe0#gSOBgg)C0e+9S z|)qn{!6hAFY`wHtbIv?@?ZaF^U)16dvnFK$jN_{T7{In7_WYf}u-4M$r5Er=!Kbhv0E@Fn`Ocq-bzXs{=@5w5|&NPG<^(| zIu3vXuEIwRlw)YvW3a#?C$UpC@M9;LqLT2)ruTbmst3_B2pEzvGKQXR4#C~z9mnl+ z&1lTh;_@}|ID#IHH|!uS8F!ZOW5Kc#Q=(%M`Eq8yuP)`Z(9!@I-f2oyh+UN#8_)k1C^g%>rWN? zE09C~#8f2AbOyf1ti19~3tTlj<6UZgcCx^j$}n!&2wGN(@G)<5EYu!|U>D6SP*9F0Wp6<&Q;2zm<|@fZ1ha}}*rJ!E{T8Cm{s{jgLt;RhAjQPGFT+@YmHMBu zC|js$y4awjWKnfcsbMif$1J=yMzwe;sm&;usdxvFP{U-CzlVZ~Ayq&Hs9{r#rx8pV zu?2nqR?v+p9P=F|*Ie9?$5-p!iuE$Q>q_-y^{DRb?_;14;M4lzXpu;;5Vp&a``owh zx-IxXcwOv=e|J6RGMM0@wuJt(BP5rLnG;Y~D=jRN#0=k$KUjC4_2Z|2CNcEj5)}Hm z>lzY{;xu-%v;47157_JXK*5dr^#pow1cki6m7y5*hh7JhJAF16f&I2WyvGG`Dt1w1k=u&*6rE1AtVH_ zr~(K!PmNrsk!?sVc;z#fk%C4!bw12w9^AQkZ7wzAn;kw$1z}pZkJ4*p&qtm^W<%#Z|M#~2)0Z{2 zCe1OF#j4giMsJbtj^{>ovR{17Z(a!2k zx}bdFFhd_mD12VUVBMe4R`TQ`(=`SPLtecnztE@20D5xh6EfDP@SB9S8L*u$CKKT+ zUhQk&v$xjY-~@~!j*bMRWqKU?cIDN$YCl@qyM*1?H=H?<-aUN?yT3OB)L;s1gb9Vr zcijG&S5rS||K8}U=s=?~v3qPalN~O;!7FALVn^!SGR1G)c3RrVho7;z!1E>6A zN-WcSpllR^*l}S#m2ZKmD%V~m_GV*TAm-7R^fL~->ur&iE}d=7ap4qiOM2^FDvf@U zyVfFGjNW)p*{QgvhTI)xxQE#tWx{?3O`Gi1bz!i?XW(iH>Ns& z3oyQ!x?6c1eB;A?d^JAK_f^GoHqG@^Sq%(S@joRWXcxZzqKo`}#>3|A@QZ7(_#C-R zw@z}t>zZHj!?zpXXI__I%TCbqF29&EnTa}_zDn1z#!TcJ3~C=r*t|9{#Yn?^1lpz& z7*IadA@TXJH45C_;hQ93+<$ zfIGC**gS5-Hihc;*A$L1K2eHC!#0ppTcMc};VVl}+p+T<4-FHfFJXy%>UywZ$)GYD z`>lKTXgjzHY8-Mqi&P8G@G;alz;aldCPs3RrPpc!+TF~SnW_pZqv7L?pIwl<&Q1iO zCN?RlG&DctXwsDsfvY)}Pz0GYCvH|)vE)zKo#UZs4rhuGBL1JSj+6xii`#ht?iB76 z-_RsKeoJx?WB)no8!3miv@O;64XrUrmvF^mjTWBz?Kf&B1IyDmE?&SbEpQ8|{B;`3 zn1E&c$HU>i`PEYdL$1Ro+AoiXOwJ9vhJZ-@y~?Qu?wuGhX3u8E-Xx^)Ae-gk_kL0I zJsz?NT5p4MxR_rnweTG$bI4MhQ`#nV)g#h-0*hEDzTOett}dV_>G+Wk@!3P{d~2CG zSq`(Qn^LwW5_1sN)cgaRFL0!s>}E1e{Cd8kTGN%|hk@c*G7#^Yw^RPzz{QD;r!ziZ zi8=A0n7g}ISev%g0bJLV!{lm{26^|ZtY7>@h$c)ql?#h0ZT#2O_!{5SQWx>?>R;$&Zu7vStPyWstnE60;0 z1+V+>n41DL=03YWUNSO5dUfjguFB(XhJw9y{~hzL=lu^$oe_-%lI$5L<;I}@`t|4Z zghwWbQ1a83 zf5v_zuqE9M6hDAE;qIbkVfc0Gkp~y>g2crinndQ77A@hm)68fWEK~e4OkQCzi4JR$ zw^LpBW4E?C%j=I&YTgdO4!Oc_@7YQ=5pPm~_$-0Y5uyHtWGQcjyg$%e4J(hj%>zvm z%91aX=R)qg&#`5DBT6$QUd6_oaK#UmEcmKI0#Yj{>wkcybcR^&{g@_EC%2tA5-Z4@ zuO$ttoVOp==xslZ=8+5pR!wp~rgO4gnZKI0!}M4&k>e~&*Ix)mEJztYfBUA!Y*~r* zL5nO!791_PHtO72k}sJI?)X${ql*9X zj1JM)=BVwK&QZz!bZ%$gJHs(#UO-{x5Efyf1zihh_A~k1=Pt>yvAg)*+G3RVyz5rK zO8{?I|9%gRJ4S-*bCOR2-247}+&fi7egDV;6&2!*fy>)bz* zOM>7GtthTUfk9Xz`xk@ExYn4&ubC zj0rz(uCIn2={$e53#x^^Jl*FnB0f23EmR|(zmT8oanx9mGstX0JTB9kT6hNv8VJN#a@IAy66bvqWYmX@h0I~K_S zke!oBj=BdyDOeka{QWSqj zY@bwcwqZ`O&#JKS>@Zkl|Cg-sZ1Du&cl)_b@k}!*Of%`nl#4EXfPo2np&!n6IEV38 zV?WskHiRMu+RK4?RqBLT-F8)FyLv3u>c7*W3ccn41U$iMhG2O4KFzC4;8aAW^$pNAh5bMnkEzYdxv=Z@2urY=$d%9=PO6xjc?y&A;u85x)kSoHM6jQ zl+%%&qow?hCSfa+wg##iWOKY5jk4TVh$jU(<>zU?Xi1<^n_Hu9x!#MfOFO+TB{lzV z-y3zrL^@WD%AH0F^Ir8)lgEW7rT7nHFMBrx!|Sw)g^3Zkq@+;7ut(x}{b|#|7c1;M zF_k@TEi%7-jci#@*3E@E8;KL@=>t+V{*)cG%Cne7CIX6EGH40(ihEB>2$1o_0V{s$#i%fPE0Jfn1^*bNXInsBNL|P!pain4tR&3r6`bDAyp|W7 zTFG$jJ>8!C(}jJXSKnGiYnK;XDT2SV-dpi_nLOM|3KKntFVw+JcBzZWyE0NKR^ZcA zri?Rq`E{i_0)D#2Z#t3{xkPV!(fmT#Ztw^2VmAF`ZMZw4(QQ7JJ*vDWSiy^ z;{omkGH?;*uheBnf5Zb{F5RhUIqB9p$a)vZrh9#42wYF9}tmXcCcQ9g1C-u@F z459Ye9)84JJd@I4nRI*h`yJjsH;6-<*(pBg&t?lGGvLW35x;KlsEXWftlm@KZyRB6uCLXf!pk-}M3WF8G{EE2jXYC#?UK}!Q+cuPYJH`fp91&_DiJ>H8s&x`Sw+wJku}hpoUpPzcHx)n~m|m@SIU=gu)ZCBhA{ zf%xwgc8DVYHKTXI+H$)BZd!qpUUgSSzW9$$d^0B=kp}cX3V))9@Vi%x9?0R`xjaU) z&+R}a zkD2EJ$1G21b7)Ub0>|D-OJ^<0lI*@{)YwU5cD_+W)16;+^(>~U}2KkrBu8#56z=b0y*_E9h@5+%BIlmKQu5LY-8 z=6S!oSI8|c%%2b6*_hkn83q1+x2$RJT=yzC?Yqj6drkO0mfr0<0Qz9`-a*(FP6l|hnbbvSGf^q-| zNtstauSp-+tJ4g;*+*ocgQ`$1Dw2>Cqhd+=lA(e{66I3txctYD0LHla6{f}BvqJZz zBDPW38|Ms=uBzuTi-Q{Do_}=%IYp+#leV-r=~Na;4Gp1Rd%_xXOTOt zM9XK!)l+TuTJB2N7*2#`4P4i%ZrC2f;_XiE@&DuNucPvawKq^0FIrlPYjG(K#ogWA z-Q9iAQrz9$-L1I07k76re&6<--&x;x|F~w#JSv zH(8W*D3DbDeYO3~oYcCHtl;LFG4omb^9j+oRWT;6683;?qG~L3C1QK-qlex~R=7M4 z%t^Xjp2(X`I-Q3THiX4(V_E}sO;f_v)TWp~#h zh)0cm`OiDL^#AjY0-%?a$1zqRRzVaON}Q4{HeRBECsqNAEhZit`%O$@EtgT6q<}^+ zZbta?ic|WKc$1^Tol0z+0!4wGgiL57U(TEtwy=zc8|YwBLgE>nUQgO2XJLOs>#U$? zJ@Ldr$xb=m#(beb-Vm-eZ!*q&0WTE6QG%FW9EW|(GAs@Zi&Ms>T07+D*PqvB&1J0n zXt;LA#4DBF#l$Wr#x|a=$XeK$M@(opB_kRuK>B(}%SfceV~LKj5s?dPW=m1Uh{nW? z42Go7p?Hk_BtCFdaEXhJooV^z$c$m=O7j^5tId)((&=16D1s4Gs+jorZR!Vc@g*sV zg!r5`r*oh-B|bhrPESl6DbY?$oD|+RKYvq5LgIjyvgENcKBg@g+5Prx;dsUSKvu<* zVWM3gQE!FduHztWck?FS>v0|D{s~uABgdxn#*Mvu&L1Ux?D2Slgzc|EcMKo5NGla? zS}^?MhnQ3=VGssr4eGsg@ASu#Xg|nS!A{X=1JHA*g3Yu0T>o9BSvB%FGrW~|KDGX7 z_F5(}AJAE05@!nhgFJ&su17RZk54p%xI;)Z{wd1@^}x5O;*|_542zd8(XfvdHO1h? z6Eb#pGMww~)AogqY%rwlA@`q-#bLa1DtEa(Gmh8nYJIeXf@(qtGRBV}Eju7}j30rz ztDI_n{oc(Um|>{l!1+DdSU6BwDWJqyIM7uo^f&|~81Zz}RG@8zW1o!0h~-~Ic)cUe zE&sONoO80CW%(DgHu@s42d-;sxdrL-3PK5k=WCgIjhsv>Yd(scOniULVmB2!QzK_S z#RcPkz@FSGvj4km7{$3K0_GLwuw?T*>3n{SE5vCNC`+l{9=; zSNR9k9GjhP?5r{WdAV;$ZJ^9=@M$=&@+F#1by19aKl~z)$4qhGaAC=@{!!)hkU8 zmHKlOOUQ?rWry)p>UV!e?yCD#01l?gk>;jjw6t1-@lZ8>Jgg8Gj?tfMT1xz)`%KKm zS!$NnUky@gT1cr`n9xPl%qr;#f~Ta+OyroJnpR>`%CX$jr>xEx;El#uBI7E83xk)JC<1`2;>T)c== z6}4UaC^j9-%m??LJH9fzmxgm>kPU(&2sxjYiJtr9lZ^X!a1j;vQJi@!B<#g6zqu_S zE6jG%RmII*f>v%PTc+U4(rdqKTJCb|Z?na` zn1aaHYmc>xR7BG@X{P}XPco-B`La&ctNXS6lMaavY*jKF!j`iDalX0=qX$L%z?N}d z55gAr7(FSf&Q&)?&>~E}oEzy9ZlG%IpwK27G=>+3AI2|9WIC@!;a@AYIl)Q2#;(l% z6T$}n1yBGW1cmx1bh48Ti4@^L@i8eqTc|fj4||?5S%iUR zZedHjnnDeAke^VbJD1`lW!!H%S4u+FYA#n#{sV_G7L7!siywLrdI7m9X2;_^u&>T7 zCJ#dh9U>6wFJ#a7h|rWcdKgyA4zD=*1w?6$7nkb><@~FX8XjF(HC{dki&8?O)j^0m zs*>W^eOwG<#xo`+H#(Q%0LvhpLf+toj07G9I>cXyKUXgIwyf?}C`Bswcjkv+kC=gL z*EgfH^q&73!fk2tasj93ksEyD>HOm9og218k5>>#q4?lSWm8qWMfI?DHx#P3zJ+mu z^K)M4N=~w}qNYH)=JpNs#3H6Sy>ciYcIkidVwg%SQiG&=sr{L)y}xU@?54px+%2_* z7_Ax3kK{B0ayR87hCw4$FcA~31iXSBMH`!vBt>v6BY*`DAB5;!dtUo2Po6*`C!npB7aeE$cmatc4Gw9Uizc(P6LG~Q{1!)ROvU-y+2!AoGUfB zLgvB#fJlcPJ2Lj3|7@^Gh(7|h@s|jTkV1Kd);vs`Y&wxODbYN7g^TwWL6*b$LWL61 zP-@aS^-tNxg3PRZEQeUyi<)6v&IuIv?dMc$)+tb&mtQ4=Er^4uTNLfHDU7&;qDei6 zVuv9G@{7go3N*B3U?uHHEgtPi2U}v{tYso?fEGbj|8E_uM&!*i2%H#Bq#Wwg3E{B4 zcBHJ$D77fHGvLKD`@TocF(ED6cbJMP{!Io zmEK)XTHxPxalWA)lxb$I7#JF&DT)bjBo}LW4G4sXU{z#IW(4&*qMbzk1h`eRz2K26 z0CpA12BIm#FD)>w*;Yr|K5PK*$8<0k<-}s0$xqT$G~A*)TFh`1 zG2&@frXZ)?GcZZTa5H3_$o|X@tUw4e!*aL~M`5}v0ms$e;JV)2L*9hrgCy&*(~hRl zmF_3b)<<3Y$1R4|6q;wx_G7CCvppR{vbL9g^|ybr9_y6l_!#u+7lC+6XP8m_v3 zH^pwk@J*+Go#_aCvJm$O`<5@ma%nx^h)P$L;U_Y}|t@U)9DyrDhG#6efHr_diN zf_JaWU!54by7ctu=`oYnR0vRU!m&xdi;ea&e;3mPnU6r1VTIsBB!A@;0uuzw`w*@Y$9-Lu z7{RT_@{OY2H{?eYI=y%z?0>a=`l~=nVon6CPWa~!pu2NZ_mb`p#!J{!UUYWE8}xfF zcsL9_c9$7g9vCIVS>d~6t(pHz5b$Dr0yE?YaE0_7cq4&(g3PL|MaCzJoC5$FkN7?S zcmC?p=pEI@sqMw=IZUkiZs#S2N|^d7!jN3(OYYJ~(LfgR5FMOJ?yR>pEZ|0DO_c6; z<|sGs>z2u*^OexKDBZQ^Nf=hYwmIsQj>^0${8tv82TotL^RB$R)u zzR-6A8GD^l#c0yNG_VEoxiJMg26KktzAoY$2tx+KCU16%sNuXMflm%~5=l*--+wry zyIlm;Q@?pF2KLn%qVW2*iL~Q=aZ`}t(8q4Xmgqe-5c37&&2v+o8I7Bo$H z;K)bsB8~li=@Ao(J=6Gvd-3aUl;x3Cz%RkAG?IN zknuq^W^OhyYGU`f1Wx?FlhQjj6E9KZEBwi7+I9F2(4^E#j;0Bh>wz^n8*}1Ocy7@2 zUk3+3Jge@%Jgd^`I%D5bo!@L+d9A>!XWBQsoHc?=7^VDG1#J za&gJ!X#&LK<7)~l9gE>Pm$pCyJ4;<}j+Nb+)KEP-w-ZHN_TNcr>IP!ON75%U2< ze%t@1r2Ya7jNR$Y;h@=RZVuOi)?fT-mXR{0!UpUbiv&|VO#>vAyV7<2ajgh4OLfaf zNjgx0gaYHbqpokePgm}^P91MnWC!h^cQ~#G-{^gwfUQdt4(y=m{I{XvS^84~0^^pn zIaZfX-y(`MnZ+&Y?ISp}+0y`Nbd;8FfkX~+F!v{OSx>ed{8K>YS#$;XniBU5_6 z$wcm97$Foz$V!HVJqEWwcey~sOm04nJ`Ohy2kaa9lM=CuU!{B^|M{ga#G1@AtAe^< za(Mr>eePJOH+a_wMTwp~`3oo`l%qd;!pR-0M`Xmjw1pEpRv>C0+%}ZG!>V>?-zPqj zqFzy*)O18vAyje(o-d#Te>VQ~uQC)e1VDNo8k)2PlLOr?VB;V^Cq)S6 zZslQvTBh;30G{}5Q}U7&TlaIa)}AB~e$Rx$eXpKoWOhmVN5RqXbt);aU;UQ!mh{g| zPQ@p8@zBmdTK=SL$f$LhL1Er z0eJbvx)W;$ZcCoP1)uI2^XZ<48FOWe^Gt=Zp!uA8x9n7wOB5?`N=2h>B0?U%S5+*X_u_z5f%W*^Rlq_CAb#N54c;%ZUA$x2Z4bF|e%If=boRw*PaCT5FHfXIeo+~l_ z(4tfDx0UR*n)M%Bs)- z{SQodOwZGd>RQD>l_^&tG~b=b z!IW%qIyNEP)ZK8#epGu+Gli2&=Hb1Pt!k29sX>&)d{#OxPo+PR3|s#pJ4TGd0`PHl z!Hr(y3q>w=MdPA_W_DNlF4P^L=QEI^PUGTK!%O5m7MFjg%}p|-I=?Cr z=|ldbG~4>YYeZ`UJS%p4Z%gsqN_%Qsk%rJqA`}}sLm-n;9~sg~LWc?_!vUJo+P&1+ zmuqidL~f4qFdqCEb)M&Nu8=1&A#AVGPJRhr0XTDn0;R~y5z1g$nEq6ht}S_-nl7sz zY|Mv2E4>?(z)0}ZfzsJStkS3x_9zZ7RMzY+cK9&A?Cfyt-SSOqjDblyaGml`JUbfi zpZF~vC?3-OmEIyNfl@-Ad6cfAT_;)oqUfStaHI^MHc8Im_165VyJ4$zf}Ta zIuwD_9-v_bHlSY!uIv*?vqCd37Bj8fxrpdv@932l&X8_fbL>!;j zq92lRwc`)I<{~)W!yw01FN2#->{k@HCOAkMyz$*Z z2qq?5)ZRwh3H&7dx1A^!tDYg^6ZNPs6E@AZzIBqwllPtv7U_5wk*=&@kxk3x^?dIVqbD#<)Dhv z>K~~7AV}_)jL+KI`igVJjD9Ibu49kX%H)&ICQB%qU*Bbu*8W8#*o+0ZPbVLH333rW zm@DKFwCdzdda{PbJ=b>T>geXcN8i{9qU2 zlTjFytysYh*}9Nl4ynyF?asG&iU{A3#*%G$KGl#2?Ib;tjOe(eVXRJfQ81dGC;wve zlb{6L-l`oR)}DDfiXRssj70hZVj^>F_>24=ypMS_GIiQV5&eywH?D6f!ioGF+X|_X zYzR~SQSP5;v7vlOm^5DhUE7d0xsT+j6pSQ{lyI>L{xKmcmDrC+?+*V7|_X&?>J^{@<**`DD}ka+GFQg!|b z$XXHcL~jfStIrY0AesCcLB}!+0kLKQu?^jIe~nygB|ccT zz~Dd-6E?)iD_`*|Zu6_{(RM176DT;HS)nRq!S9MJ96vW((euyca0?ThF8<%UH99Y5 zcJ*kCZfQ zu8od(0v_ZlD`;in`{R7EMsEdh0xs6?K-6QyD=+%O{SJ3O$dnH4u`lL*{H$^Jnp-3u zv9ZVWJkpNCuK70l`g6t(x^nuo#FljOZ!u-RL@OE%=%$eWtn zXZ#ylyc?FeuUfn3GTmrq$v;({-Q3KbRrtpAW%lXVs6fb9e=Bb1gX7aOkR8v=^n#R{ zU2ez6%d{ImDhssi`EK6vT`0AF9U#fHW4g{|P<|$hdu|t%I9s=y6r$;>(cp_Ln0O1t z_QqDcQ<{mD{%Z&f=6_0WqvY${UzM)I{{Gb>LRJ5(1x)M5pQ+wkV7VsWECxY=*DErZ z>n!(`xS32%;@^S-c9_Pv2|Avzu-WOf_hHhvT?LZd4J=YPZ}-y)tl$L;+#`FuAZDzdB30{8mMjKu|v`xy;r2C$Cb-HUMDwfNYqVpT1=w< zD#0Jo;UYHA0}8+f%oMT(mIRmbj4v)-epZunQf3=RRiKHONulZ$w0tzfj+0+fC+z(= zeK!S?kL4%*`)+^DH#^-~P9EKEa}SxEdHb>_8eahLW2>h%;{>2lzvR?^V4|n$o z3X|NfK~o2S91#a=p9VKro#bxB&g2t%J{3iqqoS7yV%BuH!ybbrp1Jy_|BY3-T}>ES zQX|$?n%&LN?3>70ciE=$dCNz)gl}TqWvAQ9G&SuK6HZ))X3Bf^Zr`|=K5XuNeaHL` za6MPDWX$3Re8>ox;6I2SmO`SX6F*2cGv!JXBy|j#;4drYQScTb&3l5aFp#4s!UD{UP5ZSGc8N!96m*pO{uhg zvi@6;8hZH$Mc2KQP-!WsTao8pIN)#r3Id`PkBtR&O0x&DHC`r_F*@}(cU`1`{JRv) z?n3<(AKBM0MhTu|UucGpeaC0_KYtK1IQD1b<6_mnVcYh#m4p%CBG1f2N;XR|gZyD1 zGQLD|k`tZ7{M}u+L{w7LF9J7UnEd?gXsGd2z&v<~{PftY-rCpf7i)sAnGN8mi#4qU zB}K<-+dE}OTOiw&5rRW`xc7k2MWpw6tipIKpg;>*oDV(~rUurZUGX3WN^99-V2lio zA_q1bB)B40}#@;%|PQ3i%GLdxRJhI+*c{*+0>t0H-1=D~^eAbFnd?+j-WZ(_xK+tRXzO z1mBQ-R+eO|rf%jKqdt~pGrj+=liNL~K#!p+CYiXh0qb2I43NSzM0T_uK$F<^TuZQ{ zI8GB~m(e5A+gl|tjGngre)*)-=W@T59##ShEuV#Gr&MU1`X2W%>Ac6gGUJ7X|?y|XX6dL*Y^5w^X zZTID$;^LyK1EcQ9#sQ;gPut%ogW3+vY$}Qa3zK7%7k{_zM%F5BS^V^Y zezZE;pdw};v)XY3u8&@Jpbyo4k1&K)KA#1X+_T6h5CQiiIX8VeI1iC?ksUO>26Wo- z{sOiIA`$|0IS)(ui8$&xO~#VTmKj_U3zi=_7EC(=*8}bhV(&(-W&(8t=)~z_9^_(N zEAD*Tn{x2KZdZ|BvEt0atZLmSAUQSG~K*nT7TAxvJb~=3O8(k`^wpN^a{Q!$p8!eeKnNDP)=tNh$Up&$P?_QW}lBqLfeOO)c{ z?xqBr7dTz$K|3rG)V%$Q+(i!0L%=g2Zsuzy6o~pi--G8!)R^`-VeR@>INz5ZZEXwJ?sz|2++LCX!7Qb3_+5 zQD)>5TG;ld;vcARu<>X*co4>h2V^Ehv%|j0=UmRwhcBYD0#URYqHgD0Dc`8dv4QTh+Ef(Bx$i$ z)Tb*W>+XUc(>N;${(TVs;R|%Nww*kxxP;@JZvM{qPu8C1u!E{r6=_ln7?+y`@S<8D zn~dD2R?!5m*sSzch1$*sqH|fzea`UQ(BEJJH;$7I;oFUj(-A6DIAx3UXqq*M8Lfq0 zI?SbkOE5PuE--ws*%ek~Gq^o)GyLayuIs5WRIY3E3lL0eK-dWFr?(5dY&^{2F^nhqk`o3rHIMDcagL-i@H4M|h@bTsSXV%l!y$UN{B;?&ljl z+71S8zEs59JZ0wh@)bczb@xMVXUz(43_&!(&$q%4@E}}oaFSJ}ovioJaXIEQr0p$$ zDN@k-%?3Tp(pinVN+3zNj*EP!d&XS9Zl(sxi+2ruC5f)YZTB@C!W(Hj?u^;eRmVt| zrRhbX9oKhH@+-U7W>6b_Hmql?KsIb7Qm;SJZ?HQb3IR!G;cUqrW2aa|K7@wY@Vn<3 z$>Z1r6APATv>|x*DTKI$#14-i2->*75S9bDi}-{uAtv{49Ck={$RA&6e6vlmO_WGr zi?O7geYyU`O>CEk$B)|g1`!zLaAwesBiR=hH?9}x^Ez5N|Bx|lp=YqzD2ajrwCcJ)R- zo)`tI(=vW&JQe;bCZfhfOd`Rmj!Y`iHZ><5-}p_UsZYp!=7GEDLX+O4@QSkhOlp(v z!|~RsAHhHWdnq{}_Deje5ig*Q;(<`oV}^8M!WwL=-5gl2b%~Jk!{ztK5-FxiNW02G zY4A2jQr}#}IYk)Q_dsBe%$_n3=m7+`I!WnYh}ln79ftZC6~|3mul@ZLC)a#@=da^~&@nC6@Um1>#F<7RhAjx#-dYb19g2z%Txd zY};`71c{Bq2gk^c=?l?Lflk0M?>BP3hJ{qOE;lpde69$e~ZrE#{+MTm^B09C^Y)dLHx@8r!ptUf_ z#ADKUYGpW2HDtRPz0RHfx|4bX@y|sGW}eT(_q&J+;luEQk$OHH^+VjFAA``9v;YTS z?c$8I|HfDBhu5e}-|J<0CNzErb96+?nFLX6_L+*av~w<*y@z`XUsRx(e0352fhJ~4 zXC%Fr@pfEjo(OX6l+ai`n^(j$Sym;^YA#(0X35uzk44Ads{V8a-D*AbXZ=@XIo5pW zTM6b6p6!^Kvaie!`KsO1IzcIWiDn5j zHp(Nqa?zYZ%ec6S8?JMq7K|0Du;EyNTF=$+phC@`5UFBL{GfH4PRt|g+4l}?GAUf*4sm-Y%=eSl*wI$Bq%1oSc z2`*{x-FKxYF*v5`94+Qwv3p9#$eihWM$3p5?O@U5&vJ7;2y&z}k%u`FQDW;?55&s+ z)>hwGxCaJjeFi@B{zWao7GR2n-q(Ut4Y+Kp4UUWBOHu(3D_1Jbb=X-czCULV7R{uwarL-uDHH5LTkM%8w zPxR~Dt?+5A_Q8U>$mrGt^z!oIc1C{g9=s`LBa#sN7XA7>Vymx3Pm7skh9Ic-ABhv^ z`}8~86V?g{HvP<8&E9u!rYERtI0|MOR3nV)9T7?vSoX`mgMw~_T#vYl5F{zYRirLF zDuolUjV5yqdyvLZX-uZwziM`<)s9wk<(xE^NgbEM_kF*;FO`qeRB0|>I{0km-Wew& zYl`6DjKF-bZ0>>kz|>>e)qNTYVMp(2XAv0CKn-l_ISkaN2zFD+nrn8bkrvfgTsFCh z;k+QfnHny@zB?jM4luL9G-1iUM{nZp0dm#;^+o?M=qes@Pa?(f;ZUZ^LxqSI7@2bP zpXqbD{v-VF7KdQrs0_hx4X20xb?)^z(sl!zfe_@~~cDG&AkfO-A&}#QNsrbR!0EJzBR|sf*(nZ)+gW!kG=8}W`ZKb!X*sm6jka6nx z&^He<@?$f`v2WP;Imr9p`Xh%t634Li;9D0C_m3J|HS43-OU$(ij8*DRUFe&L*Ur!f z>P3>b?kE(|F8UU#HVQ_9z49Z#+>mqP`sx9F&}5p|l+0BNOARS}p@M#%GU={h%33(s z_z|H~S^YHSzIRIyJGaDx>iudk5_;v=ePom`UKm!6qisOX&+>>fS&~|b+Ydr2szjEf z?L$T(ITGV66Tps zo7%6H2{ov_g^g~Ewo$ntN^}3jz4D>8^q`8t>`M6jJ>7KEuZA)DSWA;NX8%>64^7ibd9J zNyx4e#K01gR~DY(;W;a2?E_0?kVaBReDL;60#_EOeBeaaQ!1(7U@WIrAgG|AG|yca zTf97#2pOwPo@*iLQfpCDFI7463o^H~j|C#P)F?|z$(f@xwv?j{NVy{8 z>6C$XRN^%3tW z0+fez>CRu+Qil9))OqYf(6ilGtM(hQeJ`XeSoOYN6sXwB zc3XP@Z3a~2MKa=Gv3?Cbdp>*N(Ib5e{1GA6Qe?)3{G4H{L%$R{aHB=dlR!#`Ik?e* zgz=3%EN8|~yzGM*ANuL0c&E|U_Xn?}h99=}Z<_!Q;kK_BvGovJZau$2DyhVK+pyOh zua39F!3QMWQQ#-`km_HvU$& zgsRUZ`6acL#;l}O0(gYMeZ6wKvHqQ_8oEuE>_q!^aKAk}zIPytcNf?2{^aC4QE*KX&BDFC#6JRb(c3m&xO@AUa;5xA`Vwh&Mg}J@zA`;r=h>8#iGB#(#%200*lSZ(*l>20h0{`Yr!$4OwO;J(yxat>3-U} z^&37mx*1*^ZHF&sMPc_Fl2}V-&Q%jtSL5)AG!2Pjg~%pY0g{3#hEDbbglgXtqe>b< zjQ#%io9?JY2_^A+x0|=!m)wk(LC(AP&ex;ar3!(QLd8gl$T&|||D|!xhtW0+0MqE) zmVRtRFR5k{qSz7fP8tmnqjj(LS?}>fM!3P+#RjyES4VsLQSf!?82OrRkp!%^X65b7 z^QJy_2`Bkvz6pZbUwT5yI9iGADFx?+TP^~rr(nBo&-6_eg!37;a@|con!+UKUBuLZ z_wSK?-1XKKxEr0QhEclpc+_YB%?Du)P2}3jvuB`tK?GB6RQ#wY{+(0)0 zF2c-D7ZhohRDDfQKmPPb>ORXgaQ9e7z!3F(*$TOQ{&`7*5$krcFA&}P_y3{Wp<5Pm z7a=zyF3NVTXVM^D;!@Lq^$1>dN%+e4!!iPSV6n3EfNOZW_1SBC@CX3;i~8l4LNJQ3 z7ZEQ;lP#c0I5L@IU5Vb=s+ZEo4SY8XP2c)c8>H^#qsXoL$IF$mt(K?LIBc>>CeyiD zA<020E9-><-osv#ETZvy#@n{Kz#Wa#v!q=b@$*R%_0Ch+g5aOE+qXMd-t|uQk*J5J zj90ih;lOlM58k$8TO{MtuXwVk8KT(%U1vM@6%Nn5NCDoIPk+~}vxyb5XLffj zvY)@}<|esD!o2MO@2)pv9CwJ@O)oa~3u|t>{ZTh}uE%-15cFR1Dz|ruhc2G7k7{+-=M%qcs!F4sOEz12q zL2}*Ned%{YTejtl6Itr#{QSs)P*N_K%`eegJJB=kNT#8xKgoL%EXez%v~F?{nCv|{ zz5yPE4^DRuWHI#a{MAa#&Yj88rk}i=y&YV_Fsx9kK;DK`geI@9zg&za*^{wd(DLYN zuQtB(+&Gex7ZtH?R8xz(Ouds`Sqj8%g_aXOn zgWs7vnf-&Q2e~Eo>Fj38^}p(T=vzY+7qe_zCDO5Y;;TFAqLLQj)8m++)eiPgcX#%R zT-&6p%FgG+Yj-D_Cfr==xJE}c!nTeCT4qlf{pRX8qDu{&m>SOZr%xWITb_;-{eki3 z@H0x6x7jn{gZ-N)*05PqOD1c<#IlRHLMb5$+~s@i1e8KO#M_i_hB)siBo^6)Fj(lOf177( zY!v!VtM65Zh(OT6$z)(-4KXol2?lJ+EpG(llk0{eNw^_41hr2O7DW) zb0~>!KK4HDE)Hes`@@4#S@Z9q@+;;)I{G^})~`+6S&|#jA?H3Yg#?nncHtz=E;7bs z2#b(Tr?1AxuGDs=O=I45pUO^md!H1w!+h5b$e?W*lgvKI^mC@GRuQb_aZ28lDbEB^ zy7AqRd+l%^gn6FUs`8TgfuzqGlXT~_3A8>w?$_tD2Wcy#brVa^VRguhS;|fNa1{+n zt6FGC7_Jwf_(PMf?a;gs7sqZ%)zd`vch~ZARw(^fR+4gPVIA`B<3&wL1w%85TM^2j zSkR621++fC2`as+8v;p($3GOJ%M4S7s|=_Zc{#L*6MwbIDd-9W0!k4l$Gfxck8DrX z&6Zm85;kqUjI+F5jAdJz3ydJXe$AL+v}J9<)$G~~;(GmhJpEw8bje+t^pvg^gHEQY z3r-mQccdWoKM6q`QXWkc&{}-@W3VA)qL1y z>hcI8>rW4Z^H5xFf!@!5(c3izU!cQ#j72sQ11|X0X{B zVrW%kPKd;77pGhD4!8V;lix8Kzg8mWh)%^I>5(`?w@NKUyK;?12UA^~%1uQFjZY6T zIcLD6Mk6CFe}Ary|FPFxFnBWOfyb#Z>ber65r}6FRtV^eGH5BE!KyKDPha71uW43* z0zj~mI@vbB{>?iWiK> zc;I1?c;@#^FXB~MTe8MaSZ_kS0Uz}=T$J*%z|}^2uLp_${~CTf21XCt1+`asKGIis zH1c*kMx)A9loa&mU)zH2aR>BBmtu5uqyHs5`Tyr((QuZoV?a@ZZea<)$X~Erl27^d z_5T{&;uiYvJsjOJ72kQdDCK7H)Aam({uZVx2ug9yiMMoxH!eNzSST!+HSN&uJuU$rM{_}Sxy4~4&R~eYj z^UJZ&Min4(Y-0Rs-i}V)P&0R*1s8kwLMCVaENPu=K?rI@zZ*w-YMPNM!`qv^qT213 z)<>@}Th#>`vaoJN0$J;@v>f$GCVv&I#Xl^E4=X;d+eidY#vl27JRh$Ni@fb!Jg<+| z22l?1H_A?2bNi95sjVH+$O<8sWpn=?+iB4 z8W*PVc1wNhDK{<9{JL1JusPc>>SnF~pe$@f?LLzs`y?(cZRO!?lDEUNbA^LopH(M1bNYC}{a*d@ z3w1r!1gCX9tTFdD=+5Jy7uQ#N;Dwy6O~g)f_+L@p$wq{LIKx@_K%~eQ+{qogk8~y}lYR zuMyC1%_)2H>@rY?bD*yNMn~Toih04@4H0-pjdDp9-1rT6QRArB)?RI=!&`g%KC~?5@&fHJr5ea9niz{IBCeQGdbgy3T~)P zt>F?Cv5U*>ax=Hh0c>*tm%B%nfs@-ESyJ2$Y?cguhrtO9=TQ{7O1cjV@YUx|5$@T? zE#hCx5K_?P*f()^u!Gl)G)#j9RtSXO)aI2@z|fsDH32Tlov(D2D;TUmX}hC?r@Lzn z)%~i@>T2R;EKZXSnj6{ieoJNTChMQk5w#1J0it}z@*7y#qFx)^9f(BFy**e8P5#m9S%t68yU9F=UN(? zNj(H0uwUheXHh?TK*b>70#=haP75_@18}I&C)CUpjJe-m6{Y>&Id7a;(&l*EW@$lh z>GS zBCJ)wk++|n&oNlX8k)!EleM9xT+?(|ay?Mdx=Nv2Q`o$nLD4XPI6bw(POBVwU1u4f z^~KHeu|&vl2{+>^`^MNO5AR1)BTC+EUv+tR1#vOfDOgEvj&vtiF@A2$(=f@;S*gw< zeS6-FUy9N~i=|n`-kw;a*`=_W%eVWkDl~ednisX*;aPg&%J#I@3F;K8OtP0{=${VG zuHhmm%`-=N9|3wdKC(rg0giUA)@P%tfyU_P)d5VQc6%q zUGm~wv`ncOq79Z%_emdy>Z&V@latULI3vCVrRmT^X8b=?eFan<+qNtk9D=*MySuwX zaMz&0okoMZ2MMkrSa8?i?(Xg`0shW8_q})jt}%eoi?y5X-c8RnXU!@bP~Rcr<3gug zOt$vj)vNCl@a~w=jb7m}vZUy)JMT+aTm)n2wW2GcHPz5nlI28+?jiIz0r+3o@Ld7) zCi-=s`H7j{ero@jQ*Ok5uUlzJ+~Uiwx-#Gke&q7nPtgtcJKAcT>6kt|DoZ3Oltx(a zj!7iAH^`Fs-Kog5b0@rJvH5GtjYB@)3itMGql%di6s(s$A4!MqpEnP1SkHer=7Vqb zcPy{=CRRvPrZ;w9d-HX70^ZaSS6)U|p1ASB_BqQZP4uw4R%m3TjACpzJytpt_D$Ay zyBk|2Z|>gTc2KG&p4UCwnvNFszB{qO4^+LMY`74gxdGW95{O@P`_2EQqwQ232)F%l z^Zv!}ZzcWAfo=8^2wamZk{Tw%3zSl&VWbqfc3S|xxtOqEb&ZOUmE-Dayy+ZoK+0aVx(cw>US>e%<>E_>Fl+!o7{i+X>wKUw^L(_G|CSFv_#{ zi(DB1lhZ187%YrXQqEMFGpD#pwwV21;!S3CJf+aK1#%nuZotXfSsyhjB!~b*-v8Cx zvEa+cDy284<7vm2t;QwD?+W>wQMzpJmT;>*i#8-&0KZV1qg7tY6QfLuq+EOcg40VS z{E!oOv^S-tp)$RU6hUQo%hMZ5B6*OF0iWDaXZIftd{-Q z$@ITg5g%%Nxi_BBvpgB8JMN&IHnI3FDc~Dk{e%8kRK-$%A3##0B_;yO0X1s`nsL!U zyvinPa1lq?dS*yXfdIE)?T@lqwB8ZRq zx$Ok&VeEjEnw@o_P6nOCo=)l|=4#4c5aL3*iAsgr zAcjH(|AZKJ7Om}39{MB}mwTtbosu~xh*Eh@voyNn;7|DfO_ngV*%CL_Lp;&nUFyhozLMXpDR zOTjF^ApAgOSlN|h>w%*W`Jpl3=;rlxv8u%Ku9xC$43*F^2$)jUL8&+@Jy5iv?JY4` z6c!rhC_Zz%^uio&+R?>IR(2ZhXEgn!2#GIkaEU%j^xMD!bxr#4>k(`>mjWl%gB+a< zrwnKOTDuG8t=>B*h{^!&!@jSR}>cPs7RfQLK!0ENdbh1C#Xh`F(P#I_FGr~Z z+cCW$DWBNPo6oxQB-$e|FnP5MB=oI5mtl27rB~;u7Cg^vL-8@SF~6?L)D-q7aY(hTrRN@)-uUhc4xr}oct`%~ zx7rj9KPTqU`c){zw;=cW+ZXO*4@uda$j47h9}9&KB<-4zLE&I-4_XXbe9I`6W7^sN zqUnsw?Tm|1jEE=T5UR01eMLG~$fg!gmcoib1_N+cRZwHxzTP|zN%~j4xtIT=EQqYx z`Ij7<*k*A9=Nyv13d;wQ-xJ1}SF^7IwU+9L40wpyZ&vF~B;7M=h!ku(RTq$6w`WcB zn`j6}?+Yu6mFpV`e%oqEyGi<#Ha{8R>@PtuU*#O9^dI?ftY3A1<-;|6?y-TY7q=`p z%PqFe3J4>m!+hd?b4UCc>{9I63Q=gtV+*ryhZtrh?3l zy-`OI_9X)$_AOkl%Ha0r66w8hSNGguxBH2H1dGGp1bK0;)(7uX&UF@eb+;KCQt479 zV*kb2^haiTiv+1~t&wp+h`E9jeYx##rz7PgSwdSp2#ZM2pxIN#j&|u%*JA&L#AM@{ zU5hH?h;7P`Y8cG_hn5q?m}yu;Si=T*L;H&-clXTx!j2EI7b*$_f zr=uKlM3fYccN7JZDKd(7{Z_~vty1`C+AyTE%s;S>U5g#bY|hM-Haci%H)5#UaOTJA zY0Xn)Hm<3 zXOmU;x82?Puh^xpc>UM_Na?9P{gC~LpsqM}U;vv`Aaow|3yY6pXQ8M4Nd57rl0r)6 z%v8F>O9)E{FNULBy!Y*W_R>4D7(xexSUNY0X&~{wBE4@Q!!5HB|Eb{JQS9d1;Td5m zx8Ju}tK1ZGPmMlhDl5DUCQQ6gWuDRF|1HqUP6{ySfAF;^A!+vb2A+^H7)?yghMs|| zY>ik|%fVtB6X|)N%og$Vm+HzL&%y8U$>s`@(knI7CP82&Rp6m5!UO$JMJfbaRylS2 zy`!1iQY`fPS@rh7Uk8YvCUxd|Rc+Px$0yr6Io{y1K@_~(I3%(p@Upeh6qxLbAhQQr zU^+kTy`R9uS3CjgXahf<0!J zuQNn{E|mO2!*y@u=lO5{#}7qZ;%~rB2!nay3Bw< z33}7_v?asXSEJK+w!*Rq#2`cn8@UgnAY7^4h9UMm3S=Sn*!eCJ4DHMG@{??1Kb?z9 z18aF8pviiJH{VWg?3J^?Qe0BWMfWmN3woUBT3<_%%Wi|bc>-mv)dt2UEZcy zOC&C;TuHSxiJxDdFH`H9>-=ulVwuI{nM^SY@e1wr&Fyp~;$v<_F&YG({2VN}JMe^% z2$l$Tk`yqg)u?0s17YBK$_E+q{1{A?G<9tdoTSIGq*3NT`AvwgsLv9!9_p2^P_eFw8mq4 z_7S(QLQ@k2aUFICo$n8TGC9sEI*5hutAKl#Ki6Tpb{q;}T{C+P9N&B*eVoq1>Q_Fh z4XSLF-??U!HJlH^_<5qDP<)oxT!e=>u82+`a7kU@Y^Oi1*jR*{G3xpJw)>=IO$gG? zsWcOdL34_pXSGQon1m(_jurh41?|B1`;eeOW2n2qHI@_vQ2*Byk0m;;nO+e%#!L7B zYlG(W?}@FuWI9^S>47+ofnvGAbY6o$|2Fl$;PKsKd}w#29|iUFo|Z89CXV8x`{D$M z^B=B#hAPw=b$!G^Rjj7c-dTW~hqC=j^s&OiJ`SX@t`;_-4{{Du`}ML=mVbM-F~-}> zhwI)fEeDh{^3dD9i@JL$jG4=O`r+-8%dk(m9kgdmq4$ zettVBO>43W`YAOz=KU4QU_}4PGt_?jw{1dEWg2CNT0?2453PeC@yNNW033`hpzL-} zHy7YqZg|Gw|4-LQzVjM7TEkWOTvkSH+0vdop7DSwwj#^M*TRe35WkE+(>)y$EeMNg zs-Ij{7)*@Z>#9--Pe(S1s0OuO3-ZyIs8XAxO*nMuGxUA@0Jgl#!ik=1Vk*;g3)U@A zfF|EIrHCkb^cnf%aq3V5haB)SqI>-*_C?XDg772@qrQRh10w>T8;vRgALW3fNQu4( z9G?YswvBADI#q>6by=k1+_4{^a2#KbZCjA}Ea!*XX)PP~$&mQYYu7Idd)<4d>X-A; z)z3RCEslnmfzJ`BzWFMWh^&U%S^P}jYDPr|e^F)M!8SLpAI2D0lf(iNvv{a(S05vO zq&}T7*L%e8ITD&pXhZ(vZqaF2_LCTy_}U6_73%$(kePV4zqCZ3@^;odWZ?M5u(F-l z4kIA*JSLMV3#Rqq7;Sb}wnvQ-p}Jb57d)uwo1?_qqr)Bb*Z7Ne47u;JuhHD)fe(74 z;)8DrA0kdCL_GD&6o4Nsko)XrK7kJ`h`*0nJzC=YA5LhB_jktp12Z^0I`q978dy35 zNph@e^=0_VItjg=E(b{%M@XdU?W)=iPnh8KSIgc(_vEkKjyqbhmRT8<(~<|iDTE6H zvvjESm3fHF;s+)y76-kTyS1qCb?l130d976#w9s#4cz#mDwgNhY@XS6ftmL=)j`eQ%hj5*h*e$_kL3=Xw2 zJx#r!>S!wtWQJfHZ?xwg( z7CAf&YmMk(d&ZI<97^+WvA+&=)sGXNf4JH?f9!O7nW>>WcOc{!czHH`vNvfwabEgk zg)vj#THHWPnq9@EWI4=&(aY{DJ$2m}fR_K8Cvx6;h)cwj8~nRW)x}3lx7^?L+YI$N&t|_n47G z4D`lw9R`&Enauqs*^JttBe?sZu*#kZ!x@_{rCyJ^yJ({0nX@3&sXUaz1 z)0T*2+MLi#QuVe&{gMr04&!PLNMy3Nku6fB;{MU~jqc=A$F^O9w>Tdp$QgJdyOjHq z%dH~nDYC*`l>bdgy2<-Mc|U6QJ^S&mlDM^j-&XlQq&@f6`FZa7)9G=~cuKV#+Qjs034}Z3^vITR945VEQ$1e7L*#Z=Lr#**d>)G zdK*6CI%8&{O>pQ^TEyD!EOT)3880Vb@`P52U-|Mym)m5ixLQGuk&Z&|yV}7*TPJky zPC{kDG9MCdN^ z@#Wx)#WPtMUwmsC{Vq(@NsLUj->AEE10$FVR4ty&(|O_UUx!L=;;?hg@&HRVa&aFA zi2ypzX(CunG;$a56sS3hT)9sT5wpc|jJ>6a$v2K?KbStVQMNmgnebc}P@H;v$a!x3 z)4-`^mYx3oW-bc>2k|2fybG0X=)&W{zbsY(JXPq|IHr0 zSzJG$Vv!tKQY>sj^_|Z_MBSn zR!n3^omo(Qnh&rRFOH_1O)`t8_Ao(yj6lJW$DVdHV>8th4owk9E zxtzBFFhkM_X++@)4z0?pMHsHOTh~}ia)F!T zDkQ%n-jIIsP%z7Z&~e2#9{6o{g!zNp!SvlaLSl$x3>6s3lFc{|=ySkS>V#JK;T4+Z6h*rh zOUuLW`-L@?qRLXwxk+VB0Y!UAut9>~SCK?jifLhkausCGWIk%hQNe1!abU=!nEzx! z^_?QKRTyl8Yh~h0P*2{i;09NPPz@?ik;J4dl?Czws6^u-@(V>o;SU2Lyt-i3lKGY3 z1y#s$KNg5YL$F42PgA@aXBT(zF{c{gh$Uoq4}w6Dc^ zDegx&eFT~;2jd7COAs!q*1U}}Sw$takY9;C>sUH6=a1cZDt#AyIU8n?DCa#(50@|e zDuFrMUwV9N=#LeewvjuYt7RDuk7!N(`u7YDd6&A{c+#8#Xvp|rf2fd*9c_@$X^W5d z2xPk#PORNt4NoFbAT}ck%E713dEHY3&8&Q5vxl5d5edv72KN_rlw!fjh$Q9^-G2-> znrZ6re+nhsff(Gw=}wC>3y^`&AJ|hWZW zXH;YrR&3yX20o}o+OMz-Tvo#8x*uiVVHuU|D%}&su+O#WMBBbbDaXp8&HB0U3 zSO?tF^fdk$RI}odm=AEL$OhqV0CuqGIsGAyg5v2HwdogRN^C2$8!JLh7Uf=-YYuqA z{&m?UFr;8U^T4RV7`A~+1CHeK&}7Q=ZnCW4#%{Cup?iXKk*5*aad+5Hn&-_8jXQO2 z@flRG1Msqw`{^t12xFN(&43irF(A{=i~e3||96_xoKwS3aAwMfl3uEcw6#!3Lg4ix zFWKq}_d5F_{bJSoO_bjHmWg8^KT&_#ly57~h(ovjoY=cy>9fZR?a5(&`=aV`+hHod z$S#_9DdwjM-dsxNtT0kD^D;18uI#q1IG;?>y2?&ifh3dpBKM6_+vocE>6ZEq_p*hR zG0RG~r6l7F?2&2W)Scruz6XX>C!oe7zz>&IiP}`4hqX`u+_Sa8<0Na@1y}6@o6Q8J zCyq?6U|f-5HR|F37(=!R{ukEk@8Ae&(iI`N7d%3^Oq}29Z52BmtvipnIZoDW&_bMV zWN)qTqybl$NDIwU%F_NmmTW^4C|ulhFxsSUn`!u;l!hm!@)dcb93b7#7QBOMl*fUy^`)*ck`o_*$90q?jbQ` zX4x#0rX{x7W3{{=`3dAO_X<$-n;=g#FF?CAJ-c)(?O#TEyF5C>X{jy_^M}^SSLNM|2q~L|+>(nwy0>v)=1@Q9LjfigY?|dK6)a-( z#n=f`Ez2e0+?khN&G4|_ zgYBh2*UAXXO8WsvOaY&?xL8m>S_0FUfGSgw$qVJL}S*>n&ZGnsrJ@i+m9y z8CU{Tf<}OaVmL)eV)dbW6F)AhEFH$Dy%-8nigrnFG%{H^g{g3gGG^C=3=Q4ek1}*< z8j~`x6r$vqjKYRUF&e7;)McXyunY~fNW>7bp*`?qaQ_F*WDPXgL75<_9>6p+vL38@ zu~-5FB9H3ZJ9;MNFKD>hP(t71ROlLD0`l(N);ve9+}}EHfCjGF~R!Z>YB|u zf1qRy8&MrCHGJK=jjB{0K^2D=6r7b&xO*W{j{(>O?bo_XHdOSj6>N-Qhr?vVVoz{BKYV-e?C2|)7?c)6 zocuVku?8>)?gFgraI`FPgLZUX^9g_L&=K{%S{Wdk#>Bv=0}Z1W&jqZwiJm24=Rkzi z$&<9WerL%D_xjwOIi3G;`B6QuQT-33Fl0Y=0-xT7c~oW8lNR_)aKIMMk|@sePD@ORF)@zs2K-dNcs%ZrwUbkDD+NL?CB=H=C)YjK&rNa$_B)~JV+kDK6orleF6^2VLB*;5|P{j4R zP9CzSwRo+3L&V#9$3`*hp_EUfA&_lZD<8#E^QByOHuxy z-qrA%Gfd@Y20Q6|QM58dEC&&)>Z0|3S-eFmv49yJk(I=qv#Fk1J;RQDP4l>Prjcn`|oD#|O8}BpMtqr(Zbla8L z_Xrh}(4q_STt|qbe&8ZuDK~%7`w|;d1a(9fA8oS6n!B70)98IrL0!TYtydT25Wo4Y z`BeQ^oW+t9{bdxSE?+$tX%wj@^x$c_5^a9m_IYJI+JmLpd($rAL*2uQp*C2FrjD07@aU-Q}{ z@;C)zi>6yt4O6fI)9K#?5)cfC+T%d8)bXOxXFK5%d zGc4KiI>j!dfee$LuES&$QY8W$ zCr;KY97?;;gx8XZgYafPBi14{BerI^4?Mb;Jcyn>4h#V%)vUO!0N)c(;7d*Ln1xRw zhT*`qwaBU=;j!40y_!2R9NFC|yV zBqg@_2;D#>g1;xm1av9mltvi@TLNXNGZ+MIph1^wXNp!jl_-8|Dk4Kmf}7=tB1z}p zcM{;+lVO5j6X0X5BRiz~`-jz%m16#T@dsbh5ygq6U?E^JzckJBV?&)nF8eyyF3+!#VNYTP!JaASYxIm5aWy! zc>-!YlYf(dV|`#4eclHb6!l2l;mv+clUxAHzbh?8Ow$FkzjKf#Xqo=5o<2 zZYxS~gpf;Xti@yt9D&Z~-03CsfC#TH60ii}#3S#POR#2Esg0jf4Ww?hn{EdV5o3yH z_i~*r_6z3YSib2@zU7B;964`_h&akWO6NCmh}Ga~B_W0dOh0<=^;WO~86)-+u(@;A zcSY{jP}MbkENq1?_(6^Wf3)>)CP$RmNhtbRE)=fr>yB^=5(G&UPKQFDtOfKMl1*Q`3W+vl-0S|=TB9%34zBX47a7S3WEbAh`~F$U};M@aUY&7AQWjM z{$HP8S;Fd{R&fMk$A;PftLPGP7pngCfs5rL!;=TwyUb!LC8eL7{EfQGUmHzT*0f{F zC)!MQaPeIro4z3#!KDu5jqFj!j|`5cK5cG0J7#Q@G_ZHFR)$H_a@Q6a%oKW89X%kO zH7d2PEI9rexQmIV=DmWM`~IqWC+)GQZ8@+8W@*{Wot;s0$d&;I?AEf?nJJDXaI&7< zd)mY(lsG8w#|kFqS(Z#qIp8xYRyAg34=_H_-MLq6*l);vaXCh*K>6czM10;=vm4zG zc{&>I#3#6eYI%*mX+dSZkgke;BK*^8+MNQMrKR4`=!ENS!9`}-pg9GRnkUsEs@wDl zX9`PUH#kG7hlVBtxP|z1p5>^u zZ-hBx3#1?GWcjsJ3cKnasE4d%X+e<`ziEc0&pwmTd=EPc)be_doc=l*#M5>WvvGLS zUK=7Qx(BfbRUL1k&Hc_i+SO0caEC(UOG=IaxYwmutY_CJ&gpPGA99*Z1pm+H1Hs?N z3Lz%50t|Tvg0+9x;MGxoh^T6*xAiD1|GNOBKIaBF{1keN65I+{VTXUKe@n@cbG>x&B7~B^1)nh0GLF_AhEV5ve#jC8NW6Lg;2Q!eO67 zqFZ3vM#Fz`@RB=?52%8ruc>fRZP+36>uK44z%RSexL3umRwQEZ3W6(TLxWG3K`*_~ zM(_3dteaGG72I9u-#AsSie^?fWi#)eb}+k&9|zRt_XT`DUA9BYvFOtH_C+t;vVaI| zN2jLaNxZPi5dTJ6H=s5;qi~smxgBJ%6^xeW(5I_WFrTFH&BamTwVP1wUCxZEd^G)j z(-g~kW(Ws{At|<|^z|gI;CV28EVV$WvP0V5W-RvY?ch2Jk#L7!XF6{$J(#zD8at`E z=@{5p$R+laWyJFjZt;0dE2!u;r`w@m_j#B=Blb;~QH<{KkmEQ#=wBNXU(G&q)NqTTuaB?)I5795NVrxxbv{C;;q)s3(k7^UU(o{_NA_w zHN!`E^<>V%JQw{!Jwc!`J+qhoH&N95d0fHIDye&q3#W-8bN?c$w-ihpBbQ#xICKDP z8C>MP(UILH2PU_FFh@XQ%jL6>9%P->t8_XLPs1 z$bUrWHNgvc!hd@v$xP4_`Z^G0I$DSr{s!DLvX?Zmp73{Ja$z8E=8~y&|KxRhQ9R=M z~+4}w^r@9<_T(t*GsuPzIDDev|;Q}N%4A} zLwXh?ha^2enBjSmbo{)V!_&FJez5W@)>{QuCpu&GJ^EfNSWmtUR14y^|HyF;L4iGB zF1dlJLNO%%b&MZD?CIB!U3&Sf0sE!&o1ef z!FU+k?;6>7=p^{@pozkpM9+Q`*xgTOQDri3PC%cjJnYGIHp`822pMAS-92=uxN(+5 zkFTI2$@)1PQOFN-JQ)kS-Q6{g=}y0fOWP73!7|03HHBn^Pa7VbljdmQdqq>!nwuht1sv`w^N`Q z;1qC{rion7KlDR@(L|Hc&C5r`d-5!;EIvt1C~$ z5`(QEQka^YT@G#rE({PeS%VDA59#X8^Yrnpjt;ayEJ|aA$mIPxZ^y@GcpK3=Ap#IM zTv&J9;(5M&bU1V#9gof7?W~6x2p7XK8({>GL>jAYZ7gbmMnu5g)R%A%e$H_5{&1J4RtUJe#|$X4<6!BrK6kI$ zGs=`oB?^4p{pmkrJDYm%1xgL_oV@HEIA}GrQ&n;4M8AGtE4X~?8tc?1O5GHS7uLeK zd0VzOnH%$xnR-}z57dh4-Wg?UOC)#m;keFGT5hHi;`(QS;gfrLR{7~7st&}M<yTLZz4=scHA$vD zCN-B3TY`7kUJOT^JHZ(?`95&k3#&ZaDtEb=V{TlOlPTP{Jo}&sPbE=mh*Wiz<9EYN z52;?GX6sz0Zr$2zuqZccs*pR3Jf(gvBh7CZ^&D4GfCd+47rcVdc#i$|!0nW~0@s7L zZryw{s+A@C5w{*P?e8v4mv|QRY6YU7CS&4~0RyH5J^}4CakF|n8#Duy@=_0v&q@X2 z#%pd>Hf}mhx+7P&8QjKXnBtY)eGIw7sH}*eKM+ZgP`R1f`9@P!i{YV*MOMC^rVrG9 zxoWB30N{?du9QDU`sY-H^F;2@Hq&t5eHqKl>U=f)0TQMmWrZ0UUMoEOHn3h(NoAsk zAHliMe6|}ne<87H77d~ncdMH#w(nX7Fhly{OF3B0ntw#&NG{rPs!5yPfu7G9w+(q* z{>*9`&TN6i(T5F!mRG-)r0iAwYOvu4?9xBLa+D@B+%m#4LN}^4GgOBfq!FeYq>()2 z&(bleRnX>Tgs?B9=bH1Ow0-R#AA;`b$kH49fsZ7KZZ@Qq?+{|JxpwRct1jh5`T2^a73V#FSmroG#@b&0UkQQP|4IlzarUKO zsJHKbf4|y09894YhKBYwxo~^pR$XGXE*7yPsmqP`23lZIOYP%x>4)>^#YR`>%B=AT zzJ*kquOEaF``_`)`tWhwoI~Ar17+4WXwVTg_bv)$x&1?RBI`w7)h)~_`s@6M9=V&a zQT^}98-=S2Mh`4k)nOs}$`@E=(Jk9AWb3EN&1a3`$EE1wid|S%*~!&EL`{$K>a#~i z&)_FJbl zoR|*0;1V4T6}D#Fp7?OHGQlvi*iarU4y9NUTV6;XXETMbqxin2@Mv$$8)YV%-58edYS6Oa-?VE+c3ugB6cUAszKNcRvr2Y9nN2H%!+!Z|K z@3~0)(}x*=bMWM)98($<%c2@26-$d>kD#BlEK}5I*>|&K;Og$yBZfMU05=i_oAF@! z-+glhIh@|dD^cC#?IZvDX-?dz^XTlzOy2;GQ9nSk&P6z08Hy>s{)uCjmi~F{>r*o* zjOfofJ4%2*Bdw=!RimfwUBPwLs{YBoTGT>1%413yqei5@e(2{z>5p|Z!&syXE-2D? zs{&VFm3r%`Wx5N1(HJVY{lpF*$4;{Z2Imw~hq`9~lk*E7n9rDEOlbSp_5tVj6Y4>_ zGh;Ji1Uk_!!(K!BboLMLEdmbMr<|vp$6^>^abK#q*G>jJZTK&%J#1@|i0D4mU~(_R zZSEUPDIM`$85`_pYcHfCB@y2{)1LMc3Ggk3q4B#lpNba&r}ufTCQH*9FlEupom?{} zN34_7V=ogU8p}%>1T{|&1rOWojR-4-o$$-%toJ}|n(rwnxn|_waf8NsQ8k*ZBVo_F z=39Z8A~q5NuuN`i`mwkT;Rr_F4|u_m=Y)vvQZM)dm~IwovJW z%33l`{|(b5+!9|(CR3cDDE~+=oc5%0IUz1)mKr&LlC9QB0 zbC=WhzEhgjdi8RY#%Y=@?s5X8IX}$_BDc<7R>o-EkHs2dgL=*rXwy`+z*7=w!B#+B z6T&BaZ?}luP~EP^?3_^QykA0$`Mz{(&{i9Z=@e|AP|kBn98yB1BhS=@8q&eUwob}} z9#INK@&aPMWw|OToE=c@A<(=bX?bbL5)Wd`DOiFbY49N!yJ$V~gGPLdeG%CqX>`X2 z%qhG=fwz=JTjI}Z3AsUr{{r~?P0gKC$*l@{i&8T_NdGVR79;SsC_~cX+X~xsd-iz- zDJhsSm-fUs!3QaS3}8y!k$K2ke24A^P2k(yO!S0R-8*ZLQh@p5$?9ut0|WOS^PNJD67 zQfeA%ni4=P!q}Xb_Ne;Pgi;nj+B~Vj?la7BWekmDD)Q8KM1LB zfn;ePbW+0=w5y>1s0LG+`F6Kplv$sBxG+QgZui>30K=KtQlA(5pQQBJu5}V9CtW1? z%@M}s9ff)Auc{4wV;W4orUjkFMH=~LPs61zvpUhC~1&2|g|H$Peu zc0dyJ&wsMhoP5rfs z_Bm@VT(M-=1llOdEo~hEtw*VxbF#0+A8si8@fVv4=ITV`r1Z;=KOf+r|AD4Eel)}v zP>dww2D-R4LBlElI5PbIyyVF4^$ywlN3u!-35G!D9P|pc5MbCb!M%u|4~%ChWAla; z#e}7WrTGV?3$zF&DnuF?W;oit>UcsSxsgzq82|Nh)Dp>CxRfIlk$^21kr5U73zO-u z0YL%Vq38&Vxx)k^5&%@WjLN@5f4>sO!$~104MNI!5Wmyt$0M^X$vtI1eXh z&+=IF9qh;$iM^udBO?2M;L>8EG_UwNypq0WL17a&EsL0!-uUO>1H(DCE8_Fh_VSb| z8yD3;Fz?@0S@PYuVfgEF3p!mNlaM&+y&#rpr+@m-Nns&=*@|8zPbm1R86;W@U{TV? zWvRrPSSM6)7G81@RDoVFMiIwS4>C~T5V7ryRtpog5R{h_k@^f++DBB&VP~TIiUf)xoUQZ@oVgv2E z4g6Osyo4@INs}tOT+OvS=$}k<`F#M9WS4FZ>r1P#0{D~zgkq4_M9`(BFowMF| z4h1ug9+W6dm=EKtCU;wa&1xUJ0{R8m1)FJ>QjcdyMzR8!@^RD5t`G#Mx9xp7nO&v8 zG5`Dvp3VG>iWyN^>w1KXDyCAx>RfZ_6!Tz<%Y`PK)`#7-FbZu9I0h4B_6BQuNX>5c zjHLcK!#KszCwGVl$RESkXe)PpA6JMrI@Rzs|h!Y#KP9; zgA`--bbgp=h-46aK0?0jdy(tMBee|*@@eQPi};aDD`81&}XKX^pC-dUIgp3o#O@6LF$4?9e*JFI`Ak~45Ul!7f z2z}?$&7J(tATyNm%0+6balIlYUhcfHFBmB2ck9MjHcjo@ZOMz0eg3VkpJw}T^`%4& zrcO(FGMie}yJ}PI46|Y2$9lM%$9dXb3FH^x_Q5YXp5E61EwYc4Q`RCygYk>Wx>|E` zyzF0u4gS$8{e_UB@kbkttqC(#cJTr}C1kWPKhnd_HCQf4&f6s~3X?l!4WlnHIS{^v zqAxKw5uQc@RlX+?Ut_wPDV;1?gQO7o6GeZrTtz)o>)C)ssp0aq3x?u~+0?IPbKr1s zUZo8RxiXA*--c6quUoBg<{5W5y-W{H`9!4bREzIr%hwb^j)e{j~oi>uvryWbc{U3EE(L0oqQNEmzo=b%5)Ek z$*Ng_q8TX69x0&EoJ+0%Al#JqV*K=VW^G-FmOB0ovv;d<)#yCHd0+E>W)~mAmy6#l z4X3F)H=mLwyW_V6CF}WbXHWDK;Oe2*iko=akS;?M5unz`0G}CroU<7+#P!WK;F#!e zV|JD=UuVxlSU1GEaH74Aw1iAXEGF1goZ=dM&+wGr6q%t-R9%Sl5tx1w z-TjzS-!McZIw}!NzhG7n3t9Gs>(IOK_v2>me4j0#7Wz1$9Q`DOrjha)HRu6^hRhlMW+hOFLm1SRph1Jyh!s`uanLKeYHA;Xa{ zWR)on@Hc%m8&YLFa|dx$+BKBdT|Tv^kt;bxuA`eS=r~C2QU`z3Q3T+4i0M(ERSjmz zExM8ah(-L`Y6K>je1PJECP=&3@4S5l@+D1oSF8iV& zX7aqZSwL6}gds;JN0!#V`vPaj(`Y>J*6Qb15qfO#L|mXhPZZ^%zjEI@*v0|VU^Y5N zbksj2uB%Fbg8iyi(b!twQT*_{CUwGBL>CLpOcKj}Zx)wK?T>JXY~isZNs{;K>%vhV zAuk8E;RA-pd2G1|ahd&WM@jSx7Md$x^B(XOy*j*h4qZHQC0gu%L9H~A3@6y5_aN#+ z%ITL^=9u5jlu^vg&*uB=hFdcEU^P-)*%gpl4?w9zT4Y}K$Nzu`zlWF#LnL_VI#`6! ziS+~foeoyZdrwOJ8w?dazYdXrf5+uiA=M19+QdN@;rc!9?2P!ahJ^2@zq!k4({sWI zYl~#8+3d%^bhX{|0A>`>JazhU1?!v0pUY6Gs2o%hzWxlDZ7hf_7|TzTWsfEpa7+_ zhN*Y)s$r+Igs-!m_R$#<&Efl?enj&kSeyuY;Rcl1T4>@6%VKhec=Ig-<&)!AVZLt! zcUZHnLM7)(u#GlQ-&nzt$QJOJgbE<4We8bN+Xu0Dq{vLyn77)(V_7rRug{~=j6YNO z)V6>_6EC(ZD~j$umDa>JM$&nC-Dpgb(w;VHrs@tGXLH^9!6vS{Qg?Z z0@JBDV3@DkU_nL4LQ4m;Uo(|1MV+M9y>1JS41ug-^&CfH-efC9(Hzi(|2V9>ynekE zDwCS1PA!2YF~6egFHt+2PD@fd`)!G|b~p_CZxVsffh1~B%zwk|)k4HeAK~}iTYN%_ zq=}@U?5-Im@Fp$vDI!Q4zpS*Cx0pL&A+LzKY(6Y~T|G!Guqta1a;B|f6Gox#+YPwF zOk7c@Bb}IOHv0h@Pi86QA%af)OKb` z?hZX%1XE#DA^)jAn`Wnc3{ot^J8|b9_ZB@3fMuPT3 z#y{1Pc?}`dnTzw{uyXcyB{KUh%WUg z8iG3WtgQuBN9h^X-6hWb=Gc_6n(p`KKOHTwbU%ij;9JYQMAS87$(!5PU`H*%Qb$id z>LY%FOg$BlGdNs_(4w->_Cbg`v^YPL+C+t9!HUziT@9e*k5g-JVlj(AwvVSH0QHG&A%jq|G7dRvd7gLC+);sQX7IT(WC1QkvLXjL?}Oi$YQAa84*z0 z(_XF?F{QG8S95qET0yzf%0i3x>v_Iv+U68@qlX_!OWdAnHL7PHhd87CdwZk5zPo46CRaSj7U4#VP??c2)r#Cabu%itgaDO3GGI zGq8#U9FtXfY!$#^vMM!t5`rf!dJ;k;I(iar23E0vW3q}BJ%0f>`4nJk)yoh(X=N`% zh(y=D3^xO-Simt^#VUOXaPqM#b%$FBp0q7)Aw;70xP_a6RV?6`tYU3*130-@RZY!6 z*@mZ@mVmO2NHseDB-{+FVgbiv6~UH+RRD*@s`MQ?+wi3B(b+~MW|vO58Cb;vj>jtA zULAmw$5x#lbASCRx`W3mx zN6)4d!Ma-OQtRrSTCb<~ZffG+U9H!?z1L*eM&F6X)2B4FK6A&WkKDoIsTY3_c$gJx z2}&ja9mCI4Ah=%y=eA?Er!ziJ`|Yl#w>v#HMa77^J%61^vUAxS#LNIImy;_{W9WDc z$o9p=zGF;gVxuFQiv4b_)f3w*xm27lhm@n@syV2b1y?2)*Qn;gm<%P&V!L1KYnOVx-T8z5(`?pSmvUy&8&Dt6i1Z(C$OJA%H3t{7;3~t#NK_dc z*OM^IwtsctzD7zpw0FS!6q^V3xOsqJem0wnx$$*mUYfIkV@*k5iJQ|V2p1f^dDpL9 z+-mxz)~k0L9a33(|Bp_ZckA6d_J-Amt8w)?4IDX5B;J9UA|uAV#K|HVVa9xs0$!FW jBk=1MqbEar{pAmFnef;D2LJ&7{{sLh*WRGR!~$^uaW&fX diff --git a/src/Vulkan/Extensions/Silk.NET.Vulkan.Extensions.NV/NVRayTracing.gen.cs b/src/Vulkan/Extensions/Silk.NET.Vulkan.Extensions.NV/NVRayTracing.gen.cs index 2f360ca919..a15fd8a64b 100644 --- a/src/Vulkan/Extensions/Silk.NET.Vulkan.Extensions.NV/NVRayTracing.gen.cs +++ b/src/Vulkan/Extensions/Silk.NET.Vulkan.Extensions.NV/NVRayTracing.gen.cs @@ -138,21 +138,21 @@ public unsafe partial class NVRayTracing : NativeExtension ///

/// The newly created chain root /// A reference to the newly created chain. - public static unsafe ref AttachmentDescription2Khr Chain( - out AttachmentDescription2Khr capture) + public static unsafe ref AttachmentDescription2KHR Chain( + out AttachmentDescription2KHR capture) { - capture = new AttachmentDescription2Khr(StructureType.AttachmentDescription2); + capture = new AttachmentDescription2KHR(StructureType.AttachmentDescription2); return ref capture; } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescriptionStencilLayout.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescriptionStencilLayout.gen.cs index 6216ade17e..9d34559490 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescriptionStencilLayout.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescriptionStencilLayout.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAttachmentDescriptionStencilLayout")] [NativeName("Aliases", "VkAttachmentDescriptionStencilLayoutKHR")] - public unsafe partial struct AttachmentDescriptionStencilLayout : IExtendsChain, IExtendsChain + public unsafe partial struct AttachmentDescriptionStencilLayout : IExtendsChain, IExtendsChain { public AttachmentDescriptionStencilLayout ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescriptionStencilLayoutKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescriptionStencilLayoutKHR.gen.cs index 393d95f59e..9aa7b60fa7 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescriptionStencilLayoutKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentDescriptionStencilLayoutKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAttachmentDescriptionStencilLayoutKHR")] [NativeName("AliasOf", "VkAttachmentDescriptionStencilLayout")] - public unsafe partial struct AttachmentDescriptionStencilLayoutKhr : IExtendsChain, IExtendsChain + public unsafe partial struct AttachmentDescriptionStencilLayoutKHR : IExtendsChain, IExtendsChain { - public AttachmentDescriptionStencilLayoutKhr + public AttachmentDescriptionStencilLayoutKHR ( StructureType? sType = StructureType.AttachmentDescriptionStencilLayout, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReference2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReference2KHR.gen.cs index ecf7b094ce..576609efc5 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReference2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReference2KHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAttachmentReference2KHR")] [NativeName("AliasOf", "VkAttachmentReference2")] - public unsafe partial struct AttachmentReference2Khr : IChainStart + public unsafe partial struct AttachmentReference2KHR : IChainStart { - public AttachmentReference2Khr + public AttachmentReference2KHR ( StructureType? sType = StructureType.AttachmentReference2, void* pNext = null, @@ -99,10 +99,10 @@ unsafe BaseInStructure* IChainable.PNext ///
/// The newly created chain root /// A reference to the newly created chain. - public static unsafe ref AttachmentReference2Khr Chain( - out AttachmentReference2Khr capture) + public static unsafe ref AttachmentReference2KHR Chain( + out AttachmentReference2KHR capture) { - capture = new AttachmentReference2Khr(StructureType.AttachmentReference2); + capture = new AttachmentReference2KHR(StructureType.AttachmentReference2); return ref capture; } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReferenceStencilLayout.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReferenceStencilLayout.gen.cs index 89d7984680..989232bd9c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReferenceStencilLayout.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReferenceStencilLayout.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAttachmentReferenceStencilLayout")] [NativeName("Aliases", "VkAttachmentReferenceStencilLayoutKHR")] - public unsafe partial struct AttachmentReferenceStencilLayout : IExtendsChain, IExtendsChain + public unsafe partial struct AttachmentReferenceStencilLayout : IExtendsChain, IExtendsChain { public AttachmentReferenceStencilLayout ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReferenceStencilLayoutKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReferenceStencilLayoutKHR.gen.cs index 41a94f8bb6..84ab7f722b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReferenceStencilLayoutKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/AttachmentReferenceStencilLayoutKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkAttachmentReferenceStencilLayoutKHR")] [NativeName("AliasOf", "VkAttachmentReferenceStencilLayout")] - public unsafe partial struct AttachmentReferenceStencilLayoutKhr : IExtendsChain, IExtendsChain + public unsafe partial struct AttachmentReferenceStencilLayoutKHR : IExtendsChain, IExtendsChain { - public AttachmentReferenceStencilLayoutKhr + public AttachmentReferenceStencilLayoutKHR ( StructureType? sType = StructureType.AttachmentReferenceStencilLayout, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryDeviceGroupInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryDeviceGroupInfo.gen.cs index 5a41f07339..cd183166a8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryDeviceGroupInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryDeviceGroupInfo.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBindBufferMemoryDeviceGroupInfo")] [NativeName("Aliases", "VkBindBufferMemoryDeviceGroupInfoKHR")] - public unsafe partial struct BindBufferMemoryDeviceGroupInfo : IExtendsChain, IExtendsChain + public unsafe partial struct BindBufferMemoryDeviceGroupInfo : IExtendsChain, IExtendsChain { public BindBufferMemoryDeviceGroupInfo ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryDeviceGroupInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryDeviceGroupInfoKHR.gen.cs index be02f1c693..81640c917d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryDeviceGroupInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryDeviceGroupInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBindBufferMemoryDeviceGroupInfoKHR")] [NativeName("AliasOf", "VkBindBufferMemoryDeviceGroupInfo")] - public unsafe partial struct BindBufferMemoryDeviceGroupInfoKhr : IExtendsChain, IExtendsChain + public unsafe partial struct BindBufferMemoryDeviceGroupInfoKHR : IExtendsChain, IExtendsChain { - public BindBufferMemoryDeviceGroupInfoKhr + public BindBufferMemoryDeviceGroupInfoKHR ( StructureType? sType = StructureType.BindBufferMemoryDeviceGroupInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryInfoKHR.gen.cs index 09e9cad388..d402c824e1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BindBufferMemoryInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBindBufferMemoryInfoKHR")] [NativeName("AliasOf", "VkBindBufferMemoryInfo")] - public unsafe partial struct BindBufferMemoryInfoKhr : IChainStart + public unsafe partial struct BindBufferMemoryInfoKHR : IChainStart { - public BindBufferMemoryInfoKhr + public BindBufferMemoryInfoKHR ( StructureType? sType = StructureType.BindBufferMemoryInfo, void* pNext = null, @@ -99,10 +99,10 @@ unsafe BaseInStructure* IChainable.PNext ///
/// The newly created chain root /// A reference to the newly created chain. - public static unsafe ref BindBufferMemoryInfoKhr Chain( - out BindBufferMemoryInfoKhr capture) + public static unsafe ref BindBufferMemoryInfoKHR Chain( + out BindBufferMemoryInfoKHR capture) { - capture = new BindBufferMemoryInfoKhr(StructureType.BindBufferMemoryInfo); + capture = new BindBufferMemoryInfoKHR(StructureType.BindBufferMemoryInfo); return ref capture; } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryDeviceGroupInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryDeviceGroupInfo.gen.cs index d492c29649..0f7a75568a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryDeviceGroupInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryDeviceGroupInfo.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBindImageMemoryDeviceGroupInfo")] [NativeName("Aliases", "VkBindImageMemoryDeviceGroupInfoKHR")] - public unsafe partial struct BindImageMemoryDeviceGroupInfo : IExtendsChain, IExtendsChain + public unsafe partial struct BindImageMemoryDeviceGroupInfo : IExtendsChain, IExtendsChain { public BindImageMemoryDeviceGroupInfo ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryDeviceGroupInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryDeviceGroupInfoKHR.gen.cs index 8dea0be7c9..d1e20b7837 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryDeviceGroupInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryDeviceGroupInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBindImageMemoryDeviceGroupInfoKHR")] [NativeName("AliasOf", "VkBindImageMemoryDeviceGroupInfo")] - public unsafe partial struct BindImageMemoryDeviceGroupInfoKhr : IExtendsChain, IExtendsChain + public unsafe partial struct BindImageMemoryDeviceGroupInfoKHR : IExtendsChain, IExtendsChain { - public BindImageMemoryDeviceGroupInfoKhr + public BindImageMemoryDeviceGroupInfoKHR ( StructureType? sType = StructureType.BindImageMemoryDeviceGroupInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryInfoKHR.gen.cs index ec2a250a69..fe65822e01 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemoryInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBindImageMemoryInfoKHR")] [NativeName("AliasOf", "VkBindImageMemoryInfo")] - public unsafe partial struct BindImageMemoryInfoKhr : IChainStart + public unsafe partial struct BindImageMemoryInfoKHR : IChainStart { - public BindImageMemoryInfoKhr + public BindImageMemoryInfoKHR ( StructureType? sType = StructureType.BindImageMemoryInfo, void* pNext = null, @@ -99,10 +99,10 @@ unsafe BaseInStructure* IChainable.PNext ///
/// The newly created chain root /// A reference to the newly created chain. - public static unsafe ref BindImageMemoryInfoKhr Chain( - out BindImageMemoryInfoKhr capture) + public static unsafe ref BindImageMemoryInfoKHR Chain( + out BindImageMemoryInfoKHR capture) { - capture = new BindImageMemoryInfoKhr(StructureType.BindImageMemoryInfo); + capture = new BindImageMemoryInfoKHR(StructureType.BindImageMemoryInfo); return ref capture; } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemorySwapchainInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemorySwapchainInfoKHR.gen.cs index d88322768c..54254924bc 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemorySwapchainInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BindImageMemorySwapchainInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBindImageMemorySwapchainInfoKHR")] - public unsafe partial struct BindImageMemorySwapchainInfoKHR : IExtendsChain, IExtendsChain + public unsafe partial struct BindImageMemorySwapchainInfoKHR : IExtendsChain, IExtendsChain { public BindImageMemorySwapchainInfoKHR ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BindImagePlaneMemoryInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BindImagePlaneMemoryInfo.gen.cs index 11436ab7e6..5a65d42138 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BindImagePlaneMemoryInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BindImagePlaneMemoryInfo.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBindImagePlaneMemoryInfo")] [NativeName("Aliases", "VkBindImagePlaneMemoryInfoKHR")] - public unsafe partial struct BindImagePlaneMemoryInfo : IExtendsChain, IExtendsChain + public unsafe partial struct BindImagePlaneMemoryInfo : IExtendsChain, IExtendsChain { public BindImagePlaneMemoryInfo ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BindImagePlaneMemoryInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BindImagePlaneMemoryInfoKHR.gen.cs index e1abc9df95..de7e36bb73 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BindImagePlaneMemoryInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BindImagePlaneMemoryInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBindImagePlaneMemoryInfoKHR")] [NativeName("AliasOf", "VkBindImagePlaneMemoryInfo")] - public unsafe partial struct BindImagePlaneMemoryInfoKhr : IExtendsChain, IExtendsChain + public unsafe partial struct BindImagePlaneMemoryInfoKHR : IExtendsChain, IExtendsChain { - public BindImagePlaneMemoryInfoKhr + public BindImagePlaneMemoryInfoKHR ( StructureType? sType = StructureType.BindImagePlaneMemoryInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferDeviceAddressInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferDeviceAddressInfoEXT.gen.cs index 3ab954d50a..9d2a6bec9a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferDeviceAddressInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferDeviceAddressInfoEXT.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferDeviceAddressInfoEXT")] [NativeName("AliasOf", "VkBufferDeviceAddressInfo")] - public unsafe partial struct BufferDeviceAddressInfoExt : IChainable + public unsafe partial struct BufferDeviceAddressInfoEXT : IChainable { - public BufferDeviceAddressInfoExt + public BufferDeviceAddressInfoEXT ( StructureType? sType = StructureType.BufferDeviceAddressInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferDeviceAddressInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferDeviceAddressInfoKHR.gen.cs index 2a47af03e9..1631e88202 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferDeviceAddressInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferDeviceAddressInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferDeviceAddressInfoKHR")] [NativeName("AliasOf", "VkBufferDeviceAddressInfo")] - public unsafe partial struct BufferDeviceAddressInfoKhr : IChainable + public unsafe partial struct BufferDeviceAddressInfoKHR : IChainable { - public BufferDeviceAddressInfoKhr + public BufferDeviceAddressInfoKHR ( StructureType? sType = StructureType.BufferDeviceAddressInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferMemoryRequirementsInfo2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferMemoryRequirementsInfo2KHR.gen.cs index c9197e6189..1affae1b2d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferMemoryRequirementsInfo2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferMemoryRequirementsInfo2KHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferMemoryRequirementsInfo2KHR")] [NativeName("AliasOf", "VkBufferMemoryRequirementsInfo2")] - public unsafe partial struct BufferMemoryRequirementsInfo2Khr : IChainable + public unsafe partial struct BufferMemoryRequirementsInfo2KHR : IChainable { - public BufferMemoryRequirementsInfo2Khr + public BufferMemoryRequirementsInfo2KHR ( StructureType? sType = StructureType.BufferMemoryRequirementsInfo2, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferOpaqueCaptureAddressCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferOpaqueCaptureAddressCreateInfoKHR.gen.cs index 42c2693bcb..6ba3218614 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/BufferOpaqueCaptureAddressCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/BufferOpaqueCaptureAddressCreateInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkBufferOpaqueCaptureAddressCreateInfoKHR")] [NativeName("AliasOf", "VkBufferOpaqueCaptureAddressCreateInfo")] - public unsafe partial struct BufferOpaqueCaptureAddressCreateInfoKhr : IExtendsChain + public unsafe partial struct BufferOpaqueCaptureAddressCreateInfoKHR : IExtendsChain { - public BufferOpaqueCaptureAddressCreateInfoKhr + public BufferOpaqueCaptureAddressCreateInfoKHR ( StructureType? sType = StructureType.BufferOpaqueCaptureAddressCreateInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ConformanceVersionKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ConformanceVersionKHR.gen.cs index 63edb69dfd..932b00aaf5 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ConformanceVersionKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ConformanceVersionKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkConformanceVersionKHR")] [NativeName("AliasOf", "VkConformanceVersion")] - public unsafe partial struct ConformanceVersionKhr + public unsafe partial struct ConformanceVersionKHR { - public ConformanceVersionKhr + public ConformanceVersionKHR ( byte? major = null, byte? minor = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutBindingFlagsCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutBindingFlagsCreateInfoEXT.gen.cs index c4c66a31d6..d408a524f9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutBindingFlagsCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutBindingFlagsCreateInfoEXT.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDescriptorSetLayoutBindingFlagsCreateInfoEXT")] [NativeName("AliasOf", "VkDescriptorSetLayoutBindingFlagsCreateInfo")] - public unsafe partial struct DescriptorSetLayoutBindingFlagsCreateInfoExt : IExtendsChain + public unsafe partial struct DescriptorSetLayoutBindingFlagsCreateInfoEXT : IExtendsChain { - public DescriptorSetLayoutBindingFlagsCreateInfoExt + public DescriptorSetLayoutBindingFlagsCreateInfoEXT ( StructureType? sType = StructureType.DescriptorSetLayoutBindingFlagsCreateInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutSupportKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutSupportKHR.gen.cs index b1327d311d..85c6916e7b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutSupportKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetLayoutSupportKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDescriptorSetLayoutSupportKHR")] [NativeName("AliasOf", "VkDescriptorSetLayoutSupport")] - public unsafe partial struct DescriptorSetLayoutSupportKhr : IChainStart + public unsafe partial struct DescriptorSetLayoutSupportKHR : IChainStart { - public DescriptorSetLayoutSupportKhr + public DescriptorSetLayoutSupportKHR ( StructureType? sType = StructureType.DescriptorSetLayoutSupport, void* pNext = null, @@ -77,10 +77,10 @@ unsafe BaseInStructure* IChainable.PNext ///
/// The newly created chain root /// A reference to the newly created chain. - public static unsafe ref DescriptorSetLayoutSupportKhr Chain( - out DescriptorSetLayoutSupportKhr capture) + public static unsafe ref DescriptorSetLayoutSupportKHR Chain( + out DescriptorSetLayoutSupportKHR capture) { - capture = new DescriptorSetLayoutSupportKhr(StructureType.DescriptorSetLayoutSupport); + capture = new DescriptorSetLayoutSupportKHR(StructureType.DescriptorSetLayoutSupport); return ref capture; } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountAllocateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountAllocateInfoEXT.gen.cs index 789ff5ed93..f435e61120 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountAllocateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountAllocateInfoEXT.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDescriptorSetVariableDescriptorCountAllocateInfoEXT")] [NativeName("AliasOf", "VkDescriptorSetVariableDescriptorCountAllocateInfo")] - public unsafe partial struct DescriptorSetVariableDescriptorCountAllocateInfoExt : IExtendsChain + public unsafe partial struct DescriptorSetVariableDescriptorCountAllocateInfoEXT : IExtendsChain { - public DescriptorSetVariableDescriptorCountAllocateInfoExt + public DescriptorSetVariableDescriptorCountAllocateInfoEXT ( StructureType? sType = StructureType.DescriptorSetVariableDescriptorCountAllocateInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountLayoutSupport.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountLayoutSupport.gen.cs index 766397e765..9f676a42a8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountLayoutSupport.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountLayoutSupport.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDescriptorSetVariableDescriptorCountLayoutSupport")] [NativeName("Aliases", "VkDescriptorSetVariableDescriptorCountLayoutSupportEXT")] - public unsafe partial struct DescriptorSetVariableDescriptorCountLayoutSupport : IExtendsChain, IExtendsChain + public unsafe partial struct DescriptorSetVariableDescriptorCountLayoutSupport : IExtendsChain, IExtendsChain { public DescriptorSetVariableDescriptorCountLayoutSupport ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountLayoutSupportEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountLayoutSupportEXT.gen.cs index a70120e26a..c13ac8afd5 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountLayoutSupportEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorSetVariableDescriptorCountLayoutSupportEXT.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDescriptorSetVariableDescriptorCountLayoutSupportEXT")] [NativeName("AliasOf", "VkDescriptorSetVariableDescriptorCountLayoutSupport")] - public unsafe partial struct DescriptorSetVariableDescriptorCountLayoutSupportExt : IExtendsChain, IExtendsChain + public unsafe partial struct DescriptorSetVariableDescriptorCountLayoutSupportEXT : IExtendsChain, IExtendsChain { - public DescriptorSetVariableDescriptorCountLayoutSupportExt + public DescriptorSetVariableDescriptorCountLayoutSupportEXT ( StructureType? sType = StructureType.DescriptorSetVariableDescriptorCountLayoutSupport, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorUpdateTemplateCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorUpdateTemplateCreateInfoKHR.gen.cs index 1515efeaeb..6e2ae087e4 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorUpdateTemplateCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorUpdateTemplateCreateInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDescriptorUpdateTemplateCreateInfoKHR")] [NativeName("AliasOf", "VkDescriptorUpdateTemplateCreateInfo")] - public unsafe partial struct DescriptorUpdateTemplateCreateInfoKhr : IChainable + public unsafe partial struct DescriptorUpdateTemplateCreateInfoKHR : IChainable { - public DescriptorUpdateTemplateCreateInfoKhr + public DescriptorUpdateTemplateCreateInfoKHR ( StructureType? sType = StructureType.DescriptorUpdateTemplateCreateInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorUpdateTemplateEntryKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorUpdateTemplateEntryKHR.gen.cs index 83262e6381..a43a910b1c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorUpdateTemplateEntryKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DescriptorUpdateTemplateEntryKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDescriptorUpdateTemplateEntryKHR")] [NativeName("AliasOf", "VkDescriptorUpdateTemplateEntry")] - public unsafe partial struct DescriptorUpdateTemplateEntryKhr + public unsafe partial struct DescriptorUpdateTemplateEntryKHR { - public DescriptorUpdateTemplateEntryKhr + public DescriptorUpdateTemplateEntryKHR ( uint? dstBinding = null, uint? dstArrayElement = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupBindSparseInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupBindSparseInfoKHR.gen.cs index 64c6f1f025..7615abdb05 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupBindSparseInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupBindSparseInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceGroupBindSparseInfoKHR")] [NativeName("AliasOf", "VkDeviceGroupBindSparseInfo")] - public unsafe partial struct DeviceGroupBindSparseInfoKhr : IExtendsChain + public unsafe partial struct DeviceGroupBindSparseInfoKHR : IExtendsChain { - public DeviceGroupBindSparseInfoKhr + public DeviceGroupBindSparseInfoKHR ( StructureType? sType = StructureType.DeviceGroupBindSparseInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupCommandBufferBeginInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupCommandBufferBeginInfoKHR.gen.cs index d0361d26a2..b3a4f715d6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupCommandBufferBeginInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupCommandBufferBeginInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceGroupCommandBufferBeginInfoKHR")] [NativeName("AliasOf", "VkDeviceGroupCommandBufferBeginInfo")] - public unsafe partial struct DeviceGroupCommandBufferBeginInfoKhr : IExtendsChain + public unsafe partial struct DeviceGroupCommandBufferBeginInfoKHR : IExtendsChain { - public DeviceGroupCommandBufferBeginInfoKhr + public DeviceGroupCommandBufferBeginInfoKHR ( StructureType? sType = StructureType.DeviceGroupCommandBufferBeginInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupDeviceCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupDeviceCreateInfoKHR.gen.cs index a7f3c6b68a..3e40f3eab9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupDeviceCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupDeviceCreateInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceGroupDeviceCreateInfoKHR")] [NativeName("AliasOf", "VkDeviceGroupDeviceCreateInfo")] - public unsafe partial struct DeviceGroupDeviceCreateInfoKhr : IExtendsChain + public unsafe partial struct DeviceGroupDeviceCreateInfoKHR : IExtendsChain { - public DeviceGroupDeviceCreateInfoKhr + public DeviceGroupDeviceCreateInfoKHR ( StructureType? sType = StructureType.DeviceGroupDeviceCreateInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupRenderPassBeginInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupRenderPassBeginInfoKHR.gen.cs index 8a1f576a58..d68b5c57cb 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupRenderPassBeginInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupRenderPassBeginInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceGroupRenderPassBeginInfoKHR")] [NativeName("AliasOf", "VkDeviceGroupRenderPassBeginInfo")] - public unsafe partial struct DeviceGroupRenderPassBeginInfoKhr : IExtendsChain, IExtendsChain + public unsafe partial struct DeviceGroupRenderPassBeginInfoKHR : IExtendsChain, IExtendsChain { - public DeviceGroupRenderPassBeginInfoKhr + public DeviceGroupRenderPassBeginInfoKHR ( StructureType? sType = StructureType.DeviceGroupRenderPassBeginInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupSubmitInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupSubmitInfoKHR.gen.cs index 6a60dc995b..a71131ee18 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupSubmitInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceGroupSubmitInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceGroupSubmitInfoKHR")] [NativeName("AliasOf", "VkDeviceGroupSubmitInfo")] - public unsafe partial struct DeviceGroupSubmitInfoKhr : IExtendsChain + public unsafe partial struct DeviceGroupSubmitInfoKHR : IExtendsChain { - public DeviceGroupSubmitInfoKhr + public DeviceGroupSubmitInfoKHR ( StructureType? sType = StructureType.DeviceGroupSubmitInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceMemoryOpaqueCaptureAddressInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceMemoryOpaqueCaptureAddressInfoKHR.gen.cs index d09151385e..9212b20738 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceMemoryOpaqueCaptureAddressInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DeviceMemoryOpaqueCaptureAddressInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDeviceMemoryOpaqueCaptureAddressInfoKHR")] [NativeName("AliasOf", "VkDeviceMemoryOpaqueCaptureAddressInfo")] - public unsafe partial struct DeviceMemoryOpaqueCaptureAddressInfoKhr : IChainable + public unsafe partial struct DeviceMemoryOpaqueCaptureAddressInfoKHR : IChainable { - public DeviceMemoryOpaqueCaptureAddressInfoKhr + public DeviceMemoryOpaqueCaptureAddressInfoKHR ( StructureType? sType = StructureType.DeviceMemoryOpaqueCaptureAddressInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DrmFormatModifierPropertiesList2EXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DrmFormatModifierPropertiesList2EXT.gen.cs index b85e4e2dae..779e5bdfeb 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DrmFormatModifierPropertiesList2EXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DrmFormatModifierPropertiesList2EXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDrmFormatModifierPropertiesList2EXT")] - public unsafe partial struct DrmFormatModifierPropertiesList2EXT : IExtendsChain, IExtendsChain + public unsafe partial struct DrmFormatModifierPropertiesList2EXT : IExtendsChain, IExtendsChain { public DrmFormatModifierPropertiesList2EXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/DrmFormatModifierPropertiesListEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/DrmFormatModifierPropertiesListEXT.gen.cs index f6698312a8..512073fdb2 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/DrmFormatModifierPropertiesListEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/DrmFormatModifierPropertiesListEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkDrmFormatModifierPropertiesListEXT")] - public unsafe partial struct DrmFormatModifierPropertiesListEXT : IExtendsChain, IExtendsChain + public unsafe partial struct DrmFormatModifierPropertiesListEXT : IExtendsChain, IExtendsChain { public DrmFormatModifierPropertiesListEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportFenceCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportFenceCreateInfoKHR.gen.cs index 2f26ee1b7d..29fa8895d4 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportFenceCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportFenceCreateInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExportFenceCreateInfoKHR")] [NativeName("AliasOf", "VkExportFenceCreateInfo")] - public unsafe partial struct ExportFenceCreateInfoKhr : IExtendsChain + public unsafe partial struct ExportFenceCreateInfoKHR : IExtendsChain { - public ExportFenceCreateInfoKhr + public ExportFenceCreateInfoKHR ( StructureType? sType = StructureType.ExportFenceCreateInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryAllocateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryAllocateInfoKHR.gen.cs index 8b81b3cc9b..dee5f82944 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryAllocateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportMemoryAllocateInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExportMemoryAllocateInfoKHR")] [NativeName("AliasOf", "VkExportMemoryAllocateInfo")] - public unsafe partial struct ExportMemoryAllocateInfoKhr : IExtendsChain + public unsafe partial struct ExportMemoryAllocateInfoKHR : IExtendsChain { - public ExportMemoryAllocateInfoKhr + public ExportMemoryAllocateInfoKHR ( StructureType? sType = StructureType.ExportMemoryAllocateInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportSemaphoreCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportSemaphoreCreateInfoKHR.gen.cs index cde8a0b420..76bcc960c3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExportSemaphoreCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExportSemaphoreCreateInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExportSemaphoreCreateInfoKHR")] [NativeName("AliasOf", "VkExportSemaphoreCreateInfo")] - public unsafe partial struct ExportSemaphoreCreateInfoKhr : IExtendsChain + public unsafe partial struct ExportSemaphoreCreateInfoKHR : IExtendsChain { - public ExportSemaphoreCreateInfoKhr + public ExportSemaphoreCreateInfoKHR ( StructureType? sType = StructureType.ExportSemaphoreCreateInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalBufferPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalBufferPropertiesKHR.gen.cs index dac75e7c80..823296ebf9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalBufferPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalBufferPropertiesKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExternalBufferPropertiesKHR")] [NativeName("AliasOf", "VkExternalBufferProperties")] - public unsafe partial struct ExternalBufferPropertiesKhr : IChainable + public unsafe partial struct ExternalBufferPropertiesKHR : IChainable { - public ExternalBufferPropertiesKhr + public ExternalBufferPropertiesKHR ( StructureType? sType = StructureType.ExternalBufferProperties, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalFencePropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalFencePropertiesKHR.gen.cs index 597c0941e8..9e0e2871f9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalFencePropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalFencePropertiesKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExternalFencePropertiesKHR")] [NativeName("AliasOf", "VkExternalFenceProperties")] - public unsafe partial struct ExternalFencePropertiesKhr : IChainable + public unsafe partial struct ExternalFencePropertiesKHR : IChainable { - public ExternalFencePropertiesKhr + public ExternalFencePropertiesKHR ( StructureType? sType = StructureType.ExternalFenceProperties, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalFormatANDROID.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalFormatANDROID.gen.cs index 177030a1aa..cfddebbe55 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalFormatANDROID.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalFormatANDROID.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExternalFormatANDROID")] - public unsafe partial struct ExternalFormatANDROID : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct ExternalFormatANDROID : IExtendsChain, IExtendsChain, IExtendsChain { public ExternalFormatANDROID ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalImageFormatProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalImageFormatProperties.gen.cs index 894f5c57cc..6c10791396 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalImageFormatProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalImageFormatProperties.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExternalImageFormatProperties")] [NativeName("Aliases", "VkExternalImageFormatPropertiesKHR")] - public unsafe partial struct ExternalImageFormatProperties : IExtendsChain, IExtendsChain + public unsafe partial struct ExternalImageFormatProperties : IExtendsChain, IExtendsChain { public ExternalImageFormatProperties ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalImageFormatPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalImageFormatPropertiesKHR.gen.cs index e19cfbc8e8..578443c455 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalImageFormatPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalImageFormatPropertiesKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExternalImageFormatPropertiesKHR")] [NativeName("AliasOf", "VkExternalImageFormatProperties")] - public unsafe partial struct ExternalImageFormatPropertiesKhr : IExtendsChain, IExtendsChain + public unsafe partial struct ExternalImageFormatPropertiesKHR : IExtendsChain, IExtendsChain { - public ExternalImageFormatPropertiesKhr + public ExternalImageFormatPropertiesKHR ( StructureType? sType = StructureType.ExternalImageFormatProperties, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryBufferCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryBufferCreateInfoKHR.gen.cs index 7a29f079ea..ee4d22610b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryBufferCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryBufferCreateInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExternalMemoryBufferCreateInfoKHR")] [NativeName("AliasOf", "VkExternalMemoryBufferCreateInfo")] - public unsafe partial struct ExternalMemoryBufferCreateInfoKhr : IExtendsChain + public unsafe partial struct ExternalMemoryBufferCreateInfoKHR : IExtendsChain { - public ExternalMemoryBufferCreateInfoKhr + public ExternalMemoryBufferCreateInfoKHR ( StructureType? sType = StructureType.ExternalMemoryBufferCreateInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryImageCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryImageCreateInfoKHR.gen.cs index 148434eddd..f765d45758 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryImageCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryImageCreateInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExternalMemoryImageCreateInfoKHR")] [NativeName("AliasOf", "VkExternalMemoryImageCreateInfo")] - public unsafe partial struct ExternalMemoryImageCreateInfoKhr : IExtendsChain + public unsafe partial struct ExternalMemoryImageCreateInfoKHR : IExtendsChain { - public ExternalMemoryImageCreateInfoKhr + public ExternalMemoryImageCreateInfoKHR ( StructureType? sType = StructureType.ExternalMemoryImageCreateInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryPropertiesKHR.gen.cs index 70726a6941..1a2d0f7e20 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalMemoryPropertiesKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExternalMemoryPropertiesKHR")] [NativeName("AliasOf", "VkExternalMemoryProperties")] - public unsafe partial struct ExternalMemoryPropertiesKhr + public unsafe partial struct ExternalMemoryPropertiesKHR { - public ExternalMemoryPropertiesKhr + public ExternalMemoryPropertiesKHR ( ExternalMemoryFeatureFlags? externalMemoryFeatures = null, ExternalMemoryHandleTypeFlags? exportFromImportedHandleTypes = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalSemaphorePropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalSemaphorePropertiesKHR.gen.cs index 9c19cb3ac8..cd085a57de 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalSemaphorePropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ExternalSemaphorePropertiesKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkExternalSemaphorePropertiesKHR")] [NativeName("AliasOf", "VkExternalSemaphoreProperties")] - public unsafe partial struct ExternalSemaphorePropertiesKhr : IChainable + public unsafe partial struct ExternalSemaphorePropertiesKHR : IChainable { - public ExternalSemaphorePropertiesKhr + public ExternalSemaphorePropertiesKHR ( StructureType? sType = StructureType.ExternalSemaphoreProperties, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/FilterCubicImageViewImageFormatPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/FilterCubicImageViewImageFormatPropertiesEXT.gen.cs index 6a7f2fa671..64d4e20795 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/FilterCubicImageViewImageFormatPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/FilterCubicImageViewImageFormatPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkFilterCubicImageViewImageFormatPropertiesEXT")] - public unsafe partial struct FilterCubicImageViewImageFormatPropertiesEXT : IExtendsChain, IExtendsChain + public unsafe partial struct FilterCubicImageViewImageFormatPropertiesEXT : IExtendsChain, IExtendsChain { public FilterCubicImageViewImageFormatPropertiesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/FormatProperties2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/FormatProperties2KHR.gen.cs index 2c51ec8d79..43f83a79af 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/FormatProperties2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/FormatProperties2KHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkFormatProperties2KHR")] [NativeName("AliasOf", "VkFormatProperties2")] - public unsafe partial struct FormatProperties2Khr : IChainStart + public unsafe partial struct FormatProperties2KHR : IChainStart { - public FormatProperties2Khr + public FormatProperties2KHR ( StructureType? sType = StructureType.FormatProperties2, void* pNext = null, @@ -77,10 +77,10 @@ unsafe BaseInStructure* IChainable.PNext ///
/// The newly created chain root /// A reference to the newly created chain. - public static unsafe ref FormatProperties2Khr Chain( - out FormatProperties2Khr capture) + public static unsafe ref FormatProperties2KHR Chain( + out FormatProperties2KHR capture) { - capture = new FormatProperties2Khr(StructureType.FormatProperties2); + capture = new FormatProperties2KHR(StructureType.FormatProperties2); return ref capture; } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/FormatProperties3KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/FormatProperties3KHR.gen.cs index 8847787ca9..6aac48790a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/FormatProperties3KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/FormatProperties3KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkFormatProperties3KHR")] - public unsafe partial struct FormatProperties3KHR : IExtendsChain, IExtendsChain + public unsafe partial struct FormatProperties3KHR : IExtendsChain, IExtendsChain { public FormatProperties3KHR ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/FragmentShadingRateAttachmentInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/FragmentShadingRateAttachmentInfoKHR.gen.cs index 38281026f1..4a84f75d6f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/FragmentShadingRateAttachmentInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/FragmentShadingRateAttachmentInfoKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkFragmentShadingRateAttachmentInfoKHR")] - public unsafe partial struct FragmentShadingRateAttachmentInfoKHR : IExtendsChain, IExtendsChain + public unsafe partial struct FragmentShadingRateAttachmentInfoKHR : IExtendsChain, IExtendsChain { public FragmentShadingRateAttachmentInfoKHR ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferAttachmentImageInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferAttachmentImageInfoKHR.gen.cs index c4145d072f..76ddaca27a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferAttachmentImageInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferAttachmentImageInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkFramebufferAttachmentImageInfoKHR")] [NativeName("AliasOf", "VkFramebufferAttachmentImageInfo")] - public unsafe partial struct FramebufferAttachmentImageInfoKhr : IChainable + public unsafe partial struct FramebufferAttachmentImageInfoKHR : IChainable { - public FramebufferAttachmentImageInfoKhr + public FramebufferAttachmentImageInfoKHR ( StructureType? sType = StructureType.FramebufferAttachmentImageInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferAttachmentsCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferAttachmentsCreateInfoKHR.gen.cs index 275f3f0c00..f34695bfc3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferAttachmentsCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/FramebufferAttachmentsCreateInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkFramebufferAttachmentsCreateInfoKHR")] [NativeName("AliasOf", "VkFramebufferAttachmentsCreateInfo")] - public unsafe partial struct FramebufferAttachmentsCreateInfoKhr : IExtendsChain + public unsafe partial struct FramebufferAttachmentsCreateInfoKHR : IExtendsChain { - public FramebufferAttachmentsCreateInfoKhr + public FramebufferAttachmentsCreateInfoKHR ( StructureType? sType = StructureType.FramebufferAttachmentsCreateInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatListCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatListCreateInfo.gen.cs index 92637e188a..304c1e1ae4 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatListCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatListCreateInfo.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageFormatListCreateInfo")] [NativeName("Aliases", "VkImageFormatListCreateInfoKHR")] - public unsafe partial struct ImageFormatListCreateInfo : IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct ImageFormatListCreateInfo : IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain { public ImageFormatListCreateInfo ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatListCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatListCreateInfoKHR.gen.cs index 7687990573..e86e57070c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatListCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatListCreateInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageFormatListCreateInfoKHR")] [NativeName("AliasOf", "VkImageFormatListCreateInfo")] - public unsafe partial struct ImageFormatListCreateInfoKhr : IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct ImageFormatListCreateInfoKHR : IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain { - public ImageFormatListCreateInfoKhr + public ImageFormatListCreateInfoKHR ( StructureType? sType = StructureType.ImageFormatListCreateInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatProperties2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatProperties2KHR.gen.cs index 8da20351e4..83b3fe71c3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatProperties2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageFormatProperties2KHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageFormatProperties2KHR")] [NativeName("AliasOf", "VkImageFormatProperties2")] - public unsafe partial struct ImageFormatProperties2Khr : IChainStart + public unsafe partial struct ImageFormatProperties2KHR : IChainStart { - public ImageFormatProperties2Khr + public ImageFormatProperties2KHR ( StructureType? sType = StructureType.ImageFormatProperties2, void* pNext = null, @@ -77,10 +77,10 @@ unsafe BaseInStructure* IChainable.PNext ///
/// The newly created chain root /// A reference to the newly created chain. - public static unsafe ref ImageFormatProperties2Khr Chain( - out ImageFormatProperties2Khr capture) + public static unsafe ref ImageFormatProperties2KHR Chain( + out ImageFormatProperties2KHR capture) { - capture = new ImageFormatProperties2Khr(StructureType.ImageFormatProperties2); + capture = new ImageFormatProperties2KHR(StructureType.ImageFormatProperties2); return ref capture; } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageMemoryRequirementsInfo2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageMemoryRequirementsInfo2KHR.gen.cs index 8702d7f70c..73e696010c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageMemoryRequirementsInfo2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageMemoryRequirementsInfo2KHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageMemoryRequirementsInfo2KHR")] [NativeName("AliasOf", "VkImageMemoryRequirementsInfo2")] - public unsafe partial struct ImageMemoryRequirementsInfo2Khr : IChainStart + public unsafe partial struct ImageMemoryRequirementsInfo2KHR : IChainStart { - public ImageMemoryRequirementsInfo2Khr + public ImageMemoryRequirementsInfo2KHR ( StructureType? sType = StructureType.ImageMemoryRequirementsInfo2, void* pNext = null, @@ -77,10 +77,10 @@ unsafe BaseInStructure* IChainable.PNext ///
/// The newly created chain root /// A reference to the newly created chain. - public static unsafe ref ImageMemoryRequirementsInfo2Khr Chain( - out ImageMemoryRequirementsInfo2Khr capture) + public static unsafe ref ImageMemoryRequirementsInfo2KHR Chain( + out ImageMemoryRequirementsInfo2KHR capture) { - capture = new ImageMemoryRequirementsInfo2Khr(StructureType.ImageMemoryRequirementsInfo2); + capture = new ImageMemoryRequirementsInfo2KHR(StructureType.ImageMemoryRequirementsInfo2); return ref capture; } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImagePlaneMemoryRequirementsInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImagePlaneMemoryRequirementsInfo.gen.cs index 8a310c4e26..87711d1e5c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImagePlaneMemoryRequirementsInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImagePlaneMemoryRequirementsInfo.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImagePlaneMemoryRequirementsInfo")] [NativeName("Aliases", "VkImagePlaneMemoryRequirementsInfoKHR")] - public unsafe partial struct ImagePlaneMemoryRequirementsInfo : IExtendsChain, IExtendsChain + public unsafe partial struct ImagePlaneMemoryRequirementsInfo : IExtendsChain, IExtendsChain { public ImagePlaneMemoryRequirementsInfo ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImagePlaneMemoryRequirementsInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImagePlaneMemoryRequirementsInfoKHR.gen.cs index d10e028237..e7a1fa60ef 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImagePlaneMemoryRequirementsInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImagePlaneMemoryRequirementsInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImagePlaneMemoryRequirementsInfoKHR")] [NativeName("AliasOf", "VkImagePlaneMemoryRequirementsInfo")] - public unsafe partial struct ImagePlaneMemoryRequirementsInfoKhr : IExtendsChain, IExtendsChain + public unsafe partial struct ImagePlaneMemoryRequirementsInfoKHR : IExtendsChain, IExtendsChain { - public ImagePlaneMemoryRequirementsInfoKhr + public ImagePlaneMemoryRequirementsInfoKHR ( StructureType? sType = StructureType.ImagePlaneMemoryRequirementsInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageSparseMemoryRequirementsInfo2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageSparseMemoryRequirementsInfo2KHR.gen.cs index c8dffc9c38..7084ce1bc7 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageSparseMemoryRequirementsInfo2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageSparseMemoryRequirementsInfo2KHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageSparseMemoryRequirementsInfo2KHR")] [NativeName("AliasOf", "VkImageSparseMemoryRequirementsInfo2")] - public unsafe partial struct ImageSparseMemoryRequirementsInfo2Khr : IChainable + public unsafe partial struct ImageSparseMemoryRequirementsInfo2KHR : IChainable { - public ImageSparseMemoryRequirementsInfo2Khr + public ImageSparseMemoryRequirementsInfo2KHR ( StructureType? sType = StructureType.ImageSparseMemoryRequirementsInfo2, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageStencilUsageCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageStencilUsageCreateInfo.gen.cs index dabe4b7a13..8dd5ed7712 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageStencilUsageCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageStencilUsageCreateInfo.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageStencilUsageCreateInfo")] [NativeName("Aliases", "VkImageStencilUsageCreateInfoEXT")] - public unsafe partial struct ImageStencilUsageCreateInfo : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct ImageStencilUsageCreateInfo : IExtendsChain, IExtendsChain, IExtendsChain { public ImageStencilUsageCreateInfo ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageStencilUsageCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageStencilUsageCreateInfoEXT.gen.cs index b08429a6f9..bfb885e18e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageStencilUsageCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageStencilUsageCreateInfoEXT.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageStencilUsageCreateInfoEXT")] [NativeName("AliasOf", "VkImageStencilUsageCreateInfo")] - public unsafe partial struct ImageStencilUsageCreateInfoExt : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct ImageStencilUsageCreateInfoEXT : IExtendsChain, IExtendsChain, IExtendsChain { - public ImageStencilUsageCreateInfoExt + public ImageStencilUsageCreateInfoEXT ( StructureType? sType = StructureType.ImageStencilUsageCreateInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewUsageCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewUsageCreateInfoKHR.gen.cs index 826159a09c..afc4dfb4c5 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewUsageCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/ImageViewUsageCreateInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkImageViewUsageCreateInfoKHR")] [NativeName("AliasOf", "VkImageViewUsageCreateInfo")] - public unsafe partial struct ImageViewUsageCreateInfoKhr : IExtendsChain + public unsafe partial struct ImageViewUsageCreateInfoKHR : IExtendsChain { - public ImageViewUsageCreateInfoKhr + public ImageViewUsageCreateInfoKHR ( StructureType? sType = StructureType.ImageViewUsageCreateInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/InputAttachmentAspectReferenceKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/InputAttachmentAspectReferenceKHR.gen.cs index afed50ac24..3ab8ecdcc8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/InputAttachmentAspectReferenceKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/InputAttachmentAspectReferenceKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkInputAttachmentAspectReferenceKHR")] [NativeName("AliasOf", "VkInputAttachmentAspectReference")] - public unsafe partial struct InputAttachmentAspectReferenceKhr + public unsafe partial struct InputAttachmentAspectReferenceKHR { - public InputAttachmentAspectReferenceKhr + public InputAttachmentAspectReferenceKHR ( uint? subpass = null, uint? inputAttachmentIndex = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryAllocateFlagsInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryAllocateFlagsInfoKHR.gen.cs index 0c7ff7f8a5..d4fa2cadcd 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryAllocateFlagsInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryAllocateFlagsInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryAllocateFlagsInfoKHR")] [NativeName("AliasOf", "VkMemoryAllocateFlagsInfo")] - public unsafe partial struct MemoryAllocateFlagsInfoKhr : IExtendsChain + public unsafe partial struct MemoryAllocateFlagsInfoKHR : IExtendsChain { - public MemoryAllocateFlagsInfoKhr + public MemoryAllocateFlagsInfoKHR ( StructureType? sType = StructureType.MemoryAllocateFlagsInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryBarrier2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryBarrier2KHR.gen.cs index ae22032dcf..a67688b227 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryBarrier2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryBarrier2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryBarrier2KHR")] - public unsafe partial struct MemoryBarrier2KHR : IExtendsChain, IExtendsChain + public unsafe partial struct MemoryBarrier2KHR : IExtendsChain, IExtendsChain { public MemoryBarrier2KHR ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedAllocateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedAllocateInfoKHR.gen.cs index 2def34b0d1..d3f6e9d4d6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedAllocateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedAllocateInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryDedicatedAllocateInfoKHR")] [NativeName("AliasOf", "VkMemoryDedicatedAllocateInfo")] - public unsafe partial struct MemoryDedicatedAllocateInfoKhr : IExtendsChain + public unsafe partial struct MemoryDedicatedAllocateInfoKHR : IExtendsChain { - public MemoryDedicatedAllocateInfoKhr + public MemoryDedicatedAllocateInfoKHR ( StructureType? sType = StructureType.MemoryDedicatedAllocateInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedRequirements.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedRequirements.gen.cs index 8940b76003..09c7637d37 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedRequirements.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedRequirements.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryDedicatedRequirements")] [NativeName("Aliases", "VkMemoryDedicatedRequirementsKHR")] - public unsafe partial struct MemoryDedicatedRequirements : IExtendsChain, IExtendsChain + public unsafe partial struct MemoryDedicatedRequirements : IExtendsChain, IExtendsChain { public MemoryDedicatedRequirements ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedRequirementsKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedRequirementsKHR.gen.cs index 1ff3cadd70..d24a40ffef 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedRequirementsKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryDedicatedRequirementsKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryDedicatedRequirementsKHR")] [NativeName("AliasOf", "VkMemoryDedicatedRequirements")] - public unsafe partial struct MemoryDedicatedRequirementsKhr : IExtendsChain, IExtendsChain + public unsafe partial struct MemoryDedicatedRequirementsKHR : IExtendsChain, IExtendsChain { - public MemoryDedicatedRequirementsKhr + public MemoryDedicatedRequirementsKHR ( StructureType? sType = StructureType.MemoryDedicatedRequirements, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryOpaqueCaptureAddressAllocateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryOpaqueCaptureAddressAllocateInfoKHR.gen.cs index 73259508c1..accdc8f182 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryOpaqueCaptureAddressAllocateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryOpaqueCaptureAddressAllocateInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryOpaqueCaptureAddressAllocateInfoKHR")] [NativeName("AliasOf", "VkMemoryOpaqueCaptureAddressAllocateInfo")] - public unsafe partial struct MemoryOpaqueCaptureAddressAllocateInfoKhr : IExtendsChain + public unsafe partial struct MemoryOpaqueCaptureAddressAllocateInfoKHR : IExtendsChain { - public MemoryOpaqueCaptureAddressAllocateInfoKhr + public MemoryOpaqueCaptureAddressAllocateInfoKHR ( StructureType? sType = StructureType.MemoryOpaqueCaptureAddressAllocateInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryRequirements2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryRequirements2KHR.gen.cs index dad8d022e3..6ecf24f9a8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryRequirements2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/MemoryRequirements2KHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkMemoryRequirements2KHR")] [NativeName("AliasOf", "VkMemoryRequirements2")] - public unsafe partial struct MemoryRequirements2Khr : IChainStart + public unsafe partial struct MemoryRequirements2KHR : IChainStart { - public MemoryRequirements2Khr + public MemoryRequirements2KHR ( StructureType? sType = StructureType.MemoryRequirements2, void* pNext = null, @@ -77,10 +77,10 @@ unsafe BaseInStructure* IChainable.PNext ///
/// The newly created chain root /// A reference to the newly created chain. - public static unsafe ref MemoryRequirements2Khr Chain( - out MemoryRequirements2Khr capture) + public static unsafe ref MemoryRequirements2KHR Chain( + out MemoryRequirements2KHR capture) { - capture = new MemoryRequirements2Khr(StructureType.MemoryRequirements2); + capture = new MemoryRequirements2KHR(StructureType.MemoryRequirements2); return ref capture; } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice16BitStorageFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice16BitStorageFeatures.gen.cs index 4bdc41826f..cc0e28c051 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice16BitStorageFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice16BitStorageFeatures.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevice16BitStorageFeatures")] [NativeName("Aliases", "VkPhysicalDevice16BitStorageFeaturesKHR")] - public unsafe partial struct PhysicalDevice16BitStorageFeatures : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDevice16BitStorageFeatures : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDevice16BitStorageFeatures ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice16BitStorageFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice16BitStorageFeaturesKHR.gen.cs index d2de6062d5..733aa0dc46 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice16BitStorageFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice16BitStorageFeaturesKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevice16BitStorageFeaturesKHR")] [NativeName("AliasOf", "VkPhysicalDevice16BitStorageFeatures")] - public unsafe partial struct PhysicalDevice16BitStorageFeaturesKhr : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDevice16BitStorageFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { - public PhysicalDevice16BitStorageFeaturesKhr + public PhysicalDevice16BitStorageFeaturesKHR ( StructureType? sType = StructureType.PhysicalDevice16BitStorageFeatures, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice4444FormatsFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice4444FormatsFeaturesEXT.gen.cs index 843a42ba6a..fb8b023a62 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice4444FormatsFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice4444FormatsFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevice4444FormatsFeaturesEXT")] - public unsafe partial struct PhysicalDevice4444FormatsFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDevice4444FormatsFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDevice4444FormatsFeaturesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice8BitStorageFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice8BitStorageFeatures.gen.cs index d519eef2f2..05c462a123 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice8BitStorageFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice8BitStorageFeatures.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevice8BitStorageFeatures")] [NativeName("Aliases", "VkPhysicalDevice8BitStorageFeaturesKHR")] - public unsafe partial struct PhysicalDevice8BitStorageFeatures : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDevice8BitStorageFeatures : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDevice8BitStorageFeatures ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice8BitStorageFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice8BitStorageFeaturesKHR.gen.cs index e59af27358..33f58b99fa 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice8BitStorageFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevice8BitStorageFeaturesKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevice8BitStorageFeaturesKHR")] [NativeName("AliasOf", "VkPhysicalDevice8BitStorageFeatures")] - public unsafe partial struct PhysicalDevice8BitStorageFeaturesKhr : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDevice8BitStorageFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { - public PhysicalDevice8BitStorageFeaturesKhr + public PhysicalDevice8BitStorageFeaturesKHR ( StructureType? sType = StructureType.PhysicalDevice8BitStorageFeatures, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceASTCDecodeFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceASTCDecodeFeaturesEXT.gen.cs index dd59ab1c34..6e13314303 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceASTCDecodeFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceASTCDecodeFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceASTCDecodeFeaturesEXT")] - public unsafe partial struct PhysicalDeviceASTCDecodeFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceASTCDecodeFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceASTCDecodeFeaturesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceAccelerationStructureFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceAccelerationStructureFeaturesKHR.gen.cs index fbaf2f3c93..b09f235981 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceAccelerationStructureFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceAccelerationStructureFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceAccelerationStructureFeaturesKHR")] - public unsafe partial struct PhysicalDeviceAccelerationStructureFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceAccelerationStructureFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceAccelerationStructureFeaturesKHR ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceAccelerationStructurePropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceAccelerationStructurePropertiesKHR.gen.cs index 82bd701cb6..9bc345dde1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceAccelerationStructurePropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceAccelerationStructurePropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceAccelerationStructurePropertiesKHR")] - public unsafe partial struct PhysicalDeviceAccelerationStructurePropertiesKHR : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceAccelerationStructurePropertiesKHR : IExtendsChain, IExtendsChain { public PhysicalDeviceAccelerationStructurePropertiesKHR ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBlendOperationAdvancedFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBlendOperationAdvancedFeaturesEXT.gen.cs index 713b6c5b12..700ca3a4e2 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBlendOperationAdvancedFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBlendOperationAdvancedFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceBlendOperationAdvancedFeaturesEXT")] - public unsafe partial struct PhysicalDeviceBlendOperationAdvancedFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceBlendOperationAdvancedFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceBlendOperationAdvancedFeaturesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBlendOperationAdvancedPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBlendOperationAdvancedPropertiesEXT.gen.cs index abb5409223..ac354ffeae 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBlendOperationAdvancedPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBlendOperationAdvancedPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceBlendOperationAdvancedPropertiesEXT")] - public unsafe partial struct PhysicalDeviceBlendOperationAdvancedPropertiesEXT : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceBlendOperationAdvancedPropertiesEXT : IExtendsChain, IExtendsChain { public PhysicalDeviceBlendOperationAdvancedPropertiesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBorderColorSwizzleFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBorderColorSwizzleFeaturesEXT.gen.cs index 8b9968f2ee..e741ee0097 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBorderColorSwizzleFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBorderColorSwizzleFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceBorderColorSwizzleFeaturesEXT")] - public unsafe partial struct PhysicalDeviceBorderColorSwizzleFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceBorderColorSwizzleFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceBorderColorSwizzleFeaturesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferAddressFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferAddressFeaturesEXT.gen.cs index 6ea45ca099..72d78cfa0c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferAddressFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferAddressFeaturesEXT.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceBufferAddressFeaturesEXT")] [NativeName("AliasOf", "VkPhysicalDeviceBufferDeviceAddressFeaturesEXT")] - public unsafe partial struct PhysicalDeviceBufferAddressFeaturesExt : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceBufferAddressFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { - public PhysicalDeviceBufferAddressFeaturesExt + public PhysicalDeviceBufferAddressFeaturesEXT ( StructureType? sType = StructureType.PhysicalDeviceBufferDeviceAddressFeaturesExt, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferDeviceAddressFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferDeviceAddressFeatures.gen.cs index ae83213e43..e6a150ad1f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferDeviceAddressFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferDeviceAddressFeatures.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceBufferDeviceAddressFeatures")] [NativeName("Aliases", "VkPhysicalDeviceBufferDeviceAddressFeaturesKHR")] - public unsafe partial struct PhysicalDeviceBufferDeviceAddressFeatures : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceBufferDeviceAddressFeatures : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceBufferDeviceAddressFeatures ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferDeviceAddressFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferDeviceAddressFeaturesEXT.gen.cs index f4da6ca8a2..8a24e664d6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferDeviceAddressFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferDeviceAddressFeaturesEXT.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceBufferDeviceAddressFeaturesEXT")] [NativeName("Aliases", "VkPhysicalDeviceBufferAddressFeaturesEXT")] - public unsafe partial struct PhysicalDeviceBufferDeviceAddressFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceBufferDeviceAddressFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceBufferDeviceAddressFeaturesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferDeviceAddressFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferDeviceAddressFeaturesKHR.gen.cs index 237b7e6245..24e19f8fe4 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferDeviceAddressFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceBufferDeviceAddressFeaturesKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceBufferDeviceAddressFeaturesKHR")] [NativeName("AliasOf", "VkPhysicalDeviceBufferDeviceAddressFeatures")] - public unsafe partial struct PhysicalDeviceBufferDeviceAddressFeaturesKhr : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceBufferDeviceAddressFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { - public PhysicalDeviceBufferDeviceAddressFeaturesKhr + public PhysicalDeviceBufferDeviceAddressFeaturesKHR ( StructureType? sType = StructureType.PhysicalDeviceBufferDeviceAddressFeatures, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCoherentMemoryFeaturesAMD.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCoherentMemoryFeaturesAMD.gen.cs index 2a6bd1e4a9..2afac53aa9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCoherentMemoryFeaturesAMD.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCoherentMemoryFeaturesAMD.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceCoherentMemoryFeaturesAMD")] - public unsafe partial struct PhysicalDeviceCoherentMemoryFeaturesAMD : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceCoherentMemoryFeaturesAMD : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceCoherentMemoryFeaturesAMD ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceColorWriteEnableFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceColorWriteEnableFeaturesEXT.gen.cs index 08e1151da0..7bf00dc08d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceColorWriteEnableFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceColorWriteEnableFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceColorWriteEnableFeaturesEXT")] - public unsafe partial struct PhysicalDeviceColorWriteEnableFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceColorWriteEnableFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceColorWriteEnableFeaturesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceComputeShaderDerivativesFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceComputeShaderDerivativesFeaturesNV.gen.cs index a957fdb9a1..a7a5897f24 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceComputeShaderDerivativesFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceComputeShaderDerivativesFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceComputeShaderDerivativesFeaturesNV")] - public unsafe partial struct PhysicalDeviceComputeShaderDerivativesFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceComputeShaderDerivativesFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceComputeShaderDerivativesFeaturesNV ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceConditionalRenderingFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceConditionalRenderingFeaturesEXT.gen.cs index 6e1237fd44..4d4dbf0932 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceConditionalRenderingFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceConditionalRenderingFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceConditionalRenderingFeaturesEXT")] - public unsafe partial struct PhysicalDeviceConditionalRenderingFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceConditionalRenderingFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceConditionalRenderingFeaturesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceConservativeRasterizationPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceConservativeRasterizationPropertiesEXT.gen.cs index f84359c0a7..cd86756a5c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceConservativeRasterizationPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceConservativeRasterizationPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceConservativeRasterizationPropertiesEXT")] - public unsafe partial struct PhysicalDeviceConservativeRasterizationPropertiesEXT : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceConservativeRasterizationPropertiesEXT : IExtendsChain, IExtendsChain { public PhysicalDeviceConservativeRasterizationPropertiesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCooperativeMatrixFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCooperativeMatrixFeaturesNV.gen.cs index 074fb15797..e4c2421b99 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCooperativeMatrixFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCooperativeMatrixFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceCooperativeMatrixFeaturesNV")] - public unsafe partial struct PhysicalDeviceCooperativeMatrixFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceCooperativeMatrixFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceCooperativeMatrixFeaturesNV ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCooperativeMatrixPropertiesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCooperativeMatrixPropertiesNV.gen.cs index 58e2e6d5b9..c12e48f67e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCooperativeMatrixPropertiesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCooperativeMatrixPropertiesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceCooperativeMatrixPropertiesNV")] - public unsafe partial struct PhysicalDeviceCooperativeMatrixPropertiesNV : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceCooperativeMatrixPropertiesNV : IExtendsChain, IExtendsChain { public PhysicalDeviceCooperativeMatrixPropertiesNV ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCornerSampledImageFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCornerSampledImageFeaturesNV.gen.cs index 6a77b7225d..5f7e7c39d7 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCornerSampledImageFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCornerSampledImageFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceCornerSampledImageFeaturesNV")] - public unsafe partial struct PhysicalDeviceCornerSampledImageFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceCornerSampledImageFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceCornerSampledImageFeaturesNV ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCoverageReductionModeFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCoverageReductionModeFeaturesNV.gen.cs index 972ca55075..cf87868abb 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCoverageReductionModeFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCoverageReductionModeFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceCoverageReductionModeFeaturesNV")] - public unsafe partial struct PhysicalDeviceCoverageReductionModeFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceCoverageReductionModeFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceCoverageReductionModeFeaturesNV ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCustomBorderColorFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCustomBorderColorFeaturesEXT.gen.cs index 18157f33b9..3c491ad86e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCustomBorderColorFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCustomBorderColorFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceCustomBorderColorFeaturesEXT")] - public unsafe partial struct PhysicalDeviceCustomBorderColorFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceCustomBorderColorFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceCustomBorderColorFeaturesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCustomBorderColorPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCustomBorderColorPropertiesEXT.gen.cs index 3cb006b28c..88933221d8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCustomBorderColorPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceCustomBorderColorPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceCustomBorderColorPropertiesEXT")] - public unsafe partial struct PhysicalDeviceCustomBorderColorPropertiesEXT : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceCustomBorderColorPropertiesEXT : IExtendsChain, IExtendsChain { public PhysicalDeviceCustomBorderColorPropertiesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV.gen.cs index ce62369355..6492df196b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV")] - public unsafe partial struct PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDepthClipEnableFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDepthClipEnableFeaturesEXT.gen.cs index 576fb75a5f..a0d7f78634 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDepthClipEnableFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDepthClipEnableFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDepthClipEnableFeaturesEXT")] - public unsafe partial struct PhysicalDeviceDepthClipEnableFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceDepthClipEnableFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceDepthClipEnableFeaturesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDepthStencilResolveProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDepthStencilResolveProperties.gen.cs index b565f7b44b..70173d2919 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDepthStencilResolveProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDepthStencilResolveProperties.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDepthStencilResolveProperties")] [NativeName("Aliases", "VkPhysicalDeviceDepthStencilResolvePropertiesKHR")] - public unsafe partial struct PhysicalDeviceDepthStencilResolveProperties : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceDepthStencilResolveProperties : IExtendsChain, IExtendsChain { public PhysicalDeviceDepthStencilResolveProperties ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDepthStencilResolvePropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDepthStencilResolvePropertiesKHR.gen.cs index aefa2b5534..503f81d7ef 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDepthStencilResolvePropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDepthStencilResolvePropertiesKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDepthStencilResolvePropertiesKHR")] [NativeName("AliasOf", "VkPhysicalDeviceDepthStencilResolveProperties")] - public unsafe partial struct PhysicalDeviceDepthStencilResolvePropertiesKhr : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceDepthStencilResolvePropertiesKHR : IExtendsChain, IExtendsChain { - public PhysicalDeviceDepthStencilResolvePropertiesKhr + public PhysicalDeviceDepthStencilResolvePropertiesKHR ( StructureType? sType = StructureType.PhysicalDeviceDepthStencilResolveProperties, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingFeatures.gen.cs index 14a5b40e13..8d981fa538 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingFeatures.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDescriptorIndexingFeatures")] [NativeName("Aliases", "VkPhysicalDeviceDescriptorIndexingFeaturesEXT")] - public unsafe partial struct PhysicalDeviceDescriptorIndexingFeatures : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceDescriptorIndexingFeatures : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceDescriptorIndexingFeatures ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingFeaturesEXT.gen.cs index 77daccaecc..ea4ab5b098 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingFeaturesEXT.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDescriptorIndexingFeaturesEXT")] [NativeName("AliasOf", "VkPhysicalDeviceDescriptorIndexingFeatures")] - public unsafe partial struct PhysicalDeviceDescriptorIndexingFeaturesExt : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceDescriptorIndexingFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { - public PhysicalDeviceDescriptorIndexingFeaturesExt + public PhysicalDeviceDescriptorIndexingFeaturesEXT ( StructureType? sType = StructureType.PhysicalDeviceDescriptorIndexingFeatures, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingProperties.gen.cs index 195c9d368a..52396b5c05 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingProperties.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDescriptorIndexingProperties")] [NativeName("Aliases", "VkPhysicalDeviceDescriptorIndexingPropertiesEXT")] - public unsafe partial struct PhysicalDeviceDescriptorIndexingProperties : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceDescriptorIndexingProperties : IExtendsChain, IExtendsChain { public PhysicalDeviceDescriptorIndexingProperties ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingPropertiesEXT.gen.cs index 36dadabc11..488cd53545 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDescriptorIndexingPropertiesEXT.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDescriptorIndexingPropertiesEXT")] [NativeName("AliasOf", "VkPhysicalDeviceDescriptorIndexingProperties")] - public unsafe partial struct PhysicalDeviceDescriptorIndexingPropertiesExt : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceDescriptorIndexingPropertiesEXT : IExtendsChain, IExtendsChain { - public PhysicalDeviceDescriptorIndexingPropertiesExt + public PhysicalDeviceDescriptorIndexingPropertiesEXT ( StructureType? sType = StructureType.PhysicalDeviceDescriptorIndexingProperties, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDeviceGeneratedCommandsFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDeviceGeneratedCommandsFeaturesNV.gen.cs index 9be7146554..6897510821 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDeviceGeneratedCommandsFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDeviceGeneratedCommandsFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDeviceGeneratedCommandsFeaturesNV")] - public unsafe partial struct PhysicalDeviceDeviceGeneratedCommandsFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceDeviceGeneratedCommandsFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceDeviceGeneratedCommandsFeaturesNV ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDeviceGeneratedCommandsPropertiesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDeviceGeneratedCommandsPropertiesNV.gen.cs index 1cd776f905..74653ab4ce 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDeviceGeneratedCommandsPropertiesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDeviceGeneratedCommandsPropertiesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDeviceGeneratedCommandsPropertiesNV")] - public unsafe partial struct PhysicalDeviceDeviceGeneratedCommandsPropertiesNV : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceDeviceGeneratedCommandsPropertiesNV : IExtendsChain, IExtendsChain { public PhysicalDeviceDeviceGeneratedCommandsPropertiesNV ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDeviceMemoryReportFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDeviceMemoryReportFeaturesEXT.gen.cs index 1c27835c8c..60cbf93413 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDeviceMemoryReportFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDeviceMemoryReportFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDeviceMemoryReportFeaturesEXT")] - public unsafe partial struct PhysicalDeviceDeviceMemoryReportFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceDeviceMemoryReportFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceDeviceMemoryReportFeaturesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDiagnosticsConfigFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDiagnosticsConfigFeaturesNV.gen.cs index 8280028fd1..98883f3e8d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDiagnosticsConfigFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDiagnosticsConfigFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDiagnosticsConfigFeaturesNV")] - public unsafe partial struct PhysicalDeviceDiagnosticsConfigFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceDiagnosticsConfigFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceDiagnosticsConfigFeaturesNV ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDiscardRectanglePropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDiscardRectanglePropertiesEXT.gen.cs index 3037dd278b..396df1fccb 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDiscardRectanglePropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDiscardRectanglePropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDiscardRectanglePropertiesEXT")] - public unsafe partial struct PhysicalDeviceDiscardRectanglePropertiesEXT : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceDiscardRectanglePropertiesEXT : IExtendsChain, IExtendsChain { public PhysicalDeviceDiscardRectanglePropertiesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDriverProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDriverProperties.gen.cs index 1a950da34b..5493359505 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDriverProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDriverProperties.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDriverProperties")] [NativeName("Aliases", "VkPhysicalDeviceDriverPropertiesKHR")] - public unsafe partial struct PhysicalDeviceDriverProperties : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceDriverProperties : IExtendsChain, IExtendsChain { public PhysicalDeviceDriverProperties ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDriverPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDriverPropertiesKHR.gen.cs index 09ef0af31a..e71f1163ce 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDriverPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDriverPropertiesKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDriverPropertiesKHR")] [NativeName("AliasOf", "VkPhysicalDeviceDriverProperties")] - public unsafe partial struct PhysicalDeviceDriverPropertiesKhr : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceDriverPropertiesKHR : IExtendsChain, IExtendsChain { - public PhysicalDeviceDriverPropertiesKhr + public PhysicalDeviceDriverPropertiesKHR ( StructureType? sType = StructureType.PhysicalDeviceDriverProperties, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDrmPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDrmPropertiesEXT.gen.cs index d5d960aaf0..0912a7c1b1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDrmPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDrmPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDrmPropertiesEXT")] - public unsafe partial struct PhysicalDeviceDrmPropertiesEXT : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceDrmPropertiesEXT : IExtendsChain, IExtendsChain { public PhysicalDeviceDrmPropertiesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDynamicRenderingFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDynamicRenderingFeaturesKHR.gen.cs index 0bfc0c3333..fb494fef71 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDynamicRenderingFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceDynamicRenderingFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceDynamicRenderingFeaturesKHR")] - public unsafe partial struct PhysicalDeviceDynamicRenderingFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceDynamicRenderingFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceDynamicRenderingFeaturesKHR ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExclusiveScissorFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExclusiveScissorFeaturesNV.gen.cs index 841341393c..f95929303b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExclusiveScissorFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExclusiveScissorFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceExclusiveScissorFeaturesNV")] - public unsafe partial struct PhysicalDeviceExclusiveScissorFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceExclusiveScissorFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceExclusiveScissorFeaturesNV ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExtendedDynamicState2FeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExtendedDynamicState2FeaturesEXT.gen.cs index b71e41ae7e..809ab28667 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExtendedDynamicState2FeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExtendedDynamicState2FeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceExtendedDynamicState2FeaturesEXT")] - public unsafe partial struct PhysicalDeviceExtendedDynamicState2FeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceExtendedDynamicState2FeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceExtendedDynamicState2FeaturesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExtendedDynamicStateFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExtendedDynamicStateFeaturesEXT.gen.cs index 10874293d7..17b5b061cc 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExtendedDynamicStateFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExtendedDynamicStateFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceExtendedDynamicStateFeaturesEXT")] - public unsafe partial struct PhysicalDeviceExtendedDynamicStateFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceExtendedDynamicStateFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceExtendedDynamicStateFeaturesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalBufferInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalBufferInfoKHR.gen.cs index ad39fc2055..2c9f6b3883 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalBufferInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalBufferInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceExternalBufferInfoKHR")] [NativeName("AliasOf", "VkPhysicalDeviceExternalBufferInfo")] - public unsafe partial struct PhysicalDeviceExternalBufferInfoKhr : IChainable + public unsafe partial struct PhysicalDeviceExternalBufferInfoKHR : IChainable { - public PhysicalDeviceExternalBufferInfoKhr + public PhysicalDeviceExternalBufferInfoKHR ( StructureType? sType = StructureType.PhysicalDeviceExternalBufferInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalFenceInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalFenceInfoKHR.gen.cs index f9dc43e7bf..7c85621697 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalFenceInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalFenceInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceExternalFenceInfoKHR")] [NativeName("AliasOf", "VkPhysicalDeviceExternalFenceInfo")] - public unsafe partial struct PhysicalDeviceExternalFenceInfoKhr : IChainable + public unsafe partial struct PhysicalDeviceExternalFenceInfoKHR : IChainable { - public PhysicalDeviceExternalFenceInfoKhr + public PhysicalDeviceExternalFenceInfoKHR ( StructureType? sType = StructureType.PhysicalDeviceExternalFenceInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalImageFormatInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalImageFormatInfo.gen.cs index 3cd9e018e7..7d0296d530 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalImageFormatInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalImageFormatInfo.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceExternalImageFormatInfo")] [NativeName("Aliases", "VkPhysicalDeviceExternalImageFormatInfoKHR")] - public unsafe partial struct PhysicalDeviceExternalImageFormatInfo : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceExternalImageFormatInfo : IExtendsChain, IExtendsChain { public PhysicalDeviceExternalImageFormatInfo ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalImageFormatInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalImageFormatInfoKHR.gen.cs index fb952c887a..313e0b51d7 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalImageFormatInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalImageFormatInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceExternalImageFormatInfoKHR")] [NativeName("AliasOf", "VkPhysicalDeviceExternalImageFormatInfo")] - public unsafe partial struct PhysicalDeviceExternalImageFormatInfoKhr : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceExternalImageFormatInfoKHR : IExtendsChain, IExtendsChain { - public PhysicalDeviceExternalImageFormatInfoKhr + public PhysicalDeviceExternalImageFormatInfoKHR ( StructureType? sType = StructureType.PhysicalDeviceExternalImageFormatInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalMemoryHostPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalMemoryHostPropertiesEXT.gen.cs index a8595fa9bf..54a76d8b6b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalMemoryHostPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalMemoryHostPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceExternalMemoryHostPropertiesEXT")] - public unsafe partial struct PhysicalDeviceExternalMemoryHostPropertiesEXT : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceExternalMemoryHostPropertiesEXT : IExtendsChain, IExtendsChain { public PhysicalDeviceExternalMemoryHostPropertiesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalMemoryRDMAFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalMemoryRDMAFeaturesNV.gen.cs index 8ed5ca8910..69ee84d003 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalMemoryRDMAFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalMemoryRDMAFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceExternalMemoryRDMAFeaturesNV")] - public unsafe partial struct PhysicalDeviceExternalMemoryRDMAFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceExternalMemoryRDMAFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceExternalMemoryRDMAFeaturesNV ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalSemaphoreInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalSemaphoreInfoKHR.gen.cs index 00d458b902..be4514d51e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalSemaphoreInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceExternalSemaphoreInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceExternalSemaphoreInfoKHR")] [NativeName("AliasOf", "VkPhysicalDeviceExternalSemaphoreInfo")] - public unsafe partial struct PhysicalDeviceExternalSemaphoreInfoKhr : IChainStart + public unsafe partial struct PhysicalDeviceExternalSemaphoreInfoKHR : IChainStart { - public PhysicalDeviceExternalSemaphoreInfoKhr + public PhysicalDeviceExternalSemaphoreInfoKHR ( StructureType? sType = StructureType.PhysicalDeviceExternalSemaphoreInfo, void* pNext = null, @@ -77,10 +77,10 @@ unsafe BaseInStructure* IChainable.PNext ///
/// The newly created chain root /// A reference to the newly created chain. - public static unsafe ref PhysicalDeviceExternalSemaphoreInfoKhr Chain( - out PhysicalDeviceExternalSemaphoreInfoKhr capture) + public static unsafe ref PhysicalDeviceExternalSemaphoreInfoKHR Chain( + out PhysicalDeviceExternalSemaphoreInfoKHR capture) { - capture = new PhysicalDeviceExternalSemaphoreInfoKhr(StructureType.PhysicalDeviceExternalSemaphoreInfo); + capture = new PhysicalDeviceExternalSemaphoreInfoKHR(StructureType.PhysicalDeviceExternalSemaphoreInfo); return ref capture; } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFeatures2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFeatures2KHR.gen.cs index 6453f4e592..24225ac347 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFeatures2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFeatures2KHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFeatures2KHR")] [NativeName("AliasOf", "VkPhysicalDeviceFeatures2")] - public unsafe partial struct PhysicalDeviceFeatures2Khr : IChainStart, IExtendsChain + public unsafe partial struct PhysicalDeviceFeatures2KHR : IChainStart, IExtendsChain { - public PhysicalDeviceFeatures2Khr + public PhysicalDeviceFeatures2KHR ( StructureType? sType = StructureType.PhysicalDeviceFeatures2, void* pNext = null, @@ -77,10 +77,10 @@ unsafe BaseInStructure* IChainable.PNext ///
/// The newly created chain root /// A reference to the newly created chain. - public static unsafe ref PhysicalDeviceFeatures2Khr Chain( - out PhysicalDeviceFeatures2Khr capture) + public static unsafe ref PhysicalDeviceFeatures2KHR Chain( + out PhysicalDeviceFeatures2KHR capture) { - capture = new PhysicalDeviceFeatures2Khr(StructureType.PhysicalDeviceFeatures2); + capture = new PhysicalDeviceFeatures2KHR(StructureType.PhysicalDeviceFeatures2); return ref capture; } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFloat16Int8FeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFloat16Int8FeaturesKHR.gen.cs index e57adb91e6..ec4ad9c598 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFloat16Int8FeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFloat16Int8FeaturesKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFloat16Int8FeaturesKHR")] [NativeName("AliasOf", "VkPhysicalDeviceShaderFloat16Int8Features")] - public unsafe partial struct PhysicalDeviceFloat16int8featuresKhr : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceFloat16Int8FeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { - public PhysicalDeviceFloat16int8featuresKhr + public PhysicalDeviceFloat16Int8FeaturesKHR ( StructureType? sType = StructureType.PhysicalDeviceShaderFloat16Int8Features, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFloatControlsProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFloatControlsProperties.gen.cs index 7615b7b0e1..4dac523f3d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFloatControlsProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFloatControlsProperties.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFloatControlsProperties")] [NativeName("Aliases", "VkPhysicalDeviceFloatControlsPropertiesKHR")] - public unsafe partial struct PhysicalDeviceFloatControlsProperties : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceFloatControlsProperties : IExtendsChain, IExtendsChain { public PhysicalDeviceFloatControlsProperties ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFloatControlsPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFloatControlsPropertiesKHR.gen.cs index dece5b0ba4..7fc9939933 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFloatControlsPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFloatControlsPropertiesKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFloatControlsPropertiesKHR")] [NativeName("AliasOf", "VkPhysicalDeviceFloatControlsProperties")] - public unsafe partial struct PhysicalDeviceFloatControlsPropertiesKhr : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceFloatControlsPropertiesKHR : IExtendsChain, IExtendsChain { - public PhysicalDeviceFloatControlsPropertiesKhr + public PhysicalDeviceFloatControlsPropertiesKHR ( StructureType? sType = StructureType.PhysicalDeviceFloatControlsProperties, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMap2FeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMap2FeaturesEXT.gen.cs index 024c533367..da82850c5f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMap2FeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMap2FeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFragmentDensityMap2FeaturesEXT")] - public unsafe partial struct PhysicalDeviceFragmentDensityMap2FeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceFragmentDensityMap2FeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceFragmentDensityMap2FeaturesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMap2PropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMap2PropertiesEXT.gen.cs index 4a46f13504..a6a375c0a0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMap2PropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMap2PropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFragmentDensityMap2PropertiesEXT")] - public unsafe partial struct PhysicalDeviceFragmentDensityMap2PropertiesEXT : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceFragmentDensityMap2PropertiesEXT : IExtendsChain, IExtendsChain { public PhysicalDeviceFragmentDensityMap2PropertiesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMapFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMapFeaturesEXT.gen.cs index 1e8758886e..a5a63eccf2 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMapFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMapFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFragmentDensityMapFeaturesEXT")] - public unsafe partial struct PhysicalDeviceFragmentDensityMapFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceFragmentDensityMapFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceFragmentDensityMapFeaturesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMapPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMapPropertiesEXT.gen.cs index 20ed1945be..d8b796806d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMapPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentDensityMapPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFragmentDensityMapPropertiesEXT")] - public unsafe partial struct PhysicalDeviceFragmentDensityMapPropertiesEXT : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceFragmentDensityMapPropertiesEXT : IExtendsChain, IExtendsChain { public PhysicalDeviceFragmentDensityMapPropertiesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShaderBarycentricFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShaderBarycentricFeaturesNV.gen.cs index 4076ddc5cc..34562cecc1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShaderBarycentricFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShaderBarycentricFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFragmentShaderBarycentricFeaturesNV")] - public unsafe partial struct PhysicalDeviceFragmentShaderBarycentricFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceFragmentShaderBarycentricFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceFragmentShaderBarycentricFeaturesNV ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShaderInterlockFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShaderInterlockFeaturesEXT.gen.cs index 15e32935c1..42bae2f7c2 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShaderInterlockFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShaderInterlockFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFragmentShaderInterlockFeaturesEXT")] - public unsafe partial struct PhysicalDeviceFragmentShaderInterlockFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceFragmentShaderInterlockFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceFragmentShaderInterlockFeaturesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateEnumsFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateEnumsFeaturesNV.gen.cs index 5c056a3f7a..4b8871c8a1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateEnumsFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateEnumsFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFragmentShadingRateEnumsFeaturesNV")] - public unsafe partial struct PhysicalDeviceFragmentShadingRateEnumsFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceFragmentShadingRateEnumsFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceFragmentShadingRateEnumsFeaturesNV ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateEnumsPropertiesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateEnumsPropertiesNV.gen.cs index a4a2d8b048..30888370a1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateEnumsPropertiesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateEnumsPropertiesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFragmentShadingRateEnumsPropertiesNV")] - public unsafe partial struct PhysicalDeviceFragmentShadingRateEnumsPropertiesNV : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceFragmentShadingRateEnumsPropertiesNV : IExtendsChain, IExtendsChain { public PhysicalDeviceFragmentShadingRateEnumsPropertiesNV ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateFeaturesKHR.gen.cs index 0ef8cef974..441040d1b5 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRateFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFragmentShadingRateFeaturesKHR")] - public unsafe partial struct PhysicalDeviceFragmentShadingRateFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceFragmentShadingRateFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceFragmentShadingRateFeaturesKHR ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRatePropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRatePropertiesKHR.gen.cs index a39bd97e58..b805fe0f96 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRatePropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceFragmentShadingRatePropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceFragmentShadingRatePropertiesKHR")] - public unsafe partial struct PhysicalDeviceFragmentShadingRatePropertiesKHR : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceFragmentShadingRatePropertiesKHR : IExtendsChain, IExtendsChain { public PhysicalDeviceFragmentShadingRatePropertiesKHR ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceGlobalPriorityQueryFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceGlobalPriorityQueryFeaturesEXT.gen.cs index 3b907bb005..13b6ec1aee 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceGlobalPriorityQueryFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceGlobalPriorityQueryFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceGlobalPriorityQueryFeaturesEXT")] - public unsafe partial struct PhysicalDeviceGlobalPriorityQueryFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceGlobalPriorityQueryFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceGlobalPriorityQueryFeaturesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceGroupPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceGroupPropertiesKHR.gen.cs index 25a9fa6bac..eaec7162f9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceGroupPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceGroupPropertiesKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceGroupPropertiesKHR")] [NativeName("AliasOf", "VkPhysicalDeviceGroupProperties")] - public unsafe partial struct PhysicalDeviceGroupPropertiesKhr : IChainable + public unsafe partial struct PhysicalDeviceGroupPropertiesKHR : IChainable { - public PhysicalDeviceGroupPropertiesKhr + public PhysicalDeviceGroupPropertiesKHR ( StructureType? sType = StructureType.PhysicalDeviceGroupProperties, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceHostQueryResetFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceHostQueryResetFeatures.gen.cs index 946e68137f..d423c4fb3a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceHostQueryResetFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceHostQueryResetFeatures.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceHostQueryResetFeatures")] [NativeName("Aliases", "VkPhysicalDeviceHostQueryResetFeaturesEXT")] - public unsafe partial struct PhysicalDeviceHostQueryResetFeatures : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceHostQueryResetFeatures : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceHostQueryResetFeatures ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceHostQueryResetFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceHostQueryResetFeaturesEXT.gen.cs index a4299a86d8..7d1d2292d4 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceHostQueryResetFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceHostQueryResetFeaturesEXT.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceHostQueryResetFeaturesEXT")] [NativeName("AliasOf", "VkPhysicalDeviceHostQueryResetFeatures")] - public unsafe partial struct PhysicalDeviceHostQueryResetFeaturesExt : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceHostQueryResetFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { - public PhysicalDeviceHostQueryResetFeaturesExt + public PhysicalDeviceHostQueryResetFeaturesEXT ( StructureType? sType = StructureType.PhysicalDeviceHostQueryResetFeatures, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceIDProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceIDProperties.gen.cs index 088f8e562c..7feaa32658 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceIDProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceIDProperties.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceIDProperties")] [NativeName("Aliases", "VkPhysicalDeviceIDPropertiesKHR")] - public unsafe partial struct PhysicalDeviceIDProperties : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceIDProperties : IExtendsChain, IExtendsChain { public PhysicalDeviceIDProperties ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceIDPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceIDPropertiesKHR.gen.cs index c18e87b552..fe329ec530 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceIDPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceIDPropertiesKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceIDPropertiesKHR")] [NativeName("AliasOf", "VkPhysicalDeviceIDProperties")] - public unsafe partial struct PhysicalDeviceIdpropertiesKhr : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceIDPropertiesKHR : IExtendsChain, IExtendsChain { - public PhysicalDeviceIdpropertiesKhr + public PhysicalDeviceIDPropertiesKHR ( StructureType? sType = StructureType.PhysicalDeviceIDProperties, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageDrmFormatModifierInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageDrmFormatModifierInfoEXT.gen.cs index 22387262c7..03b4c438ec 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageDrmFormatModifierInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageDrmFormatModifierInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceImageDrmFormatModifierInfoEXT")] - public unsafe partial struct PhysicalDeviceImageDrmFormatModifierInfoEXT : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceImageDrmFormatModifierInfoEXT : IExtendsChain, IExtendsChain { public PhysicalDeviceImageDrmFormatModifierInfoEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageFormatInfo2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageFormatInfo2KHR.gen.cs index cc0272dff2..57d33ff47b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageFormatInfo2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageFormatInfo2KHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceImageFormatInfo2KHR")] [NativeName("AliasOf", "VkPhysicalDeviceImageFormatInfo2")] - public unsafe partial struct PhysicalDeviceImageFormatInfo2Khr : IChainStart + public unsafe partial struct PhysicalDeviceImageFormatInfo2KHR : IChainStart { - public PhysicalDeviceImageFormatInfo2Khr + public PhysicalDeviceImageFormatInfo2KHR ( StructureType? sType = StructureType.PhysicalDeviceImageFormatInfo2, void* pNext = null, @@ -121,10 +121,10 @@ unsafe BaseInStructure* IChainable.PNext ///
/// The newly created chain root /// A reference to the newly created chain. - public static unsafe ref PhysicalDeviceImageFormatInfo2Khr Chain( - out PhysicalDeviceImageFormatInfo2Khr capture) + public static unsafe ref PhysicalDeviceImageFormatInfo2KHR Chain( + out PhysicalDeviceImageFormatInfo2KHR capture) { - capture = new PhysicalDeviceImageFormatInfo2Khr(StructureType.PhysicalDeviceImageFormatInfo2); + capture = new PhysicalDeviceImageFormatInfo2KHR(StructureType.PhysicalDeviceImageFormatInfo2); return ref capture; } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageRobustnessFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageRobustnessFeaturesEXT.gen.cs index 0053eed7c4..60eb6c80fb 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageRobustnessFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageRobustnessFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceImageRobustnessFeaturesEXT")] - public unsafe partial struct PhysicalDeviceImageRobustnessFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceImageRobustnessFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceImageRobustnessFeaturesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageViewImageFormatInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageViewImageFormatInfoEXT.gen.cs index b0c15478f9..2b6a0ce1fd 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageViewImageFormatInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImageViewImageFormatInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceImageViewImageFormatInfoEXT")] - public unsafe partial struct PhysicalDeviceImageViewImageFormatInfoEXT : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceImageViewImageFormatInfoEXT : IExtendsChain, IExtendsChain { public PhysicalDeviceImageViewImageFormatInfoEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImagelessFramebufferFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImagelessFramebufferFeatures.gen.cs index 86f40b6bc7..a3a3d9cac5 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImagelessFramebufferFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImagelessFramebufferFeatures.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceImagelessFramebufferFeatures")] [NativeName("Aliases", "VkPhysicalDeviceImagelessFramebufferFeaturesKHR")] - public unsafe partial struct PhysicalDeviceImagelessFramebufferFeatures : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceImagelessFramebufferFeatures : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceImagelessFramebufferFeatures ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImagelessFramebufferFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImagelessFramebufferFeaturesKHR.gen.cs index 343670940c..8074d45947 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImagelessFramebufferFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceImagelessFramebufferFeaturesKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceImagelessFramebufferFeaturesKHR")] [NativeName("AliasOf", "VkPhysicalDeviceImagelessFramebufferFeatures")] - public unsafe partial struct PhysicalDeviceImagelessFramebufferFeaturesKhr : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceImagelessFramebufferFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { - public PhysicalDeviceImagelessFramebufferFeaturesKhr + public PhysicalDeviceImagelessFramebufferFeaturesKHR ( StructureType? sType = StructureType.PhysicalDeviceImagelessFramebufferFeatures, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceIndexTypeUint8FeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceIndexTypeUint8FeaturesEXT.gen.cs index 28f0955029..7af1af5fe7 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceIndexTypeUint8FeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceIndexTypeUint8FeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceIndexTypeUint8FeaturesEXT")] - public unsafe partial struct PhysicalDeviceIndexTypeUint8FeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceIndexTypeUint8FeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceIndexTypeUint8FeaturesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInheritedViewportScissorFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInheritedViewportScissorFeaturesNV.gen.cs index c4ad4be476..78fe6cebd2 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInheritedViewportScissorFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInheritedViewportScissorFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceInheritedViewportScissorFeaturesNV")] - public unsafe partial struct PhysicalDeviceInheritedViewportScissorFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceInheritedViewportScissorFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceInheritedViewportScissorFeaturesNV ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInlineUniformBlockFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInlineUniformBlockFeaturesEXT.gen.cs index 3d37b48e24..517c7e0688 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInlineUniformBlockFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInlineUniformBlockFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceInlineUniformBlockFeaturesEXT")] - public unsafe partial struct PhysicalDeviceInlineUniformBlockFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceInlineUniformBlockFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceInlineUniformBlockFeaturesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInlineUniformBlockPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInlineUniformBlockPropertiesEXT.gen.cs index b9a7ba3ecd..2fac728bae 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInlineUniformBlockPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInlineUniformBlockPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceInlineUniformBlockPropertiesEXT")] - public unsafe partial struct PhysicalDeviceInlineUniformBlockPropertiesEXT : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceInlineUniformBlockPropertiesEXT : IExtendsChain, IExtendsChain { public PhysicalDeviceInlineUniformBlockPropertiesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInvocationMaskFeaturesHUAWEI.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInvocationMaskFeaturesHUAWEI.gen.cs index ac9074b480..948371139a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInvocationMaskFeaturesHUAWEI.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceInvocationMaskFeaturesHUAWEI.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceInvocationMaskFeaturesHUAWEI")] - public unsafe partial struct PhysicalDeviceInvocationMaskFeaturesHUAWEI : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceInvocationMaskFeaturesHUAWEI : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceInvocationMaskFeaturesHUAWEI ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceLineRasterizationFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceLineRasterizationFeaturesEXT.gen.cs index 9e0c8bc53c..ecb55a4b1b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceLineRasterizationFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceLineRasterizationFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceLineRasterizationFeaturesEXT")] - public unsafe partial struct PhysicalDeviceLineRasterizationFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceLineRasterizationFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceLineRasterizationFeaturesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceLineRasterizationPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceLineRasterizationPropertiesEXT.gen.cs index c106fa5447..e87128faff 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceLineRasterizationPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceLineRasterizationPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceLineRasterizationPropertiesEXT")] - public unsafe partial struct PhysicalDeviceLineRasterizationPropertiesEXT : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceLineRasterizationPropertiesEXT : IExtendsChain, IExtendsChain { public PhysicalDeviceLineRasterizationPropertiesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance3Properties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance3Properties.gen.cs index d48dd728fa..ba0aea0199 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance3Properties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance3Properties.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMaintenance3Properties")] [NativeName("Aliases", "VkPhysicalDeviceMaintenance3PropertiesKHR")] - public unsafe partial struct PhysicalDeviceMaintenance3Properties : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceMaintenance3Properties : IExtendsChain, IExtendsChain { public PhysicalDeviceMaintenance3Properties ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance3PropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance3PropertiesKHR.gen.cs index 53ab907377..5fa435054f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance3PropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance3PropertiesKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMaintenance3PropertiesKHR")] [NativeName("AliasOf", "VkPhysicalDeviceMaintenance3Properties")] - public unsafe partial struct PhysicalDeviceMaintenance3PropertiesKhr : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceMaintenance3PropertiesKHR : IExtendsChain, IExtendsChain { - public PhysicalDeviceMaintenance3PropertiesKhr + public PhysicalDeviceMaintenance3PropertiesKHR ( StructureType? sType = StructureType.PhysicalDeviceMaintenance3Properties, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance4FeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance4FeaturesKHR.gen.cs index 19252a0bba..2c3f9fa758 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance4FeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance4FeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMaintenance4FeaturesKHR")] - public unsafe partial struct PhysicalDeviceMaintenance4FeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceMaintenance4FeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceMaintenance4FeaturesKHR ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance4PropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance4PropertiesKHR.gen.cs index b210855c04..23e071479d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance4PropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMaintenance4PropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMaintenance4PropertiesKHR")] - public unsafe partial struct PhysicalDeviceMaintenance4PropertiesKHR : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceMaintenance4PropertiesKHR : IExtendsChain, IExtendsChain { public PhysicalDeviceMaintenance4PropertiesKHR ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryBudgetPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryBudgetPropertiesEXT.gen.cs index bd0b635d4d..b7c7498f19 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryBudgetPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryBudgetPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMemoryBudgetPropertiesEXT")] - public unsafe partial struct PhysicalDeviceMemoryBudgetPropertiesEXT : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceMemoryBudgetPropertiesEXT : IExtendsChain, IExtendsChain { public PhysicalDeviceMemoryBudgetPropertiesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryPriorityFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryPriorityFeaturesEXT.gen.cs index 16eb99069b..9ef48c07a3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryPriorityFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryPriorityFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMemoryPriorityFeaturesEXT")] - public unsafe partial struct PhysicalDeviceMemoryPriorityFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceMemoryPriorityFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceMemoryPriorityFeaturesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryProperties2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryProperties2KHR.gen.cs index b30bb36b5e..e5fcce0339 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryProperties2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMemoryProperties2KHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMemoryProperties2KHR")] [NativeName("AliasOf", "VkPhysicalDeviceMemoryProperties2")] - public unsafe partial struct PhysicalDeviceMemoryProperties2Khr : IChainStart + public unsafe partial struct PhysicalDeviceMemoryProperties2KHR : IChainStart { - public PhysicalDeviceMemoryProperties2Khr + public PhysicalDeviceMemoryProperties2KHR ( StructureType? sType = StructureType.PhysicalDeviceMemoryProperties2, void* pNext = null, @@ -77,10 +77,10 @@ unsafe BaseInStructure* IChainable.PNext ///
/// The newly created chain root /// A reference to the newly created chain. - public static unsafe ref PhysicalDeviceMemoryProperties2Khr Chain( - out PhysicalDeviceMemoryProperties2Khr capture) + public static unsafe ref PhysicalDeviceMemoryProperties2KHR Chain( + out PhysicalDeviceMemoryProperties2KHR capture) { - capture = new PhysicalDeviceMemoryProperties2Khr(StructureType.PhysicalDeviceMemoryProperties2); + capture = new PhysicalDeviceMemoryProperties2KHR(StructureType.PhysicalDeviceMemoryProperties2); return ref capture; } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMeshShaderFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMeshShaderFeaturesNV.gen.cs index 5d98dbe77d..be171ca4b4 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMeshShaderFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMeshShaderFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMeshShaderFeaturesNV")] - public unsafe partial struct PhysicalDeviceMeshShaderFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceMeshShaderFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceMeshShaderFeaturesNV ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMeshShaderPropertiesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMeshShaderPropertiesNV.gen.cs index 9b9e714ec5..d56385a311 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMeshShaderPropertiesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMeshShaderPropertiesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMeshShaderPropertiesNV")] - public unsafe partial struct PhysicalDeviceMeshShaderPropertiesNV : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceMeshShaderPropertiesNV : IExtendsChain, IExtendsChain { public PhysicalDeviceMeshShaderPropertiesNV ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiDrawFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiDrawFeaturesEXT.gen.cs index 29c6e0a0b4..22dcdfda0e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiDrawFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiDrawFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMultiDrawFeaturesEXT")] - public unsafe partial struct PhysicalDeviceMultiDrawFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceMultiDrawFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceMultiDrawFeaturesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiDrawPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiDrawPropertiesEXT.gen.cs index 8166d3501f..bb0ef7b633 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiDrawPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiDrawPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMultiDrawPropertiesEXT")] - public unsafe partial struct PhysicalDeviceMultiDrawPropertiesEXT : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceMultiDrawPropertiesEXT : IExtendsChain, IExtendsChain { public PhysicalDeviceMultiDrawPropertiesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewFeatures.gen.cs index 5c058db301..12fa4d29bc 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewFeatures.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMultiviewFeatures")] [NativeName("Aliases", "VkPhysicalDeviceMultiviewFeaturesKHR")] - public unsafe partial struct PhysicalDeviceMultiviewFeatures : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceMultiviewFeatures : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceMultiviewFeatures ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewFeaturesKHR.gen.cs index f5cee5e27d..477fe740aa 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewFeaturesKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMultiviewFeaturesKHR")] [NativeName("AliasOf", "VkPhysicalDeviceMultiviewFeatures")] - public unsafe partial struct PhysicalDeviceMultiviewFeaturesKhr : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceMultiviewFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { - public PhysicalDeviceMultiviewFeaturesKhr + public PhysicalDeviceMultiviewFeaturesKHR ( StructureType? sType = StructureType.PhysicalDeviceMultiviewFeatures, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX.gen.cs index 55a4a82100..135fc68d76 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMultiviewPerViewAttributesPropertiesNVX")] - public unsafe partial struct PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX : IExtendsChain, IExtendsChain { public PhysicalDeviceMultiviewPerViewAttributesPropertiesNVX ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewProperties.gen.cs index f25642e2a9..8046392813 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewProperties.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMultiviewProperties")] [NativeName("Aliases", "VkPhysicalDeviceMultiviewPropertiesKHR")] - public unsafe partial struct PhysicalDeviceMultiviewProperties : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceMultiviewProperties : IExtendsChain, IExtendsChain { public PhysicalDeviceMultiviewProperties ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewPropertiesKHR.gen.cs index b704691851..bc30aab94d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMultiviewPropertiesKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMultiviewPropertiesKHR")] [NativeName("AliasOf", "VkPhysicalDeviceMultiviewProperties")] - public unsafe partial struct PhysicalDeviceMultiviewPropertiesKhr : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceMultiviewPropertiesKHR : IExtendsChain, IExtendsChain { - public PhysicalDeviceMultiviewPropertiesKhr + public PhysicalDeviceMultiviewPropertiesKHR ( StructureType? sType = StructureType.PhysicalDeviceMultiviewProperties, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMutableDescriptorTypeFeaturesVALVE.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMutableDescriptorTypeFeaturesVALVE.gen.cs index f0a80d1b04..81b8650255 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMutableDescriptorTypeFeaturesVALVE.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceMutableDescriptorTypeFeaturesVALVE.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceMutableDescriptorTypeFeaturesVALVE")] - public unsafe partial struct PhysicalDeviceMutableDescriptorTypeFeaturesVALVE : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceMutableDescriptorTypeFeaturesVALVE : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceMutableDescriptorTypeFeaturesVALVE ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePCIBusInfoPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePCIBusInfoPropertiesEXT.gen.cs index 3732d469ae..966694fc01 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePCIBusInfoPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePCIBusInfoPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePCIBusInfoPropertiesEXT")] - public unsafe partial struct PhysicalDevicePCIBusInfoPropertiesEXT : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDevicePCIBusInfoPropertiesEXT : IExtendsChain, IExtendsChain { public PhysicalDevicePCIBusInfoPropertiesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT.gen.cs index bb967e5355..4ffc0b7c35 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePageableDeviceLocalMemoryFeaturesEXT")] - public unsafe partial struct PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDevicePageableDeviceLocalMemoryFeaturesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePerformanceQueryFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePerformanceQueryFeaturesKHR.gen.cs index b4e34e6ae6..fe5ef2ab61 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePerformanceQueryFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePerformanceQueryFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePerformanceQueryFeaturesKHR")] - public unsafe partial struct PhysicalDevicePerformanceQueryFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDevicePerformanceQueryFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDevicePerformanceQueryFeaturesKHR ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePerformanceQueryPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePerformanceQueryPropertiesKHR.gen.cs index 948889e87a..6ce4a5914f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePerformanceQueryPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePerformanceQueryPropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePerformanceQueryPropertiesKHR")] - public unsafe partial struct PhysicalDevicePerformanceQueryPropertiesKHR : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDevicePerformanceQueryPropertiesKHR : IExtendsChain, IExtendsChain { public PhysicalDevicePerformanceQueryPropertiesKHR ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePipelineCreationCacheControlFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePipelineCreationCacheControlFeaturesEXT.gen.cs index b4ccf82143..6e7ae484b9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePipelineCreationCacheControlFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePipelineCreationCacheControlFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePipelineCreationCacheControlFeaturesEXT")] - public unsafe partial struct PhysicalDevicePipelineCreationCacheControlFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDevicePipelineCreationCacheControlFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDevicePipelineCreationCacheControlFeaturesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePipelineExecutablePropertiesFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePipelineExecutablePropertiesFeaturesKHR.gen.cs index 319f6822ab..bab58cc982 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePipelineExecutablePropertiesFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePipelineExecutablePropertiesFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePipelineExecutablePropertiesFeaturesKHR")] - public unsafe partial struct PhysicalDevicePipelineExecutablePropertiesFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDevicePipelineExecutablePropertiesFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDevicePipelineExecutablePropertiesFeaturesKHR ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePointClippingProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePointClippingProperties.gen.cs index 09b6f4a155..bfc7da014f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePointClippingProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePointClippingProperties.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePointClippingProperties")] [NativeName("Aliases", "VkPhysicalDevicePointClippingPropertiesKHR")] - public unsafe partial struct PhysicalDevicePointClippingProperties : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDevicePointClippingProperties : IExtendsChain, IExtendsChain { public PhysicalDevicePointClippingProperties ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePointClippingPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePointClippingPropertiesKHR.gen.cs index 3cebde8e3e..b32ea0027b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePointClippingPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePointClippingPropertiesKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePointClippingPropertiesKHR")] [NativeName("AliasOf", "VkPhysicalDevicePointClippingProperties")] - public unsafe partial struct PhysicalDevicePointClippingPropertiesKhr : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDevicePointClippingPropertiesKHR : IExtendsChain, IExtendsChain { - public PhysicalDevicePointClippingPropertiesKhr + public PhysicalDevicePointClippingPropertiesKHR ( StructureType? sType = StructureType.PhysicalDevicePointClippingProperties, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePortabilitySubsetFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePortabilitySubsetFeaturesKHR.gen.cs index 70b2b90885..b3383755d5 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePortabilitySubsetFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePortabilitySubsetFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePortabilitySubsetFeaturesKHR")] - public unsafe partial struct PhysicalDevicePortabilitySubsetFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDevicePortabilitySubsetFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDevicePortabilitySubsetFeaturesKHR ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePortabilitySubsetPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePortabilitySubsetPropertiesKHR.gen.cs index 94f6393ac3..de918e3303 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePortabilitySubsetPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePortabilitySubsetPropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePortabilitySubsetPropertiesKHR")] - public unsafe partial struct PhysicalDevicePortabilitySubsetPropertiesKHR : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDevicePortabilitySubsetPropertiesKHR : IExtendsChain, IExtendsChain { public PhysicalDevicePortabilitySubsetPropertiesKHR ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePresentIdFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePresentIdFeaturesKHR.gen.cs index 933d1b1db6..093535fe99 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePresentIdFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePresentIdFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePresentIdFeaturesKHR")] - public unsafe partial struct PhysicalDevicePresentIdFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDevicePresentIdFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDevicePresentIdFeaturesKHR ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePresentWaitFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePresentWaitFeaturesKHR.gen.cs index 62912f83c7..c268eb35f3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePresentWaitFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePresentWaitFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePresentWaitFeaturesKHR")] - public unsafe partial struct PhysicalDevicePresentWaitFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDevicePresentWaitFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDevicePresentWaitFeaturesKHR ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT.gen.cs index d0426f9b2d..4267f455e0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePrimitiveTopologyListRestartFeaturesEXT")] - public unsafe partial struct PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDevicePrimitiveTopologyListRestartFeaturesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePrivateDataFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePrivateDataFeaturesEXT.gen.cs index 6c0e75e00e..f35b3d8209 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePrivateDataFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePrivateDataFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePrivateDataFeaturesEXT")] - public unsafe partial struct PhysicalDevicePrivateDataFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDevicePrivateDataFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDevicePrivateDataFeaturesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProperties2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProperties2KHR.gen.cs index 6525de1511..43103027bf 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProperties2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProperties2KHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceProperties2KHR")] [NativeName("AliasOf", "VkPhysicalDeviceProperties2")] - public unsafe partial struct PhysicalDeviceProperties2Khr : IChainStart + public unsafe partial struct PhysicalDeviceProperties2KHR : IChainStart { - public PhysicalDeviceProperties2Khr + public PhysicalDeviceProperties2KHR ( StructureType? sType = StructureType.PhysicalDeviceProperties2, void* pNext = null, @@ -77,10 +77,10 @@ unsafe BaseInStructure* IChainable.PNext ///
/// The newly created chain root /// A reference to the newly created chain. - public static unsafe ref PhysicalDeviceProperties2Khr Chain( - out PhysicalDeviceProperties2Khr capture) + public static unsafe ref PhysicalDeviceProperties2KHR Chain( + out PhysicalDeviceProperties2KHR capture) { - capture = new PhysicalDeviceProperties2Khr(StructureType.PhysicalDeviceProperties2); + capture = new PhysicalDeviceProperties2KHR(StructureType.PhysicalDeviceProperties2); return ref capture; } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProtectedMemoryFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProtectedMemoryFeatures.gen.cs index 8b19109e21..4aac4c7960 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProtectedMemoryFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProtectedMemoryFeatures.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceProtectedMemoryFeatures")] - public unsafe partial struct PhysicalDeviceProtectedMemoryFeatures : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceProtectedMemoryFeatures : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceProtectedMemoryFeatures ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProtectedMemoryProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProtectedMemoryProperties.gen.cs index 4a04083a30..c18cf88b01 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProtectedMemoryProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProtectedMemoryProperties.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceProtectedMemoryProperties")] - public unsafe partial struct PhysicalDeviceProtectedMemoryProperties : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceProtectedMemoryProperties : IExtendsChain, IExtendsChain { public PhysicalDeviceProtectedMemoryProperties ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProvokingVertexFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProvokingVertexFeaturesEXT.gen.cs index 7f192ff618..425105a4e1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProvokingVertexFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProvokingVertexFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceProvokingVertexFeaturesEXT")] - public unsafe partial struct PhysicalDeviceProvokingVertexFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceProvokingVertexFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceProvokingVertexFeaturesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProvokingVertexPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProvokingVertexPropertiesEXT.gen.cs index 03dc5f94d9..726f9d496d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProvokingVertexPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceProvokingVertexPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceProvokingVertexPropertiesEXT")] - public unsafe partial struct PhysicalDeviceProvokingVertexPropertiesEXT : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceProvokingVertexPropertiesEXT : IExtendsChain, IExtendsChain { public PhysicalDeviceProvokingVertexPropertiesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePushDescriptorPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePushDescriptorPropertiesKHR.gen.cs index 922273f09a..fe1bc5a4d9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePushDescriptorPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDevicePushDescriptorPropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDevicePushDescriptorPropertiesKHR")] - public unsafe partial struct PhysicalDevicePushDescriptorPropertiesKHR : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDevicePushDescriptorPropertiesKHR : IExtendsChain, IExtendsChain { public PhysicalDevicePushDescriptorPropertiesKHR ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRGBA10X6FormatsFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRGBA10X6FormatsFeaturesEXT.gen.cs index 79b26827ab..d97f5993f9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRGBA10X6FormatsFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRGBA10X6FormatsFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceRGBA10X6FormatsFeaturesEXT")] - public unsafe partial struct PhysicalDeviceRGBA10X6FormatsFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceRGBA10X6FormatsFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceRGBA10X6FormatsFeaturesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayQueryFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayQueryFeaturesKHR.gen.cs index f5c2f9bc97..f9b84401ff 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayQueryFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayQueryFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceRayQueryFeaturesKHR")] - public unsafe partial struct PhysicalDeviceRayQueryFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceRayQueryFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceRayQueryFeaturesKHR ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingMotionBlurFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingMotionBlurFeaturesNV.gen.cs index 28fa626503..2b94874fac 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingMotionBlurFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingMotionBlurFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceRayTracingMotionBlurFeaturesNV")] - public unsafe partial struct PhysicalDeviceRayTracingMotionBlurFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceRayTracingMotionBlurFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceRayTracingMotionBlurFeaturesNV ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingPipelineFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingPipelineFeaturesKHR.gen.cs index 68f68697b6..73ced5a172 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingPipelineFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingPipelineFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceRayTracingPipelineFeaturesKHR")] - public unsafe partial struct PhysicalDeviceRayTracingPipelineFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceRayTracingPipelineFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceRayTracingPipelineFeaturesKHR ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingPipelinePropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingPipelinePropertiesKHR.gen.cs index 8fb4ca69d7..610727cff0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingPipelinePropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingPipelinePropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceRayTracingPipelinePropertiesKHR")] - public unsafe partial struct PhysicalDeviceRayTracingPipelinePropertiesKHR : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceRayTracingPipelinePropertiesKHR : IExtendsChain, IExtendsChain { public PhysicalDeviceRayTracingPipelinePropertiesKHR ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingPropertiesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingPropertiesNV.gen.cs index bc14867d16..a502280f55 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingPropertiesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRayTracingPropertiesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceRayTracingPropertiesNV")] - public unsafe partial struct PhysicalDeviceRayTracingPropertiesNV : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceRayTracingPropertiesNV : IExtendsChain, IExtendsChain { public PhysicalDeviceRayTracingPropertiesNV ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRepresentativeFragmentTestFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRepresentativeFragmentTestFeaturesNV.gen.cs index e5d27481fc..10048a5a0f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRepresentativeFragmentTestFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRepresentativeFragmentTestFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceRepresentativeFragmentTestFeaturesNV")] - public unsafe partial struct PhysicalDeviceRepresentativeFragmentTestFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceRepresentativeFragmentTestFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceRepresentativeFragmentTestFeaturesNV ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRobustness2FeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRobustness2FeaturesEXT.gen.cs index f11e2a52e8..580bc836a3 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRobustness2FeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRobustness2FeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceRobustness2FeaturesEXT")] - public unsafe partial struct PhysicalDeviceRobustness2FeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceRobustness2FeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceRobustness2FeaturesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRobustness2PropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRobustness2PropertiesEXT.gen.cs index 3fa94e1bf9..faa9501cb6 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRobustness2PropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceRobustness2PropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceRobustness2PropertiesEXT")] - public unsafe partial struct PhysicalDeviceRobustness2PropertiesEXT : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceRobustness2PropertiesEXT : IExtendsChain, IExtendsChain { public PhysicalDeviceRobustness2PropertiesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSampleLocationsPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSampleLocationsPropertiesEXT.gen.cs index 72bffe1334..6b63bd65f0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSampleLocationsPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSampleLocationsPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSampleLocationsPropertiesEXT")] - public unsafe partial struct PhysicalDeviceSampleLocationsPropertiesEXT : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceSampleLocationsPropertiesEXT : IExtendsChain, IExtendsChain { public PhysicalDeviceSampleLocationsPropertiesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerFilterMinmaxProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerFilterMinmaxProperties.gen.cs index 4c971ae108..0fd71e36c9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerFilterMinmaxProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerFilterMinmaxProperties.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSamplerFilterMinmaxProperties")] [NativeName("Aliases", "VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT")] - public unsafe partial struct PhysicalDeviceSamplerFilterMinmaxProperties : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceSamplerFilterMinmaxProperties : IExtendsChain, IExtendsChain { public PhysicalDeviceSamplerFilterMinmaxProperties ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerFilterMinmaxPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerFilterMinmaxPropertiesEXT.gen.cs index da1b6a8851..43b2b35696 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerFilterMinmaxPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerFilterMinmaxPropertiesEXT.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSamplerFilterMinmaxPropertiesEXT")] [NativeName("AliasOf", "VkPhysicalDeviceSamplerFilterMinmaxProperties")] - public unsafe partial struct PhysicalDeviceSamplerFilterMinmaxPropertiesExt : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceSamplerFilterMinmaxPropertiesEXT : IExtendsChain, IExtendsChain { - public PhysicalDeviceSamplerFilterMinmaxPropertiesExt + public PhysicalDeviceSamplerFilterMinmaxPropertiesEXT ( StructureType? sType = StructureType.PhysicalDeviceSamplerFilterMinmaxProperties, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerYcbcrConversionFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerYcbcrConversionFeatures.gen.cs index a1bae1506f..bf4cd37cf9 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerYcbcrConversionFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerYcbcrConversionFeatures.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSamplerYcbcrConversionFeatures")] [NativeName("Aliases", "VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR")] - public unsafe partial struct PhysicalDeviceSamplerYcbcrConversionFeatures : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceSamplerYcbcrConversionFeatures : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceSamplerYcbcrConversionFeatures ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerYcbcrConversionFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerYcbcrConversionFeaturesKHR.gen.cs index 8b96d77a91..ea1b0f03d5 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerYcbcrConversionFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSamplerYcbcrConversionFeaturesKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSamplerYcbcrConversionFeaturesKHR")] [NativeName("AliasOf", "VkPhysicalDeviceSamplerYcbcrConversionFeatures")] - public unsafe partial struct PhysicalDeviceSamplerYcbcrConversionFeaturesKhr : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceSamplerYcbcrConversionFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { - public PhysicalDeviceSamplerYcbcrConversionFeaturesKhr + public PhysicalDeviceSamplerYcbcrConversionFeaturesKHR ( StructureType? sType = StructureType.PhysicalDeviceSamplerYcbcrConversionFeatures, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceScalarBlockLayoutFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceScalarBlockLayoutFeatures.gen.cs index b4d5b7e297..f9615a7c22 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceScalarBlockLayoutFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceScalarBlockLayoutFeatures.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceScalarBlockLayoutFeatures")] [NativeName("Aliases", "VkPhysicalDeviceScalarBlockLayoutFeaturesEXT")] - public unsafe partial struct PhysicalDeviceScalarBlockLayoutFeatures : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceScalarBlockLayoutFeatures : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceScalarBlockLayoutFeatures ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceScalarBlockLayoutFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceScalarBlockLayoutFeaturesEXT.gen.cs index 9ac69534fb..7bf8b76e34 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceScalarBlockLayoutFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceScalarBlockLayoutFeaturesEXT.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceScalarBlockLayoutFeaturesEXT")] [NativeName("AliasOf", "VkPhysicalDeviceScalarBlockLayoutFeatures")] - public unsafe partial struct PhysicalDeviceScalarBlockLayoutFeaturesExt : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceScalarBlockLayoutFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { - public PhysicalDeviceScalarBlockLayoutFeaturesExt + public PhysicalDeviceScalarBlockLayoutFeaturesEXT ( StructureType? sType = StructureType.PhysicalDeviceScalarBlockLayoutFeatures, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSeparateDepthStencilLayoutsFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSeparateDepthStencilLayoutsFeatures.gen.cs index b544f91b0c..0fda8dc2b8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSeparateDepthStencilLayoutsFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSeparateDepthStencilLayoutsFeatures.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures")] [NativeName("Aliases", "VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR")] - public unsafe partial struct PhysicalDeviceSeparateDepthStencilLayoutsFeatures : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceSeparateDepthStencilLayoutsFeatures : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceSeparateDepthStencilLayoutsFeatures ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR.gen.cs index ca22d1c79b..850b417c6c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR")] [NativeName("AliasOf", "VkPhysicalDeviceSeparateDepthStencilLayoutsFeatures")] - public unsafe partial struct PhysicalDeviceSeparateDepthStencilLayoutsFeaturesKhr : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { - public PhysicalDeviceSeparateDepthStencilLayoutsFeaturesKhr + public PhysicalDeviceSeparateDepthStencilLayoutsFeaturesKHR ( StructureType? sType = StructureType.PhysicalDeviceSeparateDepthStencilLayoutsFeatures, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicFloat2FeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicFloat2FeaturesEXT.gen.cs index 2ac8ce590a..fbd4dfb868 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicFloat2FeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicFloat2FeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderAtomicFloat2FeaturesEXT")] - public unsafe partial struct PhysicalDeviceShaderAtomicFloat2FeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceShaderAtomicFloat2FeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceShaderAtomicFloat2FeaturesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicFloatFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicFloatFeaturesEXT.gen.cs index 84eb1b957a..cde0ac7b33 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicFloatFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicFloatFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderAtomicFloatFeaturesEXT")] - public unsafe partial struct PhysicalDeviceShaderAtomicFloatFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceShaderAtomicFloatFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceShaderAtomicFloatFeaturesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicInt64Features.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicInt64Features.gen.cs index 12a0bc72a4..17eeaf7a88 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicInt64Features.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicInt64Features.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderAtomicInt64Features")] [NativeName("Aliases", "VkPhysicalDeviceShaderAtomicInt64FeaturesKHR")] - public unsafe partial struct PhysicalDeviceShaderAtomicInt64Features : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceShaderAtomicInt64Features : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceShaderAtomicInt64Features ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicInt64FeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicInt64FeaturesKHR.gen.cs index 41dd8e5870..84baf3b9fa 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicInt64FeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderAtomicInt64FeaturesKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderAtomicInt64FeaturesKHR")] [NativeName("AliasOf", "VkPhysicalDeviceShaderAtomicInt64Features")] - public unsafe partial struct PhysicalDeviceShaderAtomicInt64featuresKhr : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceShaderAtomicInt64FeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { - public PhysicalDeviceShaderAtomicInt64featuresKhr + public PhysicalDeviceShaderAtomicInt64FeaturesKHR ( StructureType? sType = StructureType.PhysicalDeviceShaderAtomicInt64Features, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderClockFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderClockFeaturesKHR.gen.cs index 4c79a49894..6b79398d83 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderClockFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderClockFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderClockFeaturesKHR")] - public unsafe partial struct PhysicalDeviceShaderClockFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceShaderClockFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceShaderClockFeaturesKHR ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderCoreProperties2AMD.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderCoreProperties2AMD.gen.cs index 01720c8143..5ded1ccd30 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderCoreProperties2AMD.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderCoreProperties2AMD.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderCoreProperties2AMD")] - public unsafe partial struct PhysicalDeviceShaderCoreProperties2AMD : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceShaderCoreProperties2AMD : IExtendsChain, IExtendsChain { public PhysicalDeviceShaderCoreProperties2AMD ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderCorePropertiesAMD.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderCorePropertiesAMD.gen.cs index 8ab354dc46..2bbda65464 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderCorePropertiesAMD.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderCorePropertiesAMD.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderCorePropertiesAMD")] - public unsafe partial struct PhysicalDeviceShaderCorePropertiesAMD : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceShaderCorePropertiesAMD : IExtendsChain, IExtendsChain { public PhysicalDeviceShaderCorePropertiesAMD ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT.gen.cs index 5bceb56d30..05c010f5a4 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT")] - public unsafe partial struct PhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceShaderDemoteToHelperInvocationFeaturesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderDrawParameterFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderDrawParameterFeatures.gen.cs index 91836be25e..82422a4d0d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderDrawParameterFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderDrawParameterFeatures.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderDrawParameterFeatures")] [NativeName("AliasOf", "VkPhysicalDeviceShaderDrawParametersFeatures")] - public unsafe partial struct PhysicalDeviceShaderDrawParameterFeatures : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceShaderDrawParameterFeatures : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceShaderDrawParameterFeatures ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderDrawParametersFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderDrawParametersFeatures.gen.cs index 92bbe06b3c..9b24046e40 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderDrawParametersFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderDrawParametersFeatures.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderDrawParametersFeatures")] [NativeName("Aliases", "VkPhysicalDeviceShaderDrawParameterFeatures")] - public unsafe partial struct PhysicalDeviceShaderDrawParametersFeatures : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceShaderDrawParametersFeatures : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceShaderDrawParametersFeatures ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderFloat16Int8Features.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderFloat16Int8Features.gen.cs index 1deccfd0ec..d262887e4f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderFloat16Int8Features.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderFloat16Int8Features.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderFloat16Int8Features")] [NativeName("Aliases", "VkPhysicalDeviceShaderFloat16Int8FeaturesKHR, VkPhysicalDeviceFloat16Int8FeaturesKHR")] - public unsafe partial struct PhysicalDeviceShaderFloat16Int8Features : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceShaderFloat16Int8Features : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceShaderFloat16Int8Features ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderFloat16Int8FeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderFloat16Int8FeaturesKHR.gen.cs index c4a3cd8946..7cfa898e6b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderFloat16Int8FeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderFloat16Int8FeaturesKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderFloat16Int8FeaturesKHR")] [NativeName("AliasOf", "VkPhysicalDeviceShaderFloat16Int8Features")] - public unsafe partial struct PhysicalDeviceShaderFloat16int8featuresKhr : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceShaderFloat16Int8FeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { - public PhysicalDeviceShaderFloat16int8featuresKhr + public PhysicalDeviceShaderFloat16Int8FeaturesKHR ( StructureType? sType = StructureType.PhysicalDeviceShaderFloat16Int8Features, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderImageAtomicInt64FeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderImageAtomicInt64FeaturesEXT.gen.cs index 24dfdcb17f..3426536a59 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderImageAtomicInt64FeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderImageAtomicInt64FeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderImageAtomicInt64FeaturesEXT")] - public unsafe partial struct PhysicalDeviceShaderImageAtomicInt64FeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceShaderImageAtomicInt64FeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceShaderImageAtomicInt64FeaturesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderImageFootprintFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderImageFootprintFeaturesNV.gen.cs index ad3b07dd1e..3e5746c305 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderImageFootprintFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderImageFootprintFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderImageFootprintFeaturesNV")] - public unsafe partial struct PhysicalDeviceShaderImageFootprintFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceShaderImageFootprintFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceShaderImageFootprintFeaturesNV ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderIntegerDotProductFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderIntegerDotProductFeaturesKHR.gen.cs index 1275559d71..9bc96e7673 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderIntegerDotProductFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderIntegerDotProductFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderIntegerDotProductFeaturesKHR")] - public unsafe partial struct PhysicalDeviceShaderIntegerDotProductFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceShaderIntegerDotProductFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceShaderIntegerDotProductFeaturesKHR ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderIntegerDotProductPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderIntegerDotProductPropertiesKHR.gen.cs index 288068dede..8744de0f48 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderIntegerDotProductPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderIntegerDotProductPropertiesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderIntegerDotProductPropertiesKHR")] - public unsafe partial struct PhysicalDeviceShaderIntegerDotProductPropertiesKHR : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceShaderIntegerDotProductPropertiesKHR : IExtendsChain, IExtendsChain { public PhysicalDeviceShaderIntegerDotProductPropertiesKHR ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL.gen.cs index a9b4483cf7..48b1fdb830 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderIntegerFunctions2FeaturesINTEL")] - public unsafe partial struct PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceShaderIntegerFunctions2FeaturesINTEL ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSMBuiltinsFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSMBuiltinsFeaturesNV.gen.cs index 7c924711eb..9e15d17054 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSMBuiltinsFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSMBuiltinsFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderSMBuiltinsFeaturesNV")] - public unsafe partial struct PhysicalDeviceShaderSMBuiltinsFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceShaderSMBuiltinsFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceShaderSMBuiltinsFeaturesNV ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSMBuiltinsPropertiesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSMBuiltinsPropertiesNV.gen.cs index 8682047797..d358ba3854 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSMBuiltinsPropertiesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSMBuiltinsPropertiesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderSMBuiltinsPropertiesNV")] - public unsafe partial struct PhysicalDeviceShaderSMBuiltinsPropertiesNV : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceShaderSMBuiltinsPropertiesNV : IExtendsChain, IExtendsChain { public PhysicalDeviceShaderSMBuiltinsPropertiesNV ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSubgroupExtendedTypesFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSubgroupExtendedTypesFeatures.gen.cs index 80bb136ad9..725ecff761 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSubgroupExtendedTypesFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSubgroupExtendedTypesFeatures.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures")] [NativeName("Aliases", "VkPhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR")] - public unsafe partial struct PhysicalDeviceShaderSubgroupExtendedTypesFeatures : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceShaderSubgroupExtendedTypesFeatures : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceShaderSubgroupExtendedTypesFeatures ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR.gen.cs index 78a53ab744..5289ad8376 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR")] [NativeName("AliasOf", "VkPhysicalDeviceShaderSubgroupExtendedTypesFeatures")] - public unsafe partial struct PhysicalDeviceShaderSubgroupExtendedTypesFeaturesKhr : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { - public PhysicalDeviceShaderSubgroupExtendedTypesFeaturesKhr + public PhysicalDeviceShaderSubgroupExtendedTypesFeaturesKHR ( StructureType? sType = StructureType.PhysicalDeviceShaderSubgroupExtendedTypesFeatures, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR.gen.cs index e5303f70b3..9611dd9ffa 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR")] - public unsafe partial struct PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKHR ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderTerminateInvocationFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderTerminateInvocationFeaturesKHR.gen.cs index 8b0b041d12..ae656d6828 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderTerminateInvocationFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShaderTerminateInvocationFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShaderTerminateInvocationFeaturesKHR")] - public unsafe partial struct PhysicalDeviceShaderTerminateInvocationFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceShaderTerminateInvocationFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceShaderTerminateInvocationFeaturesKHR ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShadingRateImageFeaturesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShadingRateImageFeaturesNV.gen.cs index f278af7d06..be3458eab1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShadingRateImageFeaturesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShadingRateImageFeaturesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShadingRateImageFeaturesNV")] - public unsafe partial struct PhysicalDeviceShadingRateImageFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceShadingRateImageFeaturesNV : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceShadingRateImageFeaturesNV ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShadingRateImagePropertiesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShadingRateImagePropertiesNV.gen.cs index 2e25e38adb..51667cc5de 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShadingRateImagePropertiesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceShadingRateImagePropertiesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceShadingRateImagePropertiesNV")] - public unsafe partial struct PhysicalDeviceShadingRateImagePropertiesNV : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceShadingRateImagePropertiesNV : IExtendsChain, IExtendsChain { public PhysicalDeviceShadingRateImagePropertiesNV ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSparseImageFormatInfo2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSparseImageFormatInfo2KHR.gen.cs index 8c3aa81ab4..5aeec425c1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSparseImageFormatInfo2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSparseImageFormatInfo2KHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSparseImageFormatInfo2KHR")] [NativeName("AliasOf", "VkPhysicalDeviceSparseImageFormatInfo2")] - public unsafe partial struct PhysicalDeviceSparseImageFormatInfo2Khr : IChainable + public unsafe partial struct PhysicalDeviceSparseImageFormatInfo2KHR : IChainable { - public PhysicalDeviceSparseImageFormatInfo2Khr + public PhysicalDeviceSparseImageFormatInfo2KHR ( StructureType? sType = StructureType.PhysicalDeviceSparseImageFormatInfo2, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubgroupProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubgroupProperties.gen.cs index 9eba83752a..ebd1985579 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubgroupProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubgroupProperties.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSubgroupProperties")] - public unsafe partial struct PhysicalDeviceSubgroupProperties : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceSubgroupProperties : IExtendsChain, IExtendsChain { public PhysicalDeviceSubgroupProperties ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubgroupSizeControlFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubgroupSizeControlFeaturesEXT.gen.cs index 58b390704d..fb8534078a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubgroupSizeControlFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubgroupSizeControlFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSubgroupSizeControlFeaturesEXT")] - public unsafe partial struct PhysicalDeviceSubgroupSizeControlFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceSubgroupSizeControlFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceSubgroupSizeControlFeaturesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubgroupSizeControlPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubgroupSizeControlPropertiesEXT.gen.cs index cb33c92481..857e4eefca 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubgroupSizeControlPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubgroupSizeControlPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSubgroupSizeControlPropertiesEXT")] - public unsafe partial struct PhysicalDeviceSubgroupSizeControlPropertiesEXT : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceSubgroupSizeControlPropertiesEXT : IExtendsChain, IExtendsChain { public PhysicalDeviceSubgroupSizeControlPropertiesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubpassShadingFeaturesHUAWEI.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubpassShadingFeaturesHUAWEI.gen.cs index 1bb85c7d52..c658c452bc 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubpassShadingFeaturesHUAWEI.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubpassShadingFeaturesHUAWEI.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSubpassShadingFeaturesHUAWEI")] - public unsafe partial struct PhysicalDeviceSubpassShadingFeaturesHUAWEI : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceSubpassShadingFeaturesHUAWEI : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceSubpassShadingFeaturesHUAWEI ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubpassShadingPropertiesHUAWEI.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubpassShadingPropertiesHUAWEI.gen.cs index 80918f73d0..9bc4791c4f 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubpassShadingPropertiesHUAWEI.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSubpassShadingPropertiesHUAWEI.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSubpassShadingPropertiesHUAWEI")] - public unsafe partial struct PhysicalDeviceSubpassShadingPropertiesHUAWEI : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceSubpassShadingPropertiesHUAWEI : IExtendsChain, IExtendsChain { public PhysicalDeviceSubpassShadingPropertiesHUAWEI ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSynchronization2FeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSynchronization2FeaturesKHR.gen.cs index 1a168b7351..c1767747aa 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSynchronization2FeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceSynchronization2FeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceSynchronization2FeaturesKHR")] - public unsafe partial struct PhysicalDeviceSynchronization2FeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceSynchronization2FeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceSynchronization2FeaturesKHR ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTexelBufferAlignmentFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTexelBufferAlignmentFeaturesEXT.gen.cs index 20080754fc..428205e86a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTexelBufferAlignmentFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTexelBufferAlignmentFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceTexelBufferAlignmentFeaturesEXT")] - public unsafe partial struct PhysicalDeviceTexelBufferAlignmentFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceTexelBufferAlignmentFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceTexelBufferAlignmentFeaturesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTexelBufferAlignmentPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTexelBufferAlignmentPropertiesEXT.gen.cs index bedef5097a..8550959185 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTexelBufferAlignmentPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTexelBufferAlignmentPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceTexelBufferAlignmentPropertiesEXT")] - public unsafe partial struct PhysicalDeviceTexelBufferAlignmentPropertiesEXT : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceTexelBufferAlignmentPropertiesEXT : IExtendsChain, IExtendsChain { public PhysicalDeviceTexelBufferAlignmentPropertiesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTextureCompressionASTCHDRFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTextureCompressionASTCHDRFeaturesEXT.gen.cs index bf0afc5cdb..7000850f5b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTextureCompressionASTCHDRFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTextureCompressionASTCHDRFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceTextureCompressionASTCHDRFeaturesEXT")] - public unsafe partial struct PhysicalDeviceTextureCompressionASTCHDRFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceTextureCompressionASTCHDRFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceTextureCompressionASTCHDRFeaturesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphoreFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphoreFeatures.gen.cs index cea69c27e5..272cc6dece 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphoreFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphoreFeatures.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceTimelineSemaphoreFeatures")] [NativeName("Aliases", "VkPhysicalDeviceTimelineSemaphoreFeaturesKHR")] - public unsafe partial struct PhysicalDeviceTimelineSemaphoreFeatures : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceTimelineSemaphoreFeatures : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceTimelineSemaphoreFeatures ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphoreFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphoreFeaturesKHR.gen.cs index 6c4db3eee4..b953e6aba8 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphoreFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphoreFeaturesKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceTimelineSemaphoreFeaturesKHR")] [NativeName("AliasOf", "VkPhysicalDeviceTimelineSemaphoreFeatures")] - public unsafe partial struct PhysicalDeviceTimelineSemaphoreFeaturesKhr : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceTimelineSemaphoreFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { - public PhysicalDeviceTimelineSemaphoreFeaturesKhr + public PhysicalDeviceTimelineSemaphoreFeaturesKHR ( StructureType? sType = StructureType.PhysicalDeviceTimelineSemaphoreFeatures, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphoreProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphoreProperties.gen.cs index 048012a66e..1725e621fc 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphoreProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphoreProperties.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceTimelineSemaphoreProperties")] [NativeName("Aliases", "VkPhysicalDeviceTimelineSemaphorePropertiesKHR")] - public unsafe partial struct PhysicalDeviceTimelineSemaphoreProperties : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceTimelineSemaphoreProperties : IExtendsChain, IExtendsChain { public PhysicalDeviceTimelineSemaphoreProperties ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphorePropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphorePropertiesKHR.gen.cs index 02666e5ed8..c0269e6c2a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphorePropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTimelineSemaphorePropertiesKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceTimelineSemaphorePropertiesKHR")] [NativeName("AliasOf", "VkPhysicalDeviceTimelineSemaphoreProperties")] - public unsafe partial struct PhysicalDeviceTimelineSemaphorePropertiesKhr : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceTimelineSemaphorePropertiesKHR : IExtendsChain, IExtendsChain { - public PhysicalDeviceTimelineSemaphorePropertiesKhr + public PhysicalDeviceTimelineSemaphorePropertiesKHR ( StructureType? sType = StructureType.PhysicalDeviceTimelineSemaphoreProperties, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTransformFeedbackFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTransformFeedbackFeaturesEXT.gen.cs index c836af487c..04441302d7 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTransformFeedbackFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTransformFeedbackFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceTransformFeedbackFeaturesEXT")] - public unsafe partial struct PhysicalDeviceTransformFeedbackFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceTransformFeedbackFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceTransformFeedbackFeaturesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTransformFeedbackPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTransformFeedbackPropertiesEXT.gen.cs index 5dc71cecd0..caae53115e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTransformFeedbackPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceTransformFeedbackPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceTransformFeedbackPropertiesEXT")] - public unsafe partial struct PhysicalDeviceTransformFeedbackPropertiesEXT : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceTransformFeedbackPropertiesEXT : IExtendsChain, IExtendsChain { public PhysicalDeviceTransformFeedbackPropertiesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceUniformBufferStandardLayoutFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceUniformBufferStandardLayoutFeatures.gen.cs index 187872a0be..09ff66c214 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceUniformBufferStandardLayoutFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceUniformBufferStandardLayoutFeatures.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceUniformBufferStandardLayoutFeatures")] [NativeName("Aliases", "VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR")] - public unsafe partial struct PhysicalDeviceUniformBufferStandardLayoutFeatures : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceUniformBufferStandardLayoutFeatures : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceUniformBufferStandardLayoutFeatures ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceUniformBufferStandardLayoutFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceUniformBufferStandardLayoutFeaturesKHR.gen.cs index 020dcd675f..4200bc0765 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceUniformBufferStandardLayoutFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceUniformBufferStandardLayoutFeaturesKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceUniformBufferStandardLayoutFeaturesKHR")] [NativeName("AliasOf", "VkPhysicalDeviceUniformBufferStandardLayoutFeatures")] - public unsafe partial struct PhysicalDeviceUniformBufferStandardLayoutFeaturesKhr : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceUniformBufferStandardLayoutFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { - public PhysicalDeviceUniformBufferStandardLayoutFeaturesKhr + public PhysicalDeviceUniformBufferStandardLayoutFeaturesKHR ( StructureType? sType = StructureType.PhysicalDeviceUniformBufferStandardLayoutFeatures, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointerFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointerFeatures.gen.cs index 42f630a2d5..a622e08708 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointerFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointerFeatures.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceVariablePointerFeatures")] [NativeName("AliasOf", "VkPhysicalDeviceVariablePointersFeatures")] - public unsafe partial struct PhysicalDeviceVariablePointerFeatures : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceVariablePointerFeatures : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceVariablePointerFeatures ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointerFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointerFeaturesKHR.gen.cs index 8552ed87fe..4880626c33 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointerFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointerFeaturesKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceVariablePointerFeaturesKHR")] [NativeName("AliasOf", "VkPhysicalDeviceVariablePointersFeatures")] - public unsafe partial struct PhysicalDeviceVariablePointerFeaturesKhr : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceVariablePointerFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { - public PhysicalDeviceVariablePointerFeaturesKhr + public PhysicalDeviceVariablePointerFeaturesKHR ( StructureType? sType = StructureType.PhysicalDeviceVariablePointersFeatures, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointersFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointersFeatures.gen.cs index 58b9fcbd1b..0d46397d3d 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointersFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointersFeatures.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceVariablePointersFeatures")] [NativeName("Aliases", "VkPhysicalDeviceVariablePointersFeaturesKHR, VkPhysicalDeviceVariablePointerFeaturesKHR, VkPhysicalDeviceVariablePointerFeatures")] - public unsafe partial struct PhysicalDeviceVariablePointersFeatures : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceVariablePointersFeatures : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceVariablePointersFeatures ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointersFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointersFeaturesKHR.gen.cs index 5065277650..64baa74c15 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointersFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVariablePointersFeaturesKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceVariablePointersFeaturesKHR")] [NativeName("AliasOf", "VkPhysicalDeviceVariablePointersFeatures")] - public unsafe partial struct PhysicalDeviceVariablePointersFeaturesKhr : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceVariablePointersFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { - public PhysicalDeviceVariablePointersFeaturesKhr + public PhysicalDeviceVariablePointersFeaturesKHR ( StructureType? sType = StructureType.PhysicalDeviceVariablePointersFeatures, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVertexAttributeDivisorFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVertexAttributeDivisorFeaturesEXT.gen.cs index caa02a9354..c2458d9083 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVertexAttributeDivisorFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVertexAttributeDivisorFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceVertexAttributeDivisorFeaturesEXT")] - public unsafe partial struct PhysicalDeviceVertexAttributeDivisorFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceVertexAttributeDivisorFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceVertexAttributeDivisorFeaturesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVertexAttributeDivisorPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVertexAttributeDivisorPropertiesEXT.gen.cs index 37a4f0511f..6b5a7bdc95 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVertexAttributeDivisorPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVertexAttributeDivisorPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceVertexAttributeDivisorPropertiesEXT")] - public unsafe partial struct PhysicalDeviceVertexAttributeDivisorPropertiesEXT : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceVertexAttributeDivisorPropertiesEXT : IExtendsChain, IExtendsChain { public PhysicalDeviceVertexAttributeDivisorPropertiesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVertexInputDynamicStateFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVertexInputDynamicStateFeaturesEXT.gen.cs index 801afaf7e6..07853385ba 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVertexInputDynamicStateFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVertexInputDynamicStateFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceVertexInputDynamicStateFeaturesEXT")] - public unsafe partial struct PhysicalDeviceVertexInputDynamicStateFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceVertexInputDynamicStateFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceVertexInputDynamicStateFeaturesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan11Features.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan11Features.gen.cs index 64be99bb1e..a676845be1 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan11Features.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan11Features.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceVulkan11Features")] - public unsafe partial struct PhysicalDeviceVulkan11Features : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceVulkan11Features : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceVulkan11Features ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan11Properties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan11Properties.gen.cs index c42fb2f0c2..24f09bdb0a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan11Properties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan11Properties.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceVulkan11Properties")] - public unsafe partial struct PhysicalDeviceVulkan11Properties : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceVulkan11Properties : IExtendsChain, IExtendsChain { public PhysicalDeviceVulkan11Properties ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan12Features.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan12Features.gen.cs index 04a2f52380..302e4e3420 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan12Features.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan12Features.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceVulkan12Features")] - public unsafe partial struct PhysicalDeviceVulkan12Features : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceVulkan12Features : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceVulkan12Features ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan12Properties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan12Properties.gen.cs index abfa05c2b2..bacc18db42 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan12Properties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkan12Properties.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceVulkan12Properties")] - public unsafe partial struct PhysicalDeviceVulkan12Properties : IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceVulkan12Properties : IExtendsChain, IExtendsChain { public PhysicalDeviceVulkan12Properties ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkanMemoryModelFeatures.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkanMemoryModelFeatures.gen.cs index 3213d0ebc2..ae0b84288b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkanMemoryModelFeatures.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkanMemoryModelFeatures.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceVulkanMemoryModelFeatures")] [NativeName("Aliases", "VkPhysicalDeviceVulkanMemoryModelFeaturesKHR")] - public unsafe partial struct PhysicalDeviceVulkanMemoryModelFeatures : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceVulkanMemoryModelFeatures : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceVulkanMemoryModelFeatures ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkanMemoryModelFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkanMemoryModelFeaturesKHR.gen.cs index a6277d21df..b4a4db9487 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkanMemoryModelFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceVulkanMemoryModelFeaturesKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceVulkanMemoryModelFeaturesKHR")] [NativeName("AliasOf", "VkPhysicalDeviceVulkanMemoryModelFeatures")] - public unsafe partial struct PhysicalDeviceVulkanMemoryModelFeaturesKhr : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceVulkanMemoryModelFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { - public PhysicalDeviceVulkanMemoryModelFeaturesKhr + public PhysicalDeviceVulkanMemoryModelFeaturesKHR ( StructureType? sType = StructureType.PhysicalDeviceVulkanMemoryModelFeatures, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR.gen.cs index 046c011017..3a926482f0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR")] - public unsafe partial struct PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKHR ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT.gen.cs index 5474ac443c..ffa214ddc5 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT")] - public unsafe partial struct PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceYcbcr2Plane444FormatsFeaturesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceYcbcrImageArraysFeaturesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceYcbcrImageArraysFeaturesEXT.gen.cs index d7fec7cff7..7fd43f4b51 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceYcbcrImageArraysFeaturesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceYcbcrImageArraysFeaturesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceYcbcrImageArraysFeaturesEXT")] - public unsafe partial struct PhysicalDeviceYcbcrImageArraysFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceYcbcrImageArraysFeaturesEXT : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceYcbcrImageArraysFeaturesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR.gen.cs index 281d1aa9b1..3a09475d19 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR")] - public unsafe partial struct PhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct PhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR : IExtendsChain, IExtendsChain, IExtendsChain { public PhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKHR ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineTessellationDomainOriginStateCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineTessellationDomainOriginStateCreateInfoKHR.gen.cs index 2e18f3f691..cb03b9b1b0 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineTessellationDomainOriginStateCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/PipelineTessellationDomainOriginStateCreateInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkPipelineTessellationDomainOriginStateCreateInfoKHR")] [NativeName("AliasOf", "VkPipelineTessellationDomainOriginStateCreateInfo")] - public unsafe partial struct PipelineTessellationDomainOriginStateCreateInfoKhr : IExtendsChain + public unsafe partial struct PipelineTessellationDomainOriginStateCreateInfoKHR : IExtendsChain { - public PipelineTessellationDomainOriginStateCreateInfoKhr + public PipelineTessellationDomainOriginStateCreateInfoKHR ( StructureType? sType = StructureType.PipelineTessellationDomainOriginStateCreateInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/QueryPoolCreateInfoINTEL.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/QueryPoolCreateInfoINTEL.gen.cs index 8920992b06..f5d8282b43 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/QueryPoolCreateInfoINTEL.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/QueryPoolCreateInfoINTEL.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkQueryPoolCreateInfoINTEL")] [NativeName("AliasOf", "VkQueryPoolPerformanceQueryCreateInfoINTEL")] - public unsafe partial struct QueryPoolCreateInfoIntel : IExtendsChain + public unsafe partial struct QueryPoolCreateInfoINTEL : IExtendsChain { - public QueryPoolCreateInfoIntel + public QueryPoolCreateInfoINTEL ( StructureType? sType = StructureType.QueryPoolPerformanceQueryCreateInfoIntel, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyCheckpointProperties2NV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyCheckpointProperties2NV.gen.cs index 476a3d9746..7cbc5554fa 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyCheckpointProperties2NV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyCheckpointProperties2NV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkQueueFamilyCheckpointProperties2NV")] - public unsafe partial struct QueueFamilyCheckpointProperties2NV : IExtendsChain, IExtendsChain + public unsafe partial struct QueueFamilyCheckpointProperties2NV : IExtendsChain, IExtendsChain { public QueueFamilyCheckpointProperties2NV ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyCheckpointPropertiesNV.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyCheckpointPropertiesNV.gen.cs index d30dc19d29..43512e3bea 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyCheckpointPropertiesNV.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyCheckpointPropertiesNV.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkQueueFamilyCheckpointPropertiesNV")] - public unsafe partial struct QueueFamilyCheckpointPropertiesNV : IExtendsChain, IExtendsChain + public unsafe partial struct QueueFamilyCheckpointPropertiesNV : IExtendsChain, IExtendsChain { public QueueFamilyCheckpointPropertiesNV ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyGlobalPriorityPropertiesEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyGlobalPriorityPropertiesEXT.gen.cs index bb689b0bf7..87d603f2bb 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyGlobalPriorityPropertiesEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyGlobalPriorityPropertiesEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkQueueFamilyGlobalPriorityPropertiesEXT")] - public unsafe partial struct QueueFamilyGlobalPriorityPropertiesEXT : IExtendsChain, IExtendsChain + public unsafe partial struct QueueFamilyGlobalPriorityPropertiesEXT : IExtendsChain, IExtendsChain { public QueueFamilyGlobalPriorityPropertiesEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyProperties2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyProperties2KHR.gen.cs index ac4bb6b49b..99ac654b27 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyProperties2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/QueueFamilyProperties2KHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkQueueFamilyProperties2KHR")] [NativeName("AliasOf", "VkQueueFamilyProperties2")] - public unsafe partial struct QueueFamilyProperties2Khr : IChainStart + public unsafe partial struct QueueFamilyProperties2KHR : IChainStart { - public QueueFamilyProperties2Khr + public QueueFamilyProperties2KHR ( StructureType? sType = StructureType.QueueFamilyProperties2, void* pNext = null, @@ -77,10 +77,10 @@ unsafe BaseInStructure* IChainable.PNext ///
/// The newly created chain root /// A reference to the newly created chain. - public static unsafe ref QueueFamilyProperties2Khr Chain( - out QueueFamilyProperties2Khr capture) + public static unsafe ref QueueFamilyProperties2KHR Chain( + out QueueFamilyProperties2KHR capture) { - capture = new QueueFamilyProperties2Khr(StructureType.QueueFamilyProperties2); + capture = new QueueFamilyProperties2KHR(StructureType.QueueFamilyProperties2); return ref capture; } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassAttachmentBeginInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassAttachmentBeginInfoKHR.gen.cs index 553cc7011b..256050ee1c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassAttachmentBeginInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassAttachmentBeginInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRenderPassAttachmentBeginInfoKHR")] [NativeName("AliasOf", "VkRenderPassAttachmentBeginInfo")] - public unsafe partial struct RenderPassAttachmentBeginInfoKhr : IExtendsChain + public unsafe partial struct RenderPassAttachmentBeginInfoKHR : IExtendsChain { - public RenderPassAttachmentBeginInfoKhr + public RenderPassAttachmentBeginInfoKHR ( StructureType? sType = StructureType.RenderPassAttachmentBeginInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassCreateInfo2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassCreateInfo2KHR.gen.cs index 81cf367888..80e2211f4e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassCreateInfo2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassCreateInfo2KHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRenderPassCreateInfo2KHR")] [NativeName("AliasOf", "VkRenderPassCreateInfo2")] - public unsafe partial struct RenderPassCreateInfo2Khr : IChainStart + public unsafe partial struct RenderPassCreateInfo2KHR : IChainStart { - public RenderPassCreateInfo2Khr + public RenderPassCreateInfo2KHR ( StructureType? sType = StructureType.RenderPassCreateInfo2, void* pNext = null, @@ -165,10 +165,10 @@ unsafe BaseInStructure* IChainable.PNext ///
/// The newly created chain root /// A reference to the newly created chain. - public static unsafe ref RenderPassCreateInfo2Khr Chain( - out RenderPassCreateInfo2Khr capture) + public static unsafe ref RenderPassCreateInfo2KHR Chain( + out RenderPassCreateInfo2KHR capture) { - capture = new RenderPassCreateInfo2Khr(StructureType.RenderPassCreateInfo2); + capture = new RenderPassCreateInfo2KHR(StructureType.RenderPassCreateInfo2); return ref capture; } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassFragmentDensityMapCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassFragmentDensityMapCreateInfoEXT.gen.cs index ba861e9757..8148df5c8e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassFragmentDensityMapCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassFragmentDensityMapCreateInfoEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRenderPassFragmentDensityMapCreateInfoEXT")] - public unsafe partial struct RenderPassFragmentDensityMapCreateInfoEXT : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct RenderPassFragmentDensityMapCreateInfoEXT : IExtendsChain, IExtendsChain, IExtendsChain { public RenderPassFragmentDensityMapCreateInfoEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassInputAttachmentAspectCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassInputAttachmentAspectCreateInfoKHR.gen.cs index 4734e7dce4..e4784837aa 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassInputAttachmentAspectCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassInputAttachmentAspectCreateInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRenderPassInputAttachmentAspectCreateInfoKHR")] [NativeName("AliasOf", "VkRenderPassInputAttachmentAspectCreateInfo")] - public unsafe partial struct RenderPassInputAttachmentAspectCreateInfoKhr : IExtendsChain + public unsafe partial struct RenderPassInputAttachmentAspectCreateInfoKHR : IExtendsChain { - public RenderPassInputAttachmentAspectCreateInfoKhr + public RenderPassInputAttachmentAspectCreateInfoKHR ( StructureType? sType = StructureType.RenderPassInputAttachmentAspectCreateInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassMultiviewCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassMultiviewCreateInfoKHR.gen.cs index 625949b857..d443fa5fdb 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassMultiviewCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/RenderPassMultiviewCreateInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkRenderPassMultiviewCreateInfoKHR")] [NativeName("AliasOf", "VkRenderPassMultiviewCreateInfo")] - public unsafe partial struct RenderPassMultiviewCreateInfoKhr : IExtendsChain + public unsafe partial struct RenderPassMultiviewCreateInfoKHR : IExtendsChain { - public RenderPassMultiviewCreateInfoKhr + public RenderPassMultiviewCreateInfoKHR ( StructureType? sType = StructureType.RenderPassMultiviewCreateInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerReductionModeCreateInfoEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerReductionModeCreateInfoEXT.gen.cs index 27fe793de7..cab3d4603a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerReductionModeCreateInfoEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerReductionModeCreateInfoEXT.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSamplerReductionModeCreateInfoEXT")] [NativeName("AliasOf", "VkSamplerReductionModeCreateInfo")] - public unsafe partial struct SamplerReductionModeCreateInfoExt : IExtendsChain + public unsafe partial struct SamplerReductionModeCreateInfoEXT : IExtendsChain { - public SamplerReductionModeCreateInfoExt + public SamplerReductionModeCreateInfoEXT ( StructureType? sType = StructureType.SamplerReductionModeCreateInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionCreateInfoKHR.gen.cs index c7890e6625..391fc5220a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionCreateInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSamplerYcbcrConversionCreateInfoKHR")] [NativeName("AliasOf", "VkSamplerYcbcrConversionCreateInfo")] - public unsafe partial struct SamplerYcbcrConversionCreateInfoKhr : IChainStart + public unsafe partial struct SamplerYcbcrConversionCreateInfoKHR : IChainStart { - public SamplerYcbcrConversionCreateInfoKhr + public SamplerYcbcrConversionCreateInfoKHR ( StructureType? sType = StructureType.SamplerYcbcrConversionCreateInfo, void* pNext = null, @@ -154,10 +154,10 @@ unsafe BaseInStructure* IChainable.PNext ///
/// The newly created chain root /// A reference to the newly created chain. - public static unsafe ref SamplerYcbcrConversionCreateInfoKhr Chain( - out SamplerYcbcrConversionCreateInfoKhr capture) + public static unsafe ref SamplerYcbcrConversionCreateInfoKHR Chain( + out SamplerYcbcrConversionCreateInfoKHR capture) { - capture = new SamplerYcbcrConversionCreateInfoKhr(StructureType.SamplerYcbcrConversionCreateInfo); + capture = new SamplerYcbcrConversionCreateInfoKHR(StructureType.SamplerYcbcrConversionCreateInfo); return ref capture; } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionImageFormatProperties.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionImageFormatProperties.gen.cs index 9efa720c4b..ec53b11c81 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionImageFormatProperties.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionImageFormatProperties.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSamplerYcbcrConversionImageFormatProperties")] [NativeName("Aliases", "VkSamplerYcbcrConversionImageFormatPropertiesKHR")] - public unsafe partial struct SamplerYcbcrConversionImageFormatProperties : IExtendsChain, IExtendsChain + public unsafe partial struct SamplerYcbcrConversionImageFormatProperties : IExtendsChain, IExtendsChain { public SamplerYcbcrConversionImageFormatProperties ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionImageFormatPropertiesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionImageFormatPropertiesKHR.gen.cs index 4f06423aba..598470834e 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionImageFormatPropertiesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionImageFormatPropertiesKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSamplerYcbcrConversionImageFormatPropertiesKHR")] [NativeName("AliasOf", "VkSamplerYcbcrConversionImageFormatProperties")] - public unsafe partial struct SamplerYcbcrConversionImageFormatPropertiesKhr : IExtendsChain, IExtendsChain + public unsafe partial struct SamplerYcbcrConversionImageFormatPropertiesKHR : IExtendsChain, IExtendsChain { - public SamplerYcbcrConversionImageFormatPropertiesKhr + public SamplerYcbcrConversionImageFormatPropertiesKHR ( StructureType? sType = StructureType.SamplerYcbcrConversionImageFormatProperties, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionInfoKHR.gen.cs index 1ee0d1121b..7105e0b410 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SamplerYcbcrConversionInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSamplerYcbcrConversionInfoKHR")] [NativeName("AliasOf", "VkSamplerYcbcrConversionInfo")] - public unsafe partial struct SamplerYcbcrConversionInfoKhr : IExtendsChain, IExtendsChain + public unsafe partial struct SamplerYcbcrConversionInfoKHR : IExtendsChain, IExtendsChain { - public SamplerYcbcrConversionInfoKhr + public SamplerYcbcrConversionInfoKHR ( StructureType? sType = StructureType.SamplerYcbcrConversionInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreSignalInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreSignalInfoKHR.gen.cs index 751820dce6..9869d1487b 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreSignalInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreSignalInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSemaphoreSignalInfoKHR")] [NativeName("AliasOf", "VkSemaphoreSignalInfo")] - public unsafe partial struct SemaphoreSignalInfoKhr : IChainable + public unsafe partial struct SemaphoreSignalInfoKHR : IChainable { - public SemaphoreSignalInfoKhr + public SemaphoreSignalInfoKHR ( StructureType? sType = StructureType.SemaphoreSignalInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreTypeCreateInfo.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreTypeCreateInfo.gen.cs index 5d2d553202..b9f532a5d4 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreTypeCreateInfo.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreTypeCreateInfo.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSemaphoreTypeCreateInfo")] [NativeName("Aliases", "VkSemaphoreTypeCreateInfoKHR")] - public unsafe partial struct SemaphoreTypeCreateInfo : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct SemaphoreTypeCreateInfo : IExtendsChain, IExtendsChain, IExtendsChain { public SemaphoreTypeCreateInfo ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreTypeCreateInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreTypeCreateInfoKHR.gen.cs index 81d801b770..8cd0c48178 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreTypeCreateInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreTypeCreateInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSemaphoreTypeCreateInfoKHR")] [NativeName("AliasOf", "VkSemaphoreTypeCreateInfo")] - public unsafe partial struct SemaphoreTypeCreateInfoKhr : IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct SemaphoreTypeCreateInfoKHR : IExtendsChain, IExtendsChain, IExtendsChain { - public SemaphoreTypeCreateInfoKhr + public SemaphoreTypeCreateInfoKHR ( StructureType? sType = StructureType.SemaphoreTypeCreateInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreWaitInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreWaitInfoKHR.gen.cs index 9832fe5b4e..b9534061ee 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreWaitInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SemaphoreWaitInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSemaphoreWaitInfoKHR")] [NativeName("AliasOf", "VkSemaphoreWaitInfo")] - public unsafe partial struct SemaphoreWaitInfoKhr : IChainable + public unsafe partial struct SemaphoreWaitInfoKHR : IChainable { - public SemaphoreWaitInfoKhr + public SemaphoreWaitInfoKHR ( StructureType? sType = StructureType.SemaphoreWaitInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SparseImageFormatProperties2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SparseImageFormatProperties2KHR.gen.cs index 757a671e09..87d9946aae 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SparseImageFormatProperties2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SparseImageFormatProperties2KHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSparseImageFormatProperties2KHR")] [NativeName("AliasOf", "VkSparseImageFormatProperties2")] - public unsafe partial struct SparseImageFormatProperties2Khr : IChainable + public unsafe partial struct SparseImageFormatProperties2KHR : IChainable { - public SparseImageFormatProperties2Khr + public SparseImageFormatProperties2KHR ( StructureType? sType = StructureType.SparseImageFormatProperties2, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SparseImageMemoryRequirements2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SparseImageMemoryRequirements2KHR.gen.cs index 416d3ba76d..830bebc86a 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SparseImageMemoryRequirements2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SparseImageMemoryRequirements2KHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSparseImageMemoryRequirements2KHR")] [NativeName("AliasOf", "VkSparseImageMemoryRequirements2")] - public unsafe partial struct SparseImageMemoryRequirements2Khr : IChainable + public unsafe partial struct SparseImageMemoryRequirements2KHR : IChainable { - public SparseImageMemoryRequirements2Khr + public SparseImageMemoryRequirements2KHR ( StructureType? sType = StructureType.SparseImageMemoryRequirements2, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassBeginInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassBeginInfoKHR.gen.cs index a5dc515071..14e69cef98 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassBeginInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassBeginInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSubpassBeginInfoKHR")] [NativeName("AliasOf", "VkSubpassBeginInfo")] - public unsafe partial struct SubpassBeginInfoKhr : IChainable + public unsafe partial struct SubpassBeginInfoKHR : IChainable { - public SubpassBeginInfoKhr + public SubpassBeginInfoKHR ( StructureType? sType = StructureType.SubpassBeginInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDependency2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDependency2KHR.gen.cs index a56ef7ea5a..bc97473360 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDependency2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDependency2KHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSubpassDependency2KHR")] [NativeName("AliasOf", "VkSubpassDependency2")] - public unsafe partial struct SubpassDependency2Khr : IChainStart + public unsafe partial struct SubpassDependency2KHR : IChainStart { - public SubpassDependency2Khr + public SubpassDependency2KHR ( StructureType? sType = StructureType.SubpassDependency2, void* pNext = null, @@ -154,10 +154,10 @@ unsafe BaseInStructure* IChainable.PNext ///
/// The newly created chain root /// A reference to the newly created chain. - public static unsafe ref SubpassDependency2Khr Chain( - out SubpassDependency2Khr capture) + public static unsafe ref SubpassDependency2KHR Chain( + out SubpassDependency2KHR capture) { - capture = new SubpassDependency2Khr(StructureType.SubpassDependency2); + capture = new SubpassDependency2KHR(StructureType.SubpassDependency2); return ref capture; } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescription2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescription2KHR.gen.cs index 7bd47edf18..0bae434102 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescription2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescription2KHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSubpassDescription2KHR")] [NativeName("AliasOf", "VkSubpassDescription2")] - public unsafe partial struct SubpassDescription2Khr : IChainStart + public unsafe partial struct SubpassDescription2KHR : IChainStart { - public SubpassDescription2Khr + public SubpassDescription2KHR ( StructureType? sType = StructureType.SubpassDescription2, void* pNext = null, @@ -187,10 +187,10 @@ unsafe BaseInStructure* IChainable.PNext ///
/// The newly created chain root /// A reference to the newly created chain. - public static unsafe ref SubpassDescription2Khr Chain( - out SubpassDescription2Khr capture) + public static unsafe ref SubpassDescription2KHR Chain( + out SubpassDescription2KHR capture) { - capture = new SubpassDescription2Khr(StructureType.SubpassDescription2); + capture = new SubpassDescription2KHR(StructureType.SubpassDescription2); return ref capture; } } diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescriptionDepthStencilResolve.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescriptionDepthStencilResolve.gen.cs index 02a0e2dcc6..2b5edc66cb 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescriptionDepthStencilResolve.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescriptionDepthStencilResolve.gen.cs @@ -18,7 +18,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSubpassDescriptionDepthStencilResolve")] [NativeName("Aliases", "VkSubpassDescriptionDepthStencilResolveKHR")] - public unsafe partial struct SubpassDescriptionDepthStencilResolve : IExtendsChain, IExtendsChain + public unsafe partial struct SubpassDescriptionDepthStencilResolve : IExtendsChain, IExtendsChain { public SubpassDescriptionDepthStencilResolve ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescriptionDepthStencilResolveKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescriptionDepthStencilResolveKHR.gen.cs index 5d3b50d7a7..97ddb65446 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescriptionDepthStencilResolveKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassDescriptionDepthStencilResolveKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSubpassDescriptionDepthStencilResolveKHR")] [NativeName("AliasOf", "VkSubpassDescriptionDepthStencilResolve")] - public unsafe partial struct SubpassDescriptionDepthStencilResolveKhr : IExtendsChain, IExtendsChain + public unsafe partial struct SubpassDescriptionDepthStencilResolveKHR : IExtendsChain, IExtendsChain { - public SubpassDescriptionDepthStencilResolveKhr + public SubpassDescriptionDepthStencilResolveKHR ( StructureType? sType = StructureType.SubpassDescriptionDepthStencilResolve, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassEndInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassEndInfoKHR.gen.cs index 5b41230431..4ff4eaf24c 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassEndInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/SubpassEndInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkSubpassEndInfoKHR")] [NativeName("AliasOf", "VkSubpassEndInfo")] - public unsafe partial struct SubpassEndInfoKhr : IChainable + public unsafe partial struct SubpassEndInfoKHR : IChainable { - public SubpassEndInfoKhr + public SubpassEndInfoKHR ( StructureType? sType = StructureType.SubpassEndInfo, void* pNext = null diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/TextureLODGatherFormatPropertiesAMD.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/TextureLODGatherFormatPropertiesAMD.gen.cs index 65c80a3729..32cfce2e42 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/TextureLODGatherFormatPropertiesAMD.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/TextureLODGatherFormatPropertiesAMD.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkTextureLODGatherFormatPropertiesAMD")] - public unsafe partial struct TextureLODGatherFormatPropertiesAMD : IExtendsChain, IExtendsChain + public unsafe partial struct TextureLODGatherFormatPropertiesAMD : IExtendsChain, IExtendsChain { public TextureLODGatherFormatPropertiesAMD ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/TimelineSemaphoreSubmitInfoKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/TimelineSemaphoreSubmitInfoKHR.gen.cs index c84206ae8c..72985fb017 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/TimelineSemaphoreSubmitInfoKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/TimelineSemaphoreSubmitInfoKHR.gen.cs @@ -18,9 +18,9 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkTimelineSemaphoreSubmitInfoKHR")] [NativeName("AliasOf", "VkTimelineSemaphoreSubmitInfo")] - public unsafe partial struct TimelineSemaphoreSubmitInfoKhr : IExtendsChain, IExtendsChain + public unsafe partial struct TimelineSemaphoreSubmitInfoKHR : IExtendsChain, IExtendsChain { - public TimelineSemaphoreSubmitInfoKhr + public TimelineSemaphoreSubmitInfoKHR ( StructureType? sType = StructureType.TimelineSemaphoreSubmitInfo, void* pNext = null, diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264ProfileEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264ProfileEXT.gen.cs index 4fd9e8c1df..babf192107 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264ProfileEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH264ProfileEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoDecodeH264ProfileEXT")] - public unsafe partial struct VideoDecodeH264ProfileEXT : IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct VideoDecodeH264ProfileEXT : IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain { public VideoDecodeH264ProfileEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265ProfileEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265ProfileEXT.gen.cs index bdc5595227..e21c5c1999 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265ProfileEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoDecodeH265ProfileEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoDecodeH265ProfileEXT")] - public unsafe partial struct VideoDecodeH265ProfileEXT : IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct VideoDecodeH265ProfileEXT : IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain { public VideoDecodeH265ProfileEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264ProfileEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264ProfileEXT.gen.cs index e4fe75e400..a060de1d98 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264ProfileEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH264ProfileEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeH264ProfileEXT")] - public unsafe partial struct VideoEncodeH264ProfileEXT : IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct VideoEncodeH264ProfileEXT : IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain { public VideoEncodeH264ProfileEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265ProfileEXT.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265ProfileEXT.gen.cs index 5056f7f09a..c91c92e7ef 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265ProfileEXT.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoEncodeH265ProfileEXT.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoEncodeH265ProfileEXT")] - public unsafe partial struct VideoEncodeH265ProfileEXT : IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct VideoEncodeH265ProfileEXT : IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain { public VideoEncodeH265ProfileEXT ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoProfileKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoProfileKHR.gen.cs index 856aa34115..787aeb18eb 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoProfileKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoProfileKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoProfileKHR")] - public unsafe partial struct VideoProfileKHR : IChainStart, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct VideoProfileKHR : IChainStart, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain { public VideoProfileKHR ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoProfilesKHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoProfilesKHR.gen.cs index 5cd225ef9d..e21ba70370 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoProfilesKHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoProfilesKHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoProfilesKHR")] - public unsafe partial struct VideoProfilesKHR : IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain + public unsafe partial struct VideoProfilesKHR : IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain, IExtendsChain { public VideoProfilesKHR ( diff --git a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoQueueFamilyProperties2KHR.gen.cs b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoQueueFamilyProperties2KHR.gen.cs index 01ba8a7724..552cd51a02 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Structs/VideoQueueFamilyProperties2KHR.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Structs/VideoQueueFamilyProperties2KHR.gen.cs @@ -17,7 +17,7 @@ namespace Silk.NET.Vulkan { [NativeName("Name", "VkVideoQueueFamilyProperties2KHR")] - public unsafe partial struct VideoQueueFamilyProperties2KHR : IExtendsChain, IExtendsChain + public unsafe partial struct VideoQueueFamilyProperties2KHR : IExtendsChain, IExtendsChain { public VideoQueueFamilyProperties2KHR ( From 66336d7523a5af6168bfa69a87c4526250f8ca9b Mon Sep 17 00:00:00 2001 From: Craig Dean Date: Tue, 9 Nov 2021 23:54:42 +0000 Subject: [PATCH 36/42] feat: Linked `PrototypeStructChaining` projects to implementation * Removed the manually generated code that is replaced by the auto-generated code now that it is implemented * Removed the solution. * Corrected namespace to `Silk.NET.Vulkan`. * Fixed issue clash of `System.Buffer` and `Silk.NET.Vulkan.Buffer`. --- .../TestChainMetadata.cs | 2 +- .../TestChains.cs | 6 +- .../TestCompilation.cs | 6 +- .../TestManagedChains.cs | 30 +- .../PrototypeStructChaining.sln | 22 - .../BaseInStructure.cs | 37 - .../{Chain.cs => ChainExtensions.cs} | 175 +---- .../DeviceCreateInfo.cs | 72 -- .../PrototypeStructChaining/IChainStart.cs | 10 - .../PrototypeStructChaining/IChainable.cs | 12 - .../PrototypeStructChaining/IExtendsChain.cs | 11 - .../IStructuredType.cs | 16 - .../ManagedChain.gen.cs | 94 +-- .../ManagedChain.gen.tt | 8 +- ...lDeviceAccelerationStructureFeaturesKhr.cs | 50 -- ...hysicalDeviceDescriptorIndexingFeatures.cs | 50 -- .../PhysicalDeviceFeatures.cs | 19 - .../PhysicalDeviceFeatures2.cs | 54 -- .../PrototypeStructChaining.csproj | 4 + .../PrototypeStructChaining/StructureType.cs | 704 ------------------ 20 files changed, 81 insertions(+), 1301 deletions(-) delete mode 100644 src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.sln delete mode 100644 src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/BaseInStructure.cs rename src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/{Chain.cs => ChainExtensions.cs} (61%) delete mode 100644 src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/DeviceCreateInfo.cs delete mode 100644 src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IChainStart.cs delete mode 100644 src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IChainable.cs delete mode 100644 src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IExtendsChain.cs delete mode 100644 src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IStructuredType.cs delete mode 100644 src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceAccelerationStructureFeaturesKhr.cs delete mode 100644 src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceDescriptorIndexingFeatures.cs delete mode 100644 src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceFeatures.cs delete mode 100644 src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceFeatures2.cs delete mode 100644 src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/StructureType.cs diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChainMetadata.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChainMetadata.cs index f823b0bdf5..9e3c26a1f4 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChainMetadata.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChainMetadata.cs @@ -1,6 +1,6 @@ using System; using System.Linq; -using Silk.Net.Vulkan; +using Silk.NET.Vulkan; using Xunit; namespace PrototypeStructChaining.Test; diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChains.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChains.cs index 45c1e5b66d..40f1d40ce3 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChains.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChains.cs @@ -1,4 +1,4 @@ -using Silk.Net.Vulkan; +using Silk.NET.Vulkan; using Xunit; namespace PrototypeStructChaining.Test; @@ -14,7 +14,7 @@ public unsafe void TestAddNext() // AddNext will create an empty struct, with the correct SType (as well as ensuring the // chain's SType is coerced correctly. .AddNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures) - .AddNext(out PhysicalDeviceAccelerationStructureFeaturesKhr accelerationStructureFeaturesKhr); + .AddNext(out PhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeaturesKhr); // Ensure all pointers set correctly Assert.Equal((nint) (&indexingFeatures), (nint) features2.PNext); @@ -63,7 +63,7 @@ public unsafe void TestSetNext() { ShaderInputAttachmentArrayDynamicIndexing = true }; - var accelerationStructureFeaturesKhr = new PhysicalDeviceAccelerationStructureFeaturesKhr + var accelerationStructureFeaturesKhr = new PhysicalDeviceAccelerationStructureFeaturesKHR { AccelerationStructure = true }; diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestCompilation.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestCompilation.cs index abf2e22595..0f73e2b8e3 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestCompilation.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestCompilation.cs @@ -6,7 +6,7 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.Emit; -using Silk.Net.Vulkan; +using Silk.NET.Vulkan; using Xunit; namespace PrototypeStructChaining.Test; @@ -25,7 +25,7 @@ public class TestCompilation private static readonly string CodeTemplate = @" using System; -using Silk.Net.Vulkan; +using Silk.NET.Vulkan; public class Test {{ @@ -75,7 +75,7 @@ public void TestCantAddUnsupportedNext() Assert.Single(diagnostics); var error = diagnostics.First(); - // error CS0315: The type 'Silk.Net.Vulkan.PhysicalDeviceFeatures2' cannot be used as type parameter 'TChain' in the generic type or method 'Chain.AddNext(ref TChain, out TNext)'. There is no boxing conversion from 'Silk.Net.Vulkan.PhysicalDeviceFeatures2' to 'Silk.Net.Vulkan.IChainable'. + // error CS0315: The type 'Silk.NET.Vulkan.PhysicalDeviceFeatures2' cannot be used as type parameter 'TChain' in the generic type or method 'Chain.AddNext(ref TChain, out TNext)'. There is no boxing conversion from 'Silk.NET.Vulkan.PhysicalDeviceFeatures2' to 'Silk.NET.Vulkan.IChainable'. Assert.Equal("CS0315", error.Id); } diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestManagedChains.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestManagedChains.cs index e1504b67d3..2c7f37d5ec 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestManagedChains.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestManagedChains.cs @@ -1,6 +1,6 @@ using System; using System.Linq; -using Silk.Net.Vulkan; +using Silk.NET.Vulkan; using Xunit; namespace PrototypeStructChaining.Test; @@ -11,7 +11,7 @@ public class TestManagedChains public unsafe void TestManagedChain() { using var chain = new ManagedChain(); + PhysicalDeviceAccelerationStructureFeaturesKHR>(); // Ensure all STypes set correctly Assert.Equal(StructureType.PhysicalDeviceFeatures2, chain.Head.SType); @@ -63,7 +63,7 @@ public unsafe void TestManagedChainReplaceHead() public unsafe void TestManagedChainReplaceMiddle() { using var chain = new ManagedChain + PhysicalDeviceAccelerationStructureFeaturesKHR> ( item1: new PhysicalDeviceDescriptorIndexingFeatures { @@ -163,7 +163,7 @@ public unsafe void TestManagedChainAppend() // Check flag set Assert.True(chain.Item1.ShaderInputAttachmentArrayDynamicIndexing); - using var newChain = chain.Append(); + using var newChain = chain.Append(); // Ensure all STypes set correctly Assert.Equal(StructureType.PhysicalDeviceFeatures2, newChain.Head.SType); @@ -190,9 +190,9 @@ public unsafe void TestManagedChainTruncate() ManagedChain.Create< PhysicalDeviceFeatures2, PhysicalDeviceDescriptorIndexingFeatures, - PhysicalDeviceAccelerationStructureFeaturesKhr> + PhysicalDeviceAccelerationStructureFeaturesKHR> ( - item2: new PhysicalDeviceAccelerationStructureFeaturesKhr + item2: new PhysicalDeviceAccelerationStructureFeaturesKHR {AccelerationStructure = true} ); @@ -240,12 +240,12 @@ public unsafe void TestManagedChainLoad() PhysicalDeviceFeatures2 .Chain(out var unmanagedChain) .SetNext(ref indexingFeatures) - .AddNext(out PhysicalDeviceAccelerationStructureFeaturesKhr accelerationStructureFeaturesKhr); + .AddNext(out PhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeaturesKhr); // Loads a new managed chain from an unmanaged chain using var managedChain = new ManagedChain(out var errors, unmanagedChain); + PhysicalDeviceAccelerationStructureFeaturesKHR>(out var errors, unmanagedChain); // Check we had no loading errors Assert.Equal("", errors); @@ -276,16 +276,16 @@ public void TestManagedChainLoadWithError() .Chain(out var unmanagedChain) .AddNext(out PhysicalDeviceFeatures2 features2) .SetNext(ref indexingFeatures) - .AddNext(out PhysicalDeviceAccelerationStructureFeaturesKhr accelerationStructureFeaturesKhr); + .AddNext(out PhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeaturesKhr); // Loads a new managed chain from an unmanaged chain using var managedChain = ManagedChain.Load< DeviceCreateInfo, // Note we are supplied a PhysicalDeviceFeatures2 here from the unmanaged chain - PhysicalDeviceAccelerationStructureFeaturesKhr, + PhysicalDeviceAccelerationStructureFeaturesKHR, PhysicalDeviceDescriptorIndexingFeatures, - PhysicalDeviceAccelerationStructureFeaturesKhr, + PhysicalDeviceAccelerationStructureFeaturesKHR, // Note that the unmanaged chain did not supply a 5th entry PhysicalDeviceFeatures2>(out var errors, unmanagedChain); @@ -312,7 +312,7 @@ public void TestManagedChainLoadWithErrorTooLong() .Chain(out var unmanagedChain) .AddNext(out PhysicalDeviceFeatures2 features2) .SetNext(ref indexingFeatures) - .AddNext(out PhysicalDeviceAccelerationStructureFeaturesKhr accelerationStructureFeaturesKhr); + .AddNext(out PhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeaturesKhr); // Try loading a shorter managed chain using var managedChain = @@ -332,7 +332,7 @@ public void TestManagedChainLoadWithErrorTooLong() public void TestReadOnlyList() { using var chain = new ManagedChain(); + PhysicalDeviceAccelerationStructureFeaturesKHR>(); Assert.Equal(3, chain.Count); @@ -349,14 +349,14 @@ public void TestReadOnlyList() // Check concrete types Assert.IsType(structures[0]); Assert.IsType(structures[1]); - Assert.IsType(structures[2]); + Assert.IsType(structures[2]); } [Fact] public void TestDeconstructor() { using var chain = new ManagedChain(); + PhysicalDeviceAccelerationStructureFeaturesKHR>(); var (physicalDeviceFeatures2, indexingFeatures, accelerationStructureFeaturesKhr) = chain; diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.sln b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.sln deleted file mode 100644 index 5ffbdc6a72..0000000000 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.sln +++ /dev/null @@ -1,22 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PrototypeStructChaining", "PrototypeStructChaining\PrototypeStructChaining.csproj", "{6EF16790-8E4E-44F1-87D6-272A85B4ACA5}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PrototypeStructChaining.Test", "PrototypeStructChaining.Test\PrototypeStructChaining.Test.csproj", "{29BBBD86-81DD-4A28-BABD-0B2BD37F928B}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {6EF16790-8E4E-44F1-87D6-272A85B4ACA5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6EF16790-8E4E-44F1-87D6-272A85B4ACA5}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6EF16790-8E4E-44F1-87D6-272A85B4ACA5}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6EF16790-8E4E-44F1-87D6-272A85B4ACA5}.Release|Any CPU.Build.0 = Release|Any CPU - {29BBBD86-81DD-4A28-BABD-0B2BD37F928B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {29BBBD86-81DD-4A28-BABD-0B2BD37F928B}.Debug|Any CPU.Build.0 = Debug|Any CPU - {29BBBD86-81DD-4A28-BABD-0B2BD37F928B}.Release|Any CPU.ActiveCfg = Release|Any CPU - {29BBBD86-81DD-4A28-BABD-0B2BD37F928B}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection -EndGlobal diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/BaseInStructure.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/BaseInStructure.cs deleted file mode 100644 index dee01f2685..0000000000 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/BaseInStructure.cs +++ /dev/null @@ -1,37 +0,0 @@ -namespace Silk.Net.Vulkan; - -/// -/// Header struct of all structs. -/// -/// -/// Any pointer to a structure marked as can safely be cast to a pointer to this type. -/// In particular, this means that the void* PNext field can always be safely cast to BaseInStructure*, providing -/// access to the `SType` and `PNext` fields. -/// -/// -public struct BaseInStructure : IChainable -{ - /// - /// The structure type. - /// - public StructureType SType; - - /// - /// The next struct in the chain, if any; otherwise . - /// - public unsafe void* PNext; - - /// - /// Note, this cannot coerce the type as 'guaranteed by the `IStructuredType` interface. - StructureType IStructuredType.StructureType() - { - return SType; - } - - /// - unsafe BaseInStructure* IChainable.PNext - { - get => (BaseInStructure*) PNext; - set => PNext = value; - } -} diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/Chain.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ChainExtensions.cs similarity index 61% rename from src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/Chain.cs rename to src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ChainExtensions.cs index 75106005dc..7e04700100 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/Chain.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ChainExtensions.cs @@ -1,176 +1,9 @@ using System.Runtime.CompilerServices; -namespace Silk.Net.Vulkan; +namespace Silk.NET.Vulkan; -public static class Chain +public static class ChainExtensions { - /// - /// Replaces a structure in the chain (if present, and is false), or adds it to the end. - /// - /// The current chain - /// A reference to the structure to update - /// Always adds to the end of the chain, even if an equivalent structure is present. - /// The type of the current chain - /// The type of the value - /// A reference to the value value in the chain - /// - /// Note that both the supplied chain, and the supplied value will have their `SType` correctly set. Further, - /// the supplied structure's will be overwritten. - /// To use - /// - /// var indexingFeatures = new PhysicalDeviceDescriptorIndexingFeatures - /// { - /// ShaderInputAttachmentArrayDynamicIndexing = true - /// }; - /// var accelerationStructureFeaturesKhr = new PhysicalDeviceAccelerationStructureFeaturesKhr - /// { - /// AccelerationStructure = true - /// }; - /// - /// PhysicalDeviceFeatures2 - /// .BaseInStructure(out var features2) - /// .SetNext(ref indexingFeatures) - /// .SetNext(ref accelerationStructureFeaturesKhr); - /// - /// - public static unsafe ref TChain SetNext - ( - this ref TChain chain, - ref TNext value, - bool alwaysAdd = false - ) - where TChain : struct, IChainStart - where TNext : struct, IExtendsChain - { - // Ensure structure type of chain and value are set. - chain.StructureType(); - var structureType = value.StructureType(); - - // Find end of chain - var previousPtr = (BaseInStructure*) null; - var currentPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); - var valuePtr = (BaseInStructure*) Unsafe.AsPointer(ref value); - do - { - var nextPtr = currentPtr->PNext; - if (!alwaysAdd && currentPtr->SType == structureType) - { - // We have an existing structure, replace it. - if (previousPtr is not null) - { - previousPtr->PNext = valuePtr; - } - - valuePtr->PNext = nextPtr; - - return ref chain; - } - - previousPtr = currentPtr; - currentPtr = (BaseInStructure*) nextPtr; - } while (currentPtr is not null); - - // Add value to end of chain - previousPtr->PNext = valuePtr; - valuePtr->PNext = null; - - return ref chain; - } - - /// - /// Adds a structure to the end of the chain. - /// - /// The current chain - /// The structure added to the end of the chain - /// The type of the current chain - /// The type of the structure to add - /// The reference to the chain. - /// - /// Note that both the supplied chain, and the added structure will have their `SType` correctly set - /// To use specify the output type required, e.g.: - /// - /// PhysicalDeviceFeatures2 - /// .BaseInStructure(out var features2) - /// .AddNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures) - /// .AddNext(out PhysicalDeviceAccelerationStructureFeaturesKhr accelerationStructureFeaturesKhr); - /// - /// Note, the value is always added, even if an equivalent value is added in the chain already. Use - /// to only add if not already present. - /// - public static unsafe ref TChain AddNext(this ref TChain chain, out TNext next) - where TChain : struct, IChainStart - where TNext : struct, IExtendsChain - { - // Ensure structure type of chain is set. - chain.StructureType(); - - // Find end of chain - var currentPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); - while (currentPtr->PNext is not null) - { - currentPtr = (BaseInStructure*) currentPtr->PNext; - } - - // Create new entry and set it's structure type - next = default; - next.StructureType(); - currentPtr->PNext = (BaseInStructure*) Unsafe.AsPointer(ref next); - return ref chain; - } - - /// - /// Tries to add a structure to the end of the chain. - /// - /// The current chain - /// The structure added to the end of the chain - /// Whether the structure was actually added - /// The type of the current chain - /// The type of the structure to add - /// The reference to the chain. - /// - /// Note that both the supplied chain, and the added structure will have their `SType` correctly set - /// To use specify the output type required, e.g.: - /// - /// PhysicalDeviceFeatures2 - /// .BaseInStructure(out var features2) - /// .TryAddNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures, out var added); - /// - /// - public static unsafe ref TChain TryAddNext(this ref TChain chain, out TNext next, out bool added) - where TChain : struct, IChainStart - where TNext : struct, IExtendsChain - { - // Ensure structure type of chain is set. - chain.StructureType(); - - // Create new entry and get it's structure type - next = default; - var structureType = next.StructureType(); - - // Follow chain - var currentPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); - do - { - if (currentPtr->SType == structureType) - { - added = false; - return ref chain; - } - - var nextPtr = currentPtr->PNext; - if (nextPtr is null) - { - break; - } - - currentPtr = (BaseInStructure*) nextPtr; - } while (true); - - currentPtr->PNext = (BaseInStructure*) Unsafe.AsPointer(ref next); - added = true; - return ref chain; - } - /// /// Provides a set of all the s that can be extended by a . /// @@ -223,7 +56,7 @@ public static unsafe ref TChain TryAddNext(this ref TChain chain, [Vulkan.StructureType.PhysicalDeviceDescriptorIndexingFeatures] = typeof(PhysicalDeviceDescriptorIndexingFeatures), [Vulkan.StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr] = - typeof(PhysicalDeviceAccelerationStructureFeaturesKhr) + typeof(PhysicalDeviceAccelerationStructureFeaturesKHR) }; /// @@ -236,7 +69,7 @@ public static unsafe ref TChain TryAddNext(this ref TChain chain, [typeof(PhysicalDeviceFeatures2)] = Vulkan.StructureType.PhysicalDeviceFeatures2, [typeof(PhysicalDeviceDescriptorIndexingFeatures)] = Vulkan.StructureType.PhysicalDeviceDescriptorIndexingFeatures, - [typeof(PhysicalDeviceAccelerationStructureFeaturesKhr)] = + [typeof(PhysicalDeviceAccelerationStructureFeaturesKHR)] = Vulkan.StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr }; diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/DeviceCreateInfo.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/DeviceCreateInfo.cs deleted file mode 100644 index 3f6a136559..0000000000 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/DeviceCreateInfo.cs +++ /dev/null @@ -1,72 +0,0 @@ -namespace Silk.Net.Vulkan; - -public struct DeviceCreateInfo : IChainStart -{ - /// - public StructureType SType; - - /// - public unsafe void* PNext; - - /// - public uint Flags; - - // NOTE Truncated for example - - - public unsafe DeviceCreateInfo - ( - StructureType? sType = StructureType.DeviceCreateInfo, - void* pNext = null, - uint? flags = null - ) - : this() - { - if (sType.HasValue) - { - SType = sType.Value; - } - - if ((IntPtr) pNext != IntPtr.Zero) - { - PNext = pNext; - } - - if (flags.HasValue) - { - Flags = flags.Value; - } - // NOTE Truncated for example - } - - #region Chaining Support - - /// - /// Convenience method to start a chain. - /// - /// The newly created chain root - /// A reference to the newly created chain. - public static unsafe ref DeviceCreateInfo Chain - ( - out DeviceCreateInfo capture - ) - { - capture = new DeviceCreateInfo(StructureType.DeviceCreateInfo); - return ref capture; - } - - /// - StructureType IStructuredType.StructureType() - { - return SType = StructureType.DeviceCreateInfo; - } - - /// - unsafe BaseInStructure* IChainable.PNext - { - get => (BaseInStructure*) PNext; - set => PNext = value; - } - - #endregion -} diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IChainStart.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IChainStart.cs deleted file mode 100644 index 867d9d658a..0000000000 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IChainStart.cs +++ /dev/null @@ -1,10 +0,0 @@ -namespace Silk.Net.Vulkan; - -/// -/// Marks a chainable struct as being allowed at the start of a chain. -/// -/// Any will have a corresponding static `BaseInStructure(out var chain)` -/// convenience method. -public interface IChainStart : IChainable -{ -} diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IChainable.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IChainable.cs deleted file mode 100644 index 9b47ca507c..0000000000 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IChainable.cs +++ /dev/null @@ -1,12 +0,0 @@ -namespace Silk.Net.Vulkan; - -/// -/// Base interface for any struct that has can set the next value. -/// -/// Note that any structure marked must start with a -/// and a void* field, in that order. This is so that a pointer to it can be coerced -/// to a pointer to a . -public interface IChainable : IStructuredType -{ - unsafe BaseInStructure* PNext { get; set; } -} diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IExtendsChain.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IExtendsChain.cs deleted file mode 100644 index 5ef0a4ad99..0000000000 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IExtendsChain.cs +++ /dev/null @@ -1,11 +0,0 @@ -namespace Silk.Net.Vulkan; - -/// -/// Marks a chainable struct indicating which chain this type -/// extends. -/// -/// A chain start structure. -public interface IExtendsChain : IChainable - where TChain : IChainable -{ -} diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IStructuredType.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IStructuredType.cs deleted file mode 100644 index f34ad05399..0000000000 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IStructuredType.cs +++ /dev/null @@ -1,16 +0,0 @@ -namespace Silk.Net.Vulkan; - -/// -/// Base interface for any struct that has a field called `SType`, that must be correctly -/// set when passing into the Vulkan API. -/// -public interface IStructuredType -{ - /// - /// Gets the structured type's enum value. - /// - /// - /// Retrieving the also ensures it is set to the correct value. - /// - StructureType StructureType(); -} diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.cs index ae81ec1995..383df64c1d 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.cs @@ -4,7 +4,7 @@ using System.Runtime.InteropServices; using System.Text; -namespace Silk.Net.Vulkan; +namespace Silk.NET.Vulkan; /// /// Static class for creating Managed Chains. @@ -1292,7 +1292,7 @@ public ManagedChain Duplicate() { var newHeadPtr = Marshal.AllocHGlobal(MemorySize); // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); + System.Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); return new ManagedChain(newHeadPtr); } @@ -1508,7 +1508,7 @@ public ManagedChain Duplicate() { var newHeadPtr = Marshal.AllocHGlobal(MemorySize); // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); + System.Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); // Update all pointers ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); return new ManagedChain(newHeadPtr); @@ -1528,7 +1528,7 @@ public ManagedChain(ManagedChain previous, T1 item1 = default) { var previousSize = MemorySize - Item1Size; // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); + System.Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); // Append item 1 item1.StructureType(); @@ -1565,7 +1565,7 @@ public ManagedChain Truncate(out T1 item1) var newSize = MemorySize - Item1Size; var newHeadPtr = Marshal.AllocHGlobal(newSize); // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); + System.Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); // Update all pointers ((BaseInStructure*)newHeadPtr)->PNext = null; return new ManagedChain(newHeadPtr); @@ -1847,7 +1847,7 @@ public ManagedChain Duplicate() { var newHeadPtr = Marshal.AllocHGlobal(MemorySize); // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); + System.Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); // Update all pointers ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); @@ -1868,7 +1868,7 @@ public ManagedChain(ManagedChain previous, T2 item2 = default) { var previousSize = MemorySize - Item2Size; // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); + System.Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); // Append item 2 item2.StructureType(); @@ -1906,7 +1906,7 @@ public ManagedChain Truncate(out T2 item2) var newSize = MemorySize - Item2Size; var newHeadPtr = Marshal.AllocHGlobal(newSize); // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); + System.Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); // Update all pointers ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = null; @@ -2253,7 +2253,7 @@ public ManagedChain Duplicate() { var newHeadPtr = Marshal.AllocHGlobal(MemorySize); // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); + System.Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); // Update all pointers ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); @@ -2275,7 +2275,7 @@ public ManagedChain(ManagedChain previous, T3 item3 = default) { var previousSize = MemorySize - Item3Size; // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); + System.Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); // Append item 3 item3.StructureType(); @@ -2314,7 +2314,7 @@ public ManagedChain Truncate(out T3 item3) var newSize = MemorySize - Item3Size; var newHeadPtr = Marshal.AllocHGlobal(newSize); // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); + System.Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); // Update all pointers ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); @@ -2726,7 +2726,7 @@ public ManagedChain Duplicate() { var newHeadPtr = Marshal.AllocHGlobal(MemorySize); // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); + System.Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); // Update all pointers ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); @@ -2749,7 +2749,7 @@ public ManagedChain(ManagedChain previous, T4 item4 = defaul { var previousSize = MemorySize - Item4Size; // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); + System.Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); // Append item 4 item4.StructureType(); @@ -2789,7 +2789,7 @@ public ManagedChain Truncate(out T4 item4) var newSize = MemorySize - Item4Size; var newHeadPtr = Marshal.AllocHGlobal(newSize); // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); + System.Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); // Update all pointers ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); @@ -3266,7 +3266,7 @@ public ManagedChain Duplicate() { var newHeadPtr = Marshal.AllocHGlobal(MemorySize); // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); + System.Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); // Update all pointers ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); @@ -3290,7 +3290,7 @@ public ManagedChain(ManagedChain previous, T5 item5 = de { var previousSize = MemorySize - Item5Size; // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); + System.Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); // Append item 5 item5.StructureType(); @@ -3331,7 +3331,7 @@ public ManagedChain Truncate(out T5 item5) var newSize = MemorySize - Item5Size; var newHeadPtr = Marshal.AllocHGlobal(newSize); // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); + System.Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); // Update all pointers ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); @@ -3873,7 +3873,7 @@ public ManagedChain Duplicate() { var newHeadPtr = Marshal.AllocHGlobal(MemorySize); // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); + System.Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); // Update all pointers ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); @@ -3898,7 +3898,7 @@ public ManagedChain(ManagedChain previous, T6 item6 { var previousSize = MemorySize - Item6Size; // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); + System.Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); // Append item 6 item6.StructureType(); @@ -3940,7 +3940,7 @@ public ManagedChain Truncate(out T6 item6) var newSize = MemorySize - Item6Size; var newHeadPtr = Marshal.AllocHGlobal(newSize); // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); + System.Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); // Update all pointers ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); @@ -4547,7 +4547,7 @@ public ManagedChain Duplicate() { var newHeadPtr = Marshal.AllocHGlobal(MemorySize); // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); + System.Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); // Update all pointers ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); @@ -4573,7 +4573,7 @@ public ManagedChain(ManagedChain previous, T7 it { var previousSize = MemorySize - Item7Size; // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); + System.Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); // Append item 7 item7.StructureType(); @@ -4616,7 +4616,7 @@ public ManagedChain Truncate(out T7 item7) var newSize = MemorySize - Item7Size; var newHeadPtr = Marshal.AllocHGlobal(newSize); // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); + System.Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); // Update all pointers ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); @@ -5288,7 +5288,7 @@ public ManagedChain Duplicate() { var newHeadPtr = Marshal.AllocHGlobal(MemorySize); // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); + System.Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); // Update all pointers ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); @@ -5315,7 +5315,7 @@ public ManagedChain(ManagedChain previous, T { var previousSize = MemorySize - Item8Size; // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); + System.Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); // Append item 8 item8.StructureType(); @@ -5359,7 +5359,7 @@ public ManagedChain Truncate(out T8 item8) var newSize = MemorySize - Item8Size; var newHeadPtr = Marshal.AllocHGlobal(newSize); // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); + System.Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); // Update all pointers ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); @@ -6096,7 +6096,7 @@ public ManagedChain Duplicate() { var newHeadPtr = Marshal.AllocHGlobal(MemorySize); // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); + System.Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); // Update all pointers ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); @@ -6124,7 +6124,7 @@ public ManagedChain(ManagedChain previou { var previousSize = MemorySize - Item9Size; // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); + System.Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); // Append item 9 item9.StructureType(); @@ -6169,7 +6169,7 @@ public ManagedChain Truncate(out T9 item var newSize = MemorySize - Item9Size; var newHeadPtr = Marshal.AllocHGlobal(newSize); // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); + System.Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); // Update all pointers ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); @@ -6971,7 +6971,7 @@ public ManagedChain Duplicate() { var newHeadPtr = Marshal.AllocHGlobal(MemorySize); // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); + System.Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); // Update all pointers ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); @@ -7000,7 +7000,7 @@ public ManagedChain(ManagedChain pre { var previousSize = MemorySize - Item10Size; // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); + System.Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); // Append item 10 item10.StructureType(); @@ -7046,7 +7046,7 @@ public ManagedChain Truncate(out T10 var newSize = MemorySize - Item10Size; var newHeadPtr = Marshal.AllocHGlobal(newSize); // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); + System.Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); // Update all pointers ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); @@ -7913,7 +7913,7 @@ public ManagedChain Duplic { var newHeadPtr = Marshal.AllocHGlobal(MemorySize); // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); + System.Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); // Update all pointers ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); @@ -7943,7 +7943,7 @@ public ManagedChain(ManagedChain Truncate(ou var newSize = MemorySize - Item11Size; var newHeadPtr = Marshal.AllocHGlobal(newSize); // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); + System.Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); // Update all pointers ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); @@ -8922,7 +8922,7 @@ public ManagedChain D { var newHeadPtr = Marshal.AllocHGlobal(MemorySize); // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); + System.Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); // Update all pointers ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); @@ -8953,7 +8953,7 @@ public ManagedChain(ManagedChain Trunca var newSize = MemorySize - Item12Size; var newHeadPtr = Marshal.AllocHGlobal(newSize); // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); + System.Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); // Update all pointers ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); @@ -9998,7 +9998,7 @@ public ManagedChainPNext = (BaseInStructure*) (newHeadPtr + Item1Offset); ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); @@ -10030,7 +10030,7 @@ public ManagedChain(ManagedChain T var newSize = MemorySize - Item13Size; var newHeadPtr = Marshal.AllocHGlobal(newSize); // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); + System.Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); // Update all pointers ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); @@ -11141,7 +11141,7 @@ public ManagedChainPNext = (BaseInStructure*) (newHeadPtr + Item1Offset); ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); @@ -11174,7 +11174,7 @@ public ManagedChain(ManagedChainPNext = (BaseInStructure*) (newHeadPtr + Item1Offset); ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); @@ -12351,7 +12351,7 @@ public ManagedChainPNext = (BaseInStructure*) (newHeadPtr + Item1Offset); ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); @@ -12385,7 +12385,7 @@ public ManagedChain(ManagedChainPNext = (BaseInStructure*) (newHeadPtr + Item1Offset); ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.tt b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.tt index 7b072af330..593977b051 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.tt +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.tt @@ -100,7 +100,7 @@ using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Text; -namespace Silk.Net.Vulkan; +namespace Silk.NET.Vulkan; /// /// Static class for creating Managed Chains. @@ -374,7 +374,7 @@ public unsafe class ManagedChain<<#= tList #>> : ManagedChain { var newHeadPtr = Marshal.AllocHGlobal(MemorySize); // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); + System.Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); <# if (i > 1) { @@ -414,7 +414,7 @@ public unsafe class ManagedChain<<#= tList #>> : ManagedChain { var previousSize = MemorySize - Item<#= i - 1 #>Size; // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); + System.Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); // Append item <#= i - 1 #> item<#= i - 1 #>.StructureType(); @@ -459,7 +459,7 @@ public unsafe class ManagedChain<<#= tList #>> : ManagedChain var newSize = MemorySize - Item<#= i - 1 #>Size; var newHeadPtr = Marshal.AllocHGlobal(newSize); // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); + System.Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); // Update all pointers <# if (i > 2) diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceAccelerationStructureFeaturesKhr.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceAccelerationStructureFeaturesKhr.cs deleted file mode 100644 index c642f30156..0000000000 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceAccelerationStructureFeaturesKhr.cs +++ /dev/null @@ -1,50 +0,0 @@ -namespace Silk.Net.Vulkan; - -public struct PhysicalDeviceAccelerationStructureFeaturesKhr : - IExtendsChain, - IExtendsChain -{ - /// - public StructureType SType; - - /// - public unsafe void* PNext; - - /// - public bool AccelerationStructure; - - // NOTE Truncated for example - - public unsafe PhysicalDeviceAccelerationStructureFeaturesKhr( - StructureType? sType = StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr, - void* pNext = null, - bool? accelerationStructure = null) - : this() - { - if (sType.HasValue) - SType = sType.Value; - if ((IntPtr) pNext != IntPtr.Zero) - PNext = pNext; - if (accelerationStructure.HasValue) - AccelerationStructure = accelerationStructure.Value; - - // NOTE Truncated for example - } - - #region Chaining Support - - /// - StructureType IStructuredType.StructureType() - { - return SType = StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr; - } - - /// - unsafe BaseInStructure* IChainable.PNext - { - get => (BaseInStructure*) PNext; - set => PNext = value; - } - - #endregion -} \ No newline at end of file diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceDescriptorIndexingFeatures.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceDescriptorIndexingFeatures.cs deleted file mode 100644 index f370c44dc0..0000000000 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceDescriptorIndexingFeatures.cs +++ /dev/null @@ -1,50 +0,0 @@ -namespace Silk.Net.Vulkan; - -public struct PhysicalDeviceDescriptorIndexingFeatures : - IExtendsChain, - IExtendsChain -{ - /// - public StructureType SType; - - /// - public unsafe void* PNext; - - /// - public bool ShaderInputAttachmentArrayDynamicIndexing; - - // NOTE Truncated for example - - public unsafe PhysicalDeviceDescriptorIndexingFeatures( - StructureType? sType = StructureType.PhysicalDeviceDescriptorIndexingFeaturesExt, - void* pNext = null, - bool? shaderInputAttachmentArrayDynamicIndexing = null) - : this() - { - if (sType.HasValue) - SType = sType.Value; - if ((IntPtr) pNext != IntPtr.Zero) - PNext = pNext; - if (shaderInputAttachmentArrayDynamicIndexing.HasValue) - ShaderInputAttachmentArrayDynamicIndexing = shaderInputAttachmentArrayDynamicIndexing.Value; - - // NOTE Truncated for example - } - - #region Chaining Support - - /// - StructureType IStructuredType.StructureType() - { - return SType = StructureType.PhysicalDeviceDescriptorIndexingFeaturesExt; - } - - /// - unsafe BaseInStructure* IChainable.PNext - { - get => (BaseInStructure*) PNext; - set => PNext = value; - } - - #endregion -} \ No newline at end of file diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceFeatures.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceFeatures.cs deleted file mode 100644 index d38a0d2e30..0000000000 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceFeatures.cs +++ /dev/null @@ -1,19 +0,0 @@ -namespace Silk.Net.Vulkan; - -public struct PhysicalDeviceFeatures -{ - /// - public bool RobustBufferAccess; - - // NOTE Truncated for example - - public PhysicalDeviceFeatures( - bool? robustBufferAccess = null) - : this() - { - if (robustBufferAccess.HasValue) - RobustBufferAccess = robustBufferAccess.Value; - - // NOTE Truncated for example - } -} \ No newline at end of file diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceFeatures2.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceFeatures2.cs deleted file mode 100644 index 0f3bc822ff..0000000000 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceFeatures2.cs +++ /dev/null @@ -1,54 +0,0 @@ -namespace Silk.Net.Vulkan; - -public struct PhysicalDeviceFeatures2 : - IChainStart, - IExtendsChain -{ - public StructureType SType; - public unsafe void* PNext; - public PhysicalDeviceFeatures Features; - - public unsafe PhysicalDeviceFeatures2( - StructureType? sType = StructureType.PhysicalDeviceFeatures2, - void* pNext = null, - PhysicalDeviceFeatures? features = null) - : this() - { - if (sType.HasValue) - SType = sType.Value; - if ((IntPtr) pNext != IntPtr.Zero) - PNext = pNext; - if (!features.HasValue) - return; - Features = features.Value; - } - - #region Chaining Support - - /// - /// Convenience method to start a chain. - /// - /// The newly created chain root - /// A reference to the newly created chain. - public static unsafe ref PhysicalDeviceFeatures2 Chain( - out PhysicalDeviceFeatures2 capture) - { - capture = new PhysicalDeviceFeatures2(StructureType.PhysicalDeviceFeatures2); - return ref capture; - } - - /// - StructureType IStructuredType.StructureType() - { - return SType = StructureType.PhysicalDeviceFeatures2; - } - - /// - unsafe BaseInStructure* IChainable.PNext - { - get => (BaseInStructure*) PNext; - set => PNext = value; - } - - #endregion -} \ No newline at end of file diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PrototypeStructChaining.csproj b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PrototypeStructChaining.csproj index 79d8733662..c77aa52052 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PrototypeStructChaining.csproj +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PrototypeStructChaining.csproj @@ -26,6 +26,10 @@ + + + + True diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/StructureType.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/StructureType.cs deleted file mode 100644 index 28a3e988f7..0000000000 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/StructureType.cs +++ /dev/null @@ -1,704 +0,0 @@ -namespace Silk.Net.Vulkan; - -public enum StructureType -{ - ApplicationInfo = 0, - InstanceCreateInfo = 1, - DeviceQueueCreateInfo = 2, - DeviceCreateInfo = 3, - SubmitInfo = 4, - MemoryAllocateInfo = 5, - MappedMemoryRange = 6, - BindSparseInfo = 7, - FenceCreateInfo = 8, - SemaphoreCreateInfo = 9, - EventCreateInfo = 10, // 0x0000000A - QueryPoolCreateInfo = 11, // 0x0000000B - BufferCreateInfo = 12, // 0x0000000C - BufferViewCreateInfo = 13, // 0x0000000D - ImageCreateInfo = 14, // 0x0000000E - ImageViewCreateInfo = 15, // 0x0000000F - ShaderModuleCreateInfo = 16, // 0x00000010 - PipelineCacheCreateInfo = 17, // 0x00000011 - PipelineShaderStageCreateInfo = 18, // 0x00000012 - PipelineVertexInputStateCreateInfo = 19, // 0x00000013 - PipelineInputAssemblyStateCreateInfo = 20, // 0x00000014 - PipelineTessellationStateCreateInfo = 21, // 0x00000015 - PipelineViewportStateCreateInfo = 22, // 0x00000016 - PipelineRasterizationStateCreateInfo = 23, // 0x00000017 - PipelineMultisampleStateCreateInfo = 24, // 0x00000018 - PipelineDepthStencilStateCreateInfo = 25, // 0x00000019 - PipelineColorBlendStateCreateInfo = 26, // 0x0000001A - PipelineDynamicStateCreateInfo = 27, // 0x0000001B - GraphicsPipelineCreateInfo = 28, // 0x0000001C - ComputePipelineCreateInfo = 29, // 0x0000001D - PipelineLayoutCreateInfo = 30, // 0x0000001E - SamplerCreateInfo = 31, // 0x0000001F - DescriptorSetLayoutCreateInfo = 32, // 0x00000020 - DescriptorPoolCreateInfo = 33, // 0x00000021 - DescriptorSetAllocateInfo = 34, // 0x00000022 - WriteDescriptorSet = 35, // 0x00000023 - CopyDescriptorSet = 36, // 0x00000024 - FramebufferCreateInfo = 37, // 0x00000025 - RenderPassCreateInfo = 38, // 0x00000026 - CommandPoolCreateInfo = 39, // 0x00000027 - CommandBufferAllocateInfo = 40, // 0x00000028 - CommandBufferInheritanceInfo = 41, // 0x00000029 - CommandBufferBeginInfo = 42, // 0x0000002A - RenderPassBeginInfo = 43, // 0x0000002B - BufferMemoryBarrier = 44, // 0x0000002C - ImageMemoryBarrier = 45, // 0x0000002D - MemoryBarrier = 46, // 0x0000002E - LoaderInstanceCreateInfo = 47, // 0x0000002F - LoaderDeviceCreateInfo = 48, // 0x00000030 - PhysicalDeviceVulkan11Features = 49, // 0x00000031 - PhysicalDeviceVulkan11Properties = 50, // 0x00000032 - PhysicalDeviceVulkan12Features = 51, // 0x00000033 - PhysicalDeviceVulkan12Properties = 52, // 0x00000034 - SwapchainCreateInfoKhr = 1000001000, // 0x3B9ACDE8 - PresentInfoKhr = 1000001001, // 0x3B9ACDE9 - DisplayModeCreateInfoKhr = 1000002000, // 0x3B9AD1D0 - DisplaySurfaceCreateInfoKhr = 1000002001, // 0x3B9AD1D1 - DisplayPresentInfoKhr = 1000003000, // 0x3B9AD5B8 - XlibSurfaceCreateInfoKhr = 1000004000, // 0x3B9AD9A0 - XcbSurfaceCreateInfoKhr = 1000005000, // 0x3B9ADD88 - WaylandSurfaceCreateInfoKhr = 1000006000, // 0x3B9AE170 - AndroidSurfaceCreateInfoKhr = 1000008000, // 0x3B9AE940 - Win32SurfaceCreateInfoKhr = 1000009000, // 0x3B9AED28 - NativeBufferAndroid = 1000010000, // 0x3B9AF110 - SwapchainImageCreateInfoAndroid = 1000010001, // 0x3B9AF111 - PhysicalDevicePresentationPropertiesAndroid = 1000010002, // 0x3B9AF112 - DebugReportCallbackCreateInfoExt = 1000011000, // 0x3B9AF4F8 - DebugReportCreateInfoExt = 1000011000, // 0x3B9AF4F8 - PipelineRasterizationStateRasterizationOrderAmd = 1000018000, // 0x3B9B1050 - DebugMarkerObjectNameInfoExt = 1000022000, // 0x3B9B1FF0 - DebugMarkerObjectTagInfoExt = 1000022001, // 0x3B9B1FF1 - DebugMarkerMarkerInfoExt = 1000022002, // 0x3B9B1FF2 - VideoProfileKhr = 1000023000, // 0x3B9B23D8 - VideoCapabilitiesKhr = 1000023001, // 0x3B9B23D9 - VideoPictureResourceKhr = 1000023002, // 0x3B9B23DA - VideoGetMemoryPropertiesKhr = 1000023003, // 0x3B9B23DB - VideoBindMemoryKhr = 1000023004, // 0x3B9B23DC - VideoSessionCreateInfoKhr = 1000023005, // 0x3B9B23DD - VideoSessionParametersCreateInfoKhr = 1000023006, // 0x3B9B23DE - VideoSessionParametersUpdateInfoKhr = 1000023007, // 0x3B9B23DF - VideoBeginCodingInfoKhr = 1000023008, // 0x3B9B23E0 - VideoEndCodingInfoKhr = 1000023009, // 0x3B9B23E1 - VideoCodingControlInfoKhr = 1000023010, // 0x3B9B23E2 - VideoReferenceSlotKhr = 1000023011, // 0x3B9B23E3 - VideoQueueFamilyProperties2Khr = 1000023012, // 0x3B9B23E4 - VideoProfilesKhr = 1000023013, // 0x3B9B23E5 - PhysicalDeviceVideoFormatInfoKhr = 1000023014, // 0x3B9B23E6 - VideoFormatPropertiesKhr = 1000023015, // 0x3B9B23E7 - VideoDecodeInfoKhr = 1000024000, // 0x3B9B27C0 - DedicatedAllocationImageCreateInfoNV = 1000026000, // 0x3B9B2F90 - DedicatedAllocationBufferCreateInfoNV = 1000026001, // 0x3B9B2F91 - DedicatedAllocationMemoryAllocateInfoNV = 1000026002, // 0x3B9B2F92 - PhysicalDeviceTransformFeedbackFeaturesExt = 1000028000, // 0x3B9B3760 - PhysicalDeviceTransformFeedbackPropertiesExt = 1000028001, // 0x3B9B3761 - PipelineRasterizationStateStreamCreateInfoExt = 1000028002, // 0x3B9B3762 - CUModuleCreateInfoNvx = 1000029000, // 0x3B9B3B48 - CUFunctionCreateInfoNvx = 1000029001, // 0x3B9B3B49 - CULaunchInfoNvx = 1000029002, // 0x3B9B3B4A - ImageViewHandleInfoNvx = 1000030000, // 0x3B9B3F30 - ImageViewAddressPropertiesNvx = 1000030001, // 0x3B9B3F31 - VideoEncodeH264CapabilitiesExt = 1000038000, // 0x3B9B5E70 - VideoEncodeH264SessionCreateInfoExt = 1000038001, // 0x3B9B5E71 - VideoEncodeH264SessionParametersCreateInfoExt = 1000038002, // 0x3B9B5E72 - VideoEncodeH264SessionParametersAddInfoExt = 1000038003, // 0x3B9B5E73 - VideoEncodeH264VclFrameInfoExt = 1000038004, // 0x3B9B5E74 - VideoEncodeH264DpbSlotInfoExt = 1000038005, // 0x3B9B5E75 - VideoEncodeH264NaluSliceExt = 1000038006, // 0x3B9B5E76 - VideoEncodeH264EmitPictureParametersExt = 1000038007, // 0x3B9B5E77 - VideoEncodeH264ProfileExt = 1000038008, // 0x3B9B5E78 - VideoDecodeH264CapabilitiesExt = 1000040000, // 0x3B9B6640 - VideoDecodeH264SessionCreateInfoExt = 1000040001, // 0x3B9B6641 - VideoDecodeH264PictureInfoExt = 1000040002, // 0x3B9B6642 - VideoDecodeH264MvcExt = 1000040003, // 0x3B9B6643 - VideoDecodeH264ProfileExt = 1000040004, // 0x3B9B6644 - VideoDecodeH264SessionParametersCreateInfoExt = 1000040005, // 0x3B9B6645 - VideoDecodeH264SessionParametersAddInfoExt = 1000040006, // 0x3B9B6646 - VideoDecodeH264DpbSlotInfoExt = 1000040007, // 0x3B9B6647 - TextureLodGatherFormatPropertiesAmd = 1000041000, // 0x3B9B6A28 - StreamDescriptorSurfaceCreateInfoGgp = 1000049000, // 0x3B9B8968 - PhysicalDeviceCornerSampledImageFeaturesNV = 1000050000, // 0x3B9B8D50 - RenderPassMultiviewCreateInfo = 1000053000, // 0x3B9B9908 - RenderPassMultiviewCreateInfoKhr = 1000053000, // 0x3B9B9908 - PhysicalDeviceMultiviewFeatures = 1000053001, // 0x3B9B9909 - PhysicalDeviceMultiviewFeaturesKhr = 1000053001, // 0x3B9B9909 - PhysicalDeviceMultiviewProperties = 1000053002, // 0x3B9B990A - PhysicalDeviceMultiviewPropertiesKhr = 1000053002, // 0x3B9B990A - ExternalMemoryImageCreateInfoNV = 1000056000, // 0x3B9BA4C0 - ExportMemoryAllocateInfoNV = 1000056001, // 0x3B9BA4C1 - ImportMemoryWin32HandleInfoNV = 1000057000, // 0x3B9BA8A8 - ExportMemoryWin32HandleInfoNV = 1000057001, // 0x3B9BA8A9 - Win32KeyedMutexAcquireReleaseInfoNV = 1000058000, // 0x3B9BAC90 - PhysicalDeviceFeatures2 = 1000059000, // 0x3B9BB078 - PhysicalDeviceFeatures2Khr = 1000059000, // 0x3B9BB078 - PhysicalDeviceProperties2 = 1000059001, // 0x3B9BB079 - PhysicalDeviceProperties2Khr = 1000059001, // 0x3B9BB079 - FormatProperties2 = 1000059002, // 0x3B9BB07A - FormatProperties2Khr = 1000059002, // 0x3B9BB07A - ImageFormatProperties2 = 1000059003, // 0x3B9BB07B - ImageFormatProperties2Khr = 1000059003, // 0x3B9BB07B - PhysicalDeviceImageFormatInfo2 = 1000059004, // 0x3B9BB07C - PhysicalDeviceImageFormatInfo2Khr = 1000059004, // 0x3B9BB07C - QueueFamilyProperties2 = 1000059005, // 0x3B9BB07D - QueueFamilyProperties2Khr = 1000059005, // 0x3B9BB07D - PhysicalDeviceMemoryProperties2 = 1000059006, // 0x3B9BB07E - PhysicalDeviceMemoryProperties2Khr = 1000059006, // 0x3B9BB07E - SparseImageFormatProperties2 = 1000059007, // 0x3B9BB07F - SparseImageFormatProperties2Khr = 1000059007, // 0x3B9BB07F - PhysicalDeviceSparseImageFormatInfo2 = 1000059008, // 0x3B9BB080 - PhysicalDeviceSparseImageFormatInfo2Khr = 1000059008, // 0x3B9BB080 - MemoryAllocateFlagsInfo = 1000060000, // 0x3B9BB460 - MemoryAllocateFlagsInfoKhr = 1000060000, // 0x3B9BB460 - DeviceGroupRenderPassBeginInfo = 1000060003, // 0x3B9BB463 - DeviceGroupRenderPassBeginInfoKhr = 1000060003, // 0x3B9BB463 - DeviceGroupCommandBufferBeginInfo = 1000060004, // 0x3B9BB464 - DeviceGroupCommandBufferBeginInfoKhr = 1000060004, // 0x3B9BB464 - DeviceGroupSubmitInfo = 1000060005, // 0x3B9BB465 - DeviceGroupSubmitInfoKhr = 1000060005, // 0x3B9BB465 - DeviceGroupBindSparseInfo = 1000060006, // 0x3B9BB466 - DeviceGroupBindSparseInfoKhr = 1000060006, // 0x3B9BB466 - DeviceGroupPresentCapabilitiesKhr = 1000060007, // 0x3B9BB467 - ImageSwapchainCreateInfoKhr = 1000060008, // 0x3B9BB468 - BindImageMemorySwapchainInfoKhr = 1000060009, // 0x3B9BB469 - AcquireNextImageInfoKhr = 1000060010, // 0x3B9BB46A - DeviceGroupPresentInfoKhr = 1000060011, // 0x3B9BB46B - DeviceGroupSwapchainCreateInfoKhr = 1000060012, // 0x3B9BB46C - BindBufferMemoryDeviceGroupInfo = 1000060013, // 0x3B9BB46D - BindBufferMemoryDeviceGroupInfoKhr = 1000060013, // 0x3B9BB46D - BindImageMemoryDeviceGroupInfo = 1000060014, // 0x3B9BB46E - BindImageMemoryDeviceGroupInfoKhr = 1000060014, // 0x3B9BB46E - ValidationFlagsExt = 1000061000, // 0x3B9BB848 - VISurfaceCreateInfoNN = 1000062000, // 0x3B9BBC30 - PhysicalDeviceShaderDrawParameterFeatures = 1000063000, // 0x3B9BC018 - PhysicalDeviceShaderDrawParametersFeatures = 1000063000, // 0x3B9BC018 - PhysicalDeviceTextureCompressionAstcHdrFeaturesExt = 1000066000, // 0x3B9BCBD0 - ImageViewAstcDecodeModeExt = 1000067000, // 0x3B9BCFB8 - PhysicalDeviceAstcDecodeFeaturesExt = 1000067001, // 0x3B9BCFB9 - PhysicalDeviceGroupProperties = 1000070000, // 0x3B9BDB70 - PhysicalDeviceGroupPropertiesKhr = 1000070000, // 0x3B9BDB70 - DeviceGroupDeviceCreateInfo = 1000070001, // 0x3B9BDB71 - DeviceGroupDeviceCreateInfoKhr = 1000070001, // 0x3B9BDB71 - PhysicalDeviceExternalImageFormatInfo = 1000071000, // 0x3B9BDF58 - PhysicalDeviceExternalImageFormatInfoKhr = 1000071000, // 0x3B9BDF58 - ExternalImageFormatProperties = 1000071001, // 0x3B9BDF59 - ExternalImageFormatPropertiesKhr = 1000071001, // 0x3B9BDF59 - PhysicalDeviceExternalBufferInfo = 1000071002, // 0x3B9BDF5A - PhysicalDeviceExternalBufferInfoKhr = 1000071002, // 0x3B9BDF5A - ExternalBufferProperties = 1000071003, // 0x3B9BDF5B - ExternalBufferPropertiesKhr = 1000071003, // 0x3B9BDF5B - PhysicalDeviceIDProperties = 1000071004, // 0x3B9BDF5C - PhysicalDeviceIDPropertiesKhr = 1000071004, // 0x3B9BDF5C - ExternalMemoryBufferCreateInfo = 1000072000, // 0x3B9BE340 - ExternalMemoryBufferCreateInfoKhr = 1000072000, // 0x3B9BE340 - ExternalMemoryImageCreateInfo = 1000072001, // 0x3B9BE341 - ExternalMemoryImageCreateInfoKhr = 1000072001, // 0x3B9BE341 - ExportMemoryAllocateInfo = 1000072002, // 0x3B9BE342 - ExportMemoryAllocateInfoKhr = 1000072002, // 0x3B9BE342 - ImportMemoryWin32HandleInfoKhr = 1000073000, // 0x3B9BE728 - ExportMemoryWin32HandleInfoKhr = 1000073001, // 0x3B9BE729 - MemoryWin32HandlePropertiesKhr = 1000073002, // 0x3B9BE72A - MemoryGetWin32HandleInfoKhr = 1000073003, // 0x3B9BE72B - ImportMemoryFDInfoKhr = 1000074000, // 0x3B9BEB10 - MemoryFDPropertiesKhr = 1000074001, // 0x3B9BEB11 - MemoryGetFDInfoKhr = 1000074002, // 0x3B9BEB12 - Win32KeyedMutexAcquireReleaseInfoKhr = 1000075000, // 0x3B9BEEF8 - PhysicalDeviceExternalSemaphoreInfo = 1000076000, // 0x3B9BF2E0 - PhysicalDeviceExternalSemaphoreInfoKhr = 1000076000, // 0x3B9BF2E0 - ExternalSemaphoreProperties = 1000076001, // 0x3B9BF2E1 - ExternalSemaphorePropertiesKhr = 1000076001, // 0x3B9BF2E1 - ExportSemaphoreCreateInfo = 1000077000, // 0x3B9BF6C8 - ExportSemaphoreCreateInfoKhr = 1000077000, // 0x3B9BF6C8 - ImportSemaphoreWin32HandleInfoKhr = 1000078000, // 0x3B9BFAB0 - ExportSemaphoreWin32HandleInfoKhr = 1000078001, // 0x3B9BFAB1 - D3D12FenceSubmitInfoKhr = 1000078002, // 0x3B9BFAB2 - SemaphoreGetWin32HandleInfoKhr = 1000078003, // 0x3B9BFAB3 - ImportSemaphoreFDInfoKhr = 1000079000, // 0x3B9BFE98 - SemaphoreGetFDInfoKhr = 1000079001, // 0x3B9BFE99 - PhysicalDevicePushDescriptorPropertiesKhr = 1000080000, // 0x3B9C0280 - CommandBufferInheritanceConditionalRenderingInfoExt = 1000081000, // 0x3B9C0668 - PhysicalDeviceConditionalRenderingFeaturesExt = 1000081001, // 0x3B9C0669 - ConditionalRenderingBeginInfoExt = 1000081002, // 0x3B9C066A - PhysicalDeviceFloat16Int8FeaturesKhr = 1000082000, // 0x3B9C0A50 - PhysicalDeviceShaderFloat16Int8Features = 1000082000, // 0x3B9C0A50 - PhysicalDeviceShaderFloat16Int8FeaturesKhr = 1000082000, // 0x3B9C0A50 - PhysicalDevice16BitStorageFeatures = 1000083000, // 0x3B9C0E38 - PhysicalDevice16BitStorageFeaturesKhr = 1000083000, // 0x3B9C0E38 - PresentRegionsKhr = 1000084000, // 0x3B9C1220 - DescriptorUpdateTemplateCreateInfo = 1000085000, // 0x3B9C1608 - DescriptorUpdateTemplateCreateInfoKhr = 1000085000, // 0x3B9C1608 - PipelineViewportWScalingStateCreateInfoNV = 1000087000, // 0x3B9C1DD8 - SurfaceCapabilities2Ext = 1000090000, // 0x3B9C2990 - DisplayPowerInfoExt = 1000091000, // 0x3B9C2D78 - DeviceEventInfoExt = 1000091001, // 0x3B9C2D79 - DisplayEventInfoExt = 1000091002, // 0x3B9C2D7A - SwapchainCounterCreateInfoExt = 1000091003, // 0x3B9C2D7B - PresentTimesInfoGoogle = 1000092000, // 0x3B9C3160 - PhysicalDeviceSubgroupProperties = 1000094000, // 0x3B9C3930 - PhysicalDeviceMultiviewPerViewAttributesPropertiesNvx = 1000097000, // 0x3B9C44E8 - PipelineViewportSwizzleStateCreateInfoNV = 1000098000, // 0x3B9C48D0 - PhysicalDeviceDiscardRectanglePropertiesExt = 1000099000, // 0x3B9C4CB8 - PipelineDiscardRectangleStateCreateInfoExt = 1000099001, // 0x3B9C4CB9 - PhysicalDeviceConservativeRasterizationPropertiesExt = 1000101000, // 0x3B9C5488 - PipelineRasterizationConservativeStateCreateInfoExt = 1000101001, // 0x3B9C5489 - PhysicalDeviceDepthClipEnableFeaturesExt = 1000102000, // 0x3B9C5870 - PipelineRasterizationDepthClipStateCreateInfoExt = 1000102001, // 0x3B9C5871 - HdrMetadataExt = 1000105000, // 0x3B9C6428 - PhysicalDeviceImagelessFramebufferFeatures = 1000108000, // 0x3B9C6FE0 - PhysicalDeviceImagelessFramebufferFeaturesKhr = 1000108000, // 0x3B9C6FE0 - FramebufferAttachmentsCreateInfo = 1000108001, // 0x3B9C6FE1 - FramebufferAttachmentsCreateInfoKhr = 1000108001, // 0x3B9C6FE1 - FramebufferAttachmentImageInfo = 1000108002, // 0x3B9C6FE2 - FramebufferAttachmentImageInfoKhr = 1000108002, // 0x3B9C6FE2 - RenderPassAttachmentBeginInfo = 1000108003, // 0x3B9C6FE3 - RenderPassAttachmentBeginInfoKhr = 1000108003, // 0x3B9C6FE3 - AttachmentDescription2 = 1000109000, // 0x3B9C73C8 - AttachmentDescription2Khr = 1000109000, // 0x3B9C73C8 - AttachmentReference2 = 1000109001, // 0x3B9C73C9 - AttachmentReference2Khr = 1000109001, // 0x3B9C73C9 - SubpassDescription2 = 1000109002, // 0x3B9C73CA - SubpassDescription2Khr = 1000109002, // 0x3B9C73CA - SubpassDependency2 = 1000109003, // 0x3B9C73CB - SubpassDependency2Khr = 1000109003, // 0x3B9C73CB - RenderPassCreateInfo2 = 1000109004, // 0x3B9C73CC - RenderPassCreateInfo2Khr = 1000109004, // 0x3B9C73CC - SubpassBeginInfo = 1000109005, // 0x3B9C73CD - SubpassBeginInfoKhr = 1000109005, // 0x3B9C73CD - SubpassEndInfo = 1000109006, // 0x3B9C73CE - SubpassEndInfoKhr = 1000109006, // 0x3B9C73CE - SharedPresentSurfaceCapabilitiesKhr = 1000111000, // 0x3B9C7B98 - PhysicalDeviceExternalFenceInfo = 1000112000, // 0x3B9C7F80 - PhysicalDeviceExternalFenceInfoKhr = 1000112000, // 0x3B9C7F80 - ExternalFenceProperties = 1000112001, // 0x3B9C7F81 - ExternalFencePropertiesKhr = 1000112001, // 0x3B9C7F81 - ExportFenceCreateInfo = 1000113000, // 0x3B9C8368 - ExportFenceCreateInfoKhr = 1000113000, // 0x3B9C8368 - ImportFenceWin32HandleInfoKhr = 1000114000, // 0x3B9C8750 - ExportFenceWin32HandleInfoKhr = 1000114001, // 0x3B9C8751 - FenceGetWin32HandleInfoKhr = 1000114002, // 0x3B9C8752 - ImportFenceFDInfoKhr = 1000115000, // 0x3B9C8B38 - FenceGetFDInfoKhr = 1000115001, // 0x3B9C8B39 - PhysicalDevicePerformanceQueryFeaturesKhr = 1000116000, // 0x3B9C8F20 - PhysicalDevicePerformanceQueryPropertiesKhr = 1000116001, // 0x3B9C8F21 - QueryPoolPerformanceCreateInfoKhr = 1000116002, // 0x3B9C8F22 - PerformanceQuerySubmitInfoKhr = 1000116003, // 0x3B9C8F23 - AcquireProfilingLockInfoKhr = 1000116004, // 0x3B9C8F24 - PerformanceCounterKhr = 1000116005, // 0x3B9C8F25 - PerformanceCounterDescriptionKhr = 1000116006, // 0x3B9C8F26 - PhysicalDevicePointClippingProperties = 1000117000, // 0x3B9C9308 - PhysicalDevicePointClippingPropertiesKhr = 1000117000, // 0x3B9C9308 - RenderPassInputAttachmentAspectCreateInfo = 1000117001, // 0x3B9C9309 - RenderPassInputAttachmentAspectCreateInfoKhr = 1000117001, // 0x3B9C9309 - ImageViewUsageCreateInfo = 1000117002, // 0x3B9C930A - ImageViewUsageCreateInfoKhr = 1000117002, // 0x3B9C930A - PipelineTessellationDomainOriginStateCreateInfo = 1000117003, // 0x3B9C930B - PipelineTessellationDomainOriginStateCreateInfoKhr = 1000117003, // 0x3B9C930B - PhysicalDeviceSurfaceInfo2Khr = 1000119000, // 0x3B9C9AD8 - SurfaceCapabilities2Khr = 1000119001, // 0x3B9C9AD9 - SurfaceFormat2Khr = 1000119002, // 0x3B9C9ADA - PhysicalDeviceVariablePointerFeatures = 1000120000, // 0x3B9C9EC0 - PhysicalDeviceVariablePointerFeaturesKhr = 1000120000, // 0x3B9C9EC0 - PhysicalDeviceVariablePointersFeatures = 1000120000, // 0x3B9C9EC0 - PhysicalDeviceVariablePointersFeaturesKhr = 1000120000, // 0x3B9C9EC0 - DisplayProperties2Khr = 1000121000, // 0x3B9CA2A8 - DisplayPlaneProperties2Khr = 1000121001, // 0x3B9CA2A9 - DisplayModeProperties2Khr = 1000121002, // 0x3B9CA2AA - DisplayPlaneInfo2Khr = 1000121003, // 0x3B9CA2AB - DisplayPlaneCapabilities2Khr = 1000121004, // 0x3B9CA2AC - IosSurfaceCreateInfoMvk = 1000122000, // 0x3B9CA690 - MacosSurfaceCreateInfoMvk = 1000123000, // 0x3B9CAA78 - MemoryDedicatedRequirements = 1000127000, // 0x3B9CBA18 - MemoryDedicatedRequirementsKhr = 1000127000, // 0x3B9CBA18 - MemoryDedicatedAllocateInfo = 1000127001, // 0x3B9CBA19 - MemoryDedicatedAllocateInfoKhr = 1000127001, // 0x3B9CBA19 - DebugUtilsObjectNameInfoExt = 1000128000, // 0x3B9CBE00 - DebugUtilsObjectTagInfoExt = 1000128001, // 0x3B9CBE01 - DebugUtilsLabelExt = 1000128002, // 0x3B9CBE02 - DebugUtilsMessengerCallbackDataExt = 1000128003, // 0x3B9CBE03 - DebugUtilsMessengerCreateInfoExt = 1000128004, // 0x3B9CBE04 - AndroidHardwareBufferUsageAndroid = 1000129000, // 0x3B9CC1E8 - AndroidHardwareBufferPropertiesAndroid = 1000129001, // 0x3B9CC1E9 - AndroidHardwareBufferFormatPropertiesAndroid = 1000129002, // 0x3B9CC1EA - ImportAndroidHardwareBufferInfoAndroid = 1000129003, // 0x3B9CC1EB - MemoryGetAndroidHardwareBufferInfoAndroid = 1000129004, // 0x3B9CC1EC - ExternalFormatAndroid = 1000129005, // 0x3B9CC1ED - PhysicalDeviceSamplerFilterMinmaxProperties = 1000130000, // 0x3B9CC5D0 - PhysicalDeviceSamplerFilterMinmaxPropertiesExt = 1000130000, // 0x3B9CC5D0 - SamplerReductionModeCreateInfo = 1000130001, // 0x3B9CC5D1 - SamplerReductionModeCreateInfoExt = 1000130001, // 0x3B9CC5D1 - PhysicalDeviceInlineUniformBlockFeaturesExt = 1000138000, // 0x3B9CE510 - PhysicalDeviceInlineUniformBlockPropertiesExt = 1000138001, // 0x3B9CE511 - WriteDescriptorSetInlineUniformBlockExt = 1000138002, // 0x3B9CE512 - DescriptorPoolInlineUniformBlockCreateInfoExt = 1000138003, // 0x3B9CE513 - SampleLocationsInfoExt = 1000143000, // 0x3B9CF898 - RenderPassSampleLocationsBeginInfoExt = 1000143001, // 0x3B9CF899 - PipelineSampleLocationsStateCreateInfoExt = 1000143002, // 0x3B9CF89A - PhysicalDeviceSampleLocationsPropertiesExt = 1000143003, // 0x3B9CF89B - MultisamplePropertiesExt = 1000143004, // 0x3B9CF89C - ProtectedSubmitInfo = 1000145000, // 0x3B9D0068 - PhysicalDeviceProtectedMemoryFeatures = 1000145001, // 0x3B9D0069 - PhysicalDeviceProtectedMemoryProperties = 1000145002, // 0x3B9D006A - DeviceQueueInfo2 = 1000145003, // 0x3B9D006B - BufferMemoryRequirementsInfo2 = 1000146000, // 0x3B9D0450 - BufferMemoryRequirementsInfo2Khr = 1000146000, // 0x3B9D0450 - ImageMemoryRequirementsInfo2 = 1000146001, // 0x3B9D0451 - ImageMemoryRequirementsInfo2Khr = 1000146001, // 0x3B9D0451 - ImageSparseMemoryRequirementsInfo2 = 1000146002, // 0x3B9D0452 - ImageSparseMemoryRequirementsInfo2Khr = 1000146002, // 0x3B9D0452 - MemoryRequirements2 = 1000146003, // 0x3B9D0453 - MemoryRequirements2Khr = 1000146003, // 0x3B9D0453 - SparseImageMemoryRequirements2 = 1000146004, // 0x3B9D0454 - SparseImageMemoryRequirements2Khr = 1000146004, // 0x3B9D0454 - ImageFormatListCreateInfo = 1000147000, // 0x3B9D0838 - ImageFormatListCreateInfoKhr = 1000147000, // 0x3B9D0838 - PhysicalDeviceBlendOperationAdvancedFeaturesExt = 1000148000, // 0x3B9D0C20 - PhysicalDeviceBlendOperationAdvancedPropertiesExt = 1000148001, // 0x3B9D0C21 - PipelineColorBlendAdvancedStateCreateInfoExt = 1000148002, // 0x3B9D0C22 - PipelineCoverageToColorStateCreateInfoNV = 1000149000, // 0x3B9D1008 - AccelerationStructureBuildGeometryInfoKhr = 1000150000, // 0x3B9D13F0 - AccelerationStructureDeviceAddressInfoKhr = 1000150002, // 0x3B9D13F2 - AccelerationStructureGeometryAabbsDataKhr = 1000150003, // 0x3B9D13F3 - AccelerationStructureGeometryInstancesDataKhr = 1000150004, // 0x3B9D13F4 - AccelerationStructureGeometryTrianglesDataKhr = 1000150005, // 0x3B9D13F5 - AccelerationStructureGeometryKhr = 1000150006, // 0x3B9D13F6 - WriteDescriptorSetAccelerationStructureKhr = 1000150007, // 0x3B9D13F7 - AccelerationStructureVersionInfoKhr = 1000150009, // 0x3B9D13F9 - CopyAccelerationStructureInfoKhr = 1000150010, // 0x3B9D13FA - CopyAccelerationStructureToMemoryInfoKhr = 1000150011, // 0x3B9D13FB - CopyMemoryToAccelerationStructureInfoKhr = 1000150012, // 0x3B9D13FC - PhysicalDeviceAccelerationStructureFeaturesKhr = 1000150013, // 0x3B9D13FD - PhysicalDeviceAccelerationStructurePropertiesKhr = 1000150014, // 0x3B9D13FE - RayTracingPipelineCreateInfoKhr = 1000150015, // 0x3B9D13FF - RayTracingShaderGroupCreateInfoKhr = 1000150016, // 0x3B9D1400 - AccelerationStructureCreateInfoKhr = 1000150017, // 0x3B9D1401 - RayTracingPipelineInterfaceCreateInfoKhr = 1000150018, // 0x3B9D1402 - AccelerationStructureBuildSizesInfoKhr = 1000150020, // 0x3B9D1404 - PipelineCoverageModulationStateCreateInfoNV = 1000152000, // 0x3B9D1BC0 - PhysicalDeviceShaderSMBuiltinsFeaturesNV = 1000154000, // 0x3B9D2390 - PhysicalDeviceShaderSMBuiltinsPropertiesNV = 1000154001, // 0x3B9D2391 - SamplerYcbcrConversionCreateInfo = 1000156000, // 0x3B9D2B60 - SamplerYcbcrConversionCreateInfoKhr = 1000156000, // 0x3B9D2B60 - SamplerYcbcrConversionInfo = 1000156001, // 0x3B9D2B61 - SamplerYcbcrConversionInfoKhr = 1000156001, // 0x3B9D2B61 - BindImagePlaneMemoryInfo = 1000156002, // 0x3B9D2B62 - BindImagePlaneMemoryInfoKhr = 1000156002, // 0x3B9D2B62 - ImagePlaneMemoryRequirementsInfo = 1000156003, // 0x3B9D2B63 - ImagePlaneMemoryRequirementsInfoKhr = 1000156003, // 0x3B9D2B63 - PhysicalDeviceSamplerYcbcrConversionFeatures = 1000156004, // 0x3B9D2B64 - PhysicalDeviceSamplerYcbcrConversionFeaturesKhr = 1000156004, // 0x3B9D2B64 - SamplerYcbcrConversionImageFormatProperties = 1000156005, // 0x3B9D2B65 - SamplerYcbcrConversionImageFormatPropertiesKhr = 1000156005, // 0x3B9D2B65 - BindBufferMemoryInfo = 1000157000, // 0x3B9D2F48 - BindBufferMemoryInfoKhr = 1000157000, // 0x3B9D2F48 - BindImageMemoryInfo = 1000157001, // 0x3B9D2F49 - BindImageMemoryInfoKhr = 1000157001, // 0x3B9D2F49 - DrmFormatModifierPropertiesListExt = 1000158000, // 0x3B9D3330 - PhysicalDeviceImageDrmFormatModifierInfoExt = 1000158002, // 0x3B9D3332 - ImageDrmFormatModifierListCreateInfoExt = 1000158003, // 0x3B9D3333 - ImageDrmFormatModifierExplicitCreateInfoExt = 1000158004, // 0x3B9D3334 - ImageDrmFormatModifierPropertiesExt = 1000158005, // 0x3B9D3335 - ValidationCacheCreateInfoExt = 1000160000, // 0x3B9D3B00 - ShaderModuleValidationCacheCreateInfoExt = 1000160001, // 0x3B9D3B01 - DescriptorSetLayoutBindingFlagsCreateInfo = 1000161000, // 0x3B9D3EE8 - DescriptorSetLayoutBindingFlagsCreateInfoExt = 1000161000, // 0x3B9D3EE8 - PhysicalDeviceDescriptorIndexingFeatures = 1000161001, // 0x3B9D3EE9 - PhysicalDeviceDescriptorIndexingFeaturesExt = 1000161001, // 0x3B9D3EE9 - PhysicalDeviceDescriptorIndexingProperties = 1000161002, // 0x3B9D3EEA - PhysicalDeviceDescriptorIndexingPropertiesExt = 1000161002, // 0x3B9D3EEA - DescriptorSetVariableDescriptorCountAllocateInfo = 1000161003, // 0x3B9D3EEB - DescriptorSetVariableDescriptorCountAllocateInfoExt = 1000161003, // 0x3B9D3EEB - DescriptorSetVariableDescriptorCountLayoutSupport = 1000161004, // 0x3B9D3EEC - DescriptorSetVariableDescriptorCountLayoutSupportExt = 1000161004, // 0x3B9D3EEC - PhysicalDevicePortabilitySubsetFeaturesKhr = 1000163000, // 0x3B9D46B8 - PhysicalDevicePortabilitySubsetPropertiesKhr = 1000163001, // 0x3B9D46B9 - PipelineViewportShadingRateImageStateCreateInfoNV = 1000164000, // 0x3B9D4AA0 - PhysicalDeviceShadingRateImageFeaturesNV = 1000164001, // 0x3B9D4AA1 - PhysicalDeviceShadingRateImagePropertiesNV = 1000164002, // 0x3B9D4AA2 - PipelineViewportCoarseSampleOrderStateCreateInfoNV = 1000164005, // 0x3B9D4AA5 - RayTracingPipelineCreateInfoNV = 1000165000, // 0x3B9D4E88 - AccelerationStructureCreateInfoNV = 1000165001, // 0x3B9D4E89 - GeometryNV = 1000165003, // 0x3B9D4E8B - GeometryTrianglesNV = 1000165004, // 0x3B9D4E8C - GeometryAabbNV = 1000165005, // 0x3B9D4E8D - BindAccelerationStructureMemoryInfoNV = 1000165006, // 0x3B9D4E8E - WriteDescriptorSetAccelerationStructureNV = 1000165007, // 0x3B9D4E8F - AccelerationStructureMemoryRequirementsInfoNV = 1000165008, // 0x3B9D4E90 - PhysicalDeviceRayTracingPropertiesNV = 1000165009, // 0x3B9D4E91 - RayTracingShaderGroupCreateInfoNV = 1000165011, // 0x3B9D4E93 - AccelerationStructureInfoNV = 1000165012, // 0x3B9D4E94 - PhysicalDeviceRepresentativeFragmentTestFeaturesNV = 1000166000, // 0x3B9D5270 - PipelineRepresentativeFragmentTestStateCreateInfoNV = 1000166001, // 0x3B9D5271 - PhysicalDeviceMaintenance3Properties = 1000168000, // 0x3B9D5A40 - PhysicalDeviceMaintenance3PropertiesKhr = 1000168000, // 0x3B9D5A40 - DescriptorSetLayoutSupport = 1000168001, // 0x3B9D5A41 - DescriptorSetLayoutSupportKhr = 1000168001, // 0x3B9D5A41 - PhysicalDeviceImageViewImageFormatInfoExt = 1000170000, // 0x3B9D6210 - FilterCubicImageViewImageFormatPropertiesExt = 1000170001, // 0x3B9D6211 - DeviceQueueGlobalPriorityCreateInfoExt = 1000174000, // 0x3B9D71B0 - PhysicalDeviceShaderSubgroupExtendedTypesFeatures = 1000175000, // 0x3B9D7598 - PhysicalDeviceShaderSubgroupExtendedTypesFeaturesKhr = 1000175000, // 0x3B9D7598 - PhysicalDevice8BitStorageFeatures = 1000177000, // 0x3B9D7D68 - PhysicalDevice8BitStorageFeaturesKhr = 1000177000, // 0x3B9D7D68 - ImportMemoryHostPointerInfoExt = 1000178000, // 0x3B9D8150 - MemoryHostPointerPropertiesExt = 1000178001, // 0x3B9D8151 - PhysicalDeviceExternalMemoryHostPropertiesExt = 1000178002, // 0x3B9D8152 - PhysicalDeviceShaderAtomicInt64Features = 1000180000, // 0x3B9D8920 - PhysicalDeviceShaderAtomicInt64FeaturesKhr = 1000180000, // 0x3B9D8920 - PhysicalDeviceShaderClockFeaturesKhr = 1000181000, // 0x3B9D8D08 - PipelineCompilerControlCreateInfoAmd = 1000183000, // 0x3B9D94D8 - CalibratedTimestampInfoExt = 1000184000, // 0x3B9D98C0 - PhysicalDeviceShaderCorePropertiesAmd = 1000185000, // 0x3B9D9CA8 - VideoDecodeH265CapabilitiesExt = 1000187000, // 0x3B9DA478 - VideoDecodeH265SessionCreateInfoExt = 1000187001, // 0x3B9DA479 - VideoDecodeH265SessionParametersCreateInfoExt = 1000187002, // 0x3B9DA47A - VideoDecodeH265SessionParametersAddInfoExt = 1000187003, // 0x3B9DA47B - VideoDecodeH265ProfileExt = 1000187004, // 0x3B9DA47C - VideoDecodeH265PictureInfoExt = 1000187005, // 0x3B9DA47D - VideoDecodeH265DpbSlotInfoExt = 1000187006, // 0x3B9DA47E - DeviceMemoryOverallocationCreateInfoAmd = 1000189000, // 0x3B9DAC48 - PhysicalDeviceVertexAttributeDivisorPropertiesExt = 1000190000, // 0x3B9DB030 - PipelineVertexInputDivisorStateCreateInfoExt = 1000190001, // 0x3B9DB031 - PhysicalDeviceVertexAttributeDivisorFeaturesExt = 1000190002, // 0x3B9DB032 - PresentFrameTokenGgp = 1000191000, // 0x3B9DB418 - PipelineCreationFeedbackCreateInfoExt = 1000192000, // 0x3B9DB800 - PhysicalDeviceDriverProperties = 1000196000, // 0x3B9DC7A0 - PhysicalDeviceDriverPropertiesKhr = 1000196000, // 0x3B9DC7A0 - PhysicalDeviceFloatControlsProperties = 1000197000, // 0x3B9DCB88 - PhysicalDeviceFloatControlsPropertiesKhr = 1000197000, // 0x3B9DCB88 - PhysicalDeviceDepthStencilResolveProperties = 1000199000, // 0x3B9DD358 - PhysicalDeviceDepthStencilResolvePropertiesKhr = 1000199000, // 0x3B9DD358 - SubpassDescriptionDepthStencilResolve = 1000199001, // 0x3B9DD359 - SubpassDescriptionDepthStencilResolveKhr = 1000199001, // 0x3B9DD359 - PhysicalDeviceComputeShaderDerivativesFeaturesNV = 1000201000, // 0x3B9DDB28 - PhysicalDeviceMeshShaderFeaturesNV = 1000202000, // 0x3B9DDF10 - PhysicalDeviceMeshShaderPropertiesNV = 1000202001, // 0x3B9DDF11 - PhysicalDeviceFragmentShaderBarycentricFeaturesNV = 1000203000, // 0x3B9DE2F8 - PhysicalDeviceShaderImageFootprintFeaturesNV = 1000204000, // 0x3B9DE6E0 - PipelineViewportExclusiveScissorStateCreateInfoNV = 1000205000, // 0x3B9DEAC8 - PhysicalDeviceExclusiveScissorFeaturesNV = 1000205002, // 0x3B9DEACA - CheckpointDataNV = 1000206000, // 0x3B9DEEB0 - QueueFamilyCheckpointPropertiesNV = 1000206001, // 0x3B9DEEB1 - PhysicalDeviceTimelineSemaphoreFeatures = 1000207000, // 0x3B9DF298 - PhysicalDeviceTimelineSemaphoreFeaturesKhr = 1000207000, // 0x3B9DF298 - PhysicalDeviceTimelineSemaphoreProperties = 1000207001, // 0x3B9DF299 - PhysicalDeviceTimelineSemaphorePropertiesKhr = 1000207001, // 0x3B9DF299 - SemaphoreTypeCreateInfo = 1000207002, // 0x3B9DF29A - SemaphoreTypeCreateInfoKhr = 1000207002, // 0x3B9DF29A - TimelineSemaphoreSubmitInfo = 1000207003, // 0x3B9DF29B - TimelineSemaphoreSubmitInfoKhr = 1000207003, // 0x3B9DF29B - SemaphoreWaitInfo = 1000207004, // 0x3B9DF29C - SemaphoreWaitInfoKhr = 1000207004, // 0x3B9DF29C - SemaphoreSignalInfo = 1000207005, // 0x3B9DF29D - SemaphoreSignalInfoKhr = 1000207005, // 0x3B9DF29D - PhysicalDeviceShaderIntegerFunctions2FeaturesIntel = 1000209000, // 0x3B9DFA68 - QueryPoolCreateInfoIntel = 1000210000, // 0x3B9DFE50 - QueryPoolPerformanceQueryCreateInfoIntel = 1000210000, // 0x3B9DFE50 - InitializePerformanceApiInfoIntel = 1000210001, // 0x3B9DFE51 - PerformanceMarkerInfoIntel = 1000210002, // 0x3B9DFE52 - PerformanceStreamMarkerInfoIntel = 1000210003, // 0x3B9DFE53 - PerformanceOverrideInfoIntel = 1000210004, // 0x3B9DFE54 - PerformanceConfigurationAcquireInfoIntel = 1000210005, // 0x3B9DFE55 - PhysicalDeviceVulkanMemoryModelFeatures = 1000211000, // 0x3B9E0238 - PhysicalDeviceVulkanMemoryModelFeaturesKhr = 1000211000, // 0x3B9E0238 - PhysicalDevicePciBusInfoPropertiesExt = 1000212000, // 0x3B9E0620 - DisplayNativeHdrSurfaceCapabilitiesAmd = 1000213000, // 0x3B9E0A08 - SwapchainDisplayNativeHdrCreateInfoAmd = 1000213001, // 0x3B9E0A09 - ImagepipeSurfaceCreateInfoFuchsia = 1000214000, // 0x3B9E0DF0 - PhysicalDeviceShaderTerminateInvocationFeaturesKhr = 1000215000, // 0x3B9E11D8 - MetalSurfaceCreateInfoExt = 1000217000, // 0x3B9E19A8 - PhysicalDeviceFragmentDensityMapFeaturesExt = 1000218000, // 0x3B9E1D90 - PhysicalDeviceFragmentDensityMapPropertiesExt = 1000218001, // 0x3B9E1D91 - RenderPassFragmentDensityMapCreateInfoExt = 1000218002, // 0x3B9E1D92 - PhysicalDeviceScalarBlockLayoutFeatures = 1000221000, // 0x3B9E2948 - PhysicalDeviceScalarBlockLayoutFeaturesExt = 1000221000, // 0x3B9E2948 - PhysicalDeviceSubgroupSizeControlPropertiesExt = 1000225000, // 0x3B9E38E8 - PipelineShaderStageRequiredSubgroupSizeCreateInfoExt = 1000225001, // 0x3B9E38E9 - PhysicalDeviceSubgroupSizeControlFeaturesExt = 1000225002, // 0x3B9E38EA - FragmentShadingRateAttachmentInfoKhr = 1000226000, // 0x3B9E3CD0 - PipelineFragmentShadingRateStateCreateInfoKhr = 1000226001, // 0x3B9E3CD1 - PhysicalDeviceFragmentShadingRatePropertiesKhr = 1000226002, // 0x3B9E3CD2 - PhysicalDeviceFragmentShadingRateFeaturesKhr = 1000226003, // 0x3B9E3CD3 - PhysicalDeviceFragmentShadingRateKhr = 1000226004, // 0x3B9E3CD4 - PhysicalDeviceShaderCoreProperties2Amd = 1000227000, // 0x3B9E40B8 - PhysicalDeviceCoherentMemoryFeaturesAmd = 1000229000, // 0x3B9E4888 - PhysicalDeviceShaderImageAtomicInt64FeaturesExt = 1000234000, // 0x3B9E5C10 - PhysicalDeviceMemoryBudgetPropertiesExt = 1000237000, // 0x3B9E67C8 - PhysicalDeviceMemoryPriorityFeaturesExt = 1000238000, // 0x3B9E6BB0 - MemoryPriorityAllocateInfoExt = 1000238001, // 0x3B9E6BB1 - SurfaceProtectedCapabilitiesKhr = 1000239000, // 0x3B9E6F98 - PhysicalDeviceDedicatedAllocationImageAliasingFeaturesNV = 1000240000, // 0x3B9E7380 - PhysicalDeviceSeparateDepthStencilLayoutsFeatures = 1000241000, // 0x3B9E7768 - PhysicalDeviceSeparateDepthStencilLayoutsFeaturesKhr = 1000241000, // 0x3B9E7768 - AttachmentReferenceStencilLayout = 1000241001, // 0x3B9E7769 - AttachmentReferenceStencilLayoutKhr = 1000241001, // 0x3B9E7769 - AttachmentDescriptionStencilLayout = 1000241002, // 0x3B9E776A - AttachmentDescriptionStencilLayoutKhr = 1000241002, // 0x3B9E776A - PhysicalDeviceBufferAddressFeaturesExt = 1000244000, // 0x3B9E8320 - PhysicalDeviceBufferDeviceAddressFeaturesExt = 1000244000, // 0x3B9E8320 - BufferDeviceAddressInfo = 1000244001, // 0x3B9E8321 - BufferDeviceAddressInfoExt = 1000244001, // 0x3B9E8321 - BufferDeviceAddressInfoKhr = 1000244001, // 0x3B9E8321 - BufferDeviceAddressCreateInfoExt = 1000244002, // 0x3B9E8322 - PhysicalDeviceToolPropertiesExt = 1000245000, // 0x3B9E8708 - ImageStencilUsageCreateInfo = 1000246000, // 0x3B9E8AF0 - ImageStencilUsageCreateInfoExt = 1000246000, // 0x3B9E8AF0 - ValidationFeaturesExt = 1000247000, // 0x3B9E8ED8 - PhysicalDevicePresentWaitFeaturesKhr = 1000248000, // 0x3B9E92C0 - PhysicalDeviceCooperativeMatrixFeaturesNV = 1000249000, // 0x3B9E96A8 - CooperativeMatrixPropertiesNV = 1000249001, // 0x3B9E96A9 - PhysicalDeviceCooperativeMatrixPropertiesNV = 1000249002, // 0x3B9E96AA - PhysicalDeviceCoverageReductionModeFeaturesNV = 1000250000, // 0x3B9E9A90 - PipelineCoverageReductionStateCreateInfoNV = 1000250001, // 0x3B9E9A91 - FramebufferMixedSamplesCombinationNV = 1000250002, // 0x3B9E9A92 - PhysicalDeviceFragmentShaderInterlockFeaturesExt = 1000251000, // 0x3B9E9E78 - PhysicalDeviceYcbcrImageArraysFeaturesExt = 1000252000, // 0x3B9EA260 - PhysicalDeviceUniformBufferStandardLayoutFeatures = 1000253000, // 0x3B9EA648 - PhysicalDeviceUniformBufferStandardLayoutFeaturesKhr = 1000253000, // 0x3B9EA648 - PhysicalDeviceProvokingVertexFeaturesExt = 1000254000, // 0x3B9EAA30 - PipelineRasterizationProvokingVertexStateCreateInfoExt = 1000254001, // 0x3B9EAA31 - PhysicalDeviceProvokingVertexPropertiesExt = 1000254002, // 0x3B9EAA32 - SurfaceFullScreenExclusiveInfoExt = 1000255000, // 0x3B9EAE18 - SurfaceFullScreenExclusiveWin32InfoExt = 1000255001, // 0x3B9EAE19 - SurfaceCapabilitiesFullScreenExclusiveExt = 1000255002, // 0x3B9EAE1A - HeadlessSurfaceCreateInfoExt = 1000256000, // 0x3B9EB200 - PhysicalDeviceBufferDeviceAddressFeatures = 1000257000, // 0x3B9EB5E8 - PhysicalDeviceBufferDeviceAddressFeaturesKhr = 1000257000, // 0x3B9EB5E8 - BufferOpaqueCaptureAddressCreateInfo = 1000257002, // 0x3B9EB5EA - BufferOpaqueCaptureAddressCreateInfoKhr = 1000257002, // 0x3B9EB5EA - MemoryOpaqueCaptureAddressAllocateInfo = 1000257003, // 0x3B9EB5EB - MemoryOpaqueCaptureAddressAllocateInfoKhr = 1000257003, // 0x3B9EB5EB - DeviceMemoryOpaqueCaptureAddressInfo = 1000257004, // 0x3B9EB5EC - DeviceMemoryOpaqueCaptureAddressInfoKhr = 1000257004, // 0x3B9EB5EC - PhysicalDeviceLineRasterizationFeaturesExt = 1000259000, // 0x3B9EBDB8 - PipelineRasterizationLineStateCreateInfoExt = 1000259001, // 0x3B9EBDB9 - PhysicalDeviceLineRasterizationPropertiesExt = 1000259002, // 0x3B9EBDBA - PhysicalDeviceShaderAtomicFloatFeaturesExt = 1000260000, // 0x3B9EC1A0 - PhysicalDeviceHostQueryResetFeatures = 1000261000, // 0x3B9EC588 - PhysicalDeviceHostQueryResetFeaturesExt = 1000261000, // 0x3B9EC588 - PhysicalDeviceIndexTypeUint8FeaturesExt = 1000265000, // 0x3B9ED528 - PhysicalDeviceExtendedDynamicStateFeaturesExt = 1000267000, // 0x3B9EDCF8 - PhysicalDevicePipelineExecutablePropertiesFeaturesKhr = 1000269000, // 0x3B9EE4C8 - PipelineInfoKhr = 1000269001, // 0x3B9EE4C9 - PipelineExecutablePropertiesKhr = 1000269002, // 0x3B9EE4CA - PipelineExecutableInfoKhr = 1000269003, // 0x3B9EE4CB - PipelineExecutableStatisticKhr = 1000269004, // 0x3B9EE4CC - PipelineExecutableInternalRepresentationKhr = 1000269005, // 0x3B9EE4CD - PhysicalDeviceShaderAtomicFloat2FeaturesExt = 1000273000, // 0x3B9EF468 - PhysicalDeviceShaderDemoteToHelperInvocationFeaturesExt = 1000276000, // 0x3B9F0020 - PhysicalDeviceDeviceGeneratedCommandsPropertiesNV = 1000277000, // 0x3B9F0408 - GraphicsShaderGroupCreateInfoNV = 1000277001, // 0x3B9F0409 - GraphicsPipelineShaderGroupsCreateInfoNV = 1000277002, // 0x3B9F040A - IndirectCommandsLayoutTokenNV = 1000277003, // 0x3B9F040B - IndirectCommandsLayoutCreateInfoNV = 1000277004, // 0x3B9F040C - GeneratedCommandsInfoNV = 1000277005, // 0x3B9F040D - GeneratedCommandsMemoryRequirementsInfoNV = 1000277006, // 0x3B9F040E - PhysicalDeviceDeviceGeneratedCommandsFeaturesNV = 1000277007, // 0x3B9F040F - PhysicalDeviceInheritedViewportScissorFeaturesNV = 1000278000, // 0x3B9F07F0 - CommandBufferInheritanceViewportScissorInfoNV = 1000278001, // 0x3B9F07F1 - PhysicalDeviceShaderIntegerDotProductFeaturesKhr = 1000280000, // 0x3B9F0FC0 - PhysicalDeviceShaderIntegerDotProductPropertiesKhr = 1000280001, // 0x3B9F0FC1 - PhysicalDeviceTexelBufferAlignmentFeaturesExt = 1000281000, // 0x3B9F13A8 - PhysicalDeviceTexelBufferAlignmentPropertiesExt = 1000281001, // 0x3B9F13A9 - CommandBufferInheritanceRenderPassTransformInfoQCom = 1000282000, // 0x3B9F1790 - RenderPassTransformBeginInfoQCom = 1000282001, // 0x3B9F1791 - PhysicalDeviceDeviceMemoryReportFeaturesExt = 1000284000, // 0x3B9F1F60 - DeviceDeviceMemoryReportCreateInfoExt = 1000284001, // 0x3B9F1F61 - DeviceMemoryReportCallbackDataExt = 1000284002, // 0x3B9F1F62 - PhysicalDeviceRobustness2FeaturesExt = 1000286000, // 0x3B9F2730 - PhysicalDeviceRobustness2PropertiesExt = 1000286001, // 0x3B9F2731 - SamplerCustomBorderColorCreateInfoExt = 1000287000, // 0x3B9F2B18 - PhysicalDeviceCustomBorderColorPropertiesExt = 1000287001, // 0x3B9F2B19 - PhysicalDeviceCustomBorderColorFeaturesExt = 1000287002, // 0x3B9F2B1A - PipelineLibraryCreateInfoKhr = 1000290000, // 0x3B9F36D0 - PresentIDKhr = 1000294000, // 0x3B9F4670 - PhysicalDevicePresentIDFeaturesKhr = 1000294001, // 0x3B9F4671 - PhysicalDevicePrivateDataFeaturesExt = 1000295000, // 0x3B9F4A58 - DevicePrivateDataCreateInfoExt = 1000295001, // 0x3B9F4A59 - PrivateDataSlotCreateInfoExt = 1000295002, // 0x3B9F4A5A - PhysicalDevicePipelineCreationCacheControlFeaturesExt = 1000297000, // 0x3B9F5228 - VideoEncodeInfoKhr = 1000299000, // 0x3B9F59F8 - VideoEncodeRateControlInfoKhr = 1000299001, // 0x3B9F59F9 - PhysicalDeviceDiagnosticsConfigFeaturesNV = 1000300000, // 0x3B9F5DE0 - DeviceDiagnosticsConfigCreateInfoNV = 1000300001, // 0x3B9F5DE1 - ReservedQCom = 1000309000, // 0x3B9F8108 - MemoryBarrier2Khr = 1000314000, // 0x3B9F9490 - BufferMemoryBarrier2Khr = 1000314001, // 0x3B9F9491 - ImageMemoryBarrier2Khr = 1000314002, // 0x3B9F9492 - DependencyInfoKhr = 1000314003, // 0x3B9F9493 - SubmitInfo2Khr = 1000314004, // 0x3B9F9494 - SemaphoreSubmitInfoKhr = 1000314005, // 0x3B9F9495 - CommandBufferSubmitInfoKhr = 1000314006, // 0x3B9F9496 - PhysicalDeviceSynchronization2FeaturesKhr = 1000314007, // 0x3B9F9497 - QueueFamilyCheckpointProperties2NV = 1000314008, // 0x3B9F9498 - CheckpointData2NV = 1000314009, // 0x3B9F9499 - PhysicalDeviceShaderSubgroupUniformControlFlowFeaturesKhr = 1000323000, // 0x3B9FB7B8 - PhysicalDeviceZeroInitializeWorkgroupMemoryFeaturesKhr = 1000325000, // 0x3B9FBF88 - PhysicalDeviceFragmentShadingRateEnumsPropertiesNV = 1000326000, // 0x3B9FC370 - PhysicalDeviceFragmentShadingRateEnumsFeaturesNV = 1000326001, // 0x3B9FC371 - PipelineFragmentShadingRateEnumStateCreateInfoNV = 1000326002, // 0x3B9FC372 - AccelerationStructureGeometryMotionTrianglesDataNV = 1000327000, // 0x3B9FC758 - PhysicalDeviceRayTracingMotionBlurFeaturesNV = 1000327001, // 0x3B9FC759 - AccelerationStructureMotionInfoNV = 1000327002, // 0x3B9FC75A - PhysicalDeviceYcbcr2Plane444FormatsFeaturesExt = 1000330000, // 0x3B9FD310 - PhysicalDeviceFragmentDensityMap2FeaturesExt = 1000332000, // 0x3B9FDAE0 - PhysicalDeviceFragmentDensityMap2PropertiesExt = 1000332001, // 0x3B9FDAE1 - CopyCommandTransformInfoQCom = 1000333000, // 0x3B9FDEC8 - PhysicalDeviceImageRobustnessFeaturesExt = 1000335000, // 0x3B9FE698 - PhysicalDeviceWorkgroupMemoryExplicitLayoutFeaturesKhr = 1000336000, // 0x3B9FEA80 - CopyBufferInfo2Khr = 1000337000, // 0x3B9FEE68 - CopyImageInfo2Khr = 1000337001, // 0x3B9FEE69 - CopyBufferToImageInfo2Khr = 1000337002, // 0x3B9FEE6A - CopyImageToBufferInfo2Khr = 1000337003, // 0x3B9FEE6B - BlitImageInfo2Khr = 1000337004, // 0x3B9FEE6C - ResolveImageInfo2Khr = 1000337005, // 0x3B9FEE6D - BufferCopy2Khr = 1000337006, // 0x3B9FEE6E - ImageCopy2Khr = 1000337007, // 0x3B9FEE6F - ImageBlit2Khr = 1000337008, // 0x3B9FEE70 - BufferImageCopy2Khr = 1000337009, // 0x3B9FEE71 - ImageResolve2Khr = 1000337010, // 0x3B9FEE72 - PhysicalDevice4444FormatsFeaturesExt = 1000340000, // 0x3B9FFA20 - DirectfbSurfaceCreateInfoExt = 1000346000, // 0x3BA01190 - PhysicalDeviceRayTracingPipelineFeaturesKhr = 1000347000, // 0x3BA01578 - PhysicalDeviceRayTracingPipelinePropertiesKhr = 1000347001, // 0x3BA01579 - PhysicalDeviceRayQueryFeaturesKhr = 1000348013, // 0x3BA0196D - PhysicalDeviceMutableDescriptorTypeFeaturesValve = 1000351000, // 0x3BA02518 - MutableDescriptorTypeCreateInfoValve = 1000351002, // 0x3BA0251A - PhysicalDeviceVertexInputDynamicStateFeaturesExt = 1000352000, // 0x3BA02900 - VertexInputBindingDescription2Ext = 1000352001, // 0x3BA02901 - VertexInputAttributeDescription2Ext = 1000352002, // 0x3BA02902 - PhysicalDeviceDrmPropertiesExt = 1000353000, // 0x3BA02CE8 - PhysicalDevicePrimitiveTopologyListRestartFeaturesExt = 1000356000, // 0x3BA038A0 - ImportMemoryZirconHandleInfoFuchsia = 1000364000, // 0x3BA057E0 - MemoryZirconHandlePropertiesFuchsia = 1000364001, // 0x3BA057E1 - MemoryGetZirconHandleInfoFuchsia = 1000364002, // 0x3BA057E2 - ImportSemaphoreZirconHandleInfoFuchsia = 1000365000, // 0x3BA05BC8 - SemaphoreGetZirconHandleInfoFuchsia = 1000365001, // 0x3BA05BC9 - BufferCollectionCreateInfoFuchsia = 1000366000, // 0x3BA05FB0 - ImportMemoryBufferCollectionFuchsia = 1000366001, // 0x3BA05FB1 - BufferCollectionImageCreateInfoFuchsia = 1000366002, // 0x3BA05FB2 - BufferCollectionPropertiesFuchsia = 1000366003, // 0x3BA05FB3 - BufferConstraintsInfoFuchsia = 1000366004, // 0x3BA05FB4 - BufferCollectionBufferCreateInfoFuchsia = 1000366005, // 0x3BA05FB5 - ImageConstraintsInfoFuchsia = 1000366006, // 0x3BA05FB6 - ImageFormatConstraintsInfoFuchsia = 1000366007, // 0x3BA05FB7 - SysmemColorSpaceFuchsia = 1000366008, // 0x3BA05FB8 - BufferCollectionConstraintsInfoFuchsia = 1000366009, // 0x3BA05FB9 - SubpassShadingPipelineCreateInfoHuawei = 1000369000, // 0x3BA06B68 - PhysicalDeviceSubpassShadingFeaturesHuawei = 1000369001, // 0x3BA06B69 - PhysicalDeviceSubpassShadingPropertiesHuawei = 1000369002, // 0x3BA06B6A - PhysicalDeviceInvocationMaskFeaturesHuawei = 1000370000, // 0x3BA06F50 - MemoryGetRemoteAddressInfoNV = 1000371000, // 0x3BA07338 - PhysicalDeviceExternalMemoryRdmaFeaturesNV = 1000371001, // 0x3BA07339 - PhysicalDeviceExtendedDynamicState2FeaturesExt = 1000377000, // 0x3BA08AA8 - ScreenSurfaceCreateInfoQnx = 1000378000, // 0x3BA08E90 - PhysicalDeviceColorWriteEnableFeaturesExt = 1000381000, // 0x3BA09A48 - PipelineColorWriteCreateInfoExt = 1000381001, // 0x3BA09A49 - PhysicalDeviceGlobalPriorityQueryFeaturesExt = 1000388000, // 0x3BA0B5A0 - QueueFamilyGlobalPriorityPropertiesExt = 1000388001, // 0x3BA0B5A1 - PhysicalDeviceMultiDrawFeaturesExt = 1000392000, // 0x3BA0C540 - PhysicalDeviceMultiDrawPropertiesExt = 1000392001, // 0x3BA0C541 - PhysicalDevicePageableDeviceLocalMemoryFeaturesExt = 1000412000 // 0x3BA11360 -} \ No newline at end of file From 589d934700da145bdf0ebb5a6c9f6f2f6bf890e5 Mon Sep 17 00:00:00 2001 From: Craig Dean Date: Wed, 10 Nov 2021 00:24:13 +0000 Subject: [PATCH 37/42] feat: Added `Any` overloads As ~30% of Vulkan Structures are purely `IChainable`, that is they are not included in one of the Vulkan Specification `structextends` chains, but do implement `SType` and `PNext` correctly, I have added `Any` versions of each of the unmanaged chain extension methods. These methods accept `IChainable` directly for the `chain` and `next` parameters, making them work with any `IChainable` structure. Indeed the stricter non-`Any` methods, call the looser `Any` methods directly and serve merely as more rigorous compile time checks. Improved the inline documentation of the extensions methods. --- .../TestChainsAny.cs | 34 +++ .../ChainExtensions.cs | 33 --- src/Vulkan/Silk.NET.Vulkan/Chain.cs | 221 +++++++++++++++++- 3 files changed, 248 insertions(+), 40 deletions(-) create mode 100644 src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChainsAny.cs diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChainsAny.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChainsAny.cs new file mode 100644 index 0000000000..ce8fe1deb1 --- /dev/null +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChainsAny.cs @@ -0,0 +1,34 @@ +using Silk.NET.Vulkan; +using Xunit; + +namespace PrototypeStructChaining.Test; + +public class TestChainsAny +{ + [Fact] + public unsafe void TestAddNextUnchecked() + { + var geometryInstancesData = new AccelerationStructureGeometryInstancesDataKHR(); + geometryInstancesData + .AddNextAny(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures) + .AddNextAny(out PhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeaturesKhr); + + // Ensure all pointers set correctly + Assert.Equal((nint) (&indexingFeatures), (nint) geometryInstancesData.PNext); + Assert.Equal((nint) (&accelerationStructureFeaturesKhr), (nint) indexingFeatures.PNext); + Assert.Equal(0, (nint) accelerationStructureFeaturesKhr.PNext); + + // Ensure all STypes set correctly + Assert.Equal(StructureType.AccelerationStructureGeometryInstancesDataKhr, geometryInstancesData.SType); + Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, indexingFeatures.SType); + Assert.Equal + ( + StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr, + accelerationStructureFeaturesKhr.SType + ); + + // Check indices + Assert.Equal(1, geometryInstancesData.IndexOfAny(ref indexingFeatures)); + Assert.Equal(2, geometryInstancesData.IndexOfAny(ref accelerationStructureFeaturesKhr)); + } +} diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ChainExtensions.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ChainExtensions.cs index 7e04700100..3a65919661 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ChainExtensions.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ChainExtensions.cs @@ -73,39 +73,6 @@ public static class ChainExtensions Vulkan.StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr }; - /// - /// Returns the index of the in the , if present. - /// - /// The chain - /// The structure value - /// The type of the current chain - /// The type of the value - /// The zero-indexed index if found; otherwise -1. - public static unsafe int IndexOf(this ref TChain chain, ref TNext value) - where TChain : struct, IChainStart - where TNext : struct, IExtendsChain - { - // Ensure structure type of chain is set. - chain.StructureType(); - - var index = 0; - var currentPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); - var valuePtr = (BaseInStructure*) Unsafe.AsPointer(ref value); - // Follow chain - do - { - if (currentPtr == valuePtr) - { - return index; - } - - currentPtr = (BaseInStructure*) currentPtr->PNext; - index++; - } while (currentPtr is not null); - - return -1; - } - /// /// Gets the corresponding for a , if any. /// diff --git a/src/Vulkan/Silk.NET.Vulkan/Chain.cs b/src/Vulkan/Silk.NET.Vulkan/Chain.cs index 9eb07714e8..9aa49e2d30 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Chain.cs +++ b/src/Vulkan/Silk.NET.Vulkan/Chain.cs @@ -2,7 +2,10 @@ namespace Silk.NET.Vulkan; -public static partial class Chain +/// +/// Extension methods and utilities for building unmanaged structure chains. +/// +public static class Chain { /// /// Replaces a structure in the chain (if present, and is false), or adds it to the end. @@ -33,7 +36,15 @@ public static partial class Chain /// .SetNext(ref accelerationStructureFeaturesKhr); /// /// - public static unsafe ref TChain SetNext + /// + /// + /// + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ref TChain SetNext ( this ref TChain chain, ref TNext value, @@ -41,6 +52,53 @@ public static unsafe ref TChain SetNext ) where TChain : struct, IChainStart where TNext : struct, IExtendsChain + => ref SetNextAny(ref chain, ref value, alwaysAdd); + + /// + /// Replaces a structure in the chain (if present, and is false), or adds it to the end. + /// + /// The current chain + /// A reference to the structure to update + /// Always adds to the end of the chain, even if an equivalent structure is present. + /// The type of the current chain + /// The type of the value + /// A reference to the value value in the chain + /// + /// Note that both the supplied chain, and the supplied value will have their `SType` correctly set. Further, + /// the supplied structure's will be overwritten. + /// To use + /// + /// var indexingFeatures = new PhysicalDeviceDescriptorIndexingFeatures + /// { + /// ShaderInputAttachmentArrayDynamicIndexing = true + /// }; + /// var accelerationStructureFeaturesKhr = new PhysicalDeviceAccelerationStructureFeaturesKhr + /// { + /// AccelerationStructure = true + /// }; + /// + /// PhysicalDeviceFeatures2 + /// .BaseInStructure(out var features2) + /// .SetNext(ref indexingFeatures) + /// .SetNext(ref accelerationStructureFeaturesKhr); + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static unsafe ref TChain SetNextAny + ( + this ref TChain chain, + ref TNext value, + bool alwaysAdd = false + ) + where TChain : struct, IChainable + where TNext : struct, IChainable { // Ensure structure type of chain and value are set. chain.StructureType(); @@ -67,7 +125,7 @@ public static unsafe ref TChain SetNext } previousPtr = currentPtr; - currentPtr = (BaseInStructure*) nextPtr; + currentPtr = nextPtr; } while (currentPtr is not null); // Add value to end of chain @@ -97,9 +155,52 @@ public static unsafe ref TChain SetNext /// Note, the value is always added, even if an equivalent value is added in the chain already. Use /// to only add if not already present. /// - public static unsafe ref TChain AddNext(this ref TChain chain, out TNext next) + /// + /// + /// + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ref TChain AddNext(this ref TChain chain, out TNext next) where TChain : struct, IChainStart where TNext : struct, IExtendsChain + => ref AddNextAny(ref chain, out next); + + /// + /// Adds a structure to the end of the chain. + /// + /// The current chain + /// The structure added to the end of the chain + /// The type of the current chain + /// The type of the structure to add + /// The reference to the chain. + /// + /// Note that both the supplied chain, and the added structure will have their `SType` correctly set + /// To use specify the output type required, e.g.: + /// + /// PhysicalDeviceFeatures2 + /// .BaseInStructure(out var features2) + /// .AddNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures) + /// .AddNext(out PhysicalDeviceAccelerationStructureFeaturesKhr accelerationStructureFeaturesKhr); + /// + /// Note, the value is always added, even if an equivalent value is added in the chain already. Use + /// to only add if not already present. + /// + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + /// + /// + /// + /// + /// + public static unsafe ref TChain AddNextAny(this ref TChain chain, out TNext next) + where TChain : struct, IChainable + where TNext : struct, IChainable { // Ensure structure type of chain is set. chain.StructureType(); @@ -108,7 +209,7 @@ public static unsafe ref TChain AddNext(this ref TChain chain, ou var currentPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); while (currentPtr->PNext is not null) { - currentPtr = (BaseInStructure*) currentPtr->PNext; + currentPtr = currentPtr->PNext; } // Create new entry and set it's structure type @@ -136,9 +237,50 @@ public static unsafe ref TChain AddNext(this ref TChain chain, ou /// .TryAddNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures, out var added); /// /// - public static unsafe ref TChain TryAddNext(this ref TChain chain, out TNext next, out bool added) + /// + /// + /// + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ref TChain TryAddNext(this ref TChain chain, out TNext next, out bool added) where TChain : struct, IChainStart where TNext : struct, IExtendsChain + => ref TryAddNextAny(ref chain, out next, out added); + + /// + /// Tries to add a structure to the end of the chain. + /// + /// The current chain + /// The structure added to the end of the chain + /// Whether the structure was actually added + /// The type of the current chain + /// The type of the structure to add + /// The reference to the chain. + /// + /// Note that both the supplied chain, and the added structure will have their `SType` correctly set + /// To use specify the output type required, e.g.: + /// + /// PhysicalDeviceFeatures2 + /// .BaseInStructure(out var features2) + /// .TryAddNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures, out var added); + /// + /// + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + /// + /// + /// + /// + /// + public static unsafe ref TChain TryAddNextAny(this ref TChain chain, out TNext next, out bool added) + where TChain : struct, IChainable + where TNext : struct, IChainable { // Ensure structure type of chain is set. chain.StructureType(); @@ -163,11 +305,76 @@ public static unsafe ref TChain TryAddNext(this ref TChain chain, break; } - currentPtr = (BaseInStructure*) nextPtr; + currentPtr = nextPtr; } while (true); currentPtr->PNext = (BaseInStructure*) Unsafe.AsPointer(ref next); added = true; return ref chain; } + + /// + /// Returns the index of the in the , if present. + /// + /// The chain + /// The structure value + /// The type of the current chain + /// The type of the value + /// The zero-indexed index if found; otherwise -1. + /// + /// + /// + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static int IndexOf(this ref TChain chain, ref TNext value) + where TChain : struct, IChainStart + where TNext : struct, IExtendsChain + => IndexOfAny(ref chain, ref value); + + /// + /// Returns the index of the in the , if present. + /// + /// The chain + /// The structure value + /// The type of the current chain + /// The type of the value + /// The zero-indexed index if found; otherwise -1. + /// + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + /// + /// + /// + /// + /// + public static unsafe int IndexOfAny(this ref TChain chain, ref TNext value) + where TChain : struct, IChainable + where TNext : struct, IChainable + { + // Ensure structure type of chain is set. + chain.StructureType(); + + var index = 0; + var currentPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); + var valuePtr = (BaseInStructure*) Unsafe.AsPointer(ref value); + // Follow chain + do + { + if (currentPtr == valuePtr) + { + return index; + } + + currentPtr = currentPtr->PNext; + index++; + } while (currentPtr is not null); + + return -1; + } } From 8152c47559316c306aa2ac30702f2a0f72b96fe1 Mon Sep 17 00:00:00 2001 From: Craig Dean Date: Wed, 10 Nov 2021 01:01:11 +0000 Subject: [PATCH 38/42] docs: Updated the first two proposals Added details about PRs and the new `Any` extension methods. --- ... Chaining - #1 StructureType correction.md | 4 +- ...Struct Chaining - #2 Unmanaged Chaining.md | 313 +++++++++++++++--- 2 files changed, 267 insertions(+), 50 deletions(-) diff --git a/documentation/proposals/Proposal - Vulkan Struct Chaining - #1 StructureType correction.md b/documentation/proposals/Proposal - Vulkan Struct Chaining - #1 StructureType correction.md index 0af0ccad20..092e78bbf5 100644 --- a/documentation/proposals/Proposal - Vulkan Struct Chaining - #1 StructureType correction.md +++ b/documentation/proposals/Proposal - Vulkan Struct Chaining - #1 StructureType correction.md @@ -8,6 +8,8 @@ This is a tiny pre-requisite for and is of limited value otherwise. Its primary purpose is to mark any structure that requires it's `SType` field to be correctly set when passing to Vulkan, and to provide a mechanism for doing so. +A full implementation can be found [in Pull Request 680](https://github.com/dotnet/Silk.NET/pull/680). + # Contributors - [Craig Dean, DevDecoder](https://github.com/thargy) @@ -17,7 +19,7 @@ correctly set when passing to Vulkan, and to provide a mechanism for doing so. - [x] Proposed - [ ] Discussed with API Review Board (ARB) - [ ] Approved -- [ ] Implemented +- [x] Implemented # Design Decisions diff --git a/documentation/proposals/Proposal - Vulkan Struct Chaining - #2 Unmanaged Chaining.md b/documentation/proposals/Proposal - Vulkan Struct Chaining - #2 Unmanaged Chaining.md index 8b179e185c..983c501d2b 100644 --- a/documentation/proposals/Proposal - Vulkan Struct Chaining - #2 Unmanaged Chaining.md +++ b/documentation/proposals/Proposal - Vulkan Struct Chaining - #2 Unmanaged Chaining.md @@ -6,7 +6,7 @@ on [Proposal - Vulkan Struct Chaining - #1 StructureType correction](Proposal%20 This proposal presents a lightweight mechanism for fluently building Vulkan Structure Chains. You may wish to start with the [Usage section below](#Usage) to aid understanding. There is also a fully working prototype -[in the labs](../../src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/). +[in Pull Request 683](https://github.com/dotnet/Silk.NET/pull/683). To do so it marks any structure that meets the following requirements as being `IChainable`: @@ -22,19 +22,22 @@ is triggerred for the structure, providing a mechanism for ensuring the `SType` a `BaseInStructure* PNext { get; set; }` property for easy access to the next item in the chain. The presence of the `IChainable` interface, also acts as a **guarantee** that it is safe to cast any pointer of a struct -implementing it to a pointer to a `BaseInStructure` struct, which is a struct which has just the `SType` and `PNext` fields -present. Therefore it is always possible to cast `void* PNext` of an `IChainable` struct to `BaseInStructure*`. It is this -guarantee that requires the position of the fields to be fixed (which they are in practice). However, by ensuring we -validate the constraints at build time (when choosing to add the interface), we can prevent downstream bugs occurring at -run time. +implementing it to a pointer to a `BaseInStructure` struct, which is a struct which has just the `SType` and `PNext` +fields present. Therefore it is always possible to cast `void* PNext` of an `IChainable` struct to `BaseInStructure*`. +It is this guarantee that requires the position of the fields to be fixed (which they are in practice). However, by +ensuring we validate the constraints at build time (when choosing to add the interface), we can prevent downstream bugs +occurring at run time. **Note** that the `IChainable` interface adds the additional constraint that the `StructureType SType` field must be at -offset 0, i.e. in the first position. +offset 0, i.e. in the first position to facilitate this functionality - which is not a constraint of `IStructuredType`. -However, rather than extending `IChainable` directly, it will be more common to choose one of `IChainStart` -or `IExtendsChain` (both of which extend `IChainable`). `BuildTools` will do this based on the `structextends` -attribute provided in -the [Vulkan Specification](https://raw.githubusercontent.com/KhronosGroup/Vulkan-Headers/master/registry/vk.xml)). +However, rather than extending `IChainable` directly, where +the [Vulkan Specification](https://raw.githubusercontent.com/KhronosGroup/Vulkan-Headers/master/registry/vk.xml)) +specifies chaining constraints, via the presence of the `structextends` attribute, `BuildTools` chooses one +of `IChainStart` or `IExtendsChain` (both of which extend `IChainable`). The specification has nearly 100 chains +defined in this manner, and many of the >700 structures form part of these chains. However, over 200 structures are not +curretnly defined as part of a chain, and as such, all the utilities proposed have a 'looser' mechanism for working +with `IChainable` directly when it is necessary to do so. For example, if `struct B` extends `struct A`, then `struct B` will be marked with `IExtendsChain` and `struct A` will be marked with `IChainStart`. A struct may only extend `IChainStart` once (even though it may appear in @@ -67,24 +70,37 @@ public static unsafe ref TChain SetNext(this ref TChain chain, re where TChain : struct, IChainStart where TNext : struct, IExtendsChain {...} +public static unsafe ref TChain SetNextAny(this ref TChain chain, ref TNext value, + where TChain : struct, IChainable + where TNext : struct, IChainable {...} + public static unsafe ref TChain AddNext(this ref TChain chain, out TNext next) where TChain : struct, IChainStart where TNext : struct, IExtendsChain {...} + +public static unsafe ref TChain AddNextAny(this ref TChain chain, out TNext next) + where TChain : struct, IChainable + where TNext : struct, IChainable {...} public static unsafe ref TChain TryAddNext(this ref TChain chain, out TNext next, out bool added) where TChain : struct, IChainStart where TNext : struct, IExtendsChain {...} +public static unsafe ref TChain TryAddNextAny(this ref TChain chain, out TNext next, out bool added) + where TChain : struct, IChainable + where TNext : struct, IChainable {...} + public static unsafe int IndexOf(this ref TChain chain, ref TNext value) where TChain : struct, IChainStart where TNext : struct, IExtendsChain {...} -``` -Their implementation can be -found [in the labs](../../src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ChainExtensions.cs) and -their use is detailed below. +public static unsafe int IndexOfAny(this ref TChain chain, ref TNext value) + where TChain : struct, IChainable + where TNext : struct, IChainable {...} +``` -These extension methods +An implementation can be found [in Pull Request 683](https://github.com/dotnet/Silk.NET/pull/683) and their use is +detailed below. # Contributors @@ -95,7 +111,7 @@ These extension methods - [x] Proposed - [ ] Discussed with API Review Board (ARB) - [ ] Approved -- [ ] Implemented +- [x] Implemented # Design Decisions @@ -129,12 +145,20 @@ To be discussed: # Usage -The proposal provides for the following usage patterns: +The proposal provides for the following usages. Note that where an `Any` extension method is mentioned, it is identical +to the non-`Any` version (e.g. `AddNext` and `AddNextAny` are equivalent), save that the `Any` version does not +constrain the types to those associated with a defined chain. ### Chain Building -You can happily create the start of a chain as usual, and it's `SType` will be coerced when you start using it as a -chain: +You can happily create the start of a chain as usual, by declaring a variable first. Indeed it is necessary to do so if +you wish to specify non-default values (though you can also make use of `SetNext`s replace functionality). You also need +to use this approach when starting a chain which is not explicitly defined as a chain start by the specification. If you +do start a chain with such a structure, you will have to use the `Any` versions of the extension methods below to +continue manipulating it. + +Regardless, the `SType` and `PNext` will be overwritten whenever you start manipulating the chain, so you should never +set them manually. For example: ```csharp var createInfo = new DeviceCreateInfo @@ -145,7 +169,7 @@ var createInfo = new DeviceCreateInfo createinfo.AddNext... ``` --in many cases, we only want to create a default structure for population by the API. To do so, we use the +In many cases, we only want to create a default structure for population by the API. To do so, we use the static `BaseInStructure` method like so: ```csharp @@ -158,10 +182,10 @@ This has several advantages: - The structure's `SType` will be correctly set immediately. - The syntax is fluent, and creates more readable code when used with the other chaining methods (see below). -**Note** All the chaining methods return the current start of the chain by reference (including `BaseInStructure`). This allows -each method to scan the entire chain. More importantly, it allows the Type constraints to be checked during compile time -to ensure that a type actually extends the chain. One side effect is that `ref Chain(out)` outputs the newly created -chain _and_ returns a reference to it. This can cause confusion to less experienced C# devs, for example: +**Note** All the chaining methods return the current start of the chain by reference (including `BaseInStructure`). This +allows each method to scan the entire chain. More importantly, it allows the Type constraints to be checked during +compile time to ensure that a type actually can extend the chain. One side effect is that `ref Chain(out)` outputs the +newly created chain _and_ returns a reference to it. This can cause confusion to less experienced C# devs, for example: ```csharp // Don't do this, it is harmless but unnecessary and confusing! @@ -177,7 +201,12 @@ actually updates the `PNext` of variable `b`. Once the chain is built the final into `a`. None of this is undefined behaviour, but as it is generally poorly understood so none of the examples ever recommend assigning the output of a chain. -### AddNext +The `Chain` method is a static method implemented on `IChainStart` structures, the remaining methods are actually +extension methods. The methods ending with `Any` can be used with any `IChainable` structure, but they do not constrain +the entries, or the head of the chain to being structures explicitly mentioned by the specification. The non-`Any` +methods are more restrictive, and should usually be used in preference. + +### AddNext / AddNextAny The most common use case is to add an empty structure to the end of a chain for it to be populated by the Vulkan API, this can now be done like so: @@ -194,7 +223,7 @@ PhysicalDeviceFeatures2 Each method `out` puts a struct into the local stack frame for querying once populated, and the pointers point to this local variable. Despite generics and interfaces being used, the chain methods avoid the heap entirely. -### TryAddNext +### TryAddNext / TryAddNextAny You may only want to add a structure if it doesn't already exist in the chain, this can be done with `TryAddNext`, e.g.: @@ -207,7 +236,7 @@ PhysicalDeviceFeatures2 .TryAddNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures2, out bool added); ``` -### SetNext +### SetNext / SetNextAny Sometimes we may wish to set the initial state of a structure, or replace any existing item within the structure that has the same `StructureType` we can do this with `SetNext`: @@ -255,7 +284,7 @@ PhysicalDeviceFeatures2 .SetNext(ref indexingFeatures2, true); ``` -### IndexOf +### IndexOf / IndexOfAny Sometimes it's useful to know if a structure you previously supplied is still in a chain, this can be done with `IndexOf`, which returns a non-negative index (zero-indexed) if the structure is found, eg.: @@ -297,6 +326,10 @@ namespace Silk.Net.Vulkan; /// to a pointer to a . public interface IChainable : IStructuredType { + /// + /// Points to the next in this chain, if any; otherwise . + /// + unsafe BaseInStructure* PNext { get; set; } } ``` @@ -336,14 +369,17 @@ public interface IExtendsChain : IChainable } ``` -### Chain Extensions +### Chain Extension Methods Provides the struct chaining functionality, the full implementation can be found [in the labs](../../src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ChainExtensions.cs): ```csharp -namespace Silk.Net.Vulkan; +namespace Silk.NET.Vulkan; +/// +/// Extension methods and utilities for building unmanaged structure chains. +/// public static class Chain { /// @@ -364,21 +400,81 @@ public static class Chain /// { /// ShaderInputAttachmentArrayDynamicIndexing = true /// }; - /// var accelerationStructureFeaturesKhr = new PhysicalDeviceAccelerationStructureFeaturesKHR + /// var accelerationStructureFeaturesKhr = new PhysicalDeviceAccelerationStructureFeaturesKhr /// { /// AccelerationStructure = true /// }; /// /// PhysicalDeviceFeatures2 - /// .Chain(out var features2) + /// .BaseInStructure(out var features2) /// .SetNext(ref indexingFeatures) /// .SetNext(ref accelerationStructureFeaturesKhr); /// /// - public static unsafe ref TChain SetNext(this ref TChain chain, ref TNext value, - bool alwaysAdd = false) + /// + /// + /// + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ref TChain SetNext + ( + this ref TChain chain, + ref TNext value, + bool alwaysAdd = false + ) where TChain : struct, IChainStart - where TNext : struct, IExtendsChain {...} + where TNext : struct, IExtendsChain + => ref SetNextAny(ref chain, ref value, alwaysAdd); + + /// + /// Replaces a structure in the chain (if present, and is false), or adds it to the end. + /// + /// The current chain + /// A reference to the structure to update + /// Always adds to the end of the chain, even if an equivalent structure is present. + /// The type of the current chain + /// The type of the value + /// A reference to the value value in the chain + /// + /// Note that both the supplied chain, and the supplied value will have their `SType` correctly set. Further, + /// the supplied structure's will be overwritten. + /// To use + /// + /// var indexingFeatures = new PhysicalDeviceDescriptorIndexingFeatures + /// { + /// ShaderInputAttachmentArrayDynamicIndexing = true + /// }; + /// var accelerationStructureFeaturesKhr = new PhysicalDeviceAccelerationStructureFeaturesKhr + /// { + /// AccelerationStructure = true + /// }; + /// + /// PhysicalDeviceFeatures2 + /// .BaseInStructure(out var features2) + /// .SetNext(ref indexingFeatures) + /// .SetNext(ref accelerationStructureFeaturesKhr); + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static unsafe ref TChain SetNextAny + ( + this ref TChain chain, + ref TNext value, + bool alwaysAdd = false + ) + where TChain : struct, IChainable + where TNext : struct, IChainable + {...} /// /// Adds a structure to the end of the chain. @@ -393,16 +489,60 @@ public static class Chain /// To use specify the output type required, e.g.: /// /// PhysicalDeviceFeatures2 - /// .Chain(out var features2) + /// .BaseInStructure(out var features2) /// .AddNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures) - /// .AddNext(out PhysicalDeviceAccelerationStructureFeaturesKHR accelerationStructureFeaturesKhr); + /// .AddNext(out PhysicalDeviceAccelerationStructureFeaturesKhr accelerationStructureFeaturesKhr); /// /// Note, the value is always added, even if an equivalent value is added in the chain already. Use /// to only add if not already present. /// - public static unsafe ref TChain AddNext(this ref TChain chain, out TNext next) + /// + /// + /// + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ref TChain AddNext(this ref TChain chain, out TNext next) where TChain : struct, IChainStart - where TNext : struct, IExtendsChain {...} + where TNext : struct, IExtendsChain + => ref AddNextAny(ref chain, out next); + + /// + /// Adds a structure to the end of the chain. + /// + /// The current chain + /// The structure added to the end of the chain + /// The type of the current chain + /// The type of the structure to add + /// The reference to the chain. + /// + /// Note that both the supplied chain, and the added structure will have their `SType` correctly set + /// To use specify the output type required, e.g.: + /// + /// PhysicalDeviceFeatures2 + /// .BaseInStructure(out var features2) + /// .AddNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures) + /// .AddNext(out PhysicalDeviceAccelerationStructureFeaturesKhr accelerationStructureFeaturesKhr); + /// + /// Note, the value is always added, even if an equivalent value is added in the chain already. Use + /// to only add if not already present. + /// + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + /// + /// + /// + /// + /// + public static unsafe ref TChain AddNextAny(this ref TChain chain, out TNext next) + where TChain : struct, IChainable + where TNext : struct, IChainable + {...} /// /// Tries to add a structure to the end of the chain. @@ -418,13 +558,55 @@ public static class Chain /// To use specify the output type required, e.g.: /// /// PhysicalDeviceFeatures2 - /// .Chain(out var features2) + /// .BaseInStructure(out var features2) /// .TryAddNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures, out var added); /// /// - public static unsafe ref TChain TryAddNext(this ref TChain chain, out TNext next, out bool added) + /// + /// + /// + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ref TChain TryAddNext(this ref TChain chain, out TNext next, out bool added) where TChain : struct, IChainStart - where TNext : struct, IExtendsChain {...} + where TNext : struct, IExtendsChain + => ref TryAddNextAny(ref chain, out next, out added); + + /// + /// Tries to add a structure to the end of the chain. + /// + /// The current chain + /// The structure added to the end of the chain + /// Whether the structure was actually added + /// The type of the current chain + /// The type of the structure to add + /// The reference to the chain. + /// + /// Note that both the supplied chain, and the added structure will have their `SType` correctly set + /// To use specify the output type required, e.g.: + /// + /// PhysicalDeviceFeatures2 + /// .BaseInStructure(out var features2) + /// .TryAddNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures, out var added); + /// + /// + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + /// + /// + /// + /// + /// + public static unsafe ref TChain TryAddNextAny(this ref TChain chain, out TNext next, out bool added) + where TChain : struct, IChainable + where TNext : struct, IChainable + {...} /// /// Returns the index of the in the , if present. @@ -434,18 +616,51 @@ public static class Chain /// The type of the current chain /// The type of the value /// The zero-indexed index if found; otherwise -1. - public static unsafe int IndexOf(this ref TChain chain, ref TNext value) + /// + /// + /// + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static int IndexOf(this ref TChain chain, ref TNext value) where TChain : struct, IChainStart - where TNext : struct, IExtendsChain {...} + where TNext : struct, IExtendsChain + => IndexOfAny(ref chain, ref value); + + /// + /// Returns the index of the in the , if present. + /// + /// The chain + /// The structure value + /// The type of the current chain + /// The type of the value + /// The zero-indexed index if found; otherwise -1. + /// + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + /// + /// + /// + /// + /// + public static unsafe int IndexOfAny(this ref TChain chain, ref TNext value) + where TChain : struct, IChainable + where TNext : struct, IChainable + {...} } ``` ### Chain Structure -The `BaseInStructure` struct makes it easy to access the `SType` and `PNext` of a structure pointed to by `void* PNext`, although -it is used internally, it is useful for consumers of Silk.Net to have access to use in their own scenarios, that is -because the `IChainable` interface does not directly expose the underlying `SType` and `PNext` fields; as they are -fields (not properties), and this proposal aims to avoid boxing (so we try not to use the interface directly +The `BaseInStructure` struct makes it easy to access the `SType` and `PNext` of a structure pointed to by `void* PNext`, +although it is used internally, it is useful for consumers of Silk.Net to have access to use in their own scenarios, +that is because the `IChainable` interface does not directly expose the underlying `SType` and `PNext` fields; as they +are fields (not properties), and this proposal aims to avoid boxing (so we try not to use the interface directly unnecessarily). ```csharp From a83156e9178f1112c79fb148d398be391ee6c5c4 Mon Sep 17 00:00:00 2001 From: Craig Dean Date: Thu, 11 Nov 2021 04:13:33 +0000 Subject: [PATCH 39/42] feat: Added `Any` functionality to `ManagedChain` * Removed instance methods and converted into static extension methods. * Added `Any` equivalents with looser constraints. * Various fixes to make prototype match more closely with current draft implementations, and `Silk.NET.Vulkan`. * Added tests. * Added efficient equality overloads. * Added ToString(). * Expose the `HeadPtr` and `Size` in the base class. --- ...n Struct Chaining - #3 Managed Chaining.md | 2 +- .../TestChainMetadata.cs | 2 +- .../TestChains.cs | 2 +- .../TestChainsAny.cs | 30 + .../TestCompilation.cs | 17 +- .../TestManagedChains.cs | 55 +- .../TestManagedChainsAny.cs | 193 + .../BaseInStructure.cs | 4 +- .../PrototypeStructChaining/Buffer.cs | 12 + .../PrototypeStructChaining/Chain.cs | 251 +- .../DeviceCreateInfo.cs | 2 +- .../PrototypeStructChaining/IChainStart.cs | 2 +- .../PrototypeStructChaining/IChainable.cs | 2 +- .../PrototypeStructChaining/IExtendsChain.cs | 2 +- .../IStructuredType.cs | 2 +- .../ManagedChain.gen.cs | 23211 ++++++++++------ .../ManagedChain.gen.tt | 702 +- ...lDeviceAccelerationStructureFeaturesKhr.cs | 2 +- ...hysicalDeviceDescriptorIndexingFeatures.cs | 2 +- .../PhysicalDeviceFeatures.cs | 2 +- .../PhysicalDeviceFeatures2.cs | 2 +- .../PrototypeStructChaining.csproj | 3 +- .../PrototypeStructChaining/StructureType.cs | 2 +- 23 files changed, 15930 insertions(+), 8574 deletions(-) create mode 100644 src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChainsAny.cs create mode 100644 src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestManagedChainsAny.cs create mode 100644 src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/Buffer.cs diff --git a/documentation/proposals/Proposal - Vulkan Struct Chaining - #3 Managed Chaining.md b/documentation/proposals/Proposal - Vulkan Struct Chaining - #3 Managed Chaining.md index 47c6bbfc89..86f6456027 100644 --- a/documentation/proposals/Proposal - Vulkan Struct Chaining - #3 Managed Chaining.md +++ b/documentation/proposals/Proposal - Vulkan Struct Chaining - #3 Managed Chaining.md @@ -17,7 +17,7 @@ performance. However, many consumers are uncomfortable with pointers, and are especially prone to introducing bugs when placing structs onto the heap. This proposal provides a convenient `ManagedChain` class, and multiple -descendent `ManagedChain` classes to safely fix the structures in memory and prevent pointer bugs. +descendent `ManagedChain` (similar to the `System.Tuple` classes) classes to safely fix the structures in memory and prevent pointer bugs. Whenever a structure is loaded into the `ManagedChain` its `SType` and `PNext` are forced to be correct, preventing errors. Structures can be replaced at any time, and will be inserted efficiently into the chain as an O(1) operation. diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChainMetadata.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChainMetadata.cs index f823b0bdf5..9e3c26a1f4 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChainMetadata.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChainMetadata.cs @@ -1,6 +1,6 @@ using System; using System.Linq; -using Silk.Net.Vulkan; +using Silk.NET.Vulkan; using Xunit; namespace PrototypeStructChaining.Test; diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChains.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChains.cs index 45c1e5b66d..fd329abd36 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChains.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChains.cs @@ -1,4 +1,4 @@ -using Silk.Net.Vulkan; +using Silk.NET.Vulkan; using Xunit; namespace PrototypeStructChaining.Test; diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChainsAny.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChainsAny.cs new file mode 100644 index 0000000000..ab15057480 --- /dev/null +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestChainsAny.cs @@ -0,0 +1,30 @@ +using Silk.NET.Vulkan; +using Xunit; + +namespace PrototypeStructChaining.Test; + +public class TestChainsAny +{ + [Fact] + public unsafe void TestAddNextUnchecked() + { + var accelerationStructureFeatures = new PhysicalDeviceAccelerationStructureFeaturesKhr(); + accelerationStructureFeatures + .AddNextAny(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures) + .AddNextAny(out DeviceCreateInfo deviceCreateInfo); + + // Ensure all pointers set correctly + Assert.Equal((nint) (&indexingFeatures), (nint) accelerationStructureFeatures.PNext); + Assert.Equal((nint) (&deviceCreateInfo), (nint) indexingFeatures.PNext); + Assert.Equal(0, (nint) deviceCreateInfo.PNext); + + // Ensure all STypes set correctly + Assert.Equal(StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr, accelerationStructureFeatures.SType); + Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, indexingFeatures.SType); + Assert.Equal(StructureType.DeviceCreateInfo, deviceCreateInfo.SType); + + // Check indices + Assert.Equal(1, accelerationStructureFeatures.IndexOfAny(ref indexingFeatures)); + Assert.Equal(2, accelerationStructureFeatures.IndexOfAny(ref deviceCreateInfo)); + } +} diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestCompilation.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestCompilation.cs index abf2e22595..91c91d0aeb 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestCompilation.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestCompilation.cs @@ -6,7 +6,7 @@ using Microsoft.CodeAnalysis; using Microsoft.CodeAnalysis.CSharp; using Microsoft.CodeAnalysis.Emit; -using Silk.Net.Vulkan; +using Silk.NET.Vulkan; using Xunit; namespace PrototypeStructChaining.Test; @@ -25,7 +25,7 @@ public class TestCompilation private static readonly string CodeTemplate = @" using System; -using Silk.Net.Vulkan; +using Silk.NET.Vulkan; public class Test {{ @@ -79,6 +79,19 @@ public void TestCantAddUnsupportedNext() Assert.Equal("CS0315", error.Id); } + [Fact] + public void TestCanAddUnsupportedNextUsingAny() + { + var diagnostics = CheckCompile + ( + @"PhysicalDeviceFeatures2 + .Chain(out var features2) + .AddNextAny(out DeviceCreateInfo createInfo);" + ); + + Assert.Empty(diagnostics); + } + [Fact] public void TestCanAddSupportedNext() { diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestManagedChains.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestManagedChains.cs index e1504b67d3..fe83c428cb 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestManagedChains.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestManagedChains.cs @@ -1,6 +1,6 @@ using System; using System.Linq; -using Silk.Net.Vulkan; +using Silk.NET.Vulkan; using Xunit; namespace PrototypeStructChaining.Test; @@ -10,8 +10,12 @@ public class TestManagedChains [Fact] public unsafe void TestManagedChain() { - using var chain = new ManagedChain(); + using var chain = ManagedChain.Create + ( + default(PhysicalDeviceFeatures2), + default(PhysicalDeviceDescriptorIndexingFeatures), + default(PhysicalDeviceAccelerationStructureFeaturesKhr) + ); // Ensure all STypes set correctly Assert.Equal(StructureType.PhysicalDeviceFeatures2, chain.Head.SType); @@ -28,7 +32,12 @@ public unsafe void TestManagedChain() public unsafe void TestManagedChainReplaceHead() { using var chain = - new ManagedChain(); + ManagedChain.Create + ( + default(DeviceCreateInfo), + default(PhysicalDeviceFeatures2), + default(PhysicalDeviceDescriptorIndexingFeatures) + ); // Ensure all STypes set correctly Assert.Equal(StructureType.DeviceCreateInfo, chain.Head.SType); @@ -62,7 +71,7 @@ public unsafe void TestManagedChainReplaceHead() [Fact] public unsafe void TestManagedChainReplaceMiddle() { - using var chain = new ManagedChain ( item1: new PhysicalDeviceDescriptorIndexingFeatures @@ -105,12 +114,13 @@ public unsafe void TestManagedChainReplaceMiddle() // As is the SType Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, chain.Item1.SType); + chain.Dispose(); } [Fact] public unsafe void TestManagedChainDuplicate() { - using var chain = new ManagedChain + using var chain = ManagedChain.Create ( item1: new PhysicalDeviceDescriptorIndexingFeatures {ShaderInputAttachmentArrayDynamicIndexing = true} ); @@ -142,12 +152,23 @@ public unsafe void TestManagedChainDuplicate() // Check we have new copies Assert.NotEqual((nint) chain.HeadPtr, (nint) newChain.HeadPtr); Assert.NotEqual((nint) chain.Item1Ptr, (nint) newChain.Item1Ptr); + + // Test equality + Assert.Equal(chain, newChain); + Assert.True(chain == newChain); + + // Modify second chain + newChain.Item1 = default; + + // Test equality + Assert.NotEqual(chain, newChain); + Assert.False(chain == newChain); } [Fact] - public unsafe void TestManagedChainAppend() + public unsafe void TestManagedChainAdd() { - using var chain = new ManagedChain + using var chain = ManagedChain.Create ( item1: new PhysicalDeviceDescriptorIndexingFeatures {ShaderInputAttachmentArrayDynamicIndexing = true} ); @@ -163,7 +184,7 @@ public unsafe void TestManagedChainAppend() // Check flag set Assert.True(chain.Item1.ShaderInputAttachmentArrayDynamicIndexing); - using var newChain = chain.Append(); + using var newChain = chain.Add(default(PhysicalDeviceAccelerationStructureFeaturesKhr)); // Ensure all STypes set correctly Assert.Equal(StructureType.PhysicalDeviceFeatures2, newChain.Head.SType); @@ -244,7 +265,7 @@ public unsafe void TestManagedChainLoad() // Loads a new managed chain from an unmanaged chain using var managedChain = - new ManagedChain(out var errors, unmanagedChain); // Check we had no loading errors @@ -290,10 +311,16 @@ public void TestManagedChainLoadWithError() PhysicalDeviceFeatures2>(out var errors, unmanagedChain); // Check for errors + var errorsArray = errors.Split(new[] {'\r', '\n'}, StringSplitOptions.RemoveEmptyEntries); + Assert.Equal(2, errorsArray.Length); + Assert.Equal + ( + "The unmanaged chain has a structure type PhysicalDeviceFeatures2Khr at position 2; expected PhysicalDeviceAccelerationStructureFeaturesKhr", + errorsArray[0] + ); Assert.Equal ( - @"The unmanaged chain has a structure type PhysicalDeviceFeatures2Khr at position 2; expected PhysicalDeviceAccelerationStructureFeaturesKhr -The unmanaged chain was length 4, expected length 5", errors + "The unmanaged chain was length 4, expected length 5", errorsArray[1] ); // Despite the errors indexing features was at the right location so was loaded @@ -331,7 +358,7 @@ public void TestManagedChainLoadWithErrorTooLong() [Fact] public void TestReadOnlyList() { - using var chain = new ManagedChain(); Assert.Equal(3, chain.Count); @@ -355,7 +382,7 @@ public void TestReadOnlyList() [Fact] public void TestDeconstructor() { - using var chain = new ManagedChain(); var (physicalDeviceFeatures2, indexingFeatures, accelerationStructureFeaturesKhr) = chain; diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestManagedChainsAny.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestManagedChainsAny.cs new file mode 100644 index 0000000000..7b6c69018b --- /dev/null +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestManagedChainsAny.cs @@ -0,0 +1,193 @@ +using System; +using System.Linq; +using Silk.NET.Vulkan; +using Xunit; + +namespace PrototypeStructChaining.Test; + +public class TestManagedChainsAny +{ + [Fact] + public unsafe void TestManagedChainAny() + { + using var chain = ManagedChain.CreateAny + ( + default(PhysicalDeviceFeatures2), + default(PhysicalDeviceDescriptorIndexingFeatures), + default(DeviceCreateInfo) + ); + + // Ensure all STypes set correctly + Assert.Equal(StructureType.PhysicalDeviceFeatures2, chain.Head.SType); + Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, chain.Item1.SType); + Assert.Equal(StructureType.DeviceCreateInfo, chain.Item2.SType); + + // Ensure pointers set correctly + Assert.Equal((nint) chain.Item1Ptr, (nint) chain.Head.PNext); + Assert.Equal((nint) chain.Item2Ptr, (nint) chain.Item1.PNext); + Assert.Equal(0, (nint) chain.Item2.PNext); + } + + [Fact] + public unsafe void TestManagedChainDuplicateAny() + { + using var chain = ManagedChain.CreateAny + ( + item1: new DeviceCreateInfo {Flags = 1U} + ); + + // Ensure all STypes set correctly + Assert.Equal(StructureType.PhysicalDeviceFeatures2, chain.Head.SType); + Assert.Equal(StructureType.DeviceCreateInfo, chain.Item1.SType); + + // Ensure pointers set correctly + Assert.Equal((nint) chain.Item1Ptr, (nint) chain.Head.PNext); + Assert.Equal(0, (nint) chain.Item1.PNext); + + // Check flag set + Assert.Equal(1U, chain.Item1.Flags); + + using var newChain = chain.DuplicateAny(); + + // Ensure all STypes set correctly + Assert.Equal(StructureType.PhysicalDeviceFeatures2, chain.Head.SType); + Assert.Equal(StructureType.DeviceCreateInfo, chain.Item1.SType); + + // Ensure pointers set correctly + Assert.Equal((nint) chain.Item1Ptr, (nint) chain.Head.PNext); + Assert.Equal(0, (nint) chain.Item1.PNext); + + // Check flag set + Assert.Equal(1U, chain.Item1.Flags); + + // Check we have new copies + Assert.NotEqual((nint) chain.HeadPtr, (nint) newChain.HeadPtr); + Assert.NotEqual((nint) chain.Item1Ptr, (nint) newChain.Item1Ptr); + + // Test equality + Assert.Equal(chain, newChain); + Assert.True(chain == newChain); + } + + [Fact] + public unsafe void TestManagedChainAddAny() + { + using var chain = ManagedChain.Create + ( + item1: new PhysicalDeviceDescriptorIndexingFeatures {ShaderInputAttachmentArrayDynamicIndexing = true} + ); + + // Ensure all STypes set correctly + Assert.Equal(StructureType.PhysicalDeviceFeatures2, chain.Head.SType); + Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, chain.Item1.SType); + + // Ensure pointers set correctly + Assert.Equal((nint) chain.Item1Ptr, (nint) chain.Head.PNext); + Assert.Equal(0, (nint) chain.Item1.PNext); + + // Check flag set + Assert.True(chain.Item1.ShaderInputAttachmentArrayDynamicIndexing); + + using var newChain = chain.AddAny(default(DeviceCreateInfo)); + + // Ensure all STypes set correctly + Assert.Equal(StructureType.PhysicalDeviceFeatures2, newChain.Head.SType); + Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, newChain.Item1.SType); + Assert.Equal(StructureType.DeviceCreateInfo, newChain.Item2.SType); + + // Ensure pointers set correctly + Assert.Equal((nint) newChain.Item1Ptr, (nint) newChain.Head.PNext); + Assert.Equal((nint) newChain.Item2Ptr, (nint) newChain.Item1.PNext); + Assert.Equal(0, (nint) newChain.Item2.PNext); + + // Check flag still set + Assert.True(newChain.Item1.ShaderInputAttachmentArrayDynamicIndexing); + + // Check we have new copies + Assert.NotEqual((nint) chain.HeadPtr, (nint) newChain.HeadPtr); + Assert.NotEqual((nint) chain.Item1Ptr, (nint) newChain.Item1Ptr); + } + + [Fact] + public unsafe void TestManagedChainTruncateAny() + { + using var chain = + ManagedChain.CreateAny< + PhysicalDeviceFeatures2, + PhysicalDeviceDescriptorIndexingFeatures, + DeviceCreateInfo> + ( + item2: new DeviceCreateInfo {Flags = 1U} + ); + + // Ensure all STypes set correctly + Assert.Equal(StructureType.PhysicalDeviceFeatures2, chain.Head.SType); + Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, chain.Item1.SType); + Assert.Equal(StructureType.DeviceCreateInfo, chain.Item2.SType); + + // Ensure pointers set correctly + Assert.Equal((nint) chain.Item1Ptr, (nint) chain.Head.PNext); + Assert.Equal((nint) chain.Item2Ptr, (nint) chain.Item1.PNext); + Assert.Equal(0, (nint) chain.Item2.PNext); + + // Check flag set + Assert.Equal(1U, chain.Item2.Flags); + + using var newChain = chain.TruncateAny(out var deviceCreateInfo); + + Assert.Equal(2, newChain.Count); + + // Ensure all STypes set correctly + Assert.Equal(StructureType.PhysicalDeviceFeatures2, newChain.Head.SType); + Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, newChain.Item1.SType); + + // Ensure pointers set correctly + Assert.Equal((nint) newChain.Item1Ptr, (nint) newChain.Head.PNext); + Assert.Equal(0, (nint) newChain.Item1.PNext); + + // Check removed type flag + Assert.Equal(1U, deviceCreateInfo.Flags); + + // Check we have new copies + Assert.NotEqual((nint) chain.HeadPtr, (nint) newChain.HeadPtr); + Assert.NotEqual((nint) chain.Item1Ptr, (nint) newChain.Item1Ptr); + + // NOTE: As the new chain is valid, we can use Truncate on it + using var finalChain = newChain.Truncate(out var indexingFeatures); + } + + [Fact] + public unsafe void TestManagedChainLoadAny() + { + // Load an unmanaged chain + var indexingFeatures = new PhysicalDeviceDescriptorIndexingFeatures + { + ShaderInputAttachmentArrayDynamicIndexing = true + }; + PhysicalDeviceFeatures2 + .Chain(out var unmanagedChain) + .SetNext(ref indexingFeatures) + .AddNextAny(out DeviceCreateInfo deviceCreateInfo); + + // Loads a new managed chain from an unmanaged chain + using var managedChain = + ManagedChain.LoadAny(out var errors, unmanagedChain); + + // Check we had no loading errors + Assert.Equal("", errors); + + // Check the flag still set + Assert.True(managedChain.Item1.ShaderInputAttachmentArrayDynamicIndexing); + + // Ensure all STypes set correctly + Assert.Equal(StructureType.PhysicalDeviceFeatures2, managedChain.Head.SType); + Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, managedChain.Item1.SType); + Assert.Equal(StructureType.DeviceCreateInfo, managedChain.Item2.SType); + + // Ensure pointers set correctly + Assert.Equal((nint) managedChain.Item1Ptr, (nint) managedChain.Head.PNext); + Assert.Equal((nint) managedChain.Item2Ptr, (nint) managedChain.Item1.PNext); + Assert.Equal(0, (nint) managedChain.Item2.PNext); + } +} diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/BaseInStructure.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/BaseInStructure.cs index dee01f2685..5e71dd6f11 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/BaseInStructure.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/BaseInStructure.cs @@ -1,4 +1,4 @@ -namespace Silk.Net.Vulkan; +namespace Silk.NET.Vulkan; /// /// Header struct of all structs. @@ -19,7 +19,7 @@ public struct BaseInStructure : IChainable /// /// The next struct in the chain, if any; otherwise . /// - public unsafe void* PNext; + public unsafe BaseInStructure* PNext; /// /// Note, this cannot coerce the type as 'guaranteed by the `IStructuredType` interface. diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/Buffer.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/Buffer.cs new file mode 100644 index 0000000000..37044ff381 --- /dev/null +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/Buffer.cs @@ -0,0 +1,12 @@ +// Licensed to the .NET Foundation under one or more agreements. +// The .NET Foundation licenses this file to you under the MIT license. + +namespace Silk.NET.Vulkan; + +/// +/// PlaceHolder - to ensure disambiguation works. +/// +[Obsolete("This class is here to indicate the the real Silk.NET.Vulkan contains a `Buffer` class.")] +public class Buffer +{ +} diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/Chain.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/Chain.cs index 75106005dc..3e03c003e7 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/Chain.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/Chain.cs @@ -1,6 +1,6 @@ using System.Runtime.CompilerServices; -namespace Silk.Net.Vulkan; +namespace Silk.NET.Vulkan; public static class Chain { @@ -33,7 +33,15 @@ public static class Chain /// .SetNext(ref accelerationStructureFeaturesKhr); /// /// - public static unsafe ref TChain SetNext + /// + /// + /// + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ref TChain SetNext ( this ref TChain chain, ref TNext value, @@ -41,6 +49,53 @@ public static unsafe ref TChain SetNext ) where TChain : struct, IChainStart where TNext : struct, IExtendsChain + => ref SetNextAny(ref chain, ref value, alwaysAdd); + + /// + /// Replaces a structure in the chain (if present, and is false), or adds it to the end. + /// + /// The current chain + /// A reference to the structure to update + /// Always adds to the end of the chain, even if an equivalent structure is present. + /// The type of the current chain + /// The type of the value + /// A reference to the value value in the chain + /// + /// Note that both the supplied chain, and the supplied value will have their `SType` correctly set. Further, + /// the supplied structure's will be overwritten. + /// To use + /// + /// var indexingFeatures = new PhysicalDeviceDescriptorIndexingFeatures + /// { + /// ShaderInputAttachmentArrayDynamicIndexing = true + /// }; + /// var accelerationStructureFeaturesKhr = new PhysicalDeviceAccelerationStructureFeaturesKhr + /// { + /// AccelerationStructure = true + /// }; + /// + /// PhysicalDeviceFeatures2 + /// .BaseInStructure(out var features2) + /// .SetNext(ref indexingFeatures) + /// .SetNext(ref accelerationStructureFeaturesKhr); + /// + /// + /// + /// + /// + /// + /// + /// + /// + /// + public static unsafe ref TChain SetNextAny + ( + this ref TChain chain, + ref TNext value, + bool alwaysAdd = false + ) + where TChain : struct, IChainable + where TNext : struct, IChainable { // Ensure structure type of chain and value are set. chain.StructureType(); @@ -67,7 +122,7 @@ public static unsafe ref TChain SetNext } previousPtr = currentPtr; - currentPtr = (BaseInStructure*) nextPtr; + currentPtr = nextPtr; } while (currentPtr is not null); // Add value to end of chain @@ -97,9 +152,52 @@ public static unsafe ref TChain SetNext /// Note, the value is always added, even if an equivalent value is added in the chain already. Use /// to only add if not already present. /// - public static unsafe ref TChain AddNext(this ref TChain chain, out TNext next) + /// + /// + /// + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ref TChain AddNext(this ref TChain chain, out TNext next) where TChain : struct, IChainStart where TNext : struct, IExtendsChain + => ref AddNextAny(ref chain, out next); + + /// + /// Adds a structure to the end of the chain. + /// + /// The current chain + /// The structure added to the end of the chain + /// The type of the current chain + /// The type of the structure to add + /// The reference to the chain. + /// + /// Note that both the supplied chain, and the added structure will have their `SType` correctly set + /// To use specify the output type required, e.g.: + /// + /// PhysicalDeviceFeatures2 + /// .BaseInStructure(out var features2) + /// .AddNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures) + /// .AddNext(out PhysicalDeviceAccelerationStructureFeaturesKhr accelerationStructureFeaturesKhr); + /// + /// Note, the value is always added, even if an equivalent value is added in the chain already. Use + /// to only add if not already present. + /// + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + /// + /// + /// + /// + /// + public static unsafe ref TChain AddNextAny(this ref TChain chain, out TNext next) + where TChain : struct, IChainable + where TNext : struct, IChainable { // Ensure structure type of chain is set. chain.StructureType(); @@ -108,7 +206,7 @@ public static unsafe ref TChain AddNext(this ref TChain chain, ou var currentPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); while (currentPtr->PNext is not null) { - currentPtr = (BaseInStructure*) currentPtr->PNext; + currentPtr = currentPtr->PNext; } // Create new entry and set it's structure type @@ -136,9 +234,50 @@ public static unsafe ref TChain AddNext(this ref TChain chain, ou /// .TryAddNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures, out var added); /// /// - public static unsafe ref TChain TryAddNext(this ref TChain chain, out TNext next, out bool added) + /// + /// + /// + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ref TChain TryAddNext(this ref TChain chain, out TNext next, out bool added) where TChain : struct, IChainStart where TNext : struct, IExtendsChain + => ref TryAddNextAny(ref chain, out next, out added); + + /// + /// Tries to add a structure to the end of the chain. + /// + /// The current chain + /// The structure added to the end of the chain + /// Whether the structure was actually added + /// The type of the current chain + /// The type of the structure to add + /// The reference to the chain. + /// + /// Note that both the supplied chain, and the added structure will have their `SType` correctly set + /// To use specify the output type required, e.g.: + /// + /// PhysicalDeviceFeatures2 + /// .BaseInStructure(out var features2) + /// .TryAddNext(out PhysicalDeviceDescriptorIndexingFeatures indexingFeatures, out var added); + /// + /// + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + /// + /// + /// + /// + /// + public static unsafe ref TChain TryAddNextAny(this ref TChain chain, out TNext next, out bool added) + where TChain : struct, IChainable + where TNext : struct, IChainable { // Ensure structure type of chain is set. chain.StructureType(); @@ -163,7 +302,7 @@ public static unsafe ref TChain TryAddNext(this ref TChain chain, break; } - currentPtr = (BaseInStructure*) nextPtr; + currentPtr = nextPtr; } while (true); currentPtr->PNext = (BaseInStructure*) Unsafe.AsPointer(ref next); @@ -171,6 +310,71 @@ public static unsafe ref TChain TryAddNext(this ref TChain chain, return ref chain; } + /// + /// Returns the index of the in the , if present. + /// + /// The chain + /// The structure value + /// The type of the current chain + /// The type of the value + /// The zero-indexed index if found; otherwise -1. + /// + /// + /// + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static int IndexOf(this ref TChain chain, ref TNext value) + where TChain : struct, IChainStart + where TNext : struct, IExtendsChain + => IndexOfAny(ref chain, ref value); + + /// + /// Returns the index of the in the , if present. + /// + /// The chain + /// The structure value + /// The type of the current chain + /// The type of the value + /// The zero-indexed index if found; otherwise -1. + /// + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + /// + /// + /// + /// + /// + public static unsafe int IndexOfAny(this ref TChain chain, ref TNext value) + where TChain : struct, IChainable + where TNext : struct, IChainable + { + // Ensure structure type of chain is set. + chain.StructureType(); + + var index = 0; + var currentPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); + var valuePtr = (BaseInStructure*) Unsafe.AsPointer(ref value); + // Follow chain + do + { + if (currentPtr == valuePtr) + { + return index; + } + + currentPtr = currentPtr->PNext; + index++; + } while (currentPtr is not null); + + return -1; + } + /// /// Provides a set of all the s that can be extended by a . /// @@ -240,39 +444,6 @@ public static unsafe ref TChain TryAddNext(this ref TChain chain, Vulkan.StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr }; - /// - /// Returns the index of the in the , if present. - /// - /// The chain - /// The structure value - /// The type of the current chain - /// The type of the value - /// The zero-indexed index if found; otherwise -1. - public static unsafe int IndexOf(this ref TChain chain, ref TNext value) - where TChain : struct, IChainStart - where TNext : struct, IExtendsChain - { - // Ensure structure type of chain is set. - chain.StructureType(); - - var index = 0; - var currentPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); - var valuePtr = (BaseInStructure*) Unsafe.AsPointer(ref value); - // Follow chain - do - { - if (currentPtr == valuePtr) - { - return index; - } - - currentPtr = (BaseInStructure*) currentPtr->PNext; - index++; - } while (currentPtr is not null); - - return -1; - } - /// /// Gets the corresponding for a , if any. /// diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/DeviceCreateInfo.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/DeviceCreateInfo.cs index 3f6a136559..a0e6f61c27 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/DeviceCreateInfo.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/DeviceCreateInfo.cs @@ -1,4 +1,4 @@ -namespace Silk.Net.Vulkan; +namespace Silk.NET.Vulkan; public struct DeviceCreateInfo : IChainStart { diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IChainStart.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IChainStart.cs index 867d9d658a..9ac897e448 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IChainStart.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IChainStart.cs @@ -1,4 +1,4 @@ -namespace Silk.Net.Vulkan; +namespace Silk.NET.Vulkan; /// /// Marks a chainable struct as being allowed at the start of a chain. diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IChainable.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IChainable.cs index 9b47ca507c..03bf0e16ae 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IChainable.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IChainable.cs @@ -1,4 +1,4 @@ -namespace Silk.Net.Vulkan; +namespace Silk.NET.Vulkan; /// /// Base interface for any struct that has can set the next value. diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IExtendsChain.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IExtendsChain.cs index 5ef0a4ad99..306e008327 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IExtendsChain.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IExtendsChain.cs @@ -1,4 +1,4 @@ -namespace Silk.Net.Vulkan; +namespace Silk.NET.Vulkan; /// /// Marks a chainable struct indicating which chain this type diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IStructuredType.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IStructuredType.cs index f34ad05399..960038fac0 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IStructuredType.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IStructuredType.cs @@ -1,4 +1,4 @@ -namespace Silk.Net.Vulkan; +namespace Silk.NET.Vulkan; /// /// Base interface for any struct that has a field called `SType`, that must be correctly diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.cs index ae81ec1995..c46b5f41b6 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.cs @@ -1,16 +1,27 @@ // ReSharper disable StaticMemberInGenericType +#pragma warning disable CS0659, CS0660, CS0661 using System.Collections; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Text; -namespace Silk.Net.Vulkan; +namespace Silk.NET.Vulkan; /// -/// Static class for creating Managed Chains. +/// Base class for all Managed Chains. /// -public abstract class ManagedChain : IReadOnlyList, IDisposable +public abstract unsafe class ManagedChain : IReadOnlyList, IDisposable { + /// + /// Gets a pointer to the current head. + /// + public abstract BaseInStructure* HeadPtr { get; } + + /// + /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. + /// + public abstract int Size { get; } + /// public abstract IEnumerator GetEnumerator(); IEnumerator IEnumerable.GetEnumerator() @@ -24,6 +35,19 @@ IEnumerator IEnumerable.GetEnumerator() /// public abstract IChainable this[int index] { get; } + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public override bool Equals(object obj) + { + return !ReferenceEquals(null, obj) && + (ReferenceEquals(this, obj) || obj.GetType() == this.GetType() && MemoryEquals((ManagedChain) obj)); + } + + /// + /// Compares the supplied memory block with this one. + /// + protected abstract bool MemoryEquals(ManagedChain other); + /// public abstract void Dispose(); @@ -33,23 +57,38 @@ IEnumerator IEnumerable.GetEnumerator() /// The head of the chain. /// The chain type /// A new with 1 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ManagedChain Create(TChain head = default) where TChain : struct, IChainStart - { - return new(head); - } + => new(head); /// - /// Loads a new with 1 items from an existing unmanaged chain. + /// Creates a new with 1 items. + /// + /// The head of the chain. + /// The chain type + /// A new with 1 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain CreateAny(TChain head = default) + where TChain : struct, IChainable + => new(head); + + /// + /// Loads a new with 1 items from an existing unmanaged chain, + /// ignoring any errors. /// - /// Any errors loading the chain. /// The unmanaged chain to use as the basis of this chain. /// A new with 1 items. - public static ManagedChain Load(out string errors, TChain chain) + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Load(TChain chain) where TChain : struct, IChainStart - { - return new(out errors, chain); - } + => LoadAny(out var _, chain); /// /// Loads a new with 1 items from an existing unmanaged chain, @@ -57,10 +96,47 @@ public static ManagedChain Load(out string errors, TChain chain) /// /// The unmanaged chain to use as the basis of this chain. /// A new with 1 items. - public static ManagedChain Load(TChain chain) + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain LoadAny(TChain chain) + where TChain : struct, IChainable + => LoadAny(out var _, chain); + + /// + /// Loads a new with 1 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + /// A new with 1 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Load(out string errors, TChain chain) where TChain : struct, IChainStart - { - return new(out var _, chain); + => LoadAny(out errors, chain); + + /// + /// Loads a new with 1 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + /// A new with 1 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain LoadAny(out string errors, TChain chain) + where TChain : struct, IChainable + { + var size = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(size); + chain.StructureType(); + Marshal.StructureToPtr(chain, newHeadPtr, false); + errors = string.Empty; + return new ManagedChain(newHeadPtr); } /// @@ -71,25 +147,43 @@ public static ManagedChain Load(TChain chain) /// The chain type /// Type of Item 1. /// A new with 2 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ManagedChain Create(TChain head = default, T1 item1 = default) where TChain : struct, IChainStart where T1 : struct, IExtendsChain - { - return new(head, item1); - } + => new(head, item1); /// - /// Loads a new with 2 items from an existing unmanaged chain. + /// Creates a new with 2 items. + /// + /// The head of the chain. + /// Item 1. + /// The chain type + /// Type of Item 1. + /// A new with 2 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain CreateAny(TChain head = default, T1 item1 = default) + where TChain : struct, IChainable + where T1 : struct, IChainable + => new(head, item1); + + /// + /// Loads a new with 2 items from an existing unmanaged chain, + /// ignoring any errors. /// - /// Any errors loading the chain. /// The unmanaged chain to use as the basis of this chain. /// A new with 2 items. - public static ManagedChain Load(out string errors, TChain chain) + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Load(TChain chain) where TChain : struct, IChainStart where T1 : struct, IExtendsChain - { - return new(out errors, chain); - } + => LoadAny(out var _, chain); /// /// Loads a new with 2 items from an existing unmanaged chain, @@ -97,11 +191,80 @@ public static ManagedChain Load(out string errors, TChai /// /// The unmanaged chain to use as the basis of this chain. /// A new with 2 items. - public static ManagedChain Load(TChain chain) + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain LoadAny(TChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + => LoadAny(out var _, chain); + + /// + /// Loads a new with 2 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + /// A new with 2 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Load(out string errors, TChain chain) where TChain : struct, IChainStart where T1 : struct, IExtendsChain - { - return new(out var _, chain); + => LoadAny(out errors, chain); + + /// + /// Loads a new with 2 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + /// A new with 2 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain LoadAny(out string errors, TChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + { + var size = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(size); + chain.StructureType(); + Marshal.StructureToPtr(chain, newHeadPtr, false); + var errorBuilder = new StringBuilder(); + var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); + var newPtr = (BaseInStructure*) newHeadPtr; + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + newPtr = newPtr->PNext; + + T1 item1 = default; + var expectedStructureType = item1.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 2"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 2; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + if (existingPtr->PNext is not null) { + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 2"); + existingPtr->PNext = null; + } + item1 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item1, (nint) newPtr, false); + + // Create string of errors + errors = errorBuilder.ToString().Trim(); + return new ManagedChain(newHeadPtr); } /// @@ -114,27 +277,48 @@ public static ManagedChain Load(TChain chain) /// Type of Item 1. /// Type of Item 2. /// A new with 3 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain - { - return new(head, item1, item2); - } + => new(head, item1, item2); /// - /// Loads a new with 3 items from an existing unmanaged chain. + /// Creates a new with 3 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// A new with 3 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain CreateAny(TChain head = default, T1 item1 = default, T2 item2 = default) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + => new(head, item1, item2); + + /// + /// Loads a new with 3 items from an existing unmanaged chain, + /// ignoring any errors. /// - /// Any errors loading the chain. /// The unmanaged chain to use as the basis of this chain. /// A new with 3 items. - public static ManagedChain Load(out string errors, TChain chain) + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Load(TChain chain) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain - { - return new(out errors, chain); - } + => LoadAny(out var _, chain); /// /// Loads a new with 3 items from an existing unmanaged chain, @@ -142,12 +326,104 @@ public static ManagedChain Load(out string error /// /// The unmanaged chain to use as the basis of this chain. /// A new with 3 items. - public static ManagedChain Load(TChain chain) + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain LoadAny(TChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + => LoadAny(out var _, chain); + + /// + /// Loads a new with 3 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + /// A new with 3 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Load(out string errors, TChain chain) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain - { - return new(out var _, chain); + => LoadAny(out errors, chain); + + /// + /// Loads a new with 3 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + /// A new with 3 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain LoadAny(out string errors, TChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + { + var size = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(size); + chain.StructureType(); + Marshal.StructureToPtr(chain, newHeadPtr, false); + var errorBuilder = new StringBuilder(); + var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); + var newPtr = (BaseInStructure*) newHeadPtr; + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + newPtr = newPtr->PNext; + + T1 item1 = default; + var expectedStructureType = item1.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 3"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 2; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item1 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item1, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + newPtr = newPtr->PNext; + + T2 item2 = default; + expectedStructureType = item2.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 3"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 3; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + if (existingPtr->PNext is not null) { + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 3"); + existingPtr->PNext = null; + } + item2 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item2, (nint) newPtr, false); + + // Create string of errors + errors = errorBuilder.ToString().Trim(); + return new ManagedChain(newHeadPtr); } /// @@ -162,29 +438,38 @@ public static ManagedChain Load(TChain chain) /// Type of Item 2. /// Type of Item 3. /// A new with 4 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain where T3 : struct, IExtendsChain - { - return new(head, item1, item2, item3); - } + => new(head, item1, item2, item3); /// - /// Loads a new with 4 items from an existing unmanaged chain. + /// Creates a new with 4 items. /// - /// Any errors loading the chain. - /// The unmanaged chain to use as the basis of this chain. + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. /// A new with 4 items. - public static ManagedChain Load(out string errors, TChain chain) - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - { - return new(out errors, chain); - } + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain CreateAny(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + => new(head, item1, item2, item3); /// /// Loads a new with 4 items from an existing unmanaged chain, @@ -192,134 +477,368 @@ public static ManagedChain Load(out stri /// /// The unmanaged chain to use as the basis of this chain. /// A new with 4 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ManagedChain Load(TChain chain) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain where T3 : struct, IExtendsChain - { - return new(out var _, chain); - } + => LoadAny(out var _, chain); /// - /// Creates a new with 5 items. + /// Loads a new with 4 items from an existing unmanaged chain, + /// ignoring any errors. /// - /// The head of the chain. - /// Item 1. - /// Item 2. - /// Item 3. - /// Item 4. - /// The chain type - /// Type of Item 1. - /// Type of Item 2. - /// Type of Item 3. - /// Type of Item 4. - /// A new with 5 items. - public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default) - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - { - return new(head, item1, item2, item3, item4); - } + /// The unmanaged chain to use as the basis of this chain. + /// A new with 4 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain LoadAny(TChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + => LoadAny(out var _, chain); /// - /// Loads a new with 5 items from an existing unmanaged chain. + /// Loads a new with 4 items from an existing unmanaged chain. /// /// Any errors loading the chain. /// The unmanaged chain to use as the basis of this chain. - /// A new with 5 items. - public static ManagedChain Load(out string errors, TChain chain) + /// A new with 4 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Load(out string errors, TChain chain) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - { - return new(out errors, chain); - } + => LoadAny(out errors, chain); /// - /// Loads a new with 5 items from an existing unmanaged chain, - /// ignoring any errors. + /// Loads a new with 4 items from an existing unmanaged chain. /// + /// Any errors loading the chain. /// The unmanaged chain to use as the basis of this chain. - /// A new with 5 items. - public static ManagedChain Load(TChain chain) - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - { - return new(out var _, chain); + /// A new with 4 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain LoadAny(out string errors, TChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + { + var size = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(size); + chain.StructureType(); + Marshal.StructureToPtr(chain, newHeadPtr, false); + var errorBuilder = new StringBuilder(); + var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); + var newPtr = (BaseInStructure*) newHeadPtr; + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + newPtr = newPtr->PNext; + + T1 item1 = default; + var expectedStructureType = item1.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 4"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 2; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item1 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item1, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + newPtr = newPtr->PNext; + + T2 item2 = default; + expectedStructureType = item2.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 4"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 3; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item2 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item2, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + newPtr = newPtr->PNext; + + T3 item3 = default; + expectedStructureType = item3.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 4"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 4; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + if (existingPtr->PNext is not null) { + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 4"); + existingPtr->PNext = null; + } + item3 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item3, (nint) newPtr, false); + + // Create string of errors + errors = errorBuilder.ToString().Trim(); + return new ManagedChain(newHeadPtr); } /// - /// Creates a new with 6 items. + /// Creates a new with 5 items. /// /// The head of the chain. /// Item 1. /// Item 2. /// Item 3. /// Item 4. - /// Item 5. /// The chain type /// Type of Item 1. /// Type of Item 2. /// Type of Item 3. /// Type of Item 4. - /// Type of Item 5. - /// A new with 6 items. - public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default) + /// A new with 5 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain where T3 : struct, IExtendsChain where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - { - return new(head, item1, item2, item3, item4, item5); - } + => new(head, item1, item2, item3, item4); /// - /// Loads a new with 6 items from an existing unmanaged chain. + /// Creates a new with 5 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// A new with 5 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain CreateAny(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + => new(head, item1, item2, item3, item4); + + /// + /// Loads a new with 5 items from an existing unmanaged chain, + /// ignoring any errors. /// - /// Any errors loading the chain. /// The unmanaged chain to use as the basis of this chain. - /// A new with 6 items. - public static ManagedChain Load(out string errors, TChain chain) + /// A new with 5 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Load(TChain chain) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain where T3 : struct, IExtendsChain where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - { - return new(out errors, chain); - } + => LoadAny(out var _, chain); /// - /// Loads a new with 6 items from an existing unmanaged chain, + /// Loads a new with 5 items from an existing unmanaged chain, /// ignoring any errors. /// /// The unmanaged chain to use as the basis of this chain. - /// A new with 6 items. - public static ManagedChain Load(TChain chain) + /// A new with 5 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain LoadAny(TChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + => LoadAny(out var _, chain); + + /// + /// Loads a new with 5 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + /// A new with 5 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Load(out string errors, TChain chain) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain where T3 : struct, IExtendsChain where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - { - return new(out var _, chain); + => LoadAny(out errors, chain); + + /// + /// Loads a new with 5 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + /// A new with 5 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain LoadAny(out string errors, TChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + { + var size = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(size); + chain.StructureType(); + Marshal.StructureToPtr(chain, newHeadPtr, false); + var errorBuilder = new StringBuilder(); + var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); + var newPtr = (BaseInStructure*) newHeadPtr; + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + newPtr = newPtr->PNext; + + T1 item1 = default; + var expectedStructureType = item1.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 5"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 2; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item1 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item1, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + newPtr = newPtr->PNext; + + T2 item2 = default; + expectedStructureType = item2.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 5"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 3; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item2 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item2, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + newPtr = newPtr->PNext; + + T3 item3 = default; + expectedStructureType = item3.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 5"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 4; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item3 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item3, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + newPtr = newPtr->PNext; + + T4 item4 = default; + expectedStructureType = item4.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 5"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 5; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + if (existingPtr->PNext is not null) { + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 5"); + existingPtr->PNext = null; + } + item4 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item4, (nint) newPtr, false); + + // Create string of errors + errors = errorBuilder.ToString().Trim(); + return new ManagedChain(newHeadPtr); } /// - /// Creates a new with 7 items. + /// Creates a new with 6 items. /// /// The head of the chain. /// Item 1. @@ -327,65 +846,251 @@ public static ManagedChain LoadItem 3. /// Item 4. /// Item 5. - /// Item 6. /// The chain type /// Type of Item 1. /// Type of Item 2. /// Type of Item 3. /// Type of Item 4. /// Type of Item 5. - /// Type of Item 6. - /// A new with 7 items. - public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default) + /// A new with 6 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain where T3 : struct, IExtendsChain where T4 : struct, IExtendsChain where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - { - return new(head, item1, item2, item3, item4, item5, item6); - } + => new(head, item1, item2, item3, item4, item5); /// - /// Loads a new with 7 items from an existing unmanaged chain. + /// Creates a new with 6 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// A new with 6 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain CreateAny(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + => new(head, item1, item2, item3, item4, item5); + + /// + /// Loads a new with 6 items from an existing unmanaged chain, + /// ignoring any errors. /// - /// Any errors loading the chain. /// The unmanaged chain to use as the basis of this chain. - /// A new with 7 items. - public static ManagedChain Load(out string errors, TChain chain) + /// A new with 6 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Load(TChain chain) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain where T3 : struct, IExtendsChain where T4 : struct, IExtendsChain where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - { - return new(out errors, chain); - } + => LoadAny(out var _, chain); /// - /// Loads a new with 7 items from an existing unmanaged chain, + /// Loads a new with 6 items from an existing unmanaged chain, /// ignoring any errors. /// /// The unmanaged chain to use as the basis of this chain. - /// A new with 7 items. - public static ManagedChain Load(TChain chain) + /// A new with 6 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain LoadAny(TChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + => LoadAny(out var _, chain); + + /// + /// Loads a new with 6 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + /// A new with 6 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Load(out string errors, TChain chain) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain where T3 : struct, IExtendsChain where T4 : struct, IExtendsChain where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - { - return new(out var _, chain); + => LoadAny(out errors, chain); + + /// + /// Loads a new with 6 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + /// A new with 6 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain LoadAny(out string errors, TChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + { + var size = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(size); + chain.StructureType(); + Marshal.StructureToPtr(chain, newHeadPtr, false); + var errorBuilder = new StringBuilder(); + var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); + var newPtr = (BaseInStructure*) newHeadPtr; + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + newPtr = newPtr->PNext; + + T1 item1 = default; + var expectedStructureType = item1.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 6"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 2; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item1 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item1, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + newPtr = newPtr->PNext; + + T2 item2 = default; + expectedStructureType = item2.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 6"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 3; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item2 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item2, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + newPtr = newPtr->PNext; + + T3 item3 = default; + expectedStructureType = item3.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 6"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 4; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item3 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item3, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + newPtr = newPtr->PNext; + + T4 item4 = default; + expectedStructureType = item4.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 6"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 5; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item4 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item4, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + newPtr = newPtr->PNext; + + T5 item5 = default; + expectedStructureType = item5.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 6"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 6; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + if (existingPtr->PNext is not null) { + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 6"); + existingPtr->PNext = null; + } + item5 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item5, (nint) newPtr, false); + + // Create string of errors + errors = errorBuilder.ToString().Trim(); + return new ManagedChain(newHeadPtr); } /// - /// Creates a new with 8 items. + /// Creates a new with 7 items. /// /// The head of the chain. /// Item 1. @@ -394,7 +1099,6 @@ public static ManagedChain LoadItem 4. /// Item 5. /// Item 6. - /// Item 7. /// The chain type /// Type of Item 1. /// Type of Item 2. @@ -402,47 +1106,10 @@ public static ManagedChain LoadType of Item 4. /// Type of Item 5. /// Type of Item 6. - /// Type of Item 7. - /// A new with 8 items. - public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default) - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain - { - return new(head, item1, item2, item3, item4, item5, item6, item7); - } - - /// - /// Loads a new with 8 items from an existing unmanaged chain. - /// - /// Any errors loading the chain. - /// The unmanaged chain to use as the basis of this chain. - /// A new with 8 items. - public static ManagedChain Load(out string errors, TChain chain) - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain - { - return new(out errors, chain); - } - - /// - /// Loads a new with 8 items from an existing unmanaged chain, - /// ignoring any errors. - /// - /// The unmanaged chain to use as the basis of this chain. - /// A new with 8 items. - public static ManagedChain Load(TChain chain) + /// A new with 7 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain @@ -450,13 +1117,10 @@ public static ManagedChain Load where T5 : struct, IExtendsChain where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain - { - return new(out var _, chain); - } + => new(head, item1, item2, item3, item4, item5, item6); /// - /// Creates a new with 9 items. + /// Creates a new with 7 items. /// /// The head of the chain. /// Item 1. @@ -465,8 +1129,6 @@ public static ManagedChain LoadItem 4. /// Item 5. /// Item 6. - /// Item 7. - /// Item 8. /// The chain type /// Type of Item 1. /// Type of Item 2. @@ -474,30 +1136,31 @@ public static ManagedChain LoadType of Item 4. /// Type of Item 5. /// Type of Item 6. - /// Type of Item 7. - /// Type of Item 8. - /// A new with 9 items. - public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default) - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain - where T8 : struct, IExtendsChain - { - return new(head, item1, item2, item3, item4, item5, item6, item7, item8); - } + /// A new with 7 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain CreateAny(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + => new(head, item1, item2, item3, item4, item5, item6); /// - /// Loads a new with 9 items from an existing unmanaged chain. + /// Loads a new with 7 items from an existing unmanaged chain, + /// ignoring any errors. /// - /// Any errors loading the chain. /// The unmanaged chain to use as the basis of this chain. - /// A new with 9 items. - public static ManagedChain Load(out string errors, TChain chain) + /// A new with 7 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Load(TChain chain) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain @@ -505,57 +1168,38 @@ public static ManagedChain Load where T5 : struct, IExtendsChain where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain - where T8 : struct, IExtendsChain - { - return new(out errors, chain); - } + => LoadAny(out var _, chain); /// - /// Loads a new with 9 items from an existing unmanaged chain, + /// Loads a new with 7 items from an existing unmanaged chain, /// ignoring any errors. /// /// The unmanaged chain to use as the basis of this chain. - /// A new with 9 items. - public static ManagedChain Load(TChain chain) - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain - where T8 : struct, IExtendsChain - { - return new(out var _, chain); - } + /// A new with 7 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain LoadAny(TChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + => LoadAny(out var _, chain); /// - /// Creates a new with 10 items. + /// Loads a new with 7 items from an existing unmanaged chain. /// - /// The head of the chain. - /// Item 1. - /// Item 2. - /// Item 3. - /// Item 4. - /// Item 5. - /// Item 6. - /// Item 7. - /// Item 8. - /// Item 9. - /// The chain type - /// Type of Item 1. - /// Type of Item 2. - /// Type of Item 3. - /// Type of Item 4. - /// Type of Item 5. - /// Type of Item 6. - /// Type of Item 7. - /// Type of Item 8. - /// Type of Item 9. - /// A new with 10 items. - public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default) + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + /// A new with 7 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Load(out string errors, TChain chain) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain @@ -563,57 +1207,173 @@ public static ManagedChain Create where T5 : struct, IExtendsChain where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain - where T8 : struct, IExtendsChain - where T9 : struct, IExtendsChain - { - return new(head, item1, item2, item3, item4, item5, item6, item7, item8, item9); - } + => LoadAny(out errors, chain); /// - /// Loads a new with 10 items from an existing unmanaged chain. + /// Loads a new with 7 items from an existing unmanaged chain. /// /// Any errors loading the chain. /// The unmanaged chain to use as the basis of this chain. - /// A new with 10 items. - public static ManagedChain Load(out string errors, TChain chain) - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain - where T8 : struct, IExtendsChain - where T9 : struct, IExtendsChain - { - return new(out errors, chain); - } + /// A new with 7 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain LoadAny(out string errors, TChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + { + var size = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(size); + chain.StructureType(); + Marshal.StructureToPtr(chain, newHeadPtr, false); + var errorBuilder = new StringBuilder(); + var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); + var newPtr = (BaseInStructure*) newHeadPtr; - /// - /// Loads a new with 10 items from an existing unmanaged chain, - /// ignoring any errors. - /// - /// The unmanaged chain to use as the basis of this chain. - /// A new with 10 items. - public static ManagedChain Load(TChain chain) - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain - where T8 : struct, IExtendsChain - where T9 : struct, IExtendsChain - { - return new(out var _, chain); + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + newPtr = newPtr->PNext; + + T1 item1 = default; + var expectedStructureType = item1.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 7"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 2; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item1 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item1, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + newPtr = newPtr->PNext; + + T2 item2 = default; + expectedStructureType = item2.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 7"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 3; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item2 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item2, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + newPtr = newPtr->PNext; + + T3 item3 = default; + expectedStructureType = item3.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 7"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 4; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item3 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item3, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + newPtr = newPtr->PNext; + + T4 item4 = default; + expectedStructureType = item4.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 7"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 5; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item4 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item4, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + newPtr = newPtr->PNext; + + T5 item5 = default; + expectedStructureType = item5.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 7"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 6; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item5 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item5, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item6Offset); + newPtr = newPtr->PNext; + + T6 item6 = default; + expectedStructureType = item6.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 7"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 7; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + if (existingPtr->PNext is not null) { + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 7"); + existingPtr->PNext = null; + } + item6 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item6, (nint) newPtr, false); + + // Create string of errors + errors = errorBuilder.ToString().Trim(); + return new ManagedChain(newHeadPtr); } /// - /// Creates a new with 11 items. + /// Creates a new with 8 items. /// /// The head of the chain. /// Item 1. @@ -623,9 +1383,6 @@ public static ManagedChain LoadItem 5. /// Item 6. /// Item 7. - /// Item 8. - /// Item 9. - /// Item 10. /// The chain type /// Type of Item 1. /// Type of Item 2. @@ -634,55 +1391,10 @@ public static ManagedChain LoadType of Item 5. /// Type of Item 6. /// Type of Item 7. - /// Type of Item 8. - /// Type of Item 9. - /// Type of Item 10. - /// A new with 11 items. - public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default) - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain - where T8 : struct, IExtendsChain - where T9 : struct, IExtendsChain - where T10 : struct, IExtendsChain - { - return new(head, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10); - } - - /// - /// Loads a new with 11 items from an existing unmanaged chain. - /// - /// Any errors loading the chain. - /// The unmanaged chain to use as the basis of this chain. - /// A new with 11 items. - public static ManagedChain Load(out string errors, TChain chain) - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain - where T8 : struct, IExtendsChain - where T9 : struct, IExtendsChain - where T10 : struct, IExtendsChain - { - return new(out errors, chain); - } - - /// - /// Loads a new with 11 items from an existing unmanaged chain, - /// ignoring any errors. - /// - /// The unmanaged chain to use as the basis of this chain. - /// A new with 11 items. - public static ManagedChain Load(TChain chain) + /// A new with 8 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain @@ -691,15 +1403,10 @@ public static ManagedChain Load where T5 : struct, IExtendsChain where T6 : struct, IExtendsChain where T7 : struct, IExtendsChain - where T8 : struct, IExtendsChain - where T9 : struct, IExtendsChain - where T10 : struct, IExtendsChain - { - return new(out var _, chain); - } + => new(head, item1, item2, item3, item4, item5, item6, item7); /// - /// Creates a new with 12 items. + /// Creates a new with 8 items. /// /// The head of the chain. /// Item 1. @@ -709,10 +1416,6 @@ public static ManagedChain Load /// Item 5. /// Item 6. /// Item 7. - /// Item 8. - /// Item 9. - /// Item 10. - /// Item 11. /// The chain type /// Type of Item 1. /// Type of Item 2. @@ -721,12 +1424,32 @@ public static ManagedChain Load /// Type of Item 5. /// Type of Item 6. /// Type of Item 7. - /// Type of Item 8. - /// Type of Item 9. - /// Type of Item 10. - /// Type of Item 11. - /// A new with 12 items. - public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default) + /// A new with 8 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain CreateAny(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + => new(head, item1, item2, item3, item4, item5, item6, item7); + + /// + /// Loads a new with 8 items from an existing unmanaged chain, + /// ignoring any errors. + /// + /// The unmanaged chain to use as the basis of this chain. + /// A new with 8 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Load(TChain chain) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain @@ -735,21 +1458,39 @@ public static ManagedChain where T5 : struct, IExtendsChain where T6 : struct, IExtendsChain where T7 : struct, IExtendsChain - where T8 : struct, IExtendsChain - where T9 : struct, IExtendsChain - where T10 : struct, IExtendsChain - where T11 : struct, IExtendsChain - { - return new(head, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11); - } + => LoadAny(out var _, chain); /// - /// Loads a new with 12 items from an existing unmanaged chain. + /// Loads a new with 8 items from an existing unmanaged chain, + /// ignoring any errors. + /// + /// The unmanaged chain to use as the basis of this chain. + /// A new with 8 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain LoadAny(TChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + => LoadAny(out var _, chain); + + /// + /// Loads a new with 8 items from an existing unmanaged chain. /// /// Any errors loading the chain. /// The unmanaged chain to use as the basis of this chain. - /// A new with 12 items. - public static ManagedChain Load(out string errors, TChain chain) + /// A new with 8 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Load(out string errors, TChain chain) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain @@ -758,39 +1499,195 @@ public static ManagedChain where T5 : struct, IExtendsChain where T6 : struct, IExtendsChain where T7 : struct, IExtendsChain - where T8 : struct, IExtendsChain - where T9 : struct, IExtendsChain - where T10 : struct, IExtendsChain - where T11 : struct, IExtendsChain - { - return new(out errors, chain); - } + => LoadAny(out errors, chain); /// - /// Loads a new with 12 items from an existing unmanaged chain, - /// ignoring any errors. + /// Loads a new with 8 items from an existing unmanaged chain. /// + /// Any errors loading the chain. /// The unmanaged chain to use as the basis of this chain. - /// A new with 12 items. - public static ManagedChain Load(TChain chain) - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain - where T8 : struct, IExtendsChain - where T9 : struct, IExtendsChain - where T10 : struct, IExtendsChain - where T11 : struct, IExtendsChain - { - return new(out var _, chain); + /// A new with 8 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain LoadAny(out string errors, TChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + { + var size = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(size); + chain.StructureType(); + Marshal.StructureToPtr(chain, newHeadPtr, false); + var errorBuilder = new StringBuilder(); + var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); + var newPtr = (BaseInStructure*) newHeadPtr; + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + newPtr = newPtr->PNext; + + T1 item1 = default; + var expectedStructureType = item1.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 8"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 2; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item1 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item1, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + newPtr = newPtr->PNext; + + T2 item2 = default; + expectedStructureType = item2.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 8"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 3; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item2 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item2, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + newPtr = newPtr->PNext; + + T3 item3 = default; + expectedStructureType = item3.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 8"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 4; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item3 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item3, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + newPtr = newPtr->PNext; + + T4 item4 = default; + expectedStructureType = item4.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 8"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 5; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item4 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item4, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + newPtr = newPtr->PNext; + + T5 item5 = default; + expectedStructureType = item5.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 8"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 6; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item5 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item5, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item6Offset); + newPtr = newPtr->PNext; + + T6 item6 = default; + expectedStructureType = item6.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 8"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 7; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item6 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item6, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item7Offset); + newPtr = newPtr->PNext; + + T7 item7 = default; + expectedStructureType = item7.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 8"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 8; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + if (existingPtr->PNext is not null) { + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 8"); + existingPtr->PNext = null; + } + item7 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item7, (nint) newPtr, false); + + // Create string of errors + errors = errorBuilder.ToString().Trim(); + return new ManagedChain(newHeadPtr); } /// - /// Creates a new with 13 items. + /// Creates a new with 9 items. /// /// The head of the chain. /// Item 1. @@ -801,10 +1698,6 @@ public static ManagedChain /// Item 6. /// Item 7. /// Item 8. - /// Item 9. - /// Item 10. - /// Item 11. - /// Item 12. /// The chain type /// Type of Item 1. /// Type of Item 2. @@ -814,60 +1707,10 @@ public static ManagedChain /// Type of Item 6. /// Type of Item 7. /// Type of Item 8. - /// Type of Item 9. - /// Type of Item 10. - /// Type of Item 11. - /// Type of Item 12. - /// A new with 13 items. - public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default) - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain - where T8 : struct, IExtendsChain - where T9 : struct, IExtendsChain - where T10 : struct, IExtendsChain - where T11 : struct, IExtendsChain - where T12 : struct, IExtendsChain - { - return new(head, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12); - } - - /// - /// Loads a new with 13 items from an existing unmanaged chain. - /// - /// Any errors loading the chain. - /// The unmanaged chain to use as the basis of this chain. - /// A new with 13 items. - public static ManagedChain Load(out string errors, TChain chain) - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain - where T8 : struct, IExtendsChain - where T9 : struct, IExtendsChain - where T10 : struct, IExtendsChain - where T11 : struct, IExtendsChain - where T12 : struct, IExtendsChain - { - return new(out errors, chain); - } - - /// - /// Loads a new with 13 items from an existing unmanaged chain, - /// ignoring any errors. - /// - /// The unmanaged chain to use as the basis of this chain. - /// A new with 13 items. - public static ManagedChain Load(TChain chain) + /// A new with 9 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain @@ -877,16 +1720,10 @@ public static ManagedChain where T7 : struct, IExtendsChain where T8 : struct, IExtendsChain - where T9 : struct, IExtendsChain - where T10 : struct, IExtendsChain - where T11 : struct, IExtendsChain - where T12 : struct, IExtendsChain - { - return new(out var _, chain); - } + => new(head, item1, item2, item3, item4, item5, item6, item7, item8); /// - /// Creates a new with 14 items. + /// Creates a new with 9 items. /// /// The head of the chain. /// Item 1. @@ -897,11 +1734,6 @@ public static ManagedChainItem 6. /// Item 7. /// Item 8. - /// Item 9. - /// Item 10. - /// Item 11. - /// Item 12. - /// Item 13. /// The chain type /// Type of Item 1. /// Type of Item 2. @@ -911,13 +1743,33 @@ public static ManagedChainType of Item 6. /// Type of Item 7. /// Type of Item 8. - /// Type of Item 9. - /// Type of Item 10. - /// Type of Item 11. - /// Type of Item 12. - /// Type of Item 13. - /// A new with 14 items. - public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default, T13 item13 = default) + /// A new with 9 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain CreateAny(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + => new(head, item1, item2, item3, item4, item5, item6, item7, item8); + + /// + /// Loads a new with 9 items from an existing unmanaged chain, + /// ignoring any errors. + /// + /// The unmanaged chain to use as the basis of this chain. + /// A new with 9 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Load(TChain chain) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain @@ -927,22 +1779,40 @@ public static ManagedChain where T7 : struct, IExtendsChain where T8 : struct, IExtendsChain - where T9 : struct, IExtendsChain - where T10 : struct, IExtendsChain - where T11 : struct, IExtendsChain - where T12 : struct, IExtendsChain - where T13 : struct, IExtendsChain - { - return new(head, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13); - } + => LoadAny(out var _, chain); /// - /// Loads a new with 14 items from an existing unmanaged chain. + /// Loads a new with 9 items from an existing unmanaged chain, + /// ignoring any errors. + /// + /// The unmanaged chain to use as the basis of this chain. + /// A new with 9 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain LoadAny(TChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + => LoadAny(out var _, chain); + + /// + /// Loads a new with 9 items from an existing unmanaged chain. /// /// Any errors loading the chain. /// The unmanaged chain to use as the basis of this chain. - /// A new with 14 items. - public static ManagedChain Load(out string errors, TChain chain) + /// A new with 9 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Load(out string errors, TChain chain) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain @@ -952,22 +1822,242 @@ public static ManagedChain where T7 : struct, IExtendsChain where T8 : struct, IExtendsChain - where T9 : struct, IExtendsChain - where T10 : struct, IExtendsChain - where T11 : struct, IExtendsChain - where T12 : struct, IExtendsChain - where T13 : struct, IExtendsChain - { - return new(out errors, chain); - } + => LoadAny(out errors, chain); /// - /// Loads a new with 14 items from an existing unmanaged chain, - /// ignoring any errors. + /// Loads a new with 9 items from an existing unmanaged chain. /// + /// Any errors loading the chain. /// The unmanaged chain to use as the basis of this chain. - /// A new with 14 items. - public static ManagedChain Load(TChain chain) + /// A new with 9 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain LoadAny(out string errors, TChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + { + var size = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(size); + chain.StructureType(); + Marshal.StructureToPtr(chain, newHeadPtr, false); + var errorBuilder = new StringBuilder(); + var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); + var newPtr = (BaseInStructure*) newHeadPtr; + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + newPtr = newPtr->PNext; + + T1 item1 = default; + var expectedStructureType = item1.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 9"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 2; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item1 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item1, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + newPtr = newPtr->PNext; + + T2 item2 = default; + expectedStructureType = item2.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 9"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 3; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item2 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item2, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + newPtr = newPtr->PNext; + + T3 item3 = default; + expectedStructureType = item3.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 9"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 4; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item3 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item3, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + newPtr = newPtr->PNext; + + T4 item4 = default; + expectedStructureType = item4.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 9"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 5; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item4 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item4, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + newPtr = newPtr->PNext; + + T5 item5 = default; + expectedStructureType = item5.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 9"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 6; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item5 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item5, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item6Offset); + newPtr = newPtr->PNext; + + T6 item6 = default; + expectedStructureType = item6.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 9"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 7; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item6 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item6, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item7Offset); + newPtr = newPtr->PNext; + + T7 item7 = default; + expectedStructureType = item7.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 9"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 8; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item7 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item7, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item8Offset); + newPtr = newPtr->PNext; + + T8 item8 = default; + expectedStructureType = item8.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 9"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 9; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + if (existingPtr->PNext is not null) { + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 9"); + existingPtr->PNext = null; + } + item8 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item8, (nint) newPtr, false); + + // Create string of errors + errors = errorBuilder.ToString().Trim(); + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 10 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// A new with 10 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain @@ -978,16 +2068,10 @@ public static ManagedChain where T8 : struct, IExtendsChain where T9 : struct, IExtendsChain - where T10 : struct, IExtendsChain - where T11 : struct, IExtendsChain - where T12 : struct, IExtendsChain - where T13 : struct, IExtendsChain - { - return new(out var _, chain); - } + => new(head, item1, item2, item3, item4, item5, item6, item7, item8, item9); /// - /// Creates a new with 15 items. + /// Creates a new with 10 items. /// /// The head of the chain. /// Item 1. @@ -999,11 +2083,6 @@ public static ManagedChainItem 7. /// Item 8. /// Item 9. - /// Item 10. - /// Item 11. - /// Item 12. - /// Item 13. - /// Item 14. /// The chain type /// Type of Item 1. /// Type of Item 2. @@ -1014,13 +2093,34 @@ public static ManagedChainType of Item 7. /// Type of Item 8. /// Type of Item 9. - /// Type of Item 10. - /// Type of Item 11. - /// Type of Item 12. - /// Type of Item 13. - /// Type of Item 14. - /// A new with 15 items. - public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default, T13 item13 = default, T14 item14 = default) + /// A new with 10 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain CreateAny(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + => new(head, item1, item2, item3, item4, item5, item6, item7, item8, item9); + + /// + /// Loads a new with 10 items from an existing unmanaged chain, + /// ignoring any errors. + /// + /// The unmanaged chain to use as the basis of this chain. + /// A new with 10 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Load(TChain chain) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain @@ -1031,22 +2131,41 @@ public static ManagedChain where T8 : struct, IExtendsChain where T9 : struct, IExtendsChain - where T10 : struct, IExtendsChain - where T11 : struct, IExtendsChain - where T12 : struct, IExtendsChain - where T13 : struct, IExtendsChain - where T14 : struct, IExtendsChain - { - return new(head, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13, item14); - } + => LoadAny(out var _, chain); /// - /// Loads a new with 15 items from an existing unmanaged chain. + /// Loads a new with 10 items from an existing unmanaged chain, + /// ignoring any errors. + /// + /// The unmanaged chain to use as the basis of this chain. + /// A new with 10 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain LoadAny(TChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + => LoadAny(out var _, chain); + + /// + /// Loads a new with 10 items from an existing unmanaged chain. /// /// Any errors loading the chain. /// The unmanaged chain to use as the basis of this chain. - /// A new with 15 items. - public static ManagedChain Load(out string errors, TChain chain) + /// A new with 10 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Load(out string errors, TChain chain) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain @@ -1057,22 +2176,266 @@ public static ManagedChain where T8 : struct, IExtendsChain where T9 : struct, IExtendsChain - where T10 : struct, IExtendsChain - where T11 : struct, IExtendsChain - where T12 : struct, IExtendsChain - where T13 : struct, IExtendsChain - where T14 : struct, IExtendsChain - { - return new(out errors, chain); - } + => LoadAny(out errors, chain); /// - /// Loads a new with 15 items from an existing unmanaged chain, - /// ignoring any errors. + /// Loads a new with 10 items from an existing unmanaged chain. /// + /// Any errors loading the chain. /// The unmanaged chain to use as the basis of this chain. - /// A new with 15 items. - public static ManagedChain Load(TChain chain) + /// A new with 10 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain LoadAny(out string errors, TChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + { + var size = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(size); + chain.StructureType(); + Marshal.StructureToPtr(chain, newHeadPtr, false); + var errorBuilder = new StringBuilder(); + var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); + var newPtr = (BaseInStructure*) newHeadPtr; + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + newPtr = newPtr->PNext; + + T1 item1 = default; + var expectedStructureType = item1.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 10"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 2; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item1 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item1, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + newPtr = newPtr->PNext; + + T2 item2 = default; + expectedStructureType = item2.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 10"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 3; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item2 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item2, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + newPtr = newPtr->PNext; + + T3 item3 = default; + expectedStructureType = item3.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 10"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 4; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item3 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item3, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + newPtr = newPtr->PNext; + + T4 item4 = default; + expectedStructureType = item4.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 10"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 5; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item4 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item4, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + newPtr = newPtr->PNext; + + T5 item5 = default; + expectedStructureType = item5.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 10"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 6; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item5 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item5, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item6Offset); + newPtr = newPtr->PNext; + + T6 item6 = default; + expectedStructureType = item6.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 10"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 7; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item6 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item6, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item7Offset); + newPtr = newPtr->PNext; + + T7 item7 = default; + expectedStructureType = item7.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 10"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 8; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item7 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item7, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item8Offset); + newPtr = newPtr->PNext; + + T8 item8 = default; + expectedStructureType = item8.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 10"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 9; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item8 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item8, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item9Offset); + newPtr = newPtr->PNext; + + T9 item9 = default; + expectedStructureType = item9.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 9, expected length 10"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 10; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + if (existingPtr->PNext is not null) { + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 10"); + existingPtr->PNext = null; + } + item9 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item9, (nint) newPtr, false); + + // Create string of errors + errors = errorBuilder.ToString().Trim(); + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 11 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// A new with 11 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain @@ -1084,16 +2447,10 @@ public static ManagedChain where T9 : struct, IExtendsChain where T10 : struct, IExtendsChain - where T11 : struct, IExtendsChain - where T12 : struct, IExtendsChain - where T13 : struct, IExtendsChain - where T14 : struct, IExtendsChain - { - return new(out var _, chain); - } + => new(head, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10); /// - /// Creates a new with 16 items. + /// Creates a new with 11 items. /// /// The head of the chain. /// Item 1. @@ -1106,11 +2463,6 @@ public static ManagedChainItem 8. /// Item 9. /// Item 10. - /// Item 11. - /// Item 12. - /// Item 13. - /// Item 14. - /// Item 15. /// The chain type /// Type of Item 1. /// Type of Item 2. @@ -1122,13 +2474,35 @@ public static ManagedChainType of Item 8. /// Type of Item 9. /// Type of Item 10. - /// Type of Item 11. - /// Type of Item 12. - /// Type of Item 13. - /// Type of Item 14. - /// Type of Item 15. - /// A new with 16 items. - public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default, T13 item13 = default, T14 item14 = default, T15 item15 = default) + /// A new with 11 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain CreateAny(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + => new(head, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10); + + /// + /// Loads a new with 11 items from an existing unmanaged chain, + /// ignoring any errors. + /// + /// The unmanaged chain to use as the basis of this chain. + /// A new with 11 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Load(TChain chain) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain @@ -1140,22 +2514,42 @@ public static ManagedChain where T9 : struct, IExtendsChain where T10 : struct, IExtendsChain - where T11 : struct, IExtendsChain - where T12 : struct, IExtendsChain - where T13 : struct, IExtendsChain - where T14 : struct, IExtendsChain - where T15 : struct, IExtendsChain - { - return new(head, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13, item14, item15); - } + => LoadAny(out var _, chain); /// - /// Loads a new with 16 items from an existing unmanaged chain. + /// Loads a new with 11 items from an existing unmanaged chain, + /// ignoring any errors. + /// + /// The unmanaged chain to use as the basis of this chain. + /// A new with 11 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain LoadAny(TChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + => LoadAny(out var _, chain); + + /// + /// Loads a new with 11 items from an existing unmanaged chain. /// /// Any errors loading the chain. /// The unmanaged chain to use as the basis of this chain. - /// A new with 16 items. - public static ManagedChain Load(out string errors, TChain chain) + /// A new with 11 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Load(out string errors, TChain chain) where TChain : struct, IChainStart where T1 : struct, IExtendsChain where T2 : struct, IExtendsChain @@ -1167,316 +2561,465 @@ public static ManagedChain where T9 : struct, IExtendsChain where T10 : struct, IExtendsChain - where T11 : struct, IExtendsChain - where T12 : struct, IExtendsChain - where T13 : struct, IExtendsChain - where T14 : struct, IExtendsChain - where T15 : struct, IExtendsChain - { - return new(out errors, chain); - } + => LoadAny(out errors, chain); /// - /// Loads a new with 16 items from an existing unmanaged chain, - /// ignoring any errors. + /// Loads a new with 11 items from an existing unmanaged chain. /// + /// Any errors loading the chain. /// The unmanaged chain to use as the basis of this chain. - /// A new with 16 items. - public static ManagedChain Load(TChain chain) - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain - where T8 : struct, IExtendsChain - where T9 : struct, IExtendsChain - where T10 : struct, IExtendsChain - where T11 : struct, IExtendsChain - where T12 : struct, IExtendsChain - where T13 : struct, IExtendsChain - where T14 : struct, IExtendsChain - where T15 : struct, IExtendsChain - { - return new(out var _, chain); - } - -} + /// A new with 11 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain LoadAny(out string errors, TChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + { + var size = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(size); + chain.StructureType(); + Marshal.StructureToPtr(chain, newHeadPtr, false); + var errorBuilder = new StringBuilder(); + var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); + var newPtr = (BaseInStructure*) newHeadPtr; -/// -/// A safely manages the pointers of a managed structure chain. -/// -/// The chain type -public unsafe class ManagedChain : ManagedChain - where TChain : struct, IChainStart -{ - /// - /// Gets the size (in bytes) of the head structure. - /// - public static readonly int HeadSize = Marshal.SizeOf(); + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + newPtr = newPtr->PNext; - /// - /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. - /// - public static readonly int MemorySize = HeadSize; - - private nint _headPtr; + T1 item1 = default; + var expectedStructureType = item1.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 11"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 2; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item1 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item1, (nint) newPtr, false); - /// - /// Gets a pointer to the current head. - /// - public BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + newPtr = newPtr->PNext; - /// - /// Gets or sets the head of the chain. - /// - public TChain Head - { - get => Unsafe.AsRef((BaseInStructure*) _headPtr); - set - { - value.StructureType(); - var ptr = (BaseInStructure*) _headPtr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, _headPtr, true); - ptr->PNext = nextPtr; + T2 item2 = default; + expectedStructureType = item2.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 11"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 3; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item2 = Unsafe.AsRef(existingPtr); + } } - } + Marshal.StructureToPtr(item2, (nint) newPtr, false); - /// - /// Creates a new with 1 items from an existing memory block. - /// - /// The pointer to the head of the chain.. - /// - /// Callers are responsible for ensuring the size of the memory is correct. - /// - internal ManagedChain(nint headPtr) - { - _headPtr = headPtr; - } + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + newPtr = newPtr->PNext; - /// - /// Creates a new with 1 items. - /// - /// The head of the chain. - public ManagedChain(TChain head = default) - : this(Marshal.AllocHGlobal(MemorySize)) - { - head.StructureType(); - Marshal.StructureToPtr(head, _headPtr, false); - HeadPtr->PNext = null; - } + T3 item3 = default; + expectedStructureType = item3.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 11"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 4; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item3 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item3, (nint) newPtr, false); - /// - /// Creates a new with 1 items from an existing unmanaged chain. - /// - /// Any errors loading the chain. - /// The unmanaged chain to use as the basis of this chain. - public ManagedChain(out string errors, TChain chain) - : this(Marshal.AllocHGlobal(MemorySize)) - { - chain.StructureType(); - Marshal.StructureToPtr(chain, _headPtr, false); - errors = string.Empty; - } + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + newPtr = newPtr->PNext; - /// - /// Creates a new with 1 by copying this chain. - /// - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Duplicate() - { - var newHeadPtr = Marshal.AllocHGlobal(MemorySize); - // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); - return new ManagedChain(newHeadPtr); - } + T4 item4 = default; + expectedStructureType = item4.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 11"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 5; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item4 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item4, (nint) newPtr, false); - /// - /// Creates a new with 2 items, by appending to - /// the end of this chain. - /// - /// Item 1. - /// Type of Item 1 - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Append(T1 item1 = default) - where T1: struct, IExtendsChain - { - return new ManagedChain(this, item1); - } + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + newPtr = newPtr->PNext; - /// - public override IEnumerator GetEnumerator() - { - yield return Head; - } + T5 item5 = default; + expectedStructureType = item5.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 11"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 6; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item5 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item5, (nint) newPtr, false); - /// - public override int Count => 1; + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item6Offset); + newPtr = newPtr->PNext; - /// - public override IChainable this[int index] - => index switch - { - 0 => Head, - _ => throw new IndexOutOfRangeException() - }; + T6 item6 = default; + expectedStructureType = item6.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 11"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 7; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item6 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item6, (nint) newPtr, false); - /// - /// Deconstructs this chain. - /// - /// The head of the chain. - public void Deconstruct(out TChain head) - { - head = Head; - } + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item7Offset); + newPtr = newPtr->PNext; - /// - public override void Dispose() - { - var headPtr = Interlocked.Exchange(ref _headPtr, (nint)0); - if (headPtr == (nint)0) { - return; + T7 item7 = default; + expectedStructureType = item7.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 11"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 8; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item7 = Unsafe.AsRef(existingPtr); + } } + Marshal.StructureToPtr(item7, (nint) newPtr, false); - // Destroy all structures - Marshal.DestroyStructure(headPtr); + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item8Offset); + newPtr = newPtr->PNext; - // Free memory block - Marshal.FreeHGlobal(headPtr); - } -} + T8 item8 = default; + expectedStructureType = item8.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 11"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 9; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item8 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item8, (nint) newPtr, false); -/// -/// A safely manages the pointers of a managed structure chain. -/// -/// The chain type -/// Type of Item 1. -public unsafe class ManagedChain : ManagedChain - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain -{ - /// - /// Gets the size (in bytes) of the head structure. - /// - public static readonly int HeadSize = Marshal.SizeOf(); + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item9Offset); + newPtr = newPtr->PNext; - /// - /// Gets the offset to the start of . - /// - public static readonly int Item1Offset = HeadSize; + T9 item9 = default; + expectedStructureType = item9.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 9, expected length 11"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 10; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item9 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item9, (nint) newPtr, false); - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item1Size = Marshal.SizeOf(); + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item10Offset); + newPtr = newPtr->PNext; - /// - /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. - /// - public static readonly int MemorySize = Item1Offset + Item1Size; - - private nint _headPtr; + T10 item10 = default; + expectedStructureType = item10.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 10, expected length 11"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 11; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + if (existingPtr->PNext is not null) { + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 11"); + existingPtr->PNext = null; + } + item10 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item10, (nint) newPtr, false); - /// - /// Gets a pointer to the current head. - /// - public BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; + // Create string of errors + errors = errorBuilder.ToString().Trim(); + return new ManagedChain(newHeadPtr); + } /// - /// Gets or sets the head of the chain. + /// Creates a new with 12 items. /// - public TChain Head - { - get => Unsafe.AsRef((BaseInStructure*) _headPtr); - set - { - value.StructureType(); - var ptr = (BaseInStructure*) _headPtr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, _headPtr, true); - ptr->PNext = nextPtr; - } - } + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// Item 11. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// A new with 12 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + => new(head, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11); /// - /// Gets a pointer to the second item in the chain. + /// Creates a new with 12 items. /// - public BaseInStructure* Item1Ptr => (BaseInStructure*) (_headPtr + Item1Offset); + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// Item 11. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// A new with 12 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain CreateAny(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + where T11 : struct, IChainable + => new(head, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11); /// - /// Gets or sets item #1 in the chain. + /// Loads a new with 12 items from an existing unmanaged chain, + /// ignoring any errors. /// - public T1 Item1 - { - get => Unsafe.AsRef(Item1Ptr); - set - { - value.StructureType(); - var ptr = Item1Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } + /// The unmanaged chain to use as the basis of this chain. + /// A new with 12 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Load(TChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + => LoadAny(out var _, chain); /// - /// Creates a new with 2 items from an existing memory block. + /// Loads a new with 12 items from an existing unmanaged chain, + /// ignoring any errors. /// - /// The pointer to the head of the chain.. - /// - /// Callers are responsible for ensuring the size of the memory is correct. - /// - internal ManagedChain(nint headPtr) - { - _headPtr = headPtr; - } + /// The unmanaged chain to use as the basis of this chain. + /// A new with 12 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain LoadAny(TChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + where T11 : struct, IChainable + => LoadAny(out var _, chain); /// - /// Creates a new with 2 items. + /// Loads a new with 12 items from an existing unmanaged chain. /// - /// The head of the chain. - /// Item 1. - public ManagedChain(TChain head = default, T1 item1 = default) - : this(Marshal.AllocHGlobal(MemorySize)) - { - head.StructureType(); - Marshal.StructureToPtr(head, _headPtr, false); - BaseInStructure* itemPtr = Item1Ptr; - item1.StructureType(); - Marshal.StructureToPtr(item1, (nint)itemPtr, false); - HeadPtr->PNext = itemPtr; - Item1Ptr->PNext = null; - } + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + /// A new with 12 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Load(out string errors, TChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + => LoadAny(out errors, chain); /// - /// Creates a new with 2 items from an existing unmanaged chain. + /// Loads a new with 12 items from an existing unmanaged chain. /// /// Any errors loading the chain. /// The unmanaged chain to use as the basis of this chain. - public ManagedChain(out string errors, TChain chain) - : this(Marshal.AllocHGlobal(MemorySize)) - { + /// A new with 12 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain LoadAny(out string errors, TChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + where T11 : struct, IChainable + { + var size = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(size); chain.StructureType(); - Marshal.StructureToPtr(chain, _headPtr, false); - StringBuilder errorBuilder = new StringBuilder(); + Marshal.StructureToPtr(chain, newHeadPtr, false); + var errorBuilder = new StringBuilder(); var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); - var newPtr = (BaseInStructure*) _headPtr; + var newPtr = (BaseInStructure*) newHeadPtr; - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item1Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + newPtr = newPtr->PNext; T1 item1 = default; var expectedStructureType = item1.StructureType(); if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 2"); + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 12"); } else { if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") @@ -1485,316 +3028,446 @@ public ManagedChain(out string errors, TChain chain) .Append(expectedStructureType) .AppendLine(); } else { - if (existingPtr->PNext is not null) { - errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 2"); - existingPtr->PNext = null; - } item1 = Unsafe.AsRef(existingPtr); } } Marshal.StructureToPtr(item1, (nint) newPtr, false); - // Create string of errors - errors = errorBuilder.ToString().Trim(); - } + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + newPtr = newPtr->PNext; - /// - /// Creates a new with 2 by copying this chain. - /// - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Duplicate() - { - var newHeadPtr = Marshal.AllocHGlobal(MemorySize); - // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); - // Update all pointers - ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); - return new ManagedChain(newHeadPtr); - } - - /// - /// Creates a new with 2 items, by appending - /// to the end of this chain. - /// - /// The chain to append to. - /// Item 1. - /// - /// Do not forget to dispose the chain if you are no longer using it. - /// - public ManagedChain(ManagedChain previous, T1 item1 = default) - : this(Marshal.AllocHGlobal(MemorySize)) - { - var previousSize = MemorySize - Item1Size; - // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); - - // Append item 1 - item1.StructureType(); - Marshal.StructureToPtr(item1, _headPtr + previousSize, false); + T2 item2 = default; + expectedStructureType = item2.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 12"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 3; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item2 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item2, (nint) newPtr, false); - // Update all pointers - ((BaseInStructure*)_headPtr)->PNext = (BaseInStructure*) (_headPtr + Item1Offset); - ((BaseInStructure*)(_headPtr + previousSize))->PNext = null; - } + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + newPtr = newPtr->PNext; - /// - /// Creates a new with 1 items, by removing the last item - /// from this chain. - /// - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Truncate() - { - return Truncate(out var _); - } + T3 item3 = default; + expectedStructureType = item3.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 12"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 4; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item3 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item3, (nint) newPtr, false); - /// - /// Creates a new with 1 items, by removing - /// from the end of this chain. - /// - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Truncate(out T1 item1) - { - item1 = Item1; + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + newPtr = newPtr->PNext; - var newSize = MemorySize - Item1Size; - var newHeadPtr = Marshal.AllocHGlobal(newSize); - // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); - // Update all pointers - ((BaseInStructure*)newHeadPtr)->PNext = null; - return new ManagedChain(newHeadPtr); - } + T4 item4 = default; + expectedStructureType = item4.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 12"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 5; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item4 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item4, (nint) newPtr, false); - /// - /// Creates a new with 3 items, by appending to - /// the end of this chain. - /// - /// Item 2. - /// Type of Item 2 - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Append(T2 item2 = default) - where T2: struct, IExtendsChain - { - return new ManagedChain(this, item2); - } + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + newPtr = newPtr->PNext; - /// - public override IEnumerator GetEnumerator() - { - yield return Head; - yield return Item1; - } + T5 item5 = default; + expectedStructureType = item5.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 12"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 6; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item5 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item5, (nint) newPtr, false); - /// - public override int Count => 2; + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item6Offset); + newPtr = newPtr->PNext; - /// - public override IChainable this[int index] - => index switch - { - 0 => Head, - 1 => Item1, - _ => throw new IndexOutOfRangeException() - }; + T6 item6 = default; + expectedStructureType = item6.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 12"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 7; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item6 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item6, (nint) newPtr, false); - /// - /// Deconstructs this chain. - /// - /// The head of the chain. - /// Item 1. - public void Deconstruct(out TChain head, out T1 item1) - { - head = Head; - item1 = Item1; - } + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item7Offset); + newPtr = newPtr->PNext; - /// - public override void Dispose() - { - var headPtr = Interlocked.Exchange(ref _headPtr, (nint)0); - if (headPtr == (nint)0) { - return; + T7 item7 = default; + expectedStructureType = item7.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 12"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 8; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item7 = Unsafe.AsRef(existingPtr); + } } + Marshal.StructureToPtr(item7, (nint) newPtr, false); - // Destroy all structures - Marshal.DestroyStructure(headPtr); - Marshal.DestroyStructure(headPtr + Item1Offset); + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item8Offset); + newPtr = newPtr->PNext; - // Free memory block - Marshal.FreeHGlobal(headPtr); - } -} + T8 item8 = default; + expectedStructureType = item8.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 12"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 9; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item8 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item8, (nint) newPtr, false); -/// -/// A safely manages the pointers of a managed structure chain. -/// -/// The chain type -/// Type of Item 1. -/// Type of Item 2. -public unsafe class ManagedChain : ManagedChain - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain -{ - /// - /// Gets the size (in bytes) of the head structure. - /// - public static readonly int HeadSize = Marshal.SizeOf(); + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item9Offset); + newPtr = newPtr->PNext; - /// - /// Gets the offset to the start of . - /// - public static readonly int Item1Offset = HeadSize; + T9 item9 = default; + expectedStructureType = item9.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 9, expected length 12"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 10; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item9 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item9, (nint) newPtr, false); - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item1Size = Marshal.SizeOf(); + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item10Offset); + newPtr = newPtr->PNext; - /// - /// Gets the offset to the start of . - /// - public static readonly int Item2Offset = Item1Offset + Item1Size; + T10 item10 = default; + expectedStructureType = item10.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 10, expected length 12"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 11; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item10 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item10, (nint) newPtr, false); - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item2Size = Marshal.SizeOf(); - - /// - /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. - /// - public static readonly int MemorySize = Item2Offset + Item2Size; - - private nint _headPtr; + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item11Offset); + newPtr = newPtr->PNext; - /// - /// Gets a pointer to the current head. - /// - public BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; - - /// - /// Gets or sets the head of the chain. - /// - public TChain Head - { - get => Unsafe.AsRef((BaseInStructure*) _headPtr); - set - { - value.StructureType(); - var ptr = (BaseInStructure*) _headPtr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, _headPtr, true); - ptr->PNext = nextPtr; + T11 item11 = default; + expectedStructureType = item11.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 11, expected length 12"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 12; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + if (existingPtr->PNext is not null) { + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 12"); + existingPtr->PNext = null; + } + item11 = Unsafe.AsRef(existingPtr); + } } - } + Marshal.StructureToPtr(item11, (nint) newPtr, false); - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item1Ptr => (BaseInStructure*) (_headPtr + Item1Offset); + // Create string of errors + errors = errorBuilder.ToString().Trim(); + return new ManagedChain(newHeadPtr); + } /// - /// Gets or sets item #1 in the chain. + /// Creates a new with 13 items. /// - public T1 Item1 - { - get => Unsafe.AsRef(Item1Ptr); - set - { - value.StructureType(); - var ptr = Item1Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// Item 11. + /// Item 12. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// A new with 13 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + => new(head, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12); /// - /// Gets a pointer to the second item in the chain. + /// Creates a new with 13 items. /// - public BaseInStructure* Item2Ptr => (BaseInStructure*) (_headPtr + Item2Offset); + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// Item 11. + /// Item 12. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// A new with 13 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain CreateAny(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + where T11 : struct, IChainable + where T12 : struct, IChainable + => new(head, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12); /// - /// Gets or sets item #2 in the chain. + /// Loads a new with 13 items from an existing unmanaged chain, + /// ignoring any errors. /// - public T2 Item2 - { - get => Unsafe.AsRef(Item2Ptr); - set - { - value.StructureType(); - var ptr = Item2Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } + /// The unmanaged chain to use as the basis of this chain. + /// A new with 13 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Load(TChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + => LoadAny(out var _, chain); /// - /// Creates a new with 3 items from an existing memory block. + /// Loads a new with 13 items from an existing unmanaged chain, + /// ignoring any errors. /// - /// The pointer to the head of the chain.. - /// - /// Callers are responsible for ensuring the size of the memory is correct. - /// - internal ManagedChain(nint headPtr) - { - _headPtr = headPtr; - } + /// The unmanaged chain to use as the basis of this chain. + /// A new with 13 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain LoadAny(TChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + where T11 : struct, IChainable + where T12 : struct, IChainable + => LoadAny(out var _, chain); /// - /// Creates a new with 3 items. + /// Loads a new with 13 items from an existing unmanaged chain. /// - /// The head of the chain. - /// Item 1. - /// Item 2. - public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default) - : this(Marshal.AllocHGlobal(MemorySize)) - { - head.StructureType(); - Marshal.StructureToPtr(head, _headPtr, false); - BaseInStructure* itemPtr = Item1Ptr; - item1.StructureType(); - Marshal.StructureToPtr(item1, (nint)itemPtr, false); - HeadPtr->PNext = itemPtr; - itemPtr = Item2Ptr; - item2.StructureType(); - Marshal.StructureToPtr(item2, (nint)itemPtr, false); - Item1Ptr->PNext = itemPtr; - Item2Ptr->PNext = null; - } + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + /// A new with 13 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Load(out string errors, TChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + => LoadAny(out errors, chain); /// - /// Creates a new with 3 items from an existing unmanaged chain. + /// Loads a new with 13 items from an existing unmanaged chain. /// /// Any errors loading the chain. /// The unmanaged chain to use as the basis of this chain. - public ManagedChain(out string errors, TChain chain) - : this(Marshal.AllocHGlobal(MemorySize)) - { + /// A new with 13 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain LoadAny(out string errors, TChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + where T11 : struct, IChainable + where T12 : struct, IChainable + { + var size = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(size); chain.StructureType(); - Marshal.StructureToPtr(chain, _headPtr, false); - StringBuilder errorBuilder = new StringBuilder(); + Marshal.StructureToPtr(chain, newHeadPtr, false); + var errorBuilder = new StringBuilder(); var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); - var newPtr = (BaseInStructure*) _headPtr; + var newPtr = (BaseInStructure*) newHeadPtr; - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item1Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + newPtr = newPtr->PNext; T1 item1 = default; var expectedStructureType = item1.StructureType(); if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 3"); + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 13"); } else { if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") @@ -1808,14 +3481,14 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item1, (nint) newPtr, false); - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item2Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + newPtr = newPtr->PNext; T2 item2 = default; expectedStructureType = item2.StructureType(); if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 3"); + errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 13"); } else { if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") @@ -1824,362 +3497,456 @@ public ManagedChain(out string errors, TChain chain) .Append(expectedStructureType) .AppendLine(); } else { - if (existingPtr->PNext is not null) { - errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 3"); - existingPtr->PNext = null; - } item2 = Unsafe.AsRef(existingPtr); } } Marshal.StructureToPtr(item2, (nint) newPtr, false); - // Create string of errors - errors = errorBuilder.ToString().Trim(); - } - - /// - /// Creates a new with 3 by copying this chain. - /// - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Duplicate() - { - var newHeadPtr = Marshal.AllocHGlobal(MemorySize); - // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); - // Update all pointers - ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); - ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); - return new ManagedChain(newHeadPtr); - } - - /// - /// Creates a new with 3 items, by appending - /// to the end of this chain. - /// - /// The chain to append to. - /// Item 2. - /// - /// Do not forget to dispose the chain if you are no longer using it. - /// - public ManagedChain(ManagedChain previous, T2 item2 = default) - : this(Marshal.AllocHGlobal(MemorySize)) - { - var previousSize = MemorySize - Item2Size; - // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); - - // Append item 2 - item2.StructureType(); - Marshal.StructureToPtr(item2, _headPtr + previousSize, false); + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + newPtr = newPtr->PNext; - // Update all pointers - ((BaseInStructure*)_headPtr)->PNext = (BaseInStructure*) (_headPtr + Item1Offset); - ((BaseInStructure*)(_headPtr + Item1Offset))->PNext = (BaseInStructure*) (_headPtr + Item2Offset); - ((BaseInStructure*)(_headPtr + previousSize))->PNext = null; - } - - /// - /// Creates a new with 2 items, by removing the last item - /// from this chain. - /// - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Truncate() - { - return Truncate(out var _); - } + T3 item3 = default; + expectedStructureType = item3.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 13"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 4; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item3 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item3, (nint) newPtr, false); - /// - /// Creates a new with 2 items, by removing - /// from the end of this chain. - /// - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Truncate(out T2 item2) - { - item2 = Item2; + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + newPtr = newPtr->PNext; - var newSize = MemorySize - Item2Size; - var newHeadPtr = Marshal.AllocHGlobal(newSize); - // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); - // Update all pointers - ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); - ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = null; - return new ManagedChain(newHeadPtr); - } + T4 item4 = default; + expectedStructureType = item4.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 13"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 5; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item4 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item4, (nint) newPtr, false); - /// - /// Creates a new with 4 items, by appending to - /// the end of this chain. - /// - /// Item 3. - /// Type of Item 3 - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Append(T3 item3 = default) - where T3: struct, IExtendsChain - { - return new ManagedChain(this, item3); - } + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + newPtr = newPtr->PNext; - /// - public override IEnumerator GetEnumerator() - { - yield return Head; - yield return Item1; - yield return Item2; - } + T5 item5 = default; + expectedStructureType = item5.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 13"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 6; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item5 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item5, (nint) newPtr, false); - /// - public override int Count => 3; + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item6Offset); + newPtr = newPtr->PNext; - /// - public override IChainable this[int index] - => index switch - { - 0 => Head, - 1 => Item1, - 2 => Item2, - _ => throw new IndexOutOfRangeException() - }; + T6 item6 = default; + expectedStructureType = item6.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 13"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 7; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item6 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item6, (nint) newPtr, false); - /// - /// Deconstructs this chain. - /// - /// The head of the chain. - /// Item 1. - /// Item 2. - public void Deconstruct(out TChain head, out T1 item1, out T2 item2) - { - head = Head; - item1 = Item1; - item2 = Item2; - } + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item7Offset); + newPtr = newPtr->PNext; - /// - public override void Dispose() - { - var headPtr = Interlocked.Exchange(ref _headPtr, (nint)0); - if (headPtr == (nint)0) { - return; + T7 item7 = default; + expectedStructureType = item7.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 13"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 8; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item7 = Unsafe.AsRef(existingPtr); + } } + Marshal.StructureToPtr(item7, (nint) newPtr, false); - // Destroy all structures - Marshal.DestroyStructure(headPtr); - Marshal.DestroyStructure(headPtr + Item1Offset); - Marshal.DestroyStructure(headPtr + Item2Offset); + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item8Offset); + newPtr = newPtr->PNext; - // Free memory block - Marshal.FreeHGlobal(headPtr); - } -} + T8 item8 = default; + expectedStructureType = item8.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 13"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 9; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item8 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item8, (nint) newPtr, false); -/// -/// A safely manages the pointers of a managed structure chain. -/// -/// The chain type -/// Type of Item 1. -/// Type of Item 2. -/// Type of Item 3. -public unsafe class ManagedChain : ManagedChain - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain -{ - /// - /// Gets the size (in bytes) of the head structure. - /// - public static readonly int HeadSize = Marshal.SizeOf(); + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item9Offset); + newPtr = newPtr->PNext; - /// - /// Gets the offset to the start of . - /// - public static readonly int Item1Offset = HeadSize; + T9 item9 = default; + expectedStructureType = item9.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 9, expected length 13"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 10; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item9 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item9, (nint) newPtr, false); - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item1Size = Marshal.SizeOf(); + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item10Offset); + newPtr = newPtr->PNext; - /// - /// Gets the offset to the start of . - /// - public static readonly int Item2Offset = Item1Offset + Item1Size; + T10 item10 = default; + expectedStructureType = item10.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 10, expected length 13"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 11; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item10 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item10, (nint) newPtr, false); - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item2Size = Marshal.SizeOf(); + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item11Offset); + newPtr = newPtr->PNext; - /// - /// Gets the offset to the start of . - /// - public static readonly int Item3Offset = Item2Offset + Item2Size; + T11 item11 = default; + expectedStructureType = item11.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 11, expected length 13"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 12; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item11 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item11, (nint) newPtr, false); - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item3Size = Marshal.SizeOf(); + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item12Offset); + newPtr = newPtr->PNext; - /// - /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. - /// - public static readonly int MemorySize = Item3Offset + Item3Size; - - private nint _headPtr; - - /// - /// Gets a pointer to the current head. - /// - public BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; - - /// - /// Gets or sets the head of the chain. - /// - public TChain Head - { - get => Unsafe.AsRef((BaseInStructure*) _headPtr); - set - { - value.StructureType(); - var ptr = (BaseInStructure*) _headPtr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, _headPtr, true); - ptr->PNext = nextPtr; + T12 item12 = default; + expectedStructureType = item12.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 12, expected length 13"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 13; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + if (existingPtr->PNext is not null) { + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 13"); + existingPtr->PNext = null; + } + item12 = Unsafe.AsRef(existingPtr); + } } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item1Ptr => (BaseInStructure*) (_headPtr + Item1Offset); + Marshal.StructureToPtr(item12, (nint) newPtr, false); - /// - /// Gets or sets item #1 in the chain. - /// - public T1 Item1 - { - get => Unsafe.AsRef(Item1Ptr); - set - { - value.StructureType(); - var ptr = Item1Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } + // Create string of errors + errors = errorBuilder.ToString().Trim(); + return new ManagedChain(newHeadPtr); } /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item2Ptr => (BaseInStructure*) (_headPtr + Item2Offset); - - /// - /// Gets or sets item #2 in the chain. + /// Creates a new with 14 items. /// - public T2 Item2 - { - get => Unsafe.AsRef(Item2Ptr); - set - { - value.StructureType(); - var ptr = Item2Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// Item 11. + /// Item 12. + /// Item 13. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// Type of Item 13. + /// A new with 14 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default, T13 item13 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + where T13 : struct, IExtendsChain + => new(head, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13); /// - /// Gets a pointer to the second item in the chain. + /// Creates a new with 14 items. /// - public BaseInStructure* Item3Ptr => (BaseInStructure*) (_headPtr + Item3Offset); + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// Item 11. + /// Item 12. + /// Item 13. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// Type of Item 13. + /// A new with 14 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain CreateAny(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default, T13 item13 = default) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + where T11 : struct, IChainable + where T12 : struct, IChainable + where T13 : struct, IChainable + => new(head, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13); /// - /// Gets or sets item #3 in the chain. + /// Loads a new with 14 items from an existing unmanaged chain, + /// ignoring any errors. /// - public T3 Item3 - { - get => Unsafe.AsRef(Item3Ptr); - set - { - value.StructureType(); - var ptr = Item3Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } + /// The unmanaged chain to use as the basis of this chain. + /// A new with 14 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Load(TChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + where T13 : struct, IExtendsChain + => LoadAny(out var _, chain); /// - /// Creates a new with 4 items from an existing memory block. + /// Loads a new with 14 items from an existing unmanaged chain, + /// ignoring any errors. /// - /// The pointer to the head of the chain.. - /// - /// Callers are responsible for ensuring the size of the memory is correct. - /// - internal ManagedChain(nint headPtr) - { - _headPtr = headPtr; - } + /// The unmanaged chain to use as the basis of this chain. + /// A new with 14 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain LoadAny(TChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + where T11 : struct, IChainable + where T12 : struct, IChainable + where T13 : struct, IChainable + => LoadAny(out var _, chain); /// - /// Creates a new with 4 items. + /// Loads a new with 14 items from an existing unmanaged chain. /// - /// The head of the chain. - /// Item 1. - /// Item 2. - /// Item 3. - public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default) - : this(Marshal.AllocHGlobal(MemorySize)) - { - head.StructureType(); - Marshal.StructureToPtr(head, _headPtr, false); - BaseInStructure* itemPtr = Item1Ptr; - item1.StructureType(); - Marshal.StructureToPtr(item1, (nint)itemPtr, false); - HeadPtr->PNext = itemPtr; - itemPtr = Item2Ptr; - item2.StructureType(); - Marshal.StructureToPtr(item2, (nint)itemPtr, false); - Item1Ptr->PNext = itemPtr; - itemPtr = Item3Ptr; - item3.StructureType(); - Marshal.StructureToPtr(item3, (nint)itemPtr, false); - Item2Ptr->PNext = itemPtr; - Item3Ptr->PNext = null; - } + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + /// A new with 14 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Load(out string errors, TChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + where T13 : struct, IExtendsChain + => LoadAny(out errors, chain); /// - /// Creates a new with 4 items from an existing unmanaged chain. + /// Loads a new with 14 items from an existing unmanaged chain. /// /// Any errors loading the chain. /// The unmanaged chain to use as the basis of this chain. - public ManagedChain(out string errors, TChain chain) - : this(Marshal.AllocHGlobal(MemorySize)) - { + /// A new with 14 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain LoadAny(out string errors, TChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + where T11 : struct, IChainable + where T12 : struct, IChainable + where T13 : struct, IChainable + { + var size = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(size); chain.StructureType(); - Marshal.StructureToPtr(chain, _headPtr, false); - StringBuilder errorBuilder = new StringBuilder(); + Marshal.StructureToPtr(chain, newHeadPtr, false); + var errorBuilder = new StringBuilder(); var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); - var newPtr = (BaseInStructure*) _headPtr; + var newPtr = (BaseInStructure*) newHeadPtr; - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item1Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + newPtr = newPtr->PNext; T1 item1 = default; var expectedStructureType = item1.StructureType(); if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 4"); + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 14"); } else { if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") @@ -2193,14 +3960,14 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item1, (nint) newPtr, false); - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item2Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + newPtr = newPtr->PNext; T2 item2 = default; expectedStructureType = item2.StructureType(); if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 4"); + errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 14"); } else { if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") @@ -2214,14 +3981,14 @@ public ManagedChain(out string errors, TChain chain) } Marshal.StructureToPtr(item2, (nint) newPtr, false); - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item3Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + newPtr = newPtr->PNext; T3 item3 = default; expectedStructureType = item3.StructureType(); if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 4"); + errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 14"); } else { if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") @@ -2230,734 +3997,6276 @@ public ManagedChain(out string errors, TChain chain) .Append(expectedStructureType) .AppendLine(); } else { - if (existingPtr->PNext is not null) { - errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 4"); - existingPtr->PNext = null; - } item3 = Unsafe.AsRef(existingPtr); } } Marshal.StructureToPtr(item3, (nint) newPtr, false); - // Create string of errors - errors = errorBuilder.ToString().Trim(); - } - - /// - /// Creates a new with 4 by copying this chain. - /// - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Duplicate() - { - var newHeadPtr = Marshal.AllocHGlobal(MemorySize); - // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); - // Update all pointers - ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); - ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); - ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); - return new ManagedChain(newHeadPtr); - } + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + newPtr = newPtr->PNext; - /// - /// Creates a new with 4 items, by appending - /// to the end of this chain. - /// - /// The chain to append to. - /// Item 3. - /// - /// Do not forget to dispose the chain if you are no longer using it. - /// - public ManagedChain(ManagedChain previous, T3 item3 = default) - : this(Marshal.AllocHGlobal(MemorySize)) - { - var previousSize = MemorySize - Item3Size; - // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); - - // Append item 3 - item3.StructureType(); - Marshal.StructureToPtr(item3, _headPtr + previousSize, false); + T4 item4 = default; + expectedStructureType = item4.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 14"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 5; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item4 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item4, (nint) newPtr, false); - // Update all pointers - ((BaseInStructure*)_headPtr)->PNext = (BaseInStructure*) (_headPtr + Item1Offset); - ((BaseInStructure*)(_headPtr + Item1Offset))->PNext = (BaseInStructure*) (_headPtr + Item2Offset); - ((BaseInStructure*)(_headPtr + Item2Offset))->PNext = (BaseInStructure*) (_headPtr + Item3Offset); - ((BaseInStructure*)(_headPtr + previousSize))->PNext = null; - } + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + newPtr = newPtr->PNext; - /// - /// Creates a new with 3 items, by removing the last item - /// from this chain. - /// - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Truncate() - { - return Truncate(out var _); - } + T5 item5 = default; + expectedStructureType = item5.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 14"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 6; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item5 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item5, (nint) newPtr, false); - /// - /// Creates a new with 3 items, by removing - /// from the end of this chain. - /// - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Truncate(out T3 item3) - { - item3 = Item3; + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item6Offset); + newPtr = newPtr->PNext; - var newSize = MemorySize - Item3Size; - var newHeadPtr = Marshal.AllocHGlobal(newSize); - // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); - // Update all pointers - ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); - ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); - ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = null; - return new ManagedChain(newHeadPtr); - } + T6 item6 = default; + expectedStructureType = item6.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 14"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 7; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item6 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item6, (nint) newPtr, false); - /// - /// Creates a new with 5 items, by appending to - /// the end of this chain. - /// - /// Item 4. - /// Type of Item 4 - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Append(T4 item4 = default) - where T4: struct, IExtendsChain - { - return new ManagedChain(this, item4); - } + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item7Offset); + newPtr = newPtr->PNext; - /// - public override IEnumerator GetEnumerator() - { - yield return Head; - yield return Item1; - yield return Item2; - yield return Item3; - } + T7 item7 = default; + expectedStructureType = item7.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 14"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 8; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item7 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item7, (nint) newPtr, false); - /// - public override int Count => 4; + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item8Offset); + newPtr = newPtr->PNext; - /// - public override IChainable this[int index] - => index switch - { - 0 => Head, - 1 => Item1, - 2 => Item2, - 3 => Item3, - _ => throw new IndexOutOfRangeException() - }; + T8 item8 = default; + expectedStructureType = item8.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 14"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 9; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item8 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item8, (nint) newPtr, false); - /// - /// Deconstructs this chain. - /// - /// The head of the chain. - /// Item 1. - /// Item 2. - /// Item 3. - public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item3) - { - head = Head; - item1 = Item1; - item2 = Item2; - item3 = Item3; - } + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item9Offset); + newPtr = newPtr->PNext; - /// - public override void Dispose() - { - var headPtr = Interlocked.Exchange(ref _headPtr, (nint)0); - if (headPtr == (nint)0) { - return; + T9 item9 = default; + expectedStructureType = item9.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 9, expected length 14"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 10; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item9 = Unsafe.AsRef(existingPtr); + } } + Marshal.StructureToPtr(item9, (nint) newPtr, false); - // Destroy all structures - Marshal.DestroyStructure(headPtr); - Marshal.DestroyStructure(headPtr + Item1Offset); - Marshal.DestroyStructure(headPtr + Item2Offset); - Marshal.DestroyStructure(headPtr + Item3Offset); + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item10Offset); + newPtr = newPtr->PNext; - // Free memory block - Marshal.FreeHGlobal(headPtr); - } -} + T10 item10 = default; + expectedStructureType = item10.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 10, expected length 14"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 11; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item10 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item10, (nint) newPtr, false); -/// -/// A safely manages the pointers of a managed structure chain. -/// -/// The chain type -/// Type of Item 1. -/// Type of Item 2. -/// Type of Item 3. -/// Type of Item 4. -public unsafe class ManagedChain : ManagedChain - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain -{ - /// - /// Gets the size (in bytes) of the head structure. - /// - public static readonly int HeadSize = Marshal.SizeOf(); + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item11Offset); + newPtr = newPtr->PNext; - /// - /// Gets the offset to the start of . - /// - public static readonly int Item1Offset = HeadSize; + T11 item11 = default; + expectedStructureType = item11.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 11, expected length 14"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 12; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item11 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item11, (nint) newPtr, false); - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item1Size = Marshal.SizeOf(); + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item12Offset); + newPtr = newPtr->PNext; - /// - /// Gets the offset to the start of . - /// - public static readonly int Item2Offset = Item1Offset + Item1Size; - - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item2Size = Marshal.SizeOf(); - - /// - /// Gets the offset to the start of . - /// - public static readonly int Item3Offset = Item2Offset + Item2Size; - - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item3Size = Marshal.SizeOf(); - - /// - /// Gets the offset to the start of . - /// - public static readonly int Item4Offset = Item3Offset + Item3Size; - - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item4Size = Marshal.SizeOf(); - - /// - /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. - /// - public static readonly int MemorySize = Item4Offset + Item4Size; - - private nint _headPtr; - - /// - /// Gets a pointer to the current head. - /// - public BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; - - /// - /// Gets or sets the head of the chain. - /// - public TChain Head - { - get => Unsafe.AsRef((BaseInStructure*) _headPtr); - set - { - value.StructureType(); - var ptr = (BaseInStructure*) _headPtr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, _headPtr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item1Ptr => (BaseInStructure*) (_headPtr + Item1Offset); - - /// - /// Gets or sets item #1 in the chain. - /// - public T1 Item1 - { - get => Unsafe.AsRef(Item1Ptr); - set - { - value.StructureType(); - var ptr = Item1Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item2Ptr => (BaseInStructure*) (_headPtr + Item2Offset); - - /// - /// Gets or sets item #2 in the chain. - /// - public T2 Item2 - { - get => Unsafe.AsRef(Item2Ptr); - set - { - value.StructureType(); - var ptr = Item2Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item3Ptr => (BaseInStructure*) (_headPtr + Item3Offset); - - /// - /// Gets or sets item #3 in the chain. - /// - public T3 Item3 - { - get => Unsafe.AsRef(Item3Ptr); - set - { - value.StructureType(); - var ptr = Item3Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item4Ptr => (BaseInStructure*) (_headPtr + Item4Offset); - - /// - /// Gets or sets item #4 in the chain. - /// - public T4 Item4 - { - get => Unsafe.AsRef(Item4Ptr); - set - { - value.StructureType(); - var ptr = Item4Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Creates a new with 5 items from an existing memory block. - /// - /// The pointer to the head of the chain.. - /// - /// Callers are responsible for ensuring the size of the memory is correct. - /// - internal ManagedChain(nint headPtr) - { - _headPtr = headPtr; - } - - /// - /// Creates a new with 5 items. - /// - /// The head of the chain. - /// Item 1. - /// Item 2. - /// Item 3. - /// Item 4. - public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default) - : this(Marshal.AllocHGlobal(MemorySize)) - { - head.StructureType(); - Marshal.StructureToPtr(head, _headPtr, false); - BaseInStructure* itemPtr = Item1Ptr; - item1.StructureType(); - Marshal.StructureToPtr(item1, (nint)itemPtr, false); - HeadPtr->PNext = itemPtr; - itemPtr = Item2Ptr; - item2.StructureType(); - Marshal.StructureToPtr(item2, (nint)itemPtr, false); - Item1Ptr->PNext = itemPtr; - itemPtr = Item3Ptr; - item3.StructureType(); - Marshal.StructureToPtr(item3, (nint)itemPtr, false); - Item2Ptr->PNext = itemPtr; - itemPtr = Item4Ptr; - item4.StructureType(); - Marshal.StructureToPtr(item4, (nint)itemPtr, false); - Item3Ptr->PNext = itemPtr; - Item4Ptr->PNext = null; - } - - /// - /// Creates a new with 5 items from an existing unmanaged chain. - /// - /// Any errors loading the chain. - /// The unmanaged chain to use as the basis of this chain. - public ManagedChain(out string errors, TChain chain) - : this(Marshal.AllocHGlobal(MemorySize)) - { - chain.StructureType(); - Marshal.StructureToPtr(chain, _headPtr, false); - StringBuilder errorBuilder = new StringBuilder(); - var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); - var newPtr = (BaseInStructure*) _headPtr; - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item1Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T1 item1 = default; - var expectedStructureType = item1.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 5"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 2; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item1 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item1, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item2Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T2 item2 = default; - expectedStructureType = item2.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 5"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 3; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item2 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item2, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item3Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T3 item3 = default; - expectedStructureType = item3.StructureType(); + T12 item12 = default; + expectedStructureType = item12.StructureType(); if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 5"); + errorBuilder.AppendLine("The unmanaged chain was length 12, expected length 14"); } else { if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") .Append(existingPtr->SType) - .Append(" at position 4; expected ") + .Append(" at position 13; expected ") .Append(expectedStructureType) .AppendLine(); } else { - item3 = Unsafe.AsRef(existingPtr); + item12 = Unsafe.AsRef(existingPtr); } } - Marshal.StructureToPtr(item3, (nint) newPtr, false); + Marshal.StructureToPtr(item12, (nint) newPtr, false); - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item4Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item13Offset); + newPtr = newPtr->PNext; - T4 item4 = default; - expectedStructureType = item4.StructureType(); + T13 item13 = default; + expectedStructureType = item13.StructureType(); if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 5"); + errorBuilder.AppendLine("The unmanaged chain was length 13, expected length 14"); } else { if (existingPtr->SType != expectedStructureType) { errorBuilder.Append("The unmanaged chain has a structure type ") .Append(existingPtr->SType) - .Append(" at position 5; expected ") + .Append(" at position 14; expected ") .Append(expectedStructureType) .AppendLine(); } else { if (existingPtr->PNext is not null) { - errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 5"); + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 14"); existingPtr->PNext = null; } - item4 = Unsafe.AsRef(existingPtr); + item13 = Unsafe.AsRef(existingPtr); } } - Marshal.StructureToPtr(item4, (nint) newPtr, false); + Marshal.StructureToPtr(item13, (nint) newPtr, false); // Create string of errors errors = errorBuilder.ToString().Trim(); + return new ManagedChain(newHeadPtr); } /// - /// Creates a new with 5 by copying this chain. + /// Creates a new with 15 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// Item 11. + /// Item 12. + /// Item 13. + /// Item 14. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// Type of Item 13. + /// Type of Item 14. + /// A new with 15 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default, T13 item13 = default, T14 item14 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + where T13 : struct, IExtendsChain + where T14 : struct, IExtendsChain + => new(head, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13, item14); + + /// + /// Creates a new with 15 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// Item 11. + /// Item 12. + /// Item 13. + /// Item 14. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// Type of Item 13. + /// Type of Item 14. + /// A new with 15 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain CreateAny(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default, T13 item13 = default, T14 item14 = default) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + where T11 : struct, IChainable + where T12 : struct, IChainable + where T13 : struct, IChainable + where T14 : struct, IChainable + => new(head, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13, item14); + + /// + /// Loads a new with 15 items from an existing unmanaged chain, + /// ignoring any errors. + /// + /// The unmanaged chain to use as the basis of this chain. + /// A new with 15 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Load(TChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + where T13 : struct, IExtendsChain + where T14 : struct, IExtendsChain + => LoadAny(out var _, chain); + + /// + /// Loads a new with 15 items from an existing unmanaged chain, + /// ignoring any errors. + /// + /// The unmanaged chain to use as the basis of this chain. + /// A new with 15 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain LoadAny(TChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + where T11 : struct, IChainable + where T12 : struct, IChainable + where T13 : struct, IChainable + where T14 : struct, IChainable + => LoadAny(out var _, chain); + + /// + /// Loads a new with 15 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + /// A new with 15 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Load(out string errors, TChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + where T13 : struct, IExtendsChain + where T14 : struct, IExtendsChain + => LoadAny(out errors, chain); + + /// + /// Loads a new with 15 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + /// A new with 15 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain LoadAny(out string errors, TChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + where T11 : struct, IChainable + where T12 : struct, IChainable + where T13 : struct, IChainable + where T14 : struct, IChainable + { + var size = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(size); + chain.StructureType(); + Marshal.StructureToPtr(chain, newHeadPtr, false); + var errorBuilder = new StringBuilder(); + var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); + var newPtr = (BaseInStructure*) newHeadPtr; + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + newPtr = newPtr->PNext; + + T1 item1 = default; + var expectedStructureType = item1.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 15"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 2; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item1 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item1, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + newPtr = newPtr->PNext; + + T2 item2 = default; + expectedStructureType = item2.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 15"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 3; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item2 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item2, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + newPtr = newPtr->PNext; + + T3 item3 = default; + expectedStructureType = item3.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 15"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 4; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item3 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item3, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + newPtr = newPtr->PNext; + + T4 item4 = default; + expectedStructureType = item4.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 15"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 5; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item4 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item4, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + newPtr = newPtr->PNext; + + T5 item5 = default; + expectedStructureType = item5.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 15"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 6; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item5 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item5, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item6Offset); + newPtr = newPtr->PNext; + + T6 item6 = default; + expectedStructureType = item6.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 15"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 7; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item6 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item6, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item7Offset); + newPtr = newPtr->PNext; + + T7 item7 = default; + expectedStructureType = item7.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 15"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 8; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item7 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item7, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item8Offset); + newPtr = newPtr->PNext; + + T8 item8 = default; + expectedStructureType = item8.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 15"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 9; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item8 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item8, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item9Offset); + newPtr = newPtr->PNext; + + T9 item9 = default; + expectedStructureType = item9.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 9, expected length 15"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 10; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item9 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item9, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item10Offset); + newPtr = newPtr->PNext; + + T10 item10 = default; + expectedStructureType = item10.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 10, expected length 15"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 11; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item10 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item10, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item11Offset); + newPtr = newPtr->PNext; + + T11 item11 = default; + expectedStructureType = item11.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 11, expected length 15"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 12; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item11 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item11, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item12Offset); + newPtr = newPtr->PNext; + + T12 item12 = default; + expectedStructureType = item12.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 12, expected length 15"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 13; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item12 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item12, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item13Offset); + newPtr = newPtr->PNext; + + T13 item13 = default; + expectedStructureType = item13.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 13, expected length 15"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 14; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item13 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item13, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item14Offset); + newPtr = newPtr->PNext; + + T14 item14 = default; + expectedStructureType = item14.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 14, expected length 15"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 15; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + if (existingPtr->PNext is not null) { + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 15"); + existingPtr->PNext = null; + } + item14 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item14, (nint) newPtr, false); + + // Create string of errors + errors = errorBuilder.ToString().Trim(); + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 16 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// Item 11. + /// Item 12. + /// Item 13. + /// Item 14. + /// Item 15. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// Type of Item 13. + /// Type of Item 14. + /// Type of Item 15. + /// A new with 16 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Create(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default, T13 item13 = default, T14 item14 = default, T15 item15 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + where T13 : struct, IExtendsChain + where T14 : struct, IExtendsChain + where T15 : struct, IExtendsChain + => new(head, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13, item14, item15); + + /// + /// Creates a new with 16 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// Item 11. + /// Item 12. + /// Item 13. + /// Item 14. + /// Item 15. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// Type of Item 13. + /// Type of Item 14. + /// Type of Item 15. + /// A new with 16 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain CreateAny(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default, T13 item13 = default, T14 item14 = default, T15 item15 = default) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + where T11 : struct, IChainable + where T12 : struct, IChainable + where T13 : struct, IChainable + where T14 : struct, IChainable + where T15 : struct, IChainable + => new(head, item1, item2, item3, item4, item5, item6, item7, item8, item9, item10, item11, item12, item13, item14, item15); + + /// + /// Loads a new with 16 items from an existing unmanaged chain, + /// ignoring any errors. + /// + /// The unmanaged chain to use as the basis of this chain. + /// A new with 16 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Load(TChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + where T13 : struct, IExtendsChain + where T14 : struct, IExtendsChain + where T15 : struct, IExtendsChain + => LoadAny(out var _, chain); + + /// + /// Loads a new with 16 items from an existing unmanaged chain, + /// ignoring any errors. + /// + /// The unmanaged chain to use as the basis of this chain. + /// A new with 16 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain LoadAny(TChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + where T11 : struct, IChainable + where T12 : struct, IChainable + where T13 : struct, IChainable + where T14 : struct, IChainable + where T15 : struct, IChainable + => LoadAny(out var _, chain); + + /// + /// Loads a new with 16 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + /// A new with 16 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Load(out string errors, TChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + where T13 : struct, IExtendsChain + where T14 : struct, IExtendsChain + where T15 : struct, IExtendsChain + => LoadAny(out errors, chain); + + /// + /// Loads a new with 16 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + /// A new with 16 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain LoadAny(out string errors, TChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + where T11 : struct, IChainable + where T12 : struct, IChainable + where T13 : struct, IChainable + where T14 : struct, IChainable + where T15 : struct, IChainable + { + var size = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(size); + chain.StructureType(); + Marshal.StructureToPtr(chain, newHeadPtr, false); + var errorBuilder = new StringBuilder(); + var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); + var newPtr = (BaseInStructure*) newHeadPtr; + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + newPtr = newPtr->PNext; + + T1 item1 = default; + var expectedStructureType = item1.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 16"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 2; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item1 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item1, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + newPtr = newPtr->PNext; + + T2 item2 = default; + expectedStructureType = item2.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 16"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 3; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item2 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item2, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + newPtr = newPtr->PNext; + + T3 item3 = default; + expectedStructureType = item3.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 16"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 4; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item3 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item3, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + newPtr = newPtr->PNext; + + T4 item4 = default; + expectedStructureType = item4.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 16"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 5; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item4 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item4, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + newPtr = newPtr->PNext; + + T5 item5 = default; + expectedStructureType = item5.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 16"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 6; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item5 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item5, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item6Offset); + newPtr = newPtr->PNext; + + T6 item6 = default; + expectedStructureType = item6.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 16"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 7; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item6 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item6, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item7Offset); + newPtr = newPtr->PNext; + + T7 item7 = default; + expectedStructureType = item7.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 16"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 8; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item7 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item7, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item8Offset); + newPtr = newPtr->PNext; + + T8 item8 = default; + expectedStructureType = item8.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 16"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 9; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item8 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item8, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item9Offset); + newPtr = newPtr->PNext; + + T9 item9 = default; + expectedStructureType = item9.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 9, expected length 16"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 10; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item9 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item9, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item10Offset); + newPtr = newPtr->PNext; + + T10 item10 = default; + expectedStructureType = item10.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 10, expected length 16"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 11; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item10 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item10, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item11Offset); + newPtr = newPtr->PNext; + + T11 item11 = default; + expectedStructureType = item11.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 11, expected length 16"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 12; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item11 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item11, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item12Offset); + newPtr = newPtr->PNext; + + T12 item12 = default; + expectedStructureType = item12.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 12, expected length 16"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 13; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item12 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item12, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item13Offset); + newPtr = newPtr->PNext; + + T13 item13 = default; + expectedStructureType = item13.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 13, expected length 16"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 14; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item13 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item13, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item14Offset); + newPtr = newPtr->PNext; + + T14 item14 = default; + expectedStructureType = item14.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 14, expected length 16"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 15; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + item14 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item14, (nint) newPtr, false); + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item15Offset); + newPtr = newPtr->PNext; + + T15 item15 = default; + expectedStructureType = item15.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 15, expected length 16"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 16; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + if (existingPtr->PNext is not null) { + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 16"); + existingPtr->PNext = null; + } + item15 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item15, (nint) newPtr, false); + + // Create string of errors + errors = errorBuilder.ToString().Trim(); + return new ManagedChain(newHeadPtr); + } + +} + +/// +/// Static class providing extension methods for manipulating managed chains. +/// +/// The `Any` versions of chain methods do not validate that items belong in the chain, this is +/// useful for situations where the specification does not indicate required chain constraints. You should generally +/// try to use the none `Any` version in preference. +public static unsafe class ManagedChainExtensions +{ + /// + /// Creates a new with 1 by copying the . + /// + /// The chain. + /// The chain type + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Duplicate(this ManagedChain chain) + where TChain : struct, IChainStart + => chain.DuplicateAny(); + + /// + /// Creates a new with 1 by copying the . + /// + /// The chain. + /// The chain type + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain DuplicateAny(this ManagedChain chain) + where TChain : struct, IChainable + { + var size = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(size); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, size, size); + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 2 items, by appending to + /// the end of the . + /// + /// The chain. + /// The item to append. + /// The chain type + /// Type of Item 1. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + public static ManagedChain Add(this ManagedChain chain, T1 item1 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + => chain.AddAny(item1); + + /// + /// Creates a new with 2 items, by appending to + /// the end of the . + /// + /// The chain. + /// The item to append. + /// The chain type + /// Type of Item 1. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + public static ManagedChain AddAny(this ManagedChain chain, T1 item1 = default) + where TChain : struct, IChainable + where T1 : struct, IChainable + { + var previousSize = ManagedChain.MemorySize; + var newSize = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, previousSize, previousSize); + + // Append item 0 + item1.StructureType(); + Marshal.StructureToPtr(item1, newHeadPtr + previousSize, false); + + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + previousSize))->PNext = null; + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 2 by copying the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Duplicate(this ManagedChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + => chain.DuplicateAny(); + + /// + /// Creates a new with 2 by copying the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain DuplicateAny(this ManagedChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + { + var size = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(size); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, size, size); + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 1 items, by removing the last item + /// from the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Truncate(this ManagedChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + => chain.TruncateAny(out var _); + + /// + /// Creates a new with 1 items, by removing the last item + /// from the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain TruncateAny(this ManagedChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + => chain.TruncateAny(out var _); + + /// + /// Creates a new with 1 items, by removing + /// from the end of the . + /// + /// The chain. + /// The item removed from the . + /// The chain type + /// Type of Item 1. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Truncate(this ManagedChain chain, out T1 item1) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + => chain.TruncateAny(out item1); + + /// + /// Creates a new with 1 items, by removing + /// from the end of the . + /// + /// The chain. + /// The item removed from the . + /// The chain type + /// Type of Item 1. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + /// + /// + public static ManagedChain TruncateAny(this ManagedChain chain, out T1 item1) + where TChain : struct, IChainable + where T1 : struct, IChainable + { + // Retrieve last item. + item1 = chain.Item1; + + var newSize = ManagedChain.MemorySize - ManagedChain.Item1Size; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, newSize, newSize); + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = null; + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 3 items, by appending to + /// the end of the . + /// + /// The chain. + /// The item to append. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + public static ManagedChain Add(this ManagedChain chain, T2 item2 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + => chain.AddAny(item2); + + /// + /// Creates a new with 3 items, by appending to + /// the end of the . + /// + /// The chain. + /// The item to append. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + public static ManagedChain AddAny(this ManagedChain chain, T2 item2 = default) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + { + var previousSize = ManagedChain.MemorySize; + var newSize = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, previousSize, previousSize); + + // Append item 1 + item2.StructureType(); + Marshal.StructureToPtr(item2, newHeadPtr + previousSize, false); + + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + ((BaseInStructure*)(newHeadPtr + previousSize))->PNext = null; + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 3 by copying the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Duplicate(this ManagedChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + => chain.DuplicateAny(); + + /// + /// Creates a new with 3 by copying the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain DuplicateAny(this ManagedChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + { + var size = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(size); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, size, size); + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 2 items, by removing the last item + /// from the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Truncate(this ManagedChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + => chain.TruncateAny(out var _); + + /// + /// Creates a new with 2 items, by removing the last item + /// from the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain TruncateAny(this ManagedChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + => chain.TruncateAny(out var _); + + /// + /// Creates a new with 2 items, by removing + /// from the end of the . + /// + /// The chain. + /// The item removed from the . + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Truncate(this ManagedChain chain, out T2 item2) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + => chain.TruncateAny(out item2); + + /// + /// Creates a new with 2 items, by removing + /// from the end of the . + /// + /// The chain. + /// The item removed from the . + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + /// + /// + public static ManagedChain TruncateAny(this ManagedChain chain, out T2 item2) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + { + // Retrieve last item. + item2 = chain.Item2; + + var newSize = ManagedChain.MemorySize - ManagedChain.Item2Size; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, newSize, newSize); + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item1Offset))->PNext = null; + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 4 items, by appending to + /// the end of the . + /// + /// The chain. + /// The item to append. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + public static ManagedChain Add(this ManagedChain chain, T3 item3 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + => chain.AddAny(item3); + + /// + /// Creates a new with 4 items, by appending to + /// the end of the . + /// + /// The chain. + /// The item to append. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + public static ManagedChain AddAny(this ManagedChain chain, T3 item3 = default) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + { + var previousSize = ManagedChain.MemorySize; + var newSize = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, previousSize, previousSize); + + // Append item 2 + item3.StructureType(); + Marshal.StructureToPtr(item3, newHeadPtr + previousSize, false); + + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + ((BaseInStructure*)(newHeadPtr + previousSize))->PNext = null; + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 4 by copying the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Duplicate(this ManagedChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + => chain.DuplicateAny(); + + /// + /// Creates a new with 4 by copying the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain DuplicateAny(this ManagedChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + { + var size = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(size); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, size, size); + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 3 items, by removing the last item + /// from the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Truncate(this ManagedChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + => chain.TruncateAny(out var _); + + /// + /// Creates a new with 3 items, by removing the last item + /// from the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain TruncateAny(this ManagedChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + => chain.TruncateAny(out var _); + + /// + /// Creates a new with 3 items, by removing + /// from the end of the . + /// + /// The chain. + /// The item removed from the . + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Truncate(this ManagedChain chain, out T3 item3) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + => chain.TruncateAny(out item3); + + /// + /// Creates a new with 3 items, by removing + /// from the end of the . + /// + /// The chain. + /// The item removed from the . + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + /// + /// + public static ManagedChain TruncateAny(this ManagedChain chain, out T3 item3) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + { + // Retrieve last item. + item3 = chain.Item3; + + var newSize = ManagedChain.MemorySize - ManagedChain.Item3Size; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, newSize, newSize); + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item2Offset))->PNext = null; + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 5 items, by appending to + /// the end of the . + /// + /// The chain. + /// The item to append. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + public static ManagedChain Add(this ManagedChain chain, T4 item4 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + => chain.AddAny(item4); + + /// + /// Creates a new with 5 items, by appending to + /// the end of the . + /// + /// The chain. + /// The item to append. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + public static ManagedChain AddAny(this ManagedChain chain, T4 item4 = default) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + { + var previousSize = ManagedChain.MemorySize; + var newSize = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, previousSize, previousSize); + + // Append item 3 + item4.StructureType(); + Marshal.StructureToPtr(item4, newHeadPtr + previousSize, false); + + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + ((BaseInStructure*)(newHeadPtr + previousSize))->PNext = null; + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 5 by copying the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Duplicate(this ManagedChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + => chain.DuplicateAny(); + + /// + /// Creates a new with 5 by copying the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain DuplicateAny(this ManagedChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + { + var size = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(size); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, size, size); + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 4 items, by removing the last item + /// from the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Truncate(this ManagedChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + => chain.TruncateAny(out var _); + + /// + /// Creates a new with 4 items, by removing the last item + /// from the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain TruncateAny(this ManagedChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + => chain.TruncateAny(out var _); + + /// + /// Creates a new with 4 items, by removing + /// from the end of the . + /// + /// The chain. + /// The item removed from the . + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Truncate(this ManagedChain chain, out T4 item4) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + => chain.TruncateAny(out item4); + + /// + /// Creates a new with 4 items, by removing + /// from the end of the . + /// + /// The chain. + /// The item removed from the . + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + /// + /// + public static ManagedChain TruncateAny(this ManagedChain chain, out T4 item4) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + { + // Retrieve last item. + item4 = chain.Item4; + + var newSize = ManagedChain.MemorySize - ManagedChain.Item4Size; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, newSize, newSize); + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item3Offset))->PNext = null; + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 6 items, by appending to + /// the end of the . + /// + /// The chain. + /// The item to append. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + public static ManagedChain Add(this ManagedChain chain, T5 item5 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + => chain.AddAny(item5); + + /// + /// Creates a new with 6 items, by appending to + /// the end of the . + /// + /// The chain. + /// The item to append. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + public static ManagedChain AddAny(this ManagedChain chain, T5 item5 = default) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + { + var previousSize = ManagedChain.MemorySize; + var newSize = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, previousSize, previousSize); + + // Append item 4 + item5.StructureType(); + Marshal.StructureToPtr(item5, newHeadPtr + previousSize, false); + + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + ((BaseInStructure*)(newHeadPtr + previousSize))->PNext = null; + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 6 by copying the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Duplicate(this ManagedChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + => chain.DuplicateAny(); + + /// + /// Creates a new with 6 by copying the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain DuplicateAny(this ManagedChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + { + var size = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(size); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, size, size); + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 5 items, by removing the last item + /// from the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Truncate(this ManagedChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + => chain.TruncateAny(out var _); + + /// + /// Creates a new with 5 items, by removing the last item + /// from the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain TruncateAny(this ManagedChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + => chain.TruncateAny(out var _); + + /// + /// Creates a new with 5 items, by removing + /// from the end of the . + /// + /// The chain. + /// The item removed from the . + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Truncate(this ManagedChain chain, out T5 item5) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + => chain.TruncateAny(out item5); + + /// + /// Creates a new with 5 items, by removing + /// from the end of the . + /// + /// The chain. + /// The item removed from the . + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + /// + /// + public static ManagedChain TruncateAny(this ManagedChain chain, out T5 item5) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + { + // Retrieve last item. + item5 = chain.Item5; + + var newSize = ManagedChain.MemorySize - ManagedChain.Item5Size; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, newSize, newSize); + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item4Offset))->PNext = null; + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 7 items, by appending to + /// the end of the . + /// + /// The chain. + /// The item to append. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + public static ManagedChain Add(this ManagedChain chain, T6 item6 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + => chain.AddAny(item6); + + /// + /// Creates a new with 7 items, by appending to + /// the end of the . + /// + /// The chain. + /// The item to append. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + public static ManagedChain AddAny(this ManagedChain chain, T6 item6 = default) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + { + var previousSize = ManagedChain.MemorySize; + var newSize = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, previousSize, previousSize); + + // Append item 5 + item6.StructureType(); + Marshal.StructureToPtr(item6, newHeadPtr + previousSize, false); + + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item6Offset); + ((BaseInStructure*)(newHeadPtr + previousSize))->PNext = null; + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 7 by copying the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Duplicate(this ManagedChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + => chain.DuplicateAny(); + + /// + /// Creates a new with 7 by copying the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain DuplicateAny(this ManagedChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + { + var size = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(size); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, size, size); + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item6Offset); + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 6 items, by removing the last item + /// from the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Truncate(this ManagedChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + => chain.TruncateAny(out var _); + + /// + /// Creates a new with 6 items, by removing the last item + /// from the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain TruncateAny(this ManagedChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + => chain.TruncateAny(out var _); + + /// + /// Creates a new with 6 items, by removing + /// from the end of the . + /// + /// The chain. + /// The item removed from the . + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Truncate(this ManagedChain chain, out T6 item6) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + => chain.TruncateAny(out item6); + + /// + /// Creates a new with 6 items, by removing + /// from the end of the . + /// + /// The chain. + /// The item removed from the . + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + /// + /// + public static ManagedChain TruncateAny(this ManagedChain chain, out T6 item6) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + { + // Retrieve last item. + item6 = chain.Item6; + + var newSize = ManagedChain.MemorySize - ManagedChain.Item6Size; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, newSize, newSize); + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item5Offset))->PNext = null; + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 8 items, by appending to + /// the end of the . + /// + /// The chain. + /// The item to append. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + public static ManagedChain Add(this ManagedChain chain, T7 item7 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + => chain.AddAny(item7); + + /// + /// Creates a new with 8 items, by appending to + /// the end of the . + /// + /// The chain. + /// The item to append. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + public static ManagedChain AddAny(this ManagedChain chain, T7 item7 = default) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + { + var previousSize = ManagedChain.MemorySize; + var newSize = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, previousSize, previousSize); + + // Append item 6 + item7.StructureType(); + Marshal.StructureToPtr(item7, newHeadPtr + previousSize, false); + + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item6Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item7Offset); + ((BaseInStructure*)(newHeadPtr + previousSize))->PNext = null; + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 8 by copying the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Duplicate(this ManagedChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + => chain.DuplicateAny(); + + /// + /// Creates a new with 8 by copying the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain DuplicateAny(this ManagedChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + { + var size = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(size); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, size, size); + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item6Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item7Offset); + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 7 items, by removing the last item + /// from the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Truncate(this ManagedChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + => chain.TruncateAny(out var _); + + /// + /// Creates a new with 7 items, by removing the last item + /// from the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain TruncateAny(this ManagedChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + => chain.TruncateAny(out var _); + + /// + /// Creates a new with 7 items, by removing + /// from the end of the . + /// + /// The chain. + /// The item removed from the . + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Truncate(this ManagedChain chain, out T7 item7) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + => chain.TruncateAny(out item7); + + /// + /// Creates a new with 7 items, by removing + /// from the end of the . + /// + /// The chain. + /// The item removed from the . + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + /// + /// + public static ManagedChain TruncateAny(this ManagedChain chain, out T7 item7) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + { + // Retrieve last item. + item7 = chain.Item7; + + var newSize = ManagedChain.MemorySize - ManagedChain.Item7Size; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, newSize, newSize); + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item6Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item6Offset))->PNext = null; + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 9 items, by appending to + /// the end of the . + /// + /// The chain. + /// The item to append. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + public static ManagedChain Add(this ManagedChain chain, T8 item8 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + => chain.AddAny(item8); + + /// + /// Creates a new with 9 items, by appending to + /// the end of the . + /// + /// The chain. + /// The item to append. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + public static ManagedChain AddAny(this ManagedChain chain, T8 item8 = default) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + { + var previousSize = ManagedChain.MemorySize; + var newSize = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, previousSize, previousSize); + + // Append item 7 + item8.StructureType(); + Marshal.StructureToPtr(item8, newHeadPtr + previousSize, false); + + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item6Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item7Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item8Offset); + ((BaseInStructure*)(newHeadPtr + previousSize))->PNext = null; + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 9 by copying the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Duplicate(this ManagedChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + => chain.DuplicateAny(); + + /// + /// Creates a new with 9 by copying the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain DuplicateAny(this ManagedChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + { + var size = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(size); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, size, size); + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item6Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item7Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item8Offset); + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 8 items, by removing the last item + /// from the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Truncate(this ManagedChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + => chain.TruncateAny(out var _); + + /// + /// Creates a new with 8 items, by removing the last item + /// from the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain TruncateAny(this ManagedChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + => chain.TruncateAny(out var _); + + /// + /// Creates a new with 8 items, by removing + /// from the end of the . + /// + /// The chain. + /// The item removed from the . + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Truncate(this ManagedChain chain, out T8 item8) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + => chain.TruncateAny(out item8); + + /// + /// Creates a new with 8 items, by removing + /// from the end of the . + /// + /// The chain. + /// The item removed from the . + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + /// + /// + public static ManagedChain TruncateAny(this ManagedChain chain, out T8 item8) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + { + // Retrieve last item. + item8 = chain.Item8; + + var newSize = ManagedChain.MemorySize - ManagedChain.Item8Size; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, newSize, newSize); + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item6Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item7Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item7Offset))->PNext = null; + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 10 items, by appending to + /// the end of the . + /// + /// The chain. + /// The item to append. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + public static ManagedChain Add(this ManagedChain chain, T9 item9 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + => chain.AddAny(item9); + + /// + /// Creates a new with 10 items, by appending to + /// the end of the . + /// + /// The chain. + /// The item to append. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + public static ManagedChain AddAny(this ManagedChain chain, T9 item9 = default) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + { + var previousSize = ManagedChain.MemorySize; + var newSize = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, previousSize, previousSize); + + // Append item 8 + item9.StructureType(); + Marshal.StructureToPtr(item9, newHeadPtr + previousSize, false); + + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item6Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item7Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item8Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item9Offset); + ((BaseInStructure*)(newHeadPtr + previousSize))->PNext = null; + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 10 by copying the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Duplicate(this ManagedChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + => chain.DuplicateAny(); + + /// + /// Creates a new with 10 by copying the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain DuplicateAny(this ManagedChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + { + var size = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(size); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, size, size); + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item6Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item7Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item8Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item9Offset); + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 9 items, by removing the last item + /// from the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Truncate(this ManagedChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + => chain.TruncateAny(out var _); + + /// + /// Creates a new with 9 items, by removing the last item + /// from the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain TruncateAny(this ManagedChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + => chain.TruncateAny(out var _); + + /// + /// Creates a new with 9 items, by removing + /// from the end of the . + /// + /// The chain. + /// The item removed from the . + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Truncate(this ManagedChain chain, out T9 item9) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + => chain.TruncateAny(out item9); + + /// + /// Creates a new with 9 items, by removing + /// from the end of the . + /// + /// The chain. + /// The item removed from the . + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + /// + /// + public static ManagedChain TruncateAny(this ManagedChain chain, out T9 item9) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + { + // Retrieve last item. + item9 = chain.Item9; + + var newSize = ManagedChain.MemorySize - ManagedChain.Item9Size; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, newSize, newSize); + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item6Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item7Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item8Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item8Offset))->PNext = null; + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 11 items, by appending to + /// the end of the . + /// + /// The chain. + /// The item to append. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + public static ManagedChain Add(this ManagedChain chain, T10 item10 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + => chain.AddAny(item10); + + /// + /// Creates a new with 11 items, by appending to + /// the end of the . + /// + /// The chain. + /// The item to append. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + public static ManagedChain AddAny(this ManagedChain chain, T10 item10 = default) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + { + var previousSize = ManagedChain.MemorySize; + var newSize = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, previousSize, previousSize); + + // Append item 9 + item10.StructureType(); + Marshal.StructureToPtr(item10, newHeadPtr + previousSize, false); + + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item6Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item7Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item8Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item9Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item9Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item10Offset); + ((BaseInStructure*)(newHeadPtr + previousSize))->PNext = null; + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 11 by copying the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Duplicate(this ManagedChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + => chain.DuplicateAny(); + + /// + /// Creates a new with 11 by copying the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain DuplicateAny(this ManagedChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + { + var size = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(size); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, size, size); + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item6Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item7Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item8Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item9Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item9Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item10Offset); + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 10 items, by removing the last item + /// from the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Truncate(this ManagedChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + => chain.TruncateAny(out var _); + + /// + /// Creates a new with 10 items, by removing the last item + /// from the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain TruncateAny(this ManagedChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + => chain.TruncateAny(out var _); + + /// + /// Creates a new with 10 items, by removing + /// from the end of the . + /// + /// The chain. + /// The item removed from the . + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Truncate(this ManagedChain chain, out T10 item10) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + => chain.TruncateAny(out item10); + + /// + /// Creates a new with 10 items, by removing + /// from the end of the . + /// + /// The chain. + /// The item removed from the . + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + /// + /// + public static ManagedChain TruncateAny(this ManagedChain chain, out T10 item10) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + { + // Retrieve last item. + item10 = chain.Item10; + + var newSize = ManagedChain.MemorySize - ManagedChain.Item10Size; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, newSize, newSize); + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item6Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item7Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item8Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item9Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item9Offset))->PNext = null; + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 12 items, by appending to + /// the end of the . + /// + /// The chain. + /// The item to append. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + public static ManagedChain Add(this ManagedChain chain, T11 item11 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + => chain.AddAny(item11); + + /// + /// Creates a new with 12 items, by appending to + /// the end of the . + /// + /// The chain. + /// The item to append. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + public static ManagedChain AddAny(this ManagedChain chain, T11 item11 = default) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + where T11 : struct, IChainable + { + var previousSize = ManagedChain.MemorySize; + var newSize = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, previousSize, previousSize); + + // Append item 10 + item11.StructureType(); + Marshal.StructureToPtr(item11, newHeadPtr + previousSize, false); + + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item6Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item7Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item8Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item9Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item9Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item10Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item10Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item11Offset); + ((BaseInStructure*)(newHeadPtr + previousSize))->PNext = null; + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 12 by copying the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Duplicate(this ManagedChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + => chain.DuplicateAny(); + + /// + /// Creates a new with 12 by copying the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain DuplicateAny(this ManagedChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + where T11 : struct, IChainable + { + var size = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(size); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, size, size); + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item6Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item7Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item8Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item9Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item9Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item10Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item10Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item11Offset); + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 11 items, by removing the last item + /// from the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Truncate(this ManagedChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + => chain.TruncateAny(out var _); + + /// + /// Creates a new with 11 items, by removing the last item + /// from the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain TruncateAny(this ManagedChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + where T11 : struct, IChainable + => chain.TruncateAny(out var _); + + /// + /// Creates a new with 11 items, by removing + /// from the end of the . + /// + /// The chain. + /// The item removed from the . + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Truncate(this ManagedChain chain, out T11 item11) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + => chain.TruncateAny(out item11); + + /// + /// Creates a new with 11 items, by removing + /// from the end of the . + /// + /// The chain. + /// The item removed from the . + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + /// + /// + public static ManagedChain TruncateAny(this ManagedChain chain, out T11 item11) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + where T11 : struct, IChainable + { + // Retrieve last item. + item11 = chain.Item11; + + var newSize = ManagedChain.MemorySize - ManagedChain.Item11Size; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, newSize, newSize); + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item6Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item7Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item8Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item9Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item9Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item10Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item10Offset))->PNext = null; + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 13 items, by appending to + /// the end of the . + /// + /// The chain. + /// The item to append. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + public static ManagedChain Add(this ManagedChain chain, T12 item12 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + => chain.AddAny(item12); + + /// + /// Creates a new with 13 items, by appending to + /// the end of the . + /// + /// The chain. + /// The item to append. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + public static ManagedChain AddAny(this ManagedChain chain, T12 item12 = default) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + where T11 : struct, IChainable + where T12 : struct, IChainable + { + var previousSize = ManagedChain.MemorySize; + var newSize = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, previousSize, previousSize); + + // Append item 11 + item12.StructureType(); + Marshal.StructureToPtr(item12, newHeadPtr + previousSize, false); + + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item6Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item7Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item8Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item9Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item9Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item10Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item10Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item11Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item11Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item12Offset); + ((BaseInStructure*)(newHeadPtr + previousSize))->PNext = null; + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 13 by copying the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Duplicate(this ManagedChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + => chain.DuplicateAny(); + + /// + /// Creates a new with 13 by copying the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain DuplicateAny(this ManagedChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + where T11 : struct, IChainable + where T12 : struct, IChainable + { + var size = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(size); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, size, size); + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item6Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item7Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item8Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item9Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item9Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item10Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item10Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item11Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item11Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item12Offset); + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 12 items, by removing the last item + /// from the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Truncate(this ManagedChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + => chain.TruncateAny(out var _); + + /// + /// Creates a new with 12 items, by removing the last item + /// from the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain TruncateAny(this ManagedChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + where T11 : struct, IChainable + where T12 : struct, IChainable + => chain.TruncateAny(out var _); + + /// + /// Creates a new with 12 items, by removing + /// from the end of the . + /// + /// The chain. + /// The item removed from the . + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Truncate(this ManagedChain chain, out T12 item12) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + => chain.TruncateAny(out item12); + + /// + /// Creates a new with 12 items, by removing + /// from the end of the . + /// + /// The chain. + /// The item removed from the . + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + /// + /// + public static ManagedChain TruncateAny(this ManagedChain chain, out T12 item12) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + where T11 : struct, IChainable + where T12 : struct, IChainable + { + // Retrieve last item. + item12 = chain.Item12; + + var newSize = ManagedChain.MemorySize - ManagedChain.Item12Size; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, newSize, newSize); + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item6Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item7Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item8Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item9Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item9Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item10Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item10Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item11Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item11Offset))->PNext = null; + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 14 items, by appending to + /// the end of the . + /// + /// The chain. + /// The item to append. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// Type of Item 13. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + public static ManagedChain Add(this ManagedChain chain, T13 item13 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + where T13 : struct, IExtendsChain + => chain.AddAny(item13); + + /// + /// Creates a new with 14 items, by appending to + /// the end of the . + /// + /// The chain. + /// The item to append. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// Type of Item 13. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + public static ManagedChain AddAny(this ManagedChain chain, T13 item13 = default) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + where T11 : struct, IChainable + where T12 : struct, IChainable + where T13 : struct, IChainable + { + var previousSize = ManagedChain.MemorySize; + var newSize = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, previousSize, previousSize); + + // Append item 12 + item13.StructureType(); + Marshal.StructureToPtr(item13, newHeadPtr + previousSize, false); + + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item6Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item7Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item8Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item9Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item9Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item10Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item10Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item11Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item11Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item12Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item12Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item13Offset); + ((BaseInStructure*)(newHeadPtr + previousSize))->PNext = null; + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 14 by copying the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// Type of Item 13. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Duplicate(this ManagedChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + where T13 : struct, IExtendsChain + => chain.DuplicateAny(); + + /// + /// Creates a new with 14 by copying the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// Type of Item 13. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain DuplicateAny(this ManagedChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + where T11 : struct, IChainable + where T12 : struct, IChainable + where T13 : struct, IChainable + { + var size = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(size); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, size, size); + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item6Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item7Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item8Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item9Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item9Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item10Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item10Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item11Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item11Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item12Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item12Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item13Offset); + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 13 items, by removing the last item + /// from the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// Type of Item 13. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Truncate(this ManagedChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + where T13 : struct, IExtendsChain + => chain.TruncateAny(out var _); + + /// + /// Creates a new with 13 items, by removing the last item + /// from the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// Type of Item 13. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain TruncateAny(this ManagedChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + where T11 : struct, IChainable + where T12 : struct, IChainable + where T13 : struct, IChainable + => chain.TruncateAny(out var _); + + /// + /// Creates a new with 13 items, by removing + /// from the end of the . + /// + /// The chain. + /// The item removed from the . + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// Type of Item 13. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Truncate(this ManagedChain chain, out T13 item13) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + where T13 : struct, IExtendsChain + => chain.TruncateAny(out item13); + + /// + /// Creates a new with 13 items, by removing + /// from the end of the . + /// + /// The chain. + /// The item removed from the . + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// Type of Item 13. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + /// + /// + public static ManagedChain TruncateAny(this ManagedChain chain, out T13 item13) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + where T11 : struct, IChainable + where T12 : struct, IChainable + where T13 : struct, IChainable + { + // Retrieve last item. + item13 = chain.Item13; + + var newSize = ManagedChain.MemorySize - ManagedChain.Item13Size; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, newSize, newSize); + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item6Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item7Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item8Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item9Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item9Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item10Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item10Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item11Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item11Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item12Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item12Offset))->PNext = null; + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 15 items, by appending to + /// the end of the . + /// + /// The chain. + /// The item to append. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// Type of Item 13. + /// Type of Item 14. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + public static ManagedChain Add(this ManagedChain chain, T14 item14 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + where T13 : struct, IExtendsChain + where T14 : struct, IExtendsChain + => chain.AddAny(item14); + + /// + /// Creates a new with 15 items, by appending to + /// the end of the . + /// + /// The chain. + /// The item to append. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// Type of Item 13. + /// Type of Item 14. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + public static ManagedChain AddAny(this ManagedChain chain, T14 item14 = default) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + where T11 : struct, IChainable + where T12 : struct, IChainable + where T13 : struct, IChainable + where T14 : struct, IChainable + { + var previousSize = ManagedChain.MemorySize; + var newSize = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, previousSize, previousSize); + + // Append item 13 + item14.StructureType(); + Marshal.StructureToPtr(item14, newHeadPtr + previousSize, false); + + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item6Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item7Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item8Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item9Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item9Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item10Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item10Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item11Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item11Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item12Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item12Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item13Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item13Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item14Offset); + ((BaseInStructure*)(newHeadPtr + previousSize))->PNext = null; + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 15 by copying the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// Type of Item 13. + /// Type of Item 14. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Duplicate(this ManagedChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + where T13 : struct, IExtendsChain + where T14 : struct, IExtendsChain + => chain.DuplicateAny(); + + /// + /// Creates a new with 15 by copying the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// Type of Item 13. + /// Type of Item 14. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain DuplicateAny(this ManagedChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + where T11 : struct, IChainable + where T12 : struct, IChainable + where T13 : struct, IChainable + where T14 : struct, IChainable + { + var size = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(size); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, size, size); + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item6Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item7Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item8Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item9Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item9Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item10Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item10Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item11Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item11Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item12Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item12Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item13Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item13Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item14Offset); + return new ManagedChain(newHeadPtr); + } + + /// + /// Creates a new with 14 items, by removing the last item + /// from the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// Type of Item 13. + /// Type of Item 14. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Truncate(this ManagedChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + where T13 : struct, IExtendsChain + where T14 : struct, IExtendsChain + => chain.TruncateAny(out var _); + + /// + /// Creates a new with 14 items, by removing the last item + /// from the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// Type of Item 13. + /// Type of Item 14. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain TruncateAny(this ManagedChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + where T11 : struct, IChainable + where T12 : struct, IChainable + where T13 : struct, IChainable + where T14 : struct, IChainable + => chain.TruncateAny(out var _); + + /// + /// Creates a new with 14 items, by removing + /// from the end of the . + /// + /// The chain. + /// The item removed from the . + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// Type of Item 13. + /// Type of Item 14. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Truncate(this ManagedChain chain, out T14 item14) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + where T13 : struct, IExtendsChain + where T14 : struct, IExtendsChain + => chain.TruncateAny(out item14); + + /// + /// Creates a new with 14 items, by removing + /// from the end of the . /// + /// The chain. + /// The item removed from the . + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// Type of Item 13. + /// Type of Item 14. /// - /// Do not forget to dispose this chain if you are no longer using it. + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. /// - public ManagedChain Duplicate() - { - var newHeadPtr = Marshal.AllocHGlobal(MemorySize); + /// + /// + /// + public static ManagedChain TruncateAny(this ManagedChain chain, out T14 item14) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + where T11 : struct, IChainable + where T12 : struct, IChainable + where T13 : struct, IChainable + where T14 : struct, IChainable + { + // Retrieve last item. + item14 = chain.Item14; + + var newSize = ManagedChain.MemorySize - ManagedChain.Item14Size; + var newHeadPtr = Marshal.AllocHGlobal(newSize); // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, newSize, newSize); // Update all pointers - ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); - ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); - ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); - ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); - return new ManagedChain(newHeadPtr); + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item6Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item7Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item8Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item9Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item9Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item10Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item10Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item11Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item11Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item12Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item12Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item13Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item13Offset))->PNext = null; + return new ManagedChain(newHeadPtr); } /// - /// Creates a new with 5 items, by appending - /// to the end of this chain. + /// Creates a new with 16 items, by appending to + /// the end of the . /// - /// The chain to append to. - /// Item 4. + /// The chain. + /// The item to append. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// Type of Item 13. + /// Type of Item 14. + /// Type of Item 15. /// - /// Do not forget to dispose the chain if you are no longer using it. + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. /// - public ManagedChain(ManagedChain previous, T4 item4 = default) - : this(Marshal.AllocHGlobal(MemorySize)) - { - var previousSize = MemorySize - Item4Size; + /// + public static ManagedChain Add(this ManagedChain chain, T15 item15 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + where T13 : struct, IExtendsChain + where T14 : struct, IExtendsChain + where T15 : struct, IExtendsChain + => chain.AddAny(item15); + + /// + /// Creates a new with 16 items, by appending to + /// the end of the . + /// + /// The chain. + /// The item to append. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// Type of Item 13. + /// Type of Item 14. + /// Type of Item 15. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + public static ManagedChain AddAny(this ManagedChain chain, T15 item15 = default) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + where T11 : struct, IChainable + where T12 : struct, IChainable + where T13 : struct, IChainable + where T14 : struct, IChainable + where T15 : struct, IChainable + { + var previousSize = ManagedChain.MemorySize; + var newSize = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(newSize); // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, previousSize, previousSize); - // Append item 4 - item4.StructureType(); - Marshal.StructureToPtr(item4, _headPtr + previousSize, false); + // Append item 14 + item15.StructureType(); + Marshal.StructureToPtr(item15, newHeadPtr + previousSize, false); // Update all pointers - ((BaseInStructure*)_headPtr)->PNext = (BaseInStructure*) (_headPtr + Item1Offset); - ((BaseInStructure*)(_headPtr + Item1Offset))->PNext = (BaseInStructure*) (_headPtr + Item2Offset); - ((BaseInStructure*)(_headPtr + Item2Offset))->PNext = (BaseInStructure*) (_headPtr + Item3Offset); - ((BaseInStructure*)(_headPtr + Item3Offset))->PNext = (BaseInStructure*) (_headPtr + Item4Offset); - ((BaseInStructure*)(_headPtr + previousSize))->PNext = null; + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item6Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item7Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item8Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item9Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item9Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item10Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item10Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item11Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item11Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item12Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item12Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item13Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item13Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item14Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item14Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item15Offset); + ((BaseInStructure*)(newHeadPtr + previousSize))->PNext = null; + return new ManagedChain(newHeadPtr); } /// - /// Creates a new with 4 items, by removing the last item - /// from this chain. + /// Creates a new with 16 by copying the . /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// Type of Item 13. + /// Type of Item 14. + /// Type of Item 15. /// /// Do not forget to dispose this chain if you are no longer using it. /// - public ManagedChain Truncate() - { - return Truncate(out var _); + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Duplicate(this ManagedChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + where T13 : struct, IExtendsChain + where T14 : struct, IExtendsChain + where T15 : struct, IExtendsChain + => chain.DuplicateAny(); + + /// + /// Creates a new with 16 by copying the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// Type of Item 13. + /// Type of Item 14. + /// Type of Item 15. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain DuplicateAny(this ManagedChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + where T11 : struct, IChainable + where T12 : struct, IChainable + where T13 : struct, IChainable + where T14 : struct, IChainable + where T15 : struct, IChainable + { + var size = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(size); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, size, size); + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item6Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item7Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item8Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item9Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item9Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item10Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item10Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item11Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item11Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item12Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item12Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item13Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item13Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item14Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item14Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item15Offset); + return new ManagedChain(newHeadPtr); } /// - /// Creates a new with 4 items, by removing - /// from the end of this chain. + /// Creates a new with 15 items, by removing the last item + /// from the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// Type of Item 13. + /// Type of Item 14. + /// Type of Item 15. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Truncate(this ManagedChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + where T13 : struct, IExtendsChain + where T14 : struct, IExtendsChain + where T15 : struct, IExtendsChain + => chain.TruncateAny(out var _); + + /// + /// Creates a new with 15 items, by removing the last item + /// from the . /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// Type of Item 13. + /// Type of Item 14. + /// Type of Item 15. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain TruncateAny(this ManagedChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + where T11 : struct, IChainable + where T12 : struct, IChainable + where T13 : struct, IChainable + where T14 : struct, IChainable + where T15 : struct, IChainable + => chain.TruncateAny(out var _); + + /// + /// Creates a new with 15 items, by removing + /// from the end of the . + /// + /// The chain. + /// The item removed from the . + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// Type of Item 13. + /// Type of Item 14. + /// Type of Item 15. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Truncate(this ManagedChain chain, out T15 item15) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + where T2 : struct, IExtendsChain + where T3 : struct, IExtendsChain + where T4 : struct, IExtendsChain + where T5 : struct, IExtendsChain + where T6 : struct, IExtendsChain + where T7 : struct, IExtendsChain + where T8 : struct, IExtendsChain + where T9 : struct, IExtendsChain + where T10 : struct, IExtendsChain + where T11 : struct, IExtendsChain + where T12 : struct, IExtendsChain + where T13 : struct, IExtendsChain + where T14 : struct, IExtendsChain + where T15 : struct, IExtendsChain + => chain.TruncateAny(out item15); + + /// + /// Creates a new with 15 items, by removing + /// from the end of the . + /// + /// The chain. + /// The item removed from the . + /// The chain type + /// Type of Item 1. + /// Type of Item 2. + /// Type of Item 3. + /// Type of Item 4. + /// Type of Item 5. + /// Type of Item 6. + /// Type of Item 7. + /// Type of Item 8. + /// Type of Item 9. + /// Type of Item 10. + /// Type of Item 11. + /// Type of Item 12. + /// Type of Item 13. + /// Type of Item 14. + /// Type of Item 15. /// - /// Do not forget to dispose this chain if you are no longer using it. + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. /// - public ManagedChain Truncate(out T4 item4) - { - item4 = Item4; - - var newSize = MemorySize - Item4Size; + /// + /// + /// + public static ManagedChain TruncateAny(this ManagedChain chain, out T15 item15) + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + where T11 : struct, IChainable + where T12 : struct, IChainable + where T13 : struct, IChainable + where T14 : struct, IChainable + where T15 : struct, IChainable + { + // Retrieve last item. + item15 = chain.Item15; + + var newSize = ManagedChain.MemorySize - ManagedChain.Item15Size; var newHeadPtr = Marshal.AllocHGlobal(newSize); // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, newSize, newSize); // Update all pointers - ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); - ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); - ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); - ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = null; - return new ManagedChain(newHeadPtr); - } - - /// - /// Creates a new with 6 items, by appending to - /// the end of this chain. - /// - /// Item 5. - /// Type of Item 5 - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Append(T5 item5 = default) - where T5: struct, IExtendsChain - { - return new ManagedChain(this, item5); - } - - /// - public override IEnumerator GetEnumerator() - { - yield return Head; - yield return Item1; - yield return Item2; - yield return Item3; - yield return Item4; + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item2Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item3Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item4Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item5Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item6Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item7Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item8Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item9Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item9Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item10Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item10Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item11Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item11Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item12Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item12Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item13Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item13Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item14Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain.Item14Offset))->PNext = null; + return new ManagedChain(newHeadPtr); } - /// - public override int Count => 5; - - /// - public override IChainable this[int index] - => index switch - { - 0 => Head, - 1 => Item1, - 2 => Item2, - 3 => Item3, - 4 => Item4, - _ => throw new IndexOutOfRangeException() - }; - - /// - /// Deconstructs this chain. - /// - /// The head of the chain. - /// Item 1. - /// Item 2. - /// Item 3. - /// Item 4. - public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item3, out T4 item4) - { - head = Head; - item1 = Item1; - item2 = Item2; - item3 = Item3; - item4 = Item4; - } - - /// - public override void Dispose() - { - var headPtr = Interlocked.Exchange(ref _headPtr, (nint)0); - if (headPtr == (nint)0) { - return; - } - - // Destroy all structures - Marshal.DestroyStructure(headPtr); - Marshal.DestroyStructure(headPtr + Item1Offset); - Marshal.DestroyStructure(headPtr + Item2Offset); - Marshal.DestroyStructure(headPtr + Item3Offset); - Marshal.DestroyStructure(headPtr + Item4Offset); - - // Free memory block - Marshal.FreeHGlobal(headPtr); - } } /// -/// A safely manages the pointers of a managed structure chain. +/// A safely manages the pointers of a managed structure chain. /// /// The chain type -/// Type of Item 1. -/// Type of Item 2. -/// Type of Item 3. -/// Type of Item 4. -/// Type of Item 5. -public unsafe class ManagedChain : ManagedChain - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain +public unsafe sealed class ManagedChain : ManagedChain, IEquatable> + where TChain : struct, IChainable { /// - /// Gets the size (in bytes) of the head structure. - /// - public static readonly int HeadSize = Marshal.SizeOf(); - - /// - /// Gets the offset to the start of . - /// - public static readonly int Item1Offset = HeadSize; - - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item1Size = Marshal.SizeOf(); - - /// - /// Gets the offset to the start of . - /// - public static readonly int Item2Offset = Item1Offset + Item1Size; - - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item2Size = Marshal.SizeOf(); - - /// - /// Gets the offset to the start of . - /// - public static readonly int Item3Offset = Item2Offset + Item2Size; - - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item3Size = Marshal.SizeOf(); - - /// - /// Gets the offset to the start of . - /// - public static readonly int Item4Offset = Item3Offset + Item3Size; - - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item4Size = Marshal.SizeOf(); - - /// - /// Gets the offset to the start of . + /// Gets the size (in bytes) of the default structure header. /// - public static readonly int Item5Offset = Item4Offset + Item4Size; + public static readonly int HeaderSize = Marshal.SizeOf(); /// - /// Gets the size (in bytes) of the Item 1. + /// Gets the size (in bytes) of the head structure. /// - public static readonly int Item5Size = Marshal.SizeOf(); + public static readonly int HeadSize = Marshal.SizeOf(); /// /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. /// - public static readonly int MemorySize = Item5Offset + Item5Size; - + public static readonly int MemorySize = HeadSize; + + /// + public override int Size => MemorySize; + private nint _headPtr; - /// - /// Gets a pointer to the current head. - /// - public BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; + /// + public override BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; /// /// Gets or sets the head of the chain. @@ -2968,122 +10277,17 @@ public TChain Head set { value.StructureType(); - var ptr = (BaseInStructure*) _headPtr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, _headPtr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item1Ptr => (BaseInStructure*) (_headPtr + Item1Offset); - - /// - /// Gets or sets item #1 in the chain. - /// - public T1 Item1 - { - get => Unsafe.AsRef(Item1Ptr); - set - { - value.StructureType(); - var ptr = Item1Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item2Ptr => (BaseInStructure*) (_headPtr + Item2Offset); - - /// - /// Gets or sets item #2 in the chain. - /// - public T2 Item2 - { - get => Unsafe.AsRef(Item2Ptr); - set - { - value.StructureType(); - var ptr = Item2Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item3Ptr => (BaseInStructure*) (_headPtr + Item3Offset); - - /// - /// Gets or sets item #3 in the chain. - /// - public T3 Item3 - { - get => Unsafe.AsRef(Item3Ptr); - set - { - value.StructureType(); - var ptr = Item3Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item4Ptr => (BaseInStructure*) (_headPtr + Item4Offset); - - /// - /// Gets or sets item #4 in the chain. - /// - public T4 Item4 - { - get => Unsafe.AsRef(Item4Ptr); - set - { - value.StructureType(); - var ptr = Item4Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item5Ptr => (BaseInStructure*) (_headPtr + Item5Offset); - - /// - /// Gets or sets item #5 in the chain. - /// - public T5 Item5 - { - get => Unsafe.AsRef(Item5Ptr); - set - { - value.StructureType(); - var ptr = Item5Ptr; + var ptr = (BaseInStructure*) _headPtr; var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); + Marshal.StructureToPtr(value, _headPtr, true); ptr->PNext = nextPtr; } } /// - /// Creates a new with 6 items from an existing memory block. + /// Creates a new with 1 items from an existing memory block. /// - /// The pointer to the head of the chain.. + /// The pointer to the head of the chain. /// /// Callers are responsible for ensuring the size of the memory is correct. /// @@ -3093,267 +10297,216 @@ internal ManagedChain(nint headPtr) } /// - /// Creates a new with 6 items. + /// Creates a new with 1 items. /// /// The head of the chain. - /// Item 1. - /// Item 2. - /// Item 3. - /// Item 4. - /// Item 5. - public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default) + internal ManagedChain(TChain head = default) : this(Marshal.AllocHGlobal(MemorySize)) { head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); - BaseInStructure* itemPtr = Item1Ptr; - item1.StructureType(); - Marshal.StructureToPtr(item1, (nint)itemPtr, false); - HeadPtr->PNext = itemPtr; - itemPtr = Item2Ptr; - item2.StructureType(); - Marshal.StructureToPtr(item2, (nint)itemPtr, false); - Item1Ptr->PNext = itemPtr; - itemPtr = Item3Ptr; - item3.StructureType(); - Marshal.StructureToPtr(item3, (nint)itemPtr, false); - Item2Ptr->PNext = itemPtr; - itemPtr = Item4Ptr; - item4.StructureType(); - Marshal.StructureToPtr(item4, (nint)itemPtr, false); - Item3Ptr->PNext = itemPtr; - itemPtr = Item5Ptr; - item5.StructureType(); - Marshal.StructureToPtr(item5, (nint)itemPtr, false); - Item4Ptr->PNext = itemPtr; - Item5Ptr->PNext = null; + HeadPtr->PNext = null; } - /// - /// Creates a new with 6 items from an existing unmanaged chain. - /// - /// Any errors loading the chain. - /// The unmanaged chain to use as the basis of this chain. - public ManagedChain(out string errors, TChain chain) - : this(Marshal.AllocHGlobal(MemorySize)) + /// + public override IEnumerator GetEnumerator() { - chain.StructureType(); - Marshal.StructureToPtr(chain, _headPtr, false); - StringBuilder errorBuilder = new StringBuilder(); - var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); - var newPtr = (BaseInStructure*) _headPtr; + yield return Head; + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item1Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + public override int Count => 1; - T1 item1 = default; - var expectedStructureType = item1.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 6"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 2; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item1 = Unsafe.AsRef(existingPtr); - } + /// + public override IChainable this[int index] + => index switch + { + 0 => Head, + _ => throw new IndexOutOfRangeException() + }; + + /// + /// Compares the supplied memory block with this one, ignoring the structure headers. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + protected override bool MemoryEquals(ManagedChain other) + { + var ptr = HeadPtr; + var otherPtr = other.HeadPtr; + if (ptr == otherPtr) { + return true; } - Marshal.StructureToPtr(item1, (nint) newPtr, false); + var span = new ReadOnlySpan((void*) ptr, MemorySize); + var otherSpan = new ReadOnlySpan((void*) otherPtr, MemorySize); + var start = 0; + var length = HeadSize; + var sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + return true; + } + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Equals(ManagedChain other) + => !ReferenceEquals(null, other) && (ReferenceEquals(this, other) || MemoryEquals(other)); - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item2Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator ==(ManagedChain left, ManagedChain right) => + ReferenceEquals(null, left) + ? ReferenceEquals(null, right) + : !ReferenceEquals(null, right) && (ReferenceEquals(left, right) || left.MemoryEquals(right)); - T2 item2 = default; - expectedStructureType = item2.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 6"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 3; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item2 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item2, (nint) newPtr, false); + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator !=(ManagedChain left, ManagedChain right) => + ReferenceEquals(null, left) + ? !ReferenceEquals(null, right) + : ReferenceEquals(null, right) || (!ReferenceEquals(left, right) && !left.MemoryEquals(right)); - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item3Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append("("); + sb.Append((object) Head); sb.Append(")"); + return sb.ToString(); + } - T3 item3 = default; - expectedStructureType = item3.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 6"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 4; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item3 = Unsafe.AsRef(existingPtr); - } + /// + /// Deconstructs this chain. + /// + /// The head of the chain. + public void Deconstruct(out TChain head) + { + head = Head; + } + + /// + public override void Dispose() + { + var headPtr = Interlocked.Exchange(ref _headPtr, (nint)0); + if (headPtr == (nint)0) { + return; } - Marshal.StructureToPtr(item3, (nint) newPtr, false); - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item4Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + // Destroy all structures + Marshal.DestroyStructure(headPtr); - T4 item4 = default; - expectedStructureType = item4.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 6"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 5; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item4 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item4, (nint) newPtr, false); + // Free memory block + Marshal.FreeHGlobal(headPtr); + } +} - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item5Offset); - newPtr = (BaseInStructure*)newPtr->PNext; +/// +/// A safely manages the pointers of a managed structure chain. +/// +/// The chain type +/// Type of Item 1. +public unsafe sealed class ManagedChain : ManagedChain, IEquatable> + where TChain : struct, IChainable + where T1 : struct, IChainable +{ + /// + /// Gets the size (in bytes) of the default structure header. + /// + public static readonly int HeaderSize = Marshal.SizeOf(); - T5 item5 = default; - expectedStructureType = item5.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 6"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 6; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - if (existingPtr->PNext is not null) { - errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 6"); - existingPtr->PNext = null; - } - item5 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item5, (nint) newPtr, false); + /// + /// Gets the size (in bytes) of the head structure. + /// + public static readonly int HeadSize = Marshal.SizeOf(); - // Create string of errors - errors = errorBuilder.ToString().Trim(); - } + /// + /// Gets the offset to the start of . + /// + public static readonly int Item1Offset = HeadSize; /// - /// Creates a new with 6 by copying this chain. + /// Gets the size (in bytes) of the Item 1. /// - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Duplicate() - { - var newHeadPtr = Marshal.AllocHGlobal(MemorySize); - // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); - // Update all pointers - ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); - ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); - ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); - ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); - ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item5Offset); - return new ManagedChain(newHeadPtr); - } + public static readonly int Item1Size = Marshal.SizeOf(); /// - /// Creates a new with 6 items, by appending - /// to the end of this chain. + /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. /// - /// The chain to append to. - /// Item 5. - /// - /// Do not forget to dispose the chain if you are no longer using it. - /// - public ManagedChain(ManagedChain previous, T5 item5 = default) - : this(Marshal.AllocHGlobal(MemorySize)) - { - var previousSize = MemorySize - Item5Size; - // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); + public static readonly int MemorySize = Item1Offset + Item1Size; - // Append item 5 - item5.StructureType(); - Marshal.StructureToPtr(item5, _headPtr + previousSize, false); + /// + public override int Size => MemorySize; - // Update all pointers - ((BaseInStructure*)_headPtr)->PNext = (BaseInStructure*) (_headPtr + Item1Offset); - ((BaseInStructure*)(_headPtr + Item1Offset))->PNext = (BaseInStructure*) (_headPtr + Item2Offset); - ((BaseInStructure*)(_headPtr + Item2Offset))->PNext = (BaseInStructure*) (_headPtr + Item3Offset); - ((BaseInStructure*)(_headPtr + Item3Offset))->PNext = (BaseInStructure*) (_headPtr + Item4Offset); - ((BaseInStructure*)(_headPtr + Item4Offset))->PNext = (BaseInStructure*) (_headPtr + Item5Offset); - ((BaseInStructure*)(_headPtr + previousSize))->PNext = null; + private nint _headPtr; + + /// + public override BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; + + /// + /// Gets or sets the head of the chain. + /// + public TChain Head + { + get => Unsafe.AsRef((BaseInStructure*) _headPtr); + set + { + value.StructureType(); + var ptr = (BaseInStructure*) _headPtr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, _headPtr, true); + ptr->PNext = nextPtr; + } } /// - /// Creates a new with 5 items, by removing the last item - /// from this chain. + /// Gets a pointer to the second item in the chain. /// - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Truncate() + public BaseInStructure* Item1Ptr => (BaseInStructure*) (_headPtr + Item1Offset); + + /// + /// Gets or sets item #1 in the chain. + /// + public T1 Item1 { - return Truncate(out var _); + get => Unsafe.AsRef(Item1Ptr); + set + { + value.StructureType(); + var ptr = Item1Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } } /// - /// Creates a new with 5 items, by removing - /// from the end of this chain. + /// Creates a new with 2 items from an existing memory block. /// + /// The pointer to the head of the chain. /// - /// Do not forget to dispose this chain if you are no longer using it. + /// Callers are responsible for ensuring the size of the memory is correct. /// - public ManagedChain Truncate(out T5 item5) + internal ManagedChain(nint headPtr) { - item5 = Item5; - - var newSize = MemorySize - Item5Size; - var newHeadPtr = Marshal.AllocHGlobal(newSize); - // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); - // Update all pointers - ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); - ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); - ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); - ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); - ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = null; - return new ManagedChain(newHeadPtr); + _headPtr = headPtr; } /// - /// Creates a new with 7 items, by appending to - /// the end of this chain. + /// Creates a new with 2 items. /// - /// Item 6. - /// Type of Item 6 - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Append(T6 item6 = default) - where T6: struct, IExtendsChain + /// The head of the chain. + /// Item 1. + internal ManagedChain(TChain head = default, T1 item1 = default) + : this(Marshal.AllocHGlobal(MemorySize)) { - return new ManagedChain(this, item6); + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + var itemPtr = Item1Ptr; + item1.StructureType(); + Marshal.StructureToPtr(item1, (nint)itemPtr, false); + HeadPtr->PNext = itemPtr; + Item1Ptr->PNext = null; } /// @@ -3361,14 +10514,10 @@ public override IEnumerator GetEnumerator() { yield return Head; yield return Item1; - yield return Item2; - yield return Item3; - yield return Item4; - yield return Item5; } /// - public override int Count => 6; + public override int Count => 2; /// public override IChainable this[int index] @@ -3376,30 +10525,79 @@ public override IChainable this[int index] { 0 => Head, 1 => Item1, - 2 => Item2, - 3 => Item3, - 4 => Item4, - 5 => Item5, _ => throw new IndexOutOfRangeException() }; + /// + /// Compares the supplied memory block with this one, ignoring the structure headers. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + protected override bool MemoryEquals(ManagedChain other) + { + var ptr = HeadPtr; + var otherPtr = other.HeadPtr; + if (ptr == otherPtr) { + return true; + } + var span = new ReadOnlySpan((void*) ptr, MemorySize); + var otherSpan = new ReadOnlySpan((void*) otherPtr, MemorySize); + var start = 0; + var length = HeadSize; + var sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item1Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + return true; + } + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Equals(ManagedChain other) + => !ReferenceEquals(null, other) && (ReferenceEquals(this, other) || MemoryEquals(other)); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator ==(ManagedChain left, ManagedChain right) => + ReferenceEquals(null, left) + ? ReferenceEquals(null, right) + : !ReferenceEquals(null, right) && (ReferenceEquals(left, right) || left.MemoryEquals(right)); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator !=(ManagedChain left, ManagedChain right) => + ReferenceEquals(null, left) + ? !ReferenceEquals(null, right) + : ReferenceEquals(null, right) || (!ReferenceEquals(left, right) && !left.MemoryEquals(right)); + + /// + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append("("); + sb.Append((object) Head); sb.Append(", "); + sb.Append((object) Item1); + sb.Append(")"); + return sb.ToString(); + } + /// /// Deconstructs this chain. /// /// The head of the chain. /// Item 1. - /// Item 2. - /// Item 3. - /// Item 4. - /// Item 5. - public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5) + public void Deconstruct(out TChain head, out T1 item1) { head = Head; item1 = Item1; - item2 = Item2; - item3 = Item3; - item4 = Item4; - item5 = Item5; } /// @@ -3413,10 +10611,6 @@ public override void Dispose() // Destroy all structures Marshal.DestroyStructure(headPtr); Marshal.DestroyStructure(headPtr + Item1Offset); - Marshal.DestroyStructure(headPtr + Item2Offset); - Marshal.DestroyStructure(headPtr + Item3Offset); - Marshal.DestroyStructure(headPtr + Item4Offset); - Marshal.DestroyStructure(headPtr + Item5Offset); // Free memory block Marshal.FreeHGlobal(headPtr); @@ -3424,24 +10618,21 @@ public override void Dispose() } /// -/// A safely manages the pointers of a managed structure chain. +/// A safely manages the pointers of a managed structure chain. /// /// The chain type /// Type of Item 1. /// Type of Item 2. -/// Type of Item 3. -/// Type of Item 4. -/// Type of Item 5. -/// Type of Item 6. -public unsafe class ManagedChain : ManagedChain - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain +public unsafe sealed class ManagedChain : ManagedChain, IEquatable> + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable { + /// + /// Gets the size (in bytes) of the default structure header. + /// + public static readonly int HeaderSize = Marshal.SizeOf(); + /// /// Gets the size (in bytes) of the head structure. /// @@ -3467,57 +10658,18 @@ public unsafe class ManagedChain : ManagedChain /// public static readonly int Item2Size = Marshal.SizeOf(); - /// - /// Gets the offset to the start of . - /// - public static readonly int Item3Offset = Item2Offset + Item2Size; - - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item3Size = Marshal.SizeOf(); - - /// - /// Gets the offset to the start of . - /// - public static readonly int Item4Offset = Item3Offset + Item3Size; - - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item4Size = Marshal.SizeOf(); - - /// - /// Gets the offset to the start of . - /// - public static readonly int Item5Offset = Item4Offset + Item4Size; - - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item5Size = Marshal.SizeOf(); - - /// - /// Gets the offset to the start of . - /// - public static readonly int Item6Offset = Item5Offset + Item5Size; - - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item6Size = Marshal.SizeOf(); - /// /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. /// - public static readonly int MemorySize = Item6Offset + Item6Size; - + public static readonly int MemorySize = Item2Offset + Item2Size; + + /// + public override int Size => MemorySize; + private nint _headPtr; - /// - /// Gets a pointer to the current head. - /// - public BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; + /// + public override BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; /// /// Gets or sets the head of the chain. @@ -3578,22 +10730,240 @@ public T2 Item2 } /// - /// Gets a pointer to the second item in the chain. + /// Creates a new with 3 items from an existing memory block. /// - public BaseInStructure* Item3Ptr => (BaseInStructure*) (_headPtr + Item3Offset); + /// The pointer to the head of the chain. + /// + /// Callers are responsible for ensuring the size of the memory is correct. + /// + internal ManagedChain(nint headPtr) + { + _headPtr = headPtr; + } /// - /// Gets or sets item #3 in the chain. + /// Creates a new with 3 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + internal ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default) + : this(Marshal.AllocHGlobal(MemorySize)) + { + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + var itemPtr = Item1Ptr; + item1.StructureType(); + Marshal.StructureToPtr(item1, (nint)itemPtr, false); + HeadPtr->PNext = itemPtr; + itemPtr = Item2Ptr; + item2.StructureType(); + Marshal.StructureToPtr(item2, (nint)itemPtr, false); + Item1Ptr->PNext = itemPtr; + Item2Ptr->PNext = null; + } + + /// + public override IEnumerator GetEnumerator() + { + yield return Head; + yield return Item1; + yield return Item2; + } + + /// + public override int Count => 3; + + /// + public override IChainable this[int index] + => index switch + { + 0 => Head, + 1 => Item1, + 2 => Item2, + _ => throw new IndexOutOfRangeException() + }; + + /// + /// Compares the supplied memory block with this one, ignoring the structure headers. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + protected override bool MemoryEquals(ManagedChain other) + { + var ptr = HeadPtr; + var otherPtr = other.HeadPtr; + if (ptr == otherPtr) { + return true; + } + var span = new ReadOnlySpan((void*) ptr, MemorySize); + var otherSpan = new ReadOnlySpan((void*) otherPtr, MemorySize); + var start = 0; + var length = HeadSize; + var sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item1Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item2Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + return true; + } + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Equals(ManagedChain other) + => !ReferenceEquals(null, other) && (ReferenceEquals(this, other) || MemoryEquals(other)); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator ==(ManagedChain left, ManagedChain right) => + ReferenceEquals(null, left) + ? ReferenceEquals(null, right) + : !ReferenceEquals(null, right) && (ReferenceEquals(left, right) || left.MemoryEquals(right)); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator !=(ManagedChain left, ManagedChain right) => + ReferenceEquals(null, left) + ? !ReferenceEquals(null, right) + : ReferenceEquals(null, right) || (!ReferenceEquals(left, right) && !left.MemoryEquals(right)); + + /// + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append("("); + sb.Append((object) Head); sb.Append(", "); + sb.Append((object) Item1); + sb.Append(", "); + sb.Append((object) Item2); + sb.Append(")"); + return sb.ToString(); + } + + /// + /// Deconstructs this chain. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + public void Deconstruct(out TChain head, out T1 item1, out T2 item2) + { + head = Head; + item1 = Item1; + item2 = Item2; + } + + /// + public override void Dispose() + { + var headPtr = Interlocked.Exchange(ref _headPtr, (nint)0); + if (headPtr == (nint)0) { + return; + } + + // Destroy all structures + Marshal.DestroyStructure(headPtr); + Marshal.DestroyStructure(headPtr + Item1Offset); + Marshal.DestroyStructure(headPtr + Item2Offset); + + // Free memory block + Marshal.FreeHGlobal(headPtr); + } +} + +/// +/// A safely manages the pointers of a managed structure chain. +/// +/// The chain type +/// Type of Item 1. +/// Type of Item 2. +/// Type of Item 3. +public unsafe sealed class ManagedChain : ManagedChain, IEquatable> + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable +{ + /// + /// Gets the size (in bytes) of the default structure header. + /// + public static readonly int HeaderSize = Marshal.SizeOf(); + + /// + /// Gets the size (in bytes) of the head structure. + /// + public static readonly int HeadSize = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item1Offset = HeadSize; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item1Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item2Offset = Item1Offset + Item1Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item2Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item3Offset = Item2Offset + Item2Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item3Size = Marshal.SizeOf(); + + /// + /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. + /// + public static readonly int MemorySize = Item3Offset + Item3Size; + + /// + public override int Size => MemorySize; + + private nint _headPtr; + + /// + public override BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; + + /// + /// Gets or sets the head of the chain. /// - public T3 Item3 + public TChain Head { - get => Unsafe.AsRef(Item3Ptr); + get => Unsafe.AsRef((BaseInStructure*) _headPtr); set { value.StructureType(); - var ptr = Item3Ptr; + var ptr = (BaseInStructure*) _headPtr; var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); + Marshal.StructureToPtr(value, _headPtr, true); ptr->PNext = nextPtr; } } @@ -3601,18 +10971,18 @@ public T3 Item3 /// /// Gets a pointer to the second item in the chain. /// - public BaseInStructure* Item4Ptr => (BaseInStructure*) (_headPtr + Item4Offset); + public BaseInStructure* Item1Ptr => (BaseInStructure*) (_headPtr + Item1Offset); /// - /// Gets or sets item #4 in the chain. + /// Gets or sets item #1 in the chain. /// - public T4 Item4 + public T1 Item1 { - get => Unsafe.AsRef(Item4Ptr); + get => Unsafe.AsRef(Item1Ptr); set { value.StructureType(); - var ptr = Item4Ptr; + var ptr = Item1Ptr; var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, (nint)ptr, true); ptr->PNext = nextPtr; @@ -3622,18 +10992,18 @@ public T4 Item4 /// /// Gets a pointer to the second item in the chain. /// - public BaseInStructure* Item5Ptr => (BaseInStructure*) (_headPtr + Item5Offset); + public BaseInStructure* Item2Ptr => (BaseInStructure*) (_headPtr + Item2Offset); /// - /// Gets or sets item #5 in the chain. + /// Gets or sets item #2 in the chain. /// - public T5 Item5 + public T2 Item2 { - get => Unsafe.AsRef(Item5Ptr); + get => Unsafe.AsRef(Item2Ptr); set { value.StructureType(); - var ptr = Item5Ptr; + var ptr = Item2Ptr; var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, (nint)ptr, true); ptr->PNext = nextPtr; @@ -3643,18 +11013,18 @@ public T5 Item5 /// /// Gets a pointer to the second item in the chain. /// - public BaseInStructure* Item6Ptr => (BaseInStructure*) (_headPtr + Item6Offset); + public BaseInStructure* Item3Ptr => (BaseInStructure*) (_headPtr + Item3Offset); /// - /// Gets or sets item #6 in the chain. + /// Gets or sets item #3 in the chain. /// - public T6 Item6 + public T3 Item3 { - get => Unsafe.AsRef(Item6Ptr); + get => Unsafe.AsRef(Item3Ptr); set { value.StructureType(); - var ptr = Item6Ptr; + var ptr = Item3Ptr; var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, (nint)ptr, true); ptr->PNext = nextPtr; @@ -3662,9 +11032,9 @@ public T6 Item6 } /// - /// Creates a new with 7 items from an existing memory block. + /// Creates a new with 4 items from an existing memory block. /// - /// The pointer to the head of the chain.. + /// The pointer to the head of the chain. /// /// Callers are responsible for ensuring the size of the memory is correct. /// @@ -3674,21 +11044,18 @@ internal ManagedChain(nint headPtr) } /// - /// Creates a new with 7 items. + /// Creates a new with 4 items. /// /// The head of the chain. /// Item 1. /// Item 2. /// Item 3. - /// Item 4. - /// Item 5. - /// Item 6. - public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default) + internal ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default) : this(Marshal.AllocHGlobal(MemorySize)) { head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); - BaseInStructure* itemPtr = Item1Ptr; + var itemPtr = Item1Ptr; item1.StructureType(); Marshal.StructureToPtr(item1, (nint)itemPtr, false); HeadPtr->PNext = itemPtr; @@ -3700,270 +11067,7 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul item3.StructureType(); Marshal.StructureToPtr(item3, (nint)itemPtr, false); Item2Ptr->PNext = itemPtr; - itemPtr = Item4Ptr; - item4.StructureType(); - Marshal.StructureToPtr(item4, (nint)itemPtr, false); - Item3Ptr->PNext = itemPtr; - itemPtr = Item5Ptr; - item5.StructureType(); - Marshal.StructureToPtr(item5, (nint)itemPtr, false); - Item4Ptr->PNext = itemPtr; - itemPtr = Item6Ptr; - item6.StructureType(); - Marshal.StructureToPtr(item6, (nint)itemPtr, false); - Item5Ptr->PNext = itemPtr; - Item6Ptr->PNext = null; - } - - /// - /// Creates a new with 7 items from an existing unmanaged chain. - /// - /// Any errors loading the chain. - /// The unmanaged chain to use as the basis of this chain. - public ManagedChain(out string errors, TChain chain) - : this(Marshal.AllocHGlobal(MemorySize)) - { - chain.StructureType(); - Marshal.StructureToPtr(chain, _headPtr, false); - StringBuilder errorBuilder = new StringBuilder(); - var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); - var newPtr = (BaseInStructure*) _headPtr; - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item1Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T1 item1 = default; - var expectedStructureType = item1.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 7"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 2; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item1 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item1, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item2Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T2 item2 = default; - expectedStructureType = item2.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 7"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 3; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item2 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item2, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item3Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T3 item3 = default; - expectedStructureType = item3.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 7"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 4; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item3 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item3, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item4Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T4 item4 = default; - expectedStructureType = item4.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 7"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 5; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item4 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item4, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item5Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T5 item5 = default; - expectedStructureType = item5.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 7"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 6; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item5 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item5, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item6Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T6 item6 = default; - expectedStructureType = item6.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 7"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 7; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - if (existingPtr->PNext is not null) { - errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 7"); - existingPtr->PNext = null; - } - item6 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item6, (nint) newPtr, false); - - // Create string of errors - errors = errorBuilder.ToString().Trim(); - } - - /// - /// Creates a new with 7 by copying this chain. - /// - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Duplicate() - { - var newHeadPtr = Marshal.AllocHGlobal(MemorySize); - // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); - // Update all pointers - ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); - ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); - ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); - ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); - ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item5Offset); - ((BaseInStructure*)(newHeadPtr + Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item6Offset); - return new ManagedChain(newHeadPtr); - } - - /// - /// Creates a new with 7 items, by appending - /// to the end of this chain. - /// - /// The chain to append to. - /// Item 6. - /// - /// Do not forget to dispose the chain if you are no longer using it. - /// - public ManagedChain(ManagedChain previous, T6 item6 = default) - : this(Marshal.AllocHGlobal(MemorySize)) - { - var previousSize = MemorySize - Item6Size; - // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); - - // Append item 6 - item6.StructureType(); - Marshal.StructureToPtr(item6, _headPtr + previousSize, false); - - // Update all pointers - ((BaseInStructure*)_headPtr)->PNext = (BaseInStructure*) (_headPtr + Item1Offset); - ((BaseInStructure*)(_headPtr + Item1Offset))->PNext = (BaseInStructure*) (_headPtr + Item2Offset); - ((BaseInStructure*)(_headPtr + Item2Offset))->PNext = (BaseInStructure*) (_headPtr + Item3Offset); - ((BaseInStructure*)(_headPtr + Item3Offset))->PNext = (BaseInStructure*) (_headPtr + Item4Offset); - ((BaseInStructure*)(_headPtr + Item4Offset))->PNext = (BaseInStructure*) (_headPtr + Item5Offset); - ((BaseInStructure*)(_headPtr + Item5Offset))->PNext = (BaseInStructure*) (_headPtr + Item6Offset); - ((BaseInStructure*)(_headPtr + previousSize))->PNext = null; - } - - /// - /// Creates a new with 6 items, by removing the last item - /// from this chain. - /// - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Truncate() - { - return Truncate(out var _); - } - - /// - /// Creates a new with 6 items, by removing - /// from the end of this chain. - /// - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Truncate(out T6 item6) - { - item6 = Item6; - - var newSize = MemorySize - Item6Size; - var newHeadPtr = Marshal.AllocHGlobal(newSize); - // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); - // Update all pointers - ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); - ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); - ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); - ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); - ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item5Offset); - ((BaseInStructure*)(newHeadPtr + Item5Offset))->PNext = null; - return new ManagedChain(newHeadPtr); - } - - /// - /// Creates a new with 8 items, by appending to - /// the end of this chain. - /// - /// Item 7. - /// Type of Item 7 - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Append(T7 item7 = default) - where T7: struct, IExtendsChain - { - return new ManagedChain(this, item7); + Item3Ptr->PNext = null; } /// @@ -3973,13 +11077,10 @@ public override IEnumerator GetEnumerator() yield return Item1; yield return Item2; yield return Item3; - yield return Item4; - yield return Item5; - yield return Item6; } /// - public override int Count => 7; + public override int Count => 4; /// public override IChainable this[int index] @@ -3989,12 +11090,90 @@ public override IChainable this[int index] 1 => Item1, 2 => Item2, 3 => Item3, - 4 => Item4, - 5 => Item5, - 6 => Item6, _ => throw new IndexOutOfRangeException() }; + /// + /// Compares the supplied memory block with this one, ignoring the structure headers. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + protected override bool MemoryEquals(ManagedChain other) + { + var ptr = HeadPtr; + var otherPtr = other.HeadPtr; + if (ptr == otherPtr) { + return true; + } + var span = new ReadOnlySpan((void*) ptr, MemorySize); + var otherSpan = new ReadOnlySpan((void*) otherPtr, MemorySize); + var start = 0; + var length = HeadSize; + var sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item1Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item2Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item3Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + return true; + } + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Equals(ManagedChain other) + => !ReferenceEquals(null, other) && (ReferenceEquals(this, other) || MemoryEquals(other)); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator ==(ManagedChain left, ManagedChain right) => + ReferenceEquals(null, left) + ? ReferenceEquals(null, right) + : !ReferenceEquals(null, right) && (ReferenceEquals(left, right) || left.MemoryEquals(right)); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator !=(ManagedChain left, ManagedChain right) => + ReferenceEquals(null, left) + ? !ReferenceEquals(null, right) + : ReferenceEquals(null, right) || (!ReferenceEquals(left, right) && !left.MemoryEquals(right)); + + /// + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append("("); + sb.Append((object) Head); sb.Append(", "); + sb.Append((object) Item1); + sb.Append(", "); + sb.Append((object) Item2); + sb.Append(", "); + sb.Append((object) Item3); + sb.Append(")"); + return sb.ToString(); + } + /// /// Deconstructs this chain. /// @@ -4002,18 +11181,12 @@ public override IChainable this[int index] /// Item 1. /// Item 2. /// Item 3. - /// Item 4. - /// Item 5. - /// Item 6. - public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6) + public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item3) { head = Head; item1 = Item1; item2 = Item2; item3 = Item3; - item4 = Item4; - item5 = Item5; - item6 = Item6; } /// @@ -4029,9 +11202,6 @@ public override void Dispose() Marshal.DestroyStructure(headPtr + Item1Offset); Marshal.DestroyStructure(headPtr + Item2Offset); Marshal.DestroyStructure(headPtr + Item3Offset); - Marshal.DestroyStructure(headPtr + Item4Offset); - Marshal.DestroyStructure(headPtr + Item5Offset); - Marshal.DestroyStructure(headPtr + Item6Offset); // Free memory block Marshal.FreeHGlobal(headPtr); @@ -4039,26 +11209,25 @@ public override void Dispose() } /// -/// A safely manages the pointers of a managed structure chain. +/// A safely manages the pointers of a managed structure chain. /// /// The chain type /// Type of Item 1. /// Type of Item 2. /// Type of Item 3. /// Type of Item 4. -/// Type of Item 5. -/// Type of Item 6. -/// Type of Item 7. -public unsafe class ManagedChain : ManagedChain - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain +public unsafe sealed class ManagedChain : ManagedChain, IEquatable> + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable { + /// + /// Gets the size (in bytes) of the default structure header. + /// + public static readonly int HeaderSize = Marshal.SizeOf(); + /// /// Gets the size (in bytes) of the head structure. /// @@ -4104,47 +11273,18 @@ public unsafe class ManagedChain : ManagedCh /// public static readonly int Item4Size = Marshal.SizeOf(); - /// - /// Gets the offset to the start of . - /// - public static readonly int Item5Offset = Item4Offset + Item4Size; - - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item5Size = Marshal.SizeOf(); - - /// - /// Gets the offset to the start of . - /// - public static readonly int Item6Offset = Item5Offset + Item5Size; - - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item6Size = Marshal.SizeOf(); - - /// - /// Gets the offset to the start of . - /// - public static readonly int Item7Offset = Item6Offset + Item6Size; - - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item7Size = Marshal.SizeOf(); - /// /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. /// - public static readonly int MemorySize = Item7Offset + Item7Size; - + public static readonly int MemorySize = Item4Offset + Item4Size; + + /// + public override int Size => MemorySize; + private nint _headPtr; - /// - /// Gets a pointer to the current head. - /// - public BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; + /// + public override BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; /// /// Gets or sets the head of the chain. @@ -4210,80 +11350,341 @@ public T2 Item2 public BaseInStructure* Item3Ptr => (BaseInStructure*) (_headPtr + Item3Offset); /// - /// Gets or sets item #3 in the chain. + /// Gets or sets item #3 in the chain. + /// + public T3 Item3 + { + get => Unsafe.AsRef(Item3Ptr); + set + { + value.StructureType(); + var ptr = Item3Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } + } + + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item4Ptr => (BaseInStructure*) (_headPtr + Item4Offset); + + /// + /// Gets or sets item #4 in the chain. + /// + public T4 Item4 + { + get => Unsafe.AsRef(Item4Ptr); + set + { + value.StructureType(); + var ptr = Item4Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } + } + + /// + /// Creates a new with 5 items from an existing memory block. + /// + /// The pointer to the head of the chain. + /// + /// Callers are responsible for ensuring the size of the memory is correct. + /// + internal ManagedChain(nint headPtr) + { + _headPtr = headPtr; + } + + /// + /// Creates a new with 5 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + internal ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default) + : this(Marshal.AllocHGlobal(MemorySize)) + { + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + var itemPtr = Item1Ptr; + item1.StructureType(); + Marshal.StructureToPtr(item1, (nint)itemPtr, false); + HeadPtr->PNext = itemPtr; + itemPtr = Item2Ptr; + item2.StructureType(); + Marshal.StructureToPtr(item2, (nint)itemPtr, false); + Item1Ptr->PNext = itemPtr; + itemPtr = Item3Ptr; + item3.StructureType(); + Marshal.StructureToPtr(item3, (nint)itemPtr, false); + Item2Ptr->PNext = itemPtr; + itemPtr = Item4Ptr; + item4.StructureType(); + Marshal.StructureToPtr(item4, (nint)itemPtr, false); + Item3Ptr->PNext = itemPtr; + Item4Ptr->PNext = null; + } + + /// + public override IEnumerator GetEnumerator() + { + yield return Head; + yield return Item1; + yield return Item2; + yield return Item3; + yield return Item4; + } + + /// + public override int Count => 5; + + /// + public override IChainable this[int index] + => index switch + { + 0 => Head, + 1 => Item1, + 2 => Item2, + 3 => Item3, + 4 => Item4, + _ => throw new IndexOutOfRangeException() + }; + + /// + /// Compares the supplied memory block with this one, ignoring the structure headers. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + protected override bool MemoryEquals(ManagedChain other) + { + var ptr = HeadPtr; + var otherPtr = other.HeadPtr; + if (ptr == otherPtr) { + return true; + } + var span = new ReadOnlySpan((void*) ptr, MemorySize); + var otherSpan = new ReadOnlySpan((void*) otherPtr, MemorySize); + var start = 0; + var length = HeadSize; + var sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item1Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item2Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item3Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item4Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + return true; + } + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Equals(ManagedChain other) + => !ReferenceEquals(null, other) && (ReferenceEquals(this, other) || MemoryEquals(other)); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator ==(ManagedChain left, ManagedChain right) => + ReferenceEquals(null, left) + ? ReferenceEquals(null, right) + : !ReferenceEquals(null, right) && (ReferenceEquals(left, right) || left.MemoryEquals(right)); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator !=(ManagedChain left, ManagedChain right) => + ReferenceEquals(null, left) + ? !ReferenceEquals(null, right) + : ReferenceEquals(null, right) || (!ReferenceEquals(left, right) && !left.MemoryEquals(right)); + + /// + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append("("); + sb.Append((object) Head); sb.Append(", "); + sb.Append((object) Item1); + sb.Append(", "); + sb.Append((object) Item2); + sb.Append(", "); + sb.Append((object) Item3); + sb.Append(", "); + sb.Append((object) Item4); + sb.Append(")"); + return sb.ToString(); + } + + /// + /// Deconstructs this chain. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item3, out T4 item4) + { + head = Head; + item1 = Item1; + item2 = Item2; + item3 = Item3; + item4 = Item4; + } + + /// + public override void Dispose() + { + var headPtr = Interlocked.Exchange(ref _headPtr, (nint)0); + if (headPtr == (nint)0) { + return; + } + + // Destroy all structures + Marshal.DestroyStructure(headPtr); + Marshal.DestroyStructure(headPtr + Item1Offset); + Marshal.DestroyStructure(headPtr + Item2Offset); + Marshal.DestroyStructure(headPtr + Item3Offset); + Marshal.DestroyStructure(headPtr + Item4Offset); + + // Free memory block + Marshal.FreeHGlobal(headPtr); + } +} + +/// +/// A safely manages the pointers of a managed structure chain. +/// +/// The chain type +/// Type of Item 1. +/// Type of Item 2. +/// Type of Item 3. +/// Type of Item 4. +/// Type of Item 5. +public unsafe sealed class ManagedChain : ManagedChain, IEquatable> + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable +{ + /// + /// Gets the size (in bytes) of the default structure header. + /// + public static readonly int HeaderSize = Marshal.SizeOf(); + + /// + /// Gets the size (in bytes) of the head structure. + /// + public static readonly int HeadSize = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item1Offset = HeadSize; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item1Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item2Offset = Item1Offset + Item1Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item2Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item3Offset = Item2Offset + Item2Size; + + /// + /// Gets the size (in bytes) of the Item 1. /// - public T3 Item3 - { - get => Unsafe.AsRef(Item3Ptr); - set - { - value.StructureType(); - var ptr = Item3Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } + public static readonly int Item3Size = Marshal.SizeOf(); /// - /// Gets a pointer to the second item in the chain. + /// Gets the offset to the start of . /// - public BaseInStructure* Item4Ptr => (BaseInStructure*) (_headPtr + Item4Offset); + public static readonly int Item4Offset = Item3Offset + Item3Size; /// - /// Gets or sets item #4 in the chain. + /// Gets the size (in bytes) of the Item 1. /// - public T4 Item4 - { - get => Unsafe.AsRef(Item4Ptr); - set - { - value.StructureType(); - var ptr = Item4Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } + public static readonly int Item4Size = Marshal.SizeOf(); /// - /// Gets a pointer to the second item in the chain. + /// Gets the offset to the start of . /// - public BaseInStructure* Item5Ptr => (BaseInStructure*) (_headPtr + Item5Offset); + public static readonly int Item5Offset = Item4Offset + Item4Size; /// - /// Gets or sets item #5 in the chain. + /// Gets the size (in bytes) of the Item 1. /// - public T5 Item5 - { - get => Unsafe.AsRef(Item5Ptr); - set - { - value.StructureType(); - var ptr = Item5Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } + public static readonly int Item5Size = Marshal.SizeOf(); /// - /// Gets a pointer to the second item in the chain. + /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. /// - public BaseInStructure* Item6Ptr => (BaseInStructure*) (_headPtr + Item6Offset); + public static readonly int MemorySize = Item5Offset + Item5Size; + + /// + public override int Size => MemorySize; + + private nint _headPtr; + + /// + public override BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; /// - /// Gets or sets item #6 in the chain. + /// Gets or sets the head of the chain. /// - public T6 Item6 + public TChain Head { - get => Unsafe.AsRef(Item6Ptr); + get => Unsafe.AsRef((BaseInStructure*) _headPtr); set { value.StructureType(); - var ptr = Item6Ptr; + var ptr = (BaseInStructure*) _headPtr; var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); + Marshal.StructureToPtr(value, _headPtr, true); ptr->PNext = nextPtr; } } @@ -4291,356 +11692,155 @@ public T6 Item6 /// /// Gets a pointer to the second item in the chain. /// - public BaseInStructure* Item7Ptr => (BaseInStructure*) (_headPtr + Item7Offset); + public BaseInStructure* Item1Ptr => (BaseInStructure*) (_headPtr + Item1Offset); /// - /// Gets or sets item #7 in the chain. + /// Gets or sets item #1 in the chain. /// - public T7 Item7 + public T1 Item1 { - get => Unsafe.AsRef(Item7Ptr); + get => Unsafe.AsRef(Item1Ptr); set { value.StructureType(); - var ptr = Item7Ptr; + var ptr = Item1Ptr; var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, (nint)ptr, true); ptr->PNext = nextPtr; } - } - - /// - /// Creates a new with 8 items from an existing memory block. - /// - /// The pointer to the head of the chain.. - /// - /// Callers are responsible for ensuring the size of the memory is correct. - /// - internal ManagedChain(nint headPtr) - { - _headPtr = headPtr; - } - - /// - /// Creates a new with 8 items. - /// - /// The head of the chain. - /// Item 1. - /// Item 2. - /// Item 3. - /// Item 4. - /// Item 5. - /// Item 6. - /// Item 7. - public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default) - : this(Marshal.AllocHGlobal(MemorySize)) - { - head.StructureType(); - Marshal.StructureToPtr(head, _headPtr, false); - BaseInStructure* itemPtr = Item1Ptr; - item1.StructureType(); - Marshal.StructureToPtr(item1, (nint)itemPtr, false); - HeadPtr->PNext = itemPtr; - itemPtr = Item2Ptr; - item2.StructureType(); - Marshal.StructureToPtr(item2, (nint)itemPtr, false); - Item1Ptr->PNext = itemPtr; - itemPtr = Item3Ptr; - item3.StructureType(); - Marshal.StructureToPtr(item3, (nint)itemPtr, false); - Item2Ptr->PNext = itemPtr; - itemPtr = Item4Ptr; - item4.StructureType(); - Marshal.StructureToPtr(item4, (nint)itemPtr, false); - Item3Ptr->PNext = itemPtr; - itemPtr = Item5Ptr; - item5.StructureType(); - Marshal.StructureToPtr(item5, (nint)itemPtr, false); - Item4Ptr->PNext = itemPtr; - itemPtr = Item6Ptr; - item6.StructureType(); - Marshal.StructureToPtr(item6, (nint)itemPtr, false); - Item5Ptr->PNext = itemPtr; - itemPtr = Item7Ptr; - item7.StructureType(); - Marshal.StructureToPtr(item7, (nint)itemPtr, false); - Item6Ptr->PNext = itemPtr; - Item7Ptr->PNext = null; - } - - /// - /// Creates a new with 8 items from an existing unmanaged chain. - /// - /// Any errors loading the chain. - /// The unmanaged chain to use as the basis of this chain. - public ManagedChain(out string errors, TChain chain) - : this(Marshal.AllocHGlobal(MemorySize)) - { - chain.StructureType(); - Marshal.StructureToPtr(chain, _headPtr, false); - StringBuilder errorBuilder = new StringBuilder(); - var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); - var newPtr = (BaseInStructure*) _headPtr; - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item1Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T1 item1 = default; - var expectedStructureType = item1.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 8"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 2; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item1 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item1, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item2Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T2 item2 = default; - expectedStructureType = item2.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 8"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 3; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item2 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item2, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item3Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T3 item3 = default; - expectedStructureType = item3.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 8"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 4; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item3 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item3, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item4Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T4 item4 = default; - expectedStructureType = item4.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 8"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 5; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item4 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item4, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item5Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T5 item5 = default; - expectedStructureType = item5.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 8"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 6; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item5 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item5, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item6Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T6 item6 = default; - expectedStructureType = item6.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 8"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 7; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item6 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item6, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item7Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item2Ptr => (BaseInStructure*) (_headPtr + Item2Offset); - T7 item7 = default; - expectedStructureType = item7.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 8"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 8; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - if (existingPtr->PNext is not null) { - errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 8"); - existingPtr->PNext = null; - } - item7 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #2 in the chain. + /// + public T2 Item2 + { + get => Unsafe.AsRef(Item2Ptr); + set + { + value.StructureType(); + var ptr = Item2Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item7, (nint) newPtr, false); - - // Create string of errors - errors = errorBuilder.ToString().Trim(); } /// - /// Creates a new with 8 by copying this chain. + /// Gets a pointer to the second item in the chain. /// - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Duplicate() + public BaseInStructure* Item3Ptr => (BaseInStructure*) (_headPtr + Item3Offset); + + /// + /// Gets or sets item #3 in the chain. + /// + public T3 Item3 { - var newHeadPtr = Marshal.AllocHGlobal(MemorySize); - // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); - // Update all pointers - ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); - ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); - ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); - ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); - ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item5Offset); - ((BaseInStructure*)(newHeadPtr + Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item6Offset); - ((BaseInStructure*)(newHeadPtr + Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item7Offset); - return new ManagedChain(newHeadPtr); + get => Unsafe.AsRef(Item3Ptr); + set + { + value.StructureType(); + var ptr = Item3Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } } /// - /// Creates a new with 8 items, by appending - /// to the end of this chain. + /// Gets a pointer to the second item in the chain. /// - /// The chain to append to. - /// Item 7. - /// - /// Do not forget to dispose the chain if you are no longer using it. - /// - public ManagedChain(ManagedChain previous, T7 item7 = default) - : this(Marshal.AllocHGlobal(MemorySize)) - { - var previousSize = MemorySize - Item7Size; - // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); - - // Append item 7 - item7.StructureType(); - Marshal.StructureToPtr(item7, _headPtr + previousSize, false); + public BaseInStructure* Item4Ptr => (BaseInStructure*) (_headPtr + Item4Offset); - // Update all pointers - ((BaseInStructure*)_headPtr)->PNext = (BaseInStructure*) (_headPtr + Item1Offset); - ((BaseInStructure*)(_headPtr + Item1Offset))->PNext = (BaseInStructure*) (_headPtr + Item2Offset); - ((BaseInStructure*)(_headPtr + Item2Offset))->PNext = (BaseInStructure*) (_headPtr + Item3Offset); - ((BaseInStructure*)(_headPtr + Item3Offset))->PNext = (BaseInStructure*) (_headPtr + Item4Offset); - ((BaseInStructure*)(_headPtr + Item4Offset))->PNext = (BaseInStructure*) (_headPtr + Item5Offset); - ((BaseInStructure*)(_headPtr + Item5Offset))->PNext = (BaseInStructure*) (_headPtr + Item6Offset); - ((BaseInStructure*)(_headPtr + Item6Offset))->PNext = (BaseInStructure*) (_headPtr + Item7Offset); - ((BaseInStructure*)(_headPtr + previousSize))->PNext = null; + /// + /// Gets or sets item #4 in the chain. + /// + public T4 Item4 + { + get => Unsafe.AsRef(Item4Ptr); + set + { + value.StructureType(); + var ptr = Item4Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } } /// - /// Creates a new with 7 items, by removing the last item - /// from this chain. + /// Gets a pointer to the second item in the chain. /// - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Truncate() + public BaseInStructure* Item5Ptr => (BaseInStructure*) (_headPtr + Item5Offset); + + /// + /// Gets or sets item #5 in the chain. + /// + public T5 Item5 { - return Truncate(out var _); + get => Unsafe.AsRef(Item5Ptr); + set + { + value.StructureType(); + var ptr = Item5Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } } /// - /// Creates a new with 7 items, by removing - /// from the end of this chain. + /// Creates a new with 6 items from an existing memory block. /// + /// The pointer to the head of the chain. /// - /// Do not forget to dispose this chain if you are no longer using it. + /// Callers are responsible for ensuring the size of the memory is correct. /// - public ManagedChain Truncate(out T7 item7) + internal ManagedChain(nint headPtr) { - item7 = Item7; - - var newSize = MemorySize - Item7Size; - var newHeadPtr = Marshal.AllocHGlobal(newSize); - // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); - // Update all pointers - ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); - ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); - ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); - ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); - ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item5Offset); - ((BaseInStructure*)(newHeadPtr + Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item6Offset); - ((BaseInStructure*)(newHeadPtr + Item6Offset))->PNext = null; - return new ManagedChain(newHeadPtr); + _headPtr = headPtr; } /// - /// Creates a new with 9 items, by appending to - /// the end of this chain. + /// Creates a new with 6 items. /// - /// Item 8. - /// Type of Item 8 - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Append(T8 item8 = default) - where T8: struct, IExtendsChain + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + internal ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default) + : this(Marshal.AllocHGlobal(MemorySize)) { - return new ManagedChain(this, item8); + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + var itemPtr = Item1Ptr; + item1.StructureType(); + Marshal.StructureToPtr(item1, (nint)itemPtr, false); + HeadPtr->PNext = itemPtr; + itemPtr = Item2Ptr; + item2.StructureType(); + Marshal.StructureToPtr(item2, (nint)itemPtr, false); + Item1Ptr->PNext = itemPtr; + itemPtr = Item3Ptr; + item3.StructureType(); + Marshal.StructureToPtr(item3, (nint)itemPtr, false); + Item2Ptr->PNext = itemPtr; + itemPtr = Item4Ptr; + item4.StructureType(); + Marshal.StructureToPtr(item4, (nint)itemPtr, false); + Item3Ptr->PNext = itemPtr; + itemPtr = Item5Ptr; + item5.StructureType(); + Marshal.StructureToPtr(item5, (nint)itemPtr, false); + Item4Ptr->PNext = itemPtr; + Item5Ptr->PNext = null; } /// @@ -4652,12 +11852,10 @@ public override IEnumerator GetEnumerator() yield return Item3; yield return Item4; yield return Item5; - yield return Item6; - yield return Item7; } /// - public override int Count => 8; + public override int Count => 6; /// public override IChainable this[int index] @@ -4669,11 +11867,110 @@ public override IChainable this[int index] 3 => Item3, 4 => Item4, 5 => Item5, - 6 => Item6, - 7 => Item7, _ => throw new IndexOutOfRangeException() }; + /// + /// Compares the supplied memory block with this one, ignoring the structure headers. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + protected override bool MemoryEquals(ManagedChain other) + { + var ptr = HeadPtr; + var otherPtr = other.HeadPtr; + if (ptr == otherPtr) { + return true; + } + var span = new ReadOnlySpan((void*) ptr, MemorySize); + var otherSpan = new ReadOnlySpan((void*) otherPtr, MemorySize); + var start = 0; + var length = HeadSize; + var sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item1Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item2Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item3Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item4Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item5Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + return true; + } + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Equals(ManagedChain other) + => !ReferenceEquals(null, other) && (ReferenceEquals(this, other) || MemoryEquals(other)); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator ==(ManagedChain left, ManagedChain right) => + ReferenceEquals(null, left) + ? ReferenceEquals(null, right) + : !ReferenceEquals(null, right) && (ReferenceEquals(left, right) || left.MemoryEquals(right)); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator !=(ManagedChain left, ManagedChain right) => + ReferenceEquals(null, left) + ? !ReferenceEquals(null, right) + : ReferenceEquals(null, right) || (!ReferenceEquals(left, right) && !left.MemoryEquals(right)); + + /// + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append("("); + sb.Append((object) Head); sb.Append(", "); + sb.Append((object) Item1); + sb.Append(", "); + sb.Append((object) Item2); + sb.Append(", "); + sb.Append((object) Item3); + sb.Append(", "); + sb.Append((object) Item4); + sb.Append(", "); + sb.Append((object) Item5); + sb.Append(")"); + return sb.ToString(); + } + /// /// Deconstructs this chain. /// @@ -4683,9 +11980,7 @@ public override IChainable this[int index] /// Item 3. /// Item 4. /// Item 5. - /// Item 6. - /// Item 7. - public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6, out T7 item7) + public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5) { head = Head; item1 = Item1; @@ -4693,8 +11988,6 @@ public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item item3 = Item3; item4 = Item4; item5 = Item5; - item6 = Item6; - item7 = Item7; } /// @@ -4712,8 +12005,6 @@ public override void Dispose() Marshal.DestroyStructure(headPtr + Item3Offset); Marshal.DestroyStructure(headPtr + Item4Offset); Marshal.DestroyStructure(headPtr + Item5Offset); - Marshal.DestroyStructure(headPtr + Item6Offset); - Marshal.DestroyStructure(headPtr + Item7Offset); // Free memory block Marshal.FreeHGlobal(headPtr); @@ -4721,7 +12012,7 @@ public override void Dispose() } /// -/// A safely manages the pointers of a managed structure chain. +/// A safely manages the pointers of a managed structure chain. /// /// The chain type /// Type of Item 1. @@ -4730,19 +12021,20 @@ public override void Dispose() /// Type of Item 4. /// Type of Item 5. /// Type of Item 6. -/// Type of Item 7. -/// Type of Item 8. -public unsafe class ManagedChain : ManagedChain - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain - where T8 : struct, IExtendsChain +public unsafe sealed class ManagedChain : ManagedChain, IEquatable> + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable { + /// + /// Gets the size (in bytes) of the default structure header. + /// + public static readonly int HeaderSize = Marshal.SizeOf(); + /// /// Gets the size (in bytes) of the head structure. /// @@ -4808,37 +12100,18 @@ public unsafe class ManagedChain : Manag /// public static readonly int Item6Size = Marshal.SizeOf(); - /// - /// Gets the offset to the start of . - /// - public static readonly int Item7Offset = Item6Offset + Item6Size; - - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item7Size = Marshal.SizeOf(); - - /// - /// Gets the offset to the start of . - /// - public static readonly int Item8Offset = Item7Offset + Item7Size; - - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item8Size = Marshal.SizeOf(); - /// /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. /// - public static readonly int MemorySize = Item8Offset + Item8Size; - + public static readonly int MemorySize = Item6Offset + Item6Size; + + /// + public override int Size => MemorySize; + private nint _headPtr; - /// - /// Gets a pointer to the current head. - /// - public BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; + /// + public override BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; /// /// Gets or sets the head of the chain. @@ -4983,51 +12256,9 @@ public T6 Item6 } /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item7Ptr => (BaseInStructure*) (_headPtr + Item7Offset); - - /// - /// Gets or sets item #7 in the chain. - /// - public T7 Item7 - { - get => Unsafe.AsRef(Item7Ptr); - set - { - value.StructureType(); - var ptr = Item7Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item8Ptr => (BaseInStructure*) (_headPtr + Item8Offset); - - /// - /// Gets or sets item #8 in the chain. - /// - public T8 Item8 - { - get => Unsafe.AsRef(Item8Ptr); - set - { - value.StructureType(); - var ptr = Item8Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Creates a new with 9 items from an existing memory block. + /// Creates a new with 7 items from an existing memory block. /// - /// The pointer to the head of the chain.. + /// The pointer to the head of the chain. /// /// Callers are responsible for ensuring the size of the memory is correct. /// @@ -5037,7 +12268,7 @@ internal ManagedChain(nint headPtr) } /// - /// Creates a new with 9 items. + /// Creates a new with 7 items. /// /// The head of the chain. /// Item 1. @@ -5046,14 +12277,12 @@ internal ManagedChain(nint headPtr) /// Item 4. /// Item 5. /// Item 6. - /// Item 7. - /// Item 8. - public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default) + internal ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default) : this(Marshal.AllocHGlobal(MemorySize)) { head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); - BaseInStructure* itemPtr = Item1Ptr; + var itemPtr = Item1Ptr; item1.StructureType(); Marshal.StructureToPtr(item1, (nint)itemPtr, false); HeadPtr->PNext = itemPtr; @@ -5077,314 +12306,7 @@ public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = defaul item6.StructureType(); Marshal.StructureToPtr(item6, (nint)itemPtr, false); Item5Ptr->PNext = itemPtr; - itemPtr = Item7Ptr; - item7.StructureType(); - Marshal.StructureToPtr(item7, (nint)itemPtr, false); - Item6Ptr->PNext = itemPtr; - itemPtr = Item8Ptr; - item8.StructureType(); - Marshal.StructureToPtr(item8, (nint)itemPtr, false); - Item7Ptr->PNext = itemPtr; - Item8Ptr->PNext = null; - } - - /// - /// Creates a new with 9 items from an existing unmanaged chain. - /// - /// Any errors loading the chain. - /// The unmanaged chain to use as the basis of this chain. - public ManagedChain(out string errors, TChain chain) - : this(Marshal.AllocHGlobal(MemorySize)) - { - chain.StructureType(); - Marshal.StructureToPtr(chain, _headPtr, false); - StringBuilder errorBuilder = new StringBuilder(); - var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); - var newPtr = (BaseInStructure*) _headPtr; - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item1Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T1 item1 = default; - var expectedStructureType = item1.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 9"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 2; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item1 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item1, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item2Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T2 item2 = default; - expectedStructureType = item2.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 9"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 3; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item2 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item2, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item3Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T3 item3 = default; - expectedStructureType = item3.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 9"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 4; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item3 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item3, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item4Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T4 item4 = default; - expectedStructureType = item4.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 9"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 5; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item4 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item4, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item5Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T5 item5 = default; - expectedStructureType = item5.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 9"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 6; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item5 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item5, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item6Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T6 item6 = default; - expectedStructureType = item6.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 9"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 7; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item6 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item6, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item7Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T7 item7 = default; - expectedStructureType = item7.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 9"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 8; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item7 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item7, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item8Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T8 item8 = default; - expectedStructureType = item8.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 9"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 9; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - if (existingPtr->PNext is not null) { - errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 9"); - existingPtr->PNext = null; - } - item8 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item8, (nint) newPtr, false); - - // Create string of errors - errors = errorBuilder.ToString().Trim(); - } - - /// - /// Creates a new with 9 by copying this chain. - /// - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Duplicate() - { - var newHeadPtr = Marshal.AllocHGlobal(MemorySize); - // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); - // Update all pointers - ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); - ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); - ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); - ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); - ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item5Offset); - ((BaseInStructure*)(newHeadPtr + Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item6Offset); - ((BaseInStructure*)(newHeadPtr + Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item7Offset); - ((BaseInStructure*)(newHeadPtr + Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item8Offset); - return new ManagedChain(newHeadPtr); - } - - /// - /// Creates a new with 9 items, by appending - /// to the end of this chain. - /// - /// The chain to append to. - /// Item 8. - /// - /// Do not forget to dispose the chain if you are no longer using it. - /// - public ManagedChain(ManagedChain previous, T8 item8 = default) - : this(Marshal.AllocHGlobal(MemorySize)) - { - var previousSize = MemorySize - Item8Size; - // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); - - // Append item 8 - item8.StructureType(); - Marshal.StructureToPtr(item8, _headPtr + previousSize, false); - - // Update all pointers - ((BaseInStructure*)_headPtr)->PNext = (BaseInStructure*) (_headPtr + Item1Offset); - ((BaseInStructure*)(_headPtr + Item1Offset))->PNext = (BaseInStructure*) (_headPtr + Item2Offset); - ((BaseInStructure*)(_headPtr + Item2Offset))->PNext = (BaseInStructure*) (_headPtr + Item3Offset); - ((BaseInStructure*)(_headPtr + Item3Offset))->PNext = (BaseInStructure*) (_headPtr + Item4Offset); - ((BaseInStructure*)(_headPtr + Item4Offset))->PNext = (BaseInStructure*) (_headPtr + Item5Offset); - ((BaseInStructure*)(_headPtr + Item5Offset))->PNext = (BaseInStructure*) (_headPtr + Item6Offset); - ((BaseInStructure*)(_headPtr + Item6Offset))->PNext = (BaseInStructure*) (_headPtr + Item7Offset); - ((BaseInStructure*)(_headPtr + Item7Offset))->PNext = (BaseInStructure*) (_headPtr + Item8Offset); - ((BaseInStructure*)(_headPtr + previousSize))->PNext = null; - } - - /// - /// Creates a new with 8 items, by removing the last item - /// from this chain. - /// - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Truncate() - { - return Truncate(out var _); - } - - /// - /// Creates a new with 8 items, by removing - /// from the end of this chain. - /// - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Truncate(out T8 item8) - { - item8 = Item8; - - var newSize = MemorySize - Item8Size; - var newHeadPtr = Marshal.AllocHGlobal(newSize); - // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); - // Update all pointers - ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); - ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); - ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); - ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); - ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item5Offset); - ((BaseInStructure*)(newHeadPtr + Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item6Offset); - ((BaseInStructure*)(newHeadPtr + Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item7Offset); - ((BaseInStructure*)(newHeadPtr + Item7Offset))->PNext = null; - return new ManagedChain(newHeadPtr); - } - - /// - /// Creates a new with 10 items, by appending to - /// the end of this chain. - /// - /// Item 9. - /// Type of Item 9 - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Append(T9 item9 = default) - where T9: struct, IExtendsChain - { - return new ManagedChain(this, item9); + Item6Ptr->PNext = null; } /// @@ -5397,12 +12319,10 @@ public override IEnumerator GetEnumerator() yield return Item4; yield return Item5; yield return Item6; - yield return Item7; - yield return Item8; } /// - public override int Count => 9; + public override int Count => 7; /// public override IChainable this[int index] @@ -5415,11 +12335,120 @@ public override IChainable this[int index] 4 => Item4, 5 => Item5, 6 => Item6, - 7 => Item7, - 8 => Item8, _ => throw new IndexOutOfRangeException() }; + /// + /// Compares the supplied memory block with this one, ignoring the structure headers. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + protected override bool MemoryEquals(ManagedChain other) + { + var ptr = HeadPtr; + var otherPtr = other.HeadPtr; + if (ptr == otherPtr) { + return true; + } + var span = new ReadOnlySpan((void*) ptr, MemorySize); + var otherSpan = new ReadOnlySpan((void*) otherPtr, MemorySize); + var start = 0; + var length = HeadSize; + var sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item1Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item2Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item3Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item4Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item5Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item6Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + return true; + } + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Equals(ManagedChain other) + => !ReferenceEquals(null, other) && (ReferenceEquals(this, other) || MemoryEquals(other)); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator ==(ManagedChain left, ManagedChain right) => + ReferenceEquals(null, left) + ? ReferenceEquals(null, right) + : !ReferenceEquals(null, right) && (ReferenceEquals(left, right) || left.MemoryEquals(right)); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator !=(ManagedChain left, ManagedChain right) => + ReferenceEquals(null, left) + ? !ReferenceEquals(null, right) + : ReferenceEquals(null, right) || (!ReferenceEquals(left, right) && !left.MemoryEquals(right)); + + /// + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append("("); + sb.Append((object) Head); sb.Append(", "); + sb.Append((object) Item1); + sb.Append(", "); + sb.Append((object) Item2); + sb.Append(", "); + sb.Append((object) Item3); + sb.Append(", "); + sb.Append((object) Item4); + sb.Append(", "); + sb.Append((object) Item5); + sb.Append(", "); + sb.Append((object) Item6); + sb.Append(")"); + return sb.ToString(); + } + /// /// Deconstructs this chain. /// @@ -5429,10 +12458,8 @@ public override IChainable this[int index] /// Item 3. /// Item 4. /// Item 5. - /// Item 6. - /// Item 7. - /// Item 8. - public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6, out T7 item7, out T8 item8) + /// Item 6. + public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6) { head = Head; item1 = Item1; @@ -5441,8 +12468,6 @@ public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item item4 = Item4; item5 = Item5; item6 = Item6; - item7 = Item7; - item8 = Item8; } /// @@ -5461,8 +12486,6 @@ public override void Dispose() Marshal.DestroyStructure(headPtr + Item4Offset); Marshal.DestroyStructure(headPtr + Item5Offset); Marshal.DestroyStructure(headPtr + Item6Offset); - Marshal.DestroyStructure(headPtr + Item7Offset); - Marshal.DestroyStructure(headPtr + Item8Offset); // Free memory block Marshal.FreeHGlobal(headPtr); @@ -5470,7 +12493,7 @@ public override void Dispose() } /// -/// A safely manages the pointers of a managed structure chain. +/// A safely manages the pointers of a managed structure chain. /// /// The chain type /// Type of Item 1. @@ -5480,20 +12503,21 @@ public override void Dispose() /// Type of Item 5. /// Type of Item 6. /// Type of Item 7. -/// Type of Item 8. -/// Type of Item 9. -public unsafe class ManagedChain : ManagedChain - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain - where T8 : struct, IExtendsChain - where T9 : struct, IExtendsChain +public unsafe sealed class ManagedChain : ManagedChain, IEquatable> + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable { + /// + /// Gets the size (in bytes) of the default structure header. + /// + public static readonly int HeaderSize = Marshal.SizeOf(); + /// /// Gets the size (in bytes) of the head structure. /// @@ -5569,37 +12593,18 @@ public unsafe class ManagedChain : M /// public static readonly int Item7Size = Marshal.SizeOf(); - /// - /// Gets the offset to the start of . - /// - public static readonly int Item8Offset = Item7Offset + Item7Size; - - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item8Size = Marshal.SizeOf(); - - /// - /// Gets the offset to the start of . - /// - public static readonly int Item9Offset = Item8Offset + Item8Size; - - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item9Size = Marshal.SizeOf(); - /// /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. /// - public static readonly int MemorySize = Item9Offset + Item9Size; - + public static readonly int MemorySize = Item7Offset + Item7Size; + + /// + public override int Size => MemorySize; + private nint _headPtr; - /// - /// Gets a pointer to the current head. - /// - public BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; + /// + public override BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; /// /// Gets or sets the head of the chain. @@ -5723,479 +12728,676 @@ public T5 Item5 } /// - /// Gets a pointer to the second item in the chain. + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item6Ptr => (BaseInStructure*) (_headPtr + Item6Offset); + + /// + /// Gets or sets item #6 in the chain. + /// + public T6 Item6 + { + get => Unsafe.AsRef(Item6Ptr); + set + { + value.StructureType(); + var ptr = Item6Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } + } + + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item7Ptr => (BaseInStructure*) (_headPtr + Item7Offset); + + /// + /// Gets or sets item #7 in the chain. + /// + public T7 Item7 + { + get => Unsafe.AsRef(Item7Ptr); + set + { + value.StructureType(); + var ptr = Item7Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } + } + + /// + /// Creates a new with 8 items from an existing memory block. + /// + /// The pointer to the head of the chain. + /// + /// Callers are responsible for ensuring the size of the memory is correct. + /// + internal ManagedChain(nint headPtr) + { + _headPtr = headPtr; + } + + /// + /// Creates a new with 8 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + internal ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default) + : this(Marshal.AllocHGlobal(MemorySize)) + { + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + var itemPtr = Item1Ptr; + item1.StructureType(); + Marshal.StructureToPtr(item1, (nint)itemPtr, false); + HeadPtr->PNext = itemPtr; + itemPtr = Item2Ptr; + item2.StructureType(); + Marshal.StructureToPtr(item2, (nint)itemPtr, false); + Item1Ptr->PNext = itemPtr; + itemPtr = Item3Ptr; + item3.StructureType(); + Marshal.StructureToPtr(item3, (nint)itemPtr, false); + Item2Ptr->PNext = itemPtr; + itemPtr = Item4Ptr; + item4.StructureType(); + Marshal.StructureToPtr(item4, (nint)itemPtr, false); + Item3Ptr->PNext = itemPtr; + itemPtr = Item5Ptr; + item5.StructureType(); + Marshal.StructureToPtr(item5, (nint)itemPtr, false); + Item4Ptr->PNext = itemPtr; + itemPtr = Item6Ptr; + item6.StructureType(); + Marshal.StructureToPtr(item6, (nint)itemPtr, false); + Item5Ptr->PNext = itemPtr; + itemPtr = Item7Ptr; + item7.StructureType(); + Marshal.StructureToPtr(item7, (nint)itemPtr, false); + Item6Ptr->PNext = itemPtr; + Item7Ptr->PNext = null; + } + + /// + public override IEnumerator GetEnumerator() + { + yield return Head; + yield return Item1; + yield return Item2; + yield return Item3; + yield return Item4; + yield return Item5; + yield return Item6; + yield return Item7; + } + + /// + public override int Count => 8; + + /// + public override IChainable this[int index] + => index switch + { + 0 => Head, + 1 => Item1, + 2 => Item2, + 3 => Item3, + 4 => Item4, + 5 => Item5, + 6 => Item6, + 7 => Item7, + _ => throw new IndexOutOfRangeException() + }; + + /// + /// Compares the supplied memory block with this one, ignoring the structure headers. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + protected override bool MemoryEquals(ManagedChain other) + { + var ptr = HeadPtr; + var otherPtr = other.HeadPtr; + if (ptr == otherPtr) { + return true; + } + var span = new ReadOnlySpan((void*) ptr, MemorySize); + var otherSpan = new ReadOnlySpan((void*) otherPtr, MemorySize); + var start = 0; + var length = HeadSize; + var sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item1Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item2Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item3Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item4Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item5Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item6Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item7Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + return true; + } + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Equals(ManagedChain other) + => !ReferenceEquals(null, other) && (ReferenceEquals(this, other) || MemoryEquals(other)); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator ==(ManagedChain left, ManagedChain right) => + ReferenceEquals(null, left) + ? ReferenceEquals(null, right) + : !ReferenceEquals(null, right) && (ReferenceEquals(left, right) || left.MemoryEquals(right)); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator !=(ManagedChain left, ManagedChain right) => + ReferenceEquals(null, left) + ? !ReferenceEquals(null, right) + : ReferenceEquals(null, right) || (!ReferenceEquals(left, right) && !left.MemoryEquals(right)); + + /// + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append("("); + sb.Append((object) Head); sb.Append(", "); + sb.Append((object) Item1); + sb.Append(", "); + sb.Append((object) Item2); + sb.Append(", "); + sb.Append((object) Item3); + sb.Append(", "); + sb.Append((object) Item4); + sb.Append(", "); + sb.Append((object) Item5); + sb.Append(", "); + sb.Append((object) Item6); + sb.Append(", "); + sb.Append((object) Item7); + sb.Append(")"); + return sb.ToString(); + } + + /// + /// Deconstructs this chain. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6, out T7 item7) + { + head = Head; + item1 = Item1; + item2 = Item2; + item3 = Item3; + item4 = Item4; + item5 = Item5; + item6 = Item6; + item7 = Item7; + } + + /// + public override void Dispose() + { + var headPtr = Interlocked.Exchange(ref _headPtr, (nint)0); + if (headPtr == (nint)0) { + return; + } + + // Destroy all structures + Marshal.DestroyStructure(headPtr); + Marshal.DestroyStructure(headPtr + Item1Offset); + Marshal.DestroyStructure(headPtr + Item2Offset); + Marshal.DestroyStructure(headPtr + Item3Offset); + Marshal.DestroyStructure(headPtr + Item4Offset); + Marshal.DestroyStructure(headPtr + Item5Offset); + Marshal.DestroyStructure(headPtr + Item6Offset); + Marshal.DestroyStructure(headPtr + Item7Offset); + + // Free memory block + Marshal.FreeHGlobal(headPtr); + } +} + +/// +/// A safely manages the pointers of a managed structure chain. +/// +/// The chain type +/// Type of Item 1. +/// Type of Item 2. +/// Type of Item 3. +/// Type of Item 4. +/// Type of Item 5. +/// Type of Item 6. +/// Type of Item 7. +/// Type of Item 8. +public unsafe sealed class ManagedChain : ManagedChain, IEquatable> + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable +{ + /// + /// Gets the size (in bytes) of the default structure header. + /// + public static readonly int HeaderSize = Marshal.SizeOf(); + + /// + /// Gets the size (in bytes) of the head structure. + /// + public static readonly int HeadSize = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item1Offset = HeadSize; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item1Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . /// - public BaseInStructure* Item6Ptr => (BaseInStructure*) (_headPtr + Item6Offset); + public static readonly int Item2Offset = Item1Offset + Item1Size; /// - /// Gets or sets item #6 in the chain. + /// Gets the size (in bytes) of the Item 1. /// - public T6 Item6 - { - get => Unsafe.AsRef(Item6Ptr); - set - { - value.StructureType(); - var ptr = Item6Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } + public static readonly int Item2Size = Marshal.SizeOf(); /// - /// Gets a pointer to the second item in the chain. + /// Gets the offset to the start of . /// - public BaseInStructure* Item7Ptr => (BaseInStructure*) (_headPtr + Item7Offset); + public static readonly int Item3Offset = Item2Offset + Item2Size; /// - /// Gets or sets item #7 in the chain. + /// Gets the size (in bytes) of the Item 1. /// - public T7 Item7 - { - get => Unsafe.AsRef(Item7Ptr); - set - { - value.StructureType(); - var ptr = Item7Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } + public static readonly int Item3Size = Marshal.SizeOf(); /// - /// Gets a pointer to the second item in the chain. + /// Gets the offset to the start of . /// - public BaseInStructure* Item8Ptr => (BaseInStructure*) (_headPtr + Item8Offset); + public static readonly int Item4Offset = Item3Offset + Item3Size; /// - /// Gets or sets item #8 in the chain. + /// Gets the size (in bytes) of the Item 1. /// - public T8 Item8 - { - get => Unsafe.AsRef(Item8Ptr); - set - { - value.StructureType(); - var ptr = Item8Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } + public static readonly int Item4Size = Marshal.SizeOf(); /// - /// Gets a pointer to the second item in the chain. + /// Gets the offset to the start of . /// - public BaseInStructure* Item9Ptr => (BaseInStructure*) (_headPtr + Item9Offset); + public static readonly int Item5Offset = Item4Offset + Item4Size; /// - /// Gets or sets item #9 in the chain. + /// Gets the size (in bytes) of the Item 1. /// - public T9 Item9 - { - get => Unsafe.AsRef(Item9Ptr); - set - { - value.StructureType(); - var ptr = Item9Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } + public static readonly int Item5Size = Marshal.SizeOf(); /// - /// Creates a new with 10 items from an existing memory block. + /// Gets the offset to the start of . /// - /// The pointer to the head of the chain.. - /// - /// Callers are responsible for ensuring the size of the memory is correct. - /// - internal ManagedChain(nint headPtr) - { - _headPtr = headPtr; - } + public static readonly int Item6Offset = Item5Offset + Item5Size; /// - /// Creates a new with 10 items. + /// Gets the size (in bytes) of the Item 1. /// - /// The head of the chain. - /// Item 1. - /// Item 2. - /// Item 3. - /// Item 4. - /// Item 5. - /// Item 6. - /// Item 7. - /// Item 8. - /// Item 9. - public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default) - : this(Marshal.AllocHGlobal(MemorySize)) - { - head.StructureType(); - Marshal.StructureToPtr(head, _headPtr, false); - BaseInStructure* itemPtr = Item1Ptr; - item1.StructureType(); - Marshal.StructureToPtr(item1, (nint)itemPtr, false); - HeadPtr->PNext = itemPtr; - itemPtr = Item2Ptr; - item2.StructureType(); - Marshal.StructureToPtr(item2, (nint)itemPtr, false); - Item1Ptr->PNext = itemPtr; - itemPtr = Item3Ptr; - item3.StructureType(); - Marshal.StructureToPtr(item3, (nint)itemPtr, false); - Item2Ptr->PNext = itemPtr; - itemPtr = Item4Ptr; - item4.StructureType(); - Marshal.StructureToPtr(item4, (nint)itemPtr, false); - Item3Ptr->PNext = itemPtr; - itemPtr = Item5Ptr; - item5.StructureType(); - Marshal.StructureToPtr(item5, (nint)itemPtr, false); - Item4Ptr->PNext = itemPtr; - itemPtr = Item6Ptr; - item6.StructureType(); - Marshal.StructureToPtr(item6, (nint)itemPtr, false); - Item5Ptr->PNext = itemPtr; - itemPtr = Item7Ptr; - item7.StructureType(); - Marshal.StructureToPtr(item7, (nint)itemPtr, false); - Item6Ptr->PNext = itemPtr; - itemPtr = Item8Ptr; - item8.StructureType(); - Marshal.StructureToPtr(item8, (nint)itemPtr, false); - Item7Ptr->PNext = itemPtr; - itemPtr = Item9Ptr; - item9.StructureType(); - Marshal.StructureToPtr(item9, (nint)itemPtr, false); - Item8Ptr->PNext = itemPtr; - Item9Ptr->PNext = null; - } + public static readonly int Item6Size = Marshal.SizeOf(); /// - /// Creates a new with 10 items from an existing unmanaged chain. + /// Gets the offset to the start of . /// - /// Any errors loading the chain. - /// The unmanaged chain to use as the basis of this chain. - public ManagedChain(out string errors, TChain chain) - : this(Marshal.AllocHGlobal(MemorySize)) - { - chain.StructureType(); - Marshal.StructureToPtr(chain, _headPtr, false); - StringBuilder errorBuilder = new StringBuilder(); - var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); - var newPtr = (BaseInStructure*) _headPtr; - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item1Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T1 item1 = default; - var expectedStructureType = item1.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 10"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 2; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item1 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item1, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item2Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + public static readonly int Item7Offset = Item6Offset + Item6Size; - T2 item2 = default; - expectedStructureType = item2.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 10"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 3; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item2 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item2, (nint) newPtr, false); + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item7Size = Marshal.SizeOf(); - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item3Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets the offset to the start of . + /// + public static readonly int Item8Offset = Item7Offset + Item7Size; - T3 item3 = default; - expectedStructureType = item3.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 10"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 4; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item3 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item3, (nint) newPtr, false); + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item8Size = Marshal.SizeOf(); - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item4Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. + /// + public static readonly int MemorySize = Item8Offset + Item8Size; + + /// + public override int Size => MemorySize; - T4 item4 = default; - expectedStructureType = item4.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 10"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 5; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item4 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item4, (nint) newPtr, false); + private nint _headPtr; - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item5Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + public override BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; - T5 item5 = default; - expectedStructureType = item5.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 10"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 6; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item5 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets the head of the chain. + /// + public TChain Head + { + get => Unsafe.AsRef((BaseInStructure*) _headPtr); + set + { + value.StructureType(); + var ptr = (BaseInStructure*) _headPtr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, _headPtr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item5, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item6Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item1Ptr => (BaseInStructure*) (_headPtr + Item1Offset); - T6 item6 = default; - expectedStructureType = item6.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 10"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 7; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item6 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #1 in the chain. + /// + public T1 Item1 + { + get => Unsafe.AsRef(Item1Ptr); + set + { + value.StructureType(); + var ptr = Item1Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item6, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item7Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item2Ptr => (BaseInStructure*) (_headPtr + Item2Offset); - T7 item7 = default; - expectedStructureType = item7.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 10"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 8; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item7 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #2 in the chain. + /// + public T2 Item2 + { + get => Unsafe.AsRef(Item2Ptr); + set + { + value.StructureType(); + var ptr = Item2Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item7, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item8Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item3Ptr => (BaseInStructure*) (_headPtr + Item3Offset); - T8 item8 = default; - expectedStructureType = item8.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 10"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 9; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item8 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #3 in the chain. + /// + public T3 Item3 + { + get => Unsafe.AsRef(Item3Ptr); + set + { + value.StructureType(); + var ptr = Item3Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item8, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item9Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item4Ptr => (BaseInStructure*) (_headPtr + Item4Offset); - T9 item9 = default; - expectedStructureType = item9.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 9, expected length 10"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 10; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - if (existingPtr->PNext is not null) { - errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 10"); - existingPtr->PNext = null; - } - item9 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #4 in the chain. + /// + public T4 Item4 + { + get => Unsafe.AsRef(Item4Ptr); + set + { + value.StructureType(); + var ptr = Item4Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item9, (nint) newPtr, false); - - // Create string of errors - errors = errorBuilder.ToString().Trim(); } /// - /// Creates a new with 10 by copying this chain. + /// Gets a pointer to the second item in the chain. /// - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Duplicate() + public BaseInStructure* Item5Ptr => (BaseInStructure*) (_headPtr + Item5Offset); + + /// + /// Gets or sets item #5 in the chain. + /// + public T5 Item5 { - var newHeadPtr = Marshal.AllocHGlobal(MemorySize); - // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); - // Update all pointers - ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); - ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); - ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); - ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); - ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item5Offset); - ((BaseInStructure*)(newHeadPtr + Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item6Offset); - ((BaseInStructure*)(newHeadPtr + Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item7Offset); - ((BaseInStructure*)(newHeadPtr + Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item8Offset); - ((BaseInStructure*)(newHeadPtr + Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item9Offset); - return new ManagedChain(newHeadPtr); + get => Unsafe.AsRef(Item5Ptr); + set + { + value.StructureType(); + var ptr = Item5Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } } /// - /// Creates a new with 10 items, by appending - /// to the end of this chain. + /// Gets a pointer to the second item in the chain. /// - /// The chain to append to. - /// Item 9. - /// - /// Do not forget to dispose the chain if you are no longer using it. - /// - public ManagedChain(ManagedChain previous, T9 item9 = default) - : this(Marshal.AllocHGlobal(MemorySize)) + public BaseInStructure* Item6Ptr => (BaseInStructure*) (_headPtr + Item6Offset); + + /// + /// Gets or sets item #6 in the chain. + /// + public T6 Item6 { - var previousSize = MemorySize - Item9Size; - // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); - - // Append item 9 - item9.StructureType(); - Marshal.StructureToPtr(item9, _headPtr + previousSize, false); + get => Unsafe.AsRef(Item6Ptr); + set + { + value.StructureType(); + var ptr = Item6Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } + } - // Update all pointers - ((BaseInStructure*)_headPtr)->PNext = (BaseInStructure*) (_headPtr + Item1Offset); - ((BaseInStructure*)(_headPtr + Item1Offset))->PNext = (BaseInStructure*) (_headPtr + Item2Offset); - ((BaseInStructure*)(_headPtr + Item2Offset))->PNext = (BaseInStructure*) (_headPtr + Item3Offset); - ((BaseInStructure*)(_headPtr + Item3Offset))->PNext = (BaseInStructure*) (_headPtr + Item4Offset); - ((BaseInStructure*)(_headPtr + Item4Offset))->PNext = (BaseInStructure*) (_headPtr + Item5Offset); - ((BaseInStructure*)(_headPtr + Item5Offset))->PNext = (BaseInStructure*) (_headPtr + Item6Offset); - ((BaseInStructure*)(_headPtr + Item6Offset))->PNext = (BaseInStructure*) (_headPtr + Item7Offset); - ((BaseInStructure*)(_headPtr + Item7Offset))->PNext = (BaseInStructure*) (_headPtr + Item8Offset); - ((BaseInStructure*)(_headPtr + Item8Offset))->PNext = (BaseInStructure*) (_headPtr + Item9Offset); - ((BaseInStructure*)(_headPtr + previousSize))->PNext = null; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item7Ptr => (BaseInStructure*) (_headPtr + Item7Offset); + + /// + /// Gets or sets item #7 in the chain. + /// + public T7 Item7 + { + get => Unsafe.AsRef(Item7Ptr); + set + { + value.StructureType(); + var ptr = Item7Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } } /// - /// Creates a new with 9 items, by removing the last item - /// from this chain. + /// Gets a pointer to the second item in the chain. /// - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Truncate() + public BaseInStructure* Item8Ptr => (BaseInStructure*) (_headPtr + Item8Offset); + + /// + /// Gets or sets item #8 in the chain. + /// + public T8 Item8 { - return Truncate(out var _); + get => Unsafe.AsRef(Item8Ptr); + set + { + value.StructureType(); + var ptr = Item8Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } } /// - /// Creates a new with 9 items, by removing - /// from the end of this chain. + /// Creates a new with 9 items from an existing memory block. /// + /// The pointer to the head of the chain. /// - /// Do not forget to dispose this chain if you are no longer using it. + /// Callers are responsible for ensuring the size of the memory is correct. /// - public ManagedChain Truncate(out T9 item9) + internal ManagedChain(nint headPtr) { - item9 = Item9; - - var newSize = MemorySize - Item9Size; - var newHeadPtr = Marshal.AllocHGlobal(newSize); - // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); - // Update all pointers - ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); - ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); - ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); - ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); - ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item5Offset); - ((BaseInStructure*)(newHeadPtr + Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item6Offset); - ((BaseInStructure*)(newHeadPtr + Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item7Offset); - ((BaseInStructure*)(newHeadPtr + Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item8Offset); - ((BaseInStructure*)(newHeadPtr + Item8Offset))->PNext = null; - return new ManagedChain(newHeadPtr); + _headPtr = headPtr; } /// - /// Creates a new with 11 items, by appending to - /// the end of this chain. + /// Creates a new with 9 items. /// - /// Item 10. - /// Type of Item 10 - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Append(T10 item10 = default) - where T10: struct, IExtendsChain + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + internal ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default) + : this(Marshal.AllocHGlobal(MemorySize)) { - return new ManagedChain(this, item10); + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + var itemPtr = Item1Ptr; + item1.StructureType(); + Marshal.StructureToPtr(item1, (nint)itemPtr, false); + HeadPtr->PNext = itemPtr; + itemPtr = Item2Ptr; + item2.StructureType(); + Marshal.StructureToPtr(item2, (nint)itemPtr, false); + Item1Ptr->PNext = itemPtr; + itemPtr = Item3Ptr; + item3.StructureType(); + Marshal.StructureToPtr(item3, (nint)itemPtr, false); + Item2Ptr->PNext = itemPtr; + itemPtr = Item4Ptr; + item4.StructureType(); + Marshal.StructureToPtr(item4, (nint)itemPtr, false); + Item3Ptr->PNext = itemPtr; + itemPtr = Item5Ptr; + item5.StructureType(); + Marshal.StructureToPtr(item5, (nint)itemPtr, false); + Item4Ptr->PNext = itemPtr; + itemPtr = Item6Ptr; + item6.StructureType(); + Marshal.StructureToPtr(item6, (nint)itemPtr, false); + Item5Ptr->PNext = itemPtr; + itemPtr = Item7Ptr; + item7.StructureType(); + Marshal.StructureToPtr(item7, (nint)itemPtr, false); + Item6Ptr->PNext = itemPtr; + itemPtr = Item8Ptr; + item8.StructureType(); + Marshal.StructureToPtr(item8, (nint)itemPtr, false); + Item7Ptr->PNext = itemPtr; + Item8Ptr->PNext = null; } /// @@ -6210,11 +13412,10 @@ public override IEnumerator GetEnumerator() yield return Item6; yield return Item7; yield return Item8; - yield return Item9; } /// - public override int Count => 10; + public override int Count => 9; /// public override IChainable this[int index] @@ -6229,10 +13430,140 @@ public override IChainable this[int index] 6 => Item6, 7 => Item7, 8 => Item8, - 9 => Item9, _ => throw new IndexOutOfRangeException() }; + /// + /// Compares the supplied memory block with this one, ignoring the structure headers. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + protected override bool MemoryEquals(ManagedChain other) + { + var ptr = HeadPtr; + var otherPtr = other.HeadPtr; + if (ptr == otherPtr) { + return true; + } + var span = new ReadOnlySpan((void*) ptr, MemorySize); + var otherSpan = new ReadOnlySpan((void*) otherPtr, MemorySize); + var start = 0; + var length = HeadSize; + var sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item1Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item2Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item3Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item4Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item5Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item6Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item7Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item8Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + return true; + } + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Equals(ManagedChain other) + => !ReferenceEquals(null, other) && (ReferenceEquals(this, other) || MemoryEquals(other)); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator ==(ManagedChain left, ManagedChain right) => + ReferenceEquals(null, left) + ? ReferenceEquals(null, right) + : !ReferenceEquals(null, right) && (ReferenceEquals(left, right) || left.MemoryEquals(right)); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator !=(ManagedChain left, ManagedChain right) => + ReferenceEquals(null, left) + ? !ReferenceEquals(null, right) + : ReferenceEquals(null, right) || (!ReferenceEquals(left, right) && !left.MemoryEquals(right)); + + /// + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append("("); + sb.Append((object) Head); sb.Append(", "); + sb.Append((object) Item1); + sb.Append(", "); + sb.Append((object) Item2); + sb.Append(", "); + sb.Append((object) Item3); + sb.Append(", "); + sb.Append((object) Item4); + sb.Append(", "); + sb.Append((object) Item5); + sb.Append(", "); + sb.Append((object) Item6); + sb.Append(", "); + sb.Append((object) Item7); + sb.Append(", "); + sb.Append((object) Item8); + sb.Append(")"); + return sb.ToString(); + } + /// /// Deconstructs this chain. /// @@ -6245,8 +13576,7 @@ public override IChainable this[int index] /// Item 6. /// Item 7. /// Item 8. - /// Item 9. - public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6, out T7 item7, out T8 item8, out T9 item9) + public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6, out T7 item7, out T8 item8) { head = Head; item1 = Item1; @@ -6257,7 +13587,6 @@ public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item item6 = Item6; item7 = Item7; item8 = Item8; - item9 = Item9; } /// @@ -6278,7 +13607,6 @@ public override void Dispose() Marshal.DestroyStructure(headPtr + Item6Offset); Marshal.DestroyStructure(headPtr + Item7Offset); Marshal.DestroyStructure(headPtr + Item8Offset); - Marshal.DestroyStructure(headPtr + Item9Offset); // Free memory block Marshal.FreeHGlobal(headPtr); @@ -6286,7 +13614,7 @@ public override void Dispose() } /// -/// A safely manages the pointers of a managed structure chain. +/// A safely manages the pointers of a managed structure chain. /// /// The chain type /// Type of Item 1. @@ -6298,20 +13626,23 @@ public override void Dispose() /// Type of Item 7. /// Type of Item 8. /// Type of Item 9. -/// Type of Item 10. -public unsafe class ManagedChain : ManagedChain - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain - where T8 : struct, IExtendsChain - where T9 : struct, IExtendsChain - where T10 : struct, IExtendsChain +public unsafe sealed class ManagedChain : ManagedChain, IEquatable> + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable { + /// + /// Gets the size (in bytes) of the default structure header. + /// + public static readonly int HeaderSize = Marshal.SizeOf(); + /// /// Gets the size (in bytes) of the head structure. /// @@ -6380,700 +13711,318 @@ public unsafe class ManagedChain /// Gets the offset to the start of . /// - public static readonly int Item7Offset = Item6Offset + Item6Size; - - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item7Size = Marshal.SizeOf(); - - /// - /// Gets the offset to the start of . - /// - public static readonly int Item8Offset = Item7Offset + Item7Size; - - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item8Size = Marshal.SizeOf(); - - /// - /// Gets the offset to the start of . - /// - public static readonly int Item9Offset = Item8Offset + Item8Size; - - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item9Size = Marshal.SizeOf(); - - /// - /// Gets the offset to the start of . - /// - public static readonly int Item10Offset = Item9Offset + Item9Size; - - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item10Size = Marshal.SizeOf(); - - /// - /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. - /// - public static readonly int MemorySize = Item10Offset + Item10Size; - - private nint _headPtr; - - /// - /// Gets a pointer to the current head. - /// - public BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; - - /// - /// Gets or sets the head of the chain. - /// - public TChain Head - { - get => Unsafe.AsRef((BaseInStructure*) _headPtr); - set - { - value.StructureType(); - var ptr = (BaseInStructure*) _headPtr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, _headPtr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item1Ptr => (BaseInStructure*) (_headPtr + Item1Offset); - - /// - /// Gets or sets item #1 in the chain. - /// - public T1 Item1 - { - get => Unsafe.AsRef(Item1Ptr); - set - { - value.StructureType(); - var ptr = Item1Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item2Ptr => (BaseInStructure*) (_headPtr + Item2Offset); - - /// - /// Gets or sets item #2 in the chain. - /// - public T2 Item2 - { - get => Unsafe.AsRef(Item2Ptr); - set - { - value.StructureType(); - var ptr = Item2Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item3Ptr => (BaseInStructure*) (_headPtr + Item3Offset); - - /// - /// Gets or sets item #3 in the chain. - /// - public T3 Item3 - { - get => Unsafe.AsRef(Item3Ptr); - set - { - value.StructureType(); - var ptr = Item3Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item4Ptr => (BaseInStructure*) (_headPtr + Item4Offset); - - /// - /// Gets or sets item #4 in the chain. - /// - public T4 Item4 - { - get => Unsafe.AsRef(Item4Ptr); - set - { - value.StructureType(); - var ptr = Item4Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item5Ptr => (BaseInStructure*) (_headPtr + Item5Offset); - - /// - /// Gets or sets item #5 in the chain. - /// - public T5 Item5 - { - get => Unsafe.AsRef(Item5Ptr); - set - { - value.StructureType(); - var ptr = Item5Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item6Ptr => (BaseInStructure*) (_headPtr + Item6Offset); - - /// - /// Gets or sets item #6 in the chain. - /// - public T6 Item6 - { - get => Unsafe.AsRef(Item6Ptr); - set - { - value.StructureType(); - var ptr = Item6Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item7Ptr => (BaseInStructure*) (_headPtr + Item7Offset); + public static readonly int Item7Offset = Item6Offset + Item6Size; /// - /// Gets or sets item #7 in the chain. + /// Gets the size (in bytes) of the Item 1. /// - public T7 Item7 - { - get => Unsafe.AsRef(Item7Ptr); - set - { - value.StructureType(); - var ptr = Item7Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } + public static readonly int Item7Size = Marshal.SizeOf(); /// - /// Gets a pointer to the second item in the chain. + /// Gets the offset to the start of . /// - public BaseInStructure* Item8Ptr => (BaseInStructure*) (_headPtr + Item8Offset); + public static readonly int Item8Offset = Item7Offset + Item7Size; /// - /// Gets or sets item #8 in the chain. + /// Gets the size (in bytes) of the Item 1. /// - public T8 Item8 - { - get => Unsafe.AsRef(Item8Ptr); - set - { - value.StructureType(); - var ptr = Item8Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } + public static readonly int Item8Size = Marshal.SizeOf(); /// - /// Gets a pointer to the second item in the chain. + /// Gets the offset to the start of . /// - public BaseInStructure* Item9Ptr => (BaseInStructure*) (_headPtr + Item9Offset); + public static readonly int Item9Offset = Item8Offset + Item8Size; /// - /// Gets or sets item #9 in the chain. + /// Gets the size (in bytes) of the Item 1. /// - public T9 Item9 - { - get => Unsafe.AsRef(Item9Ptr); - set - { - value.StructureType(); - var ptr = Item9Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } + public static readonly int Item9Size = Marshal.SizeOf(); /// - /// Gets a pointer to the second item in the chain. + /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. /// - public BaseInStructure* Item10Ptr => (BaseInStructure*) (_headPtr + Item10Offset); + public static readonly int MemorySize = Item9Offset + Item9Size; + + /// + public override int Size => MemorySize; + + private nint _headPtr; + + /// + public override BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; /// - /// Gets or sets item #10 in the chain. + /// Gets or sets the head of the chain. /// - public T10 Item10 + public TChain Head { - get => Unsafe.AsRef(Item10Ptr); + get => Unsafe.AsRef((BaseInStructure*) _headPtr); set { value.StructureType(); - var ptr = Item10Ptr; + var ptr = (BaseInStructure*) _headPtr; var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); + Marshal.StructureToPtr(value, _headPtr, true); ptr->PNext = nextPtr; } } /// - /// Creates a new with 11 items from an existing memory block. - /// - /// The pointer to the head of the chain.. - /// - /// Callers are responsible for ensuring the size of the memory is correct. - /// - internal ManagedChain(nint headPtr) - { - _headPtr = headPtr; - } - - /// - /// Creates a new with 11 items. + /// Gets a pointer to the second item in the chain. /// - /// The head of the chain. - /// Item 1. - /// Item 2. - /// Item 3. - /// Item 4. - /// Item 5. - /// Item 6. - /// Item 7. - /// Item 8. - /// Item 9. - /// Item 10. - public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default) - : this(Marshal.AllocHGlobal(MemorySize)) - { - head.StructureType(); - Marshal.StructureToPtr(head, _headPtr, false); - BaseInStructure* itemPtr = Item1Ptr; - item1.StructureType(); - Marshal.StructureToPtr(item1, (nint)itemPtr, false); - HeadPtr->PNext = itemPtr; - itemPtr = Item2Ptr; - item2.StructureType(); - Marshal.StructureToPtr(item2, (nint)itemPtr, false); - Item1Ptr->PNext = itemPtr; - itemPtr = Item3Ptr; - item3.StructureType(); - Marshal.StructureToPtr(item3, (nint)itemPtr, false); - Item2Ptr->PNext = itemPtr; - itemPtr = Item4Ptr; - item4.StructureType(); - Marshal.StructureToPtr(item4, (nint)itemPtr, false); - Item3Ptr->PNext = itemPtr; - itemPtr = Item5Ptr; - item5.StructureType(); - Marshal.StructureToPtr(item5, (nint)itemPtr, false); - Item4Ptr->PNext = itemPtr; - itemPtr = Item6Ptr; - item6.StructureType(); - Marshal.StructureToPtr(item6, (nint)itemPtr, false); - Item5Ptr->PNext = itemPtr; - itemPtr = Item7Ptr; - item7.StructureType(); - Marshal.StructureToPtr(item7, (nint)itemPtr, false); - Item6Ptr->PNext = itemPtr; - itemPtr = Item8Ptr; - item8.StructureType(); - Marshal.StructureToPtr(item8, (nint)itemPtr, false); - Item7Ptr->PNext = itemPtr; - itemPtr = Item9Ptr; - item9.StructureType(); - Marshal.StructureToPtr(item9, (nint)itemPtr, false); - Item8Ptr->PNext = itemPtr; - itemPtr = Item10Ptr; - item10.StructureType(); - Marshal.StructureToPtr(item10, (nint)itemPtr, false); - Item9Ptr->PNext = itemPtr; - Item10Ptr->PNext = null; - } + public BaseInStructure* Item1Ptr => (BaseInStructure*) (_headPtr + Item1Offset); /// - /// Creates a new with 11 items from an existing unmanaged chain. + /// Gets or sets item #1 in the chain. /// - /// Any errors loading the chain. - /// The unmanaged chain to use as the basis of this chain. - public ManagedChain(out string errors, TChain chain) - : this(Marshal.AllocHGlobal(MemorySize)) + public T1 Item1 { - chain.StructureType(); - Marshal.StructureToPtr(chain, _headPtr, false); - StringBuilder errorBuilder = new StringBuilder(); - var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); - var newPtr = (BaseInStructure*) _headPtr; - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item1Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T1 item1 = default; - var expectedStructureType = item1.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 11"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 2; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item1 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item1, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item2Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T2 item2 = default; - expectedStructureType = item2.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 11"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 3; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item2 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item2, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item3Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T3 item3 = default; - expectedStructureType = item3.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 11"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 4; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item3 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item3, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item4Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T4 item4 = default; - expectedStructureType = item4.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 11"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 5; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item4 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item4, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item5Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T5 item5 = default; - expectedStructureType = item5.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 11"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 6; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item5 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item5, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item6Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T6 item6 = default; - expectedStructureType = item6.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 11"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 7; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item6 = Unsafe.AsRef(existingPtr); - } + get => Unsafe.AsRef(Item1Ptr); + set + { + value.StructureType(); + var ptr = Item1Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item6, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item7Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item2Ptr => (BaseInStructure*) (_headPtr + Item2Offset); - T7 item7 = default; - expectedStructureType = item7.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 11"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 8; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item7 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #2 in the chain. + /// + public T2 Item2 + { + get => Unsafe.AsRef(Item2Ptr); + set + { + value.StructureType(); + var ptr = Item2Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item7, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item8Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item3Ptr => (BaseInStructure*) (_headPtr + Item3Offset); - T8 item8 = default; - expectedStructureType = item8.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 11"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 9; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item8 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #3 in the chain. + /// + public T3 Item3 + { + get => Unsafe.AsRef(Item3Ptr); + set + { + value.StructureType(); + var ptr = Item3Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item8, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item9Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item4Ptr => (BaseInStructure*) (_headPtr + Item4Offset); - T9 item9 = default; - expectedStructureType = item9.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 9, expected length 11"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 10; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item9 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #4 in the chain. + /// + public T4 Item4 + { + get => Unsafe.AsRef(Item4Ptr); + set + { + value.StructureType(); + var ptr = Item4Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item9, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item10Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item5Ptr => (BaseInStructure*) (_headPtr + Item5Offset); - T10 item10 = default; - expectedStructureType = item10.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 10, expected length 11"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 11; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - if (existingPtr->PNext is not null) { - errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 11"); - existingPtr->PNext = null; - } - item10 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #5 in the chain. + /// + public T5 Item5 + { + get => Unsafe.AsRef(Item5Ptr); + set + { + value.StructureType(); + var ptr = Item5Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item10, (nint) newPtr, false); - - // Create string of errors - errors = errorBuilder.ToString().Trim(); } /// - /// Creates a new with 11 by copying this chain. + /// Gets a pointer to the second item in the chain. /// - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Duplicate() + public BaseInStructure* Item6Ptr => (BaseInStructure*) (_headPtr + Item6Offset); + + /// + /// Gets or sets item #6 in the chain. + /// + public T6 Item6 { - var newHeadPtr = Marshal.AllocHGlobal(MemorySize); - // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); - // Update all pointers - ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); - ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); - ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); - ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); - ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item5Offset); - ((BaseInStructure*)(newHeadPtr + Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item6Offset); - ((BaseInStructure*)(newHeadPtr + Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item7Offset); - ((BaseInStructure*)(newHeadPtr + Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item8Offset); - ((BaseInStructure*)(newHeadPtr + Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item9Offset); - ((BaseInStructure*)(newHeadPtr + Item9Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item10Offset); - return new ManagedChain(newHeadPtr); + get => Unsafe.AsRef(Item6Ptr); + set + { + value.StructureType(); + var ptr = Item6Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } } /// - /// Creates a new with 11 items, by appending - /// to the end of this chain. + /// Gets a pointer to the second item in the chain. /// - /// The chain to append to. - /// Item 10. - /// - /// Do not forget to dispose the chain if you are no longer using it. - /// - public ManagedChain(ManagedChain previous, T10 item10 = default) - : this(Marshal.AllocHGlobal(MemorySize)) + public BaseInStructure* Item7Ptr => (BaseInStructure*) (_headPtr + Item7Offset); + + /// + /// Gets or sets item #7 in the chain. + /// + public T7 Item7 { - var previousSize = MemorySize - Item10Size; - // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); - - // Append item 10 - item10.StructureType(); - Marshal.StructureToPtr(item10, _headPtr + previousSize, false); + get => Unsafe.AsRef(Item7Ptr); + set + { + value.StructureType(); + var ptr = Item7Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } + } - // Update all pointers - ((BaseInStructure*)_headPtr)->PNext = (BaseInStructure*) (_headPtr + Item1Offset); - ((BaseInStructure*)(_headPtr + Item1Offset))->PNext = (BaseInStructure*) (_headPtr + Item2Offset); - ((BaseInStructure*)(_headPtr + Item2Offset))->PNext = (BaseInStructure*) (_headPtr + Item3Offset); - ((BaseInStructure*)(_headPtr + Item3Offset))->PNext = (BaseInStructure*) (_headPtr + Item4Offset); - ((BaseInStructure*)(_headPtr + Item4Offset))->PNext = (BaseInStructure*) (_headPtr + Item5Offset); - ((BaseInStructure*)(_headPtr + Item5Offset))->PNext = (BaseInStructure*) (_headPtr + Item6Offset); - ((BaseInStructure*)(_headPtr + Item6Offset))->PNext = (BaseInStructure*) (_headPtr + Item7Offset); - ((BaseInStructure*)(_headPtr + Item7Offset))->PNext = (BaseInStructure*) (_headPtr + Item8Offset); - ((BaseInStructure*)(_headPtr + Item8Offset))->PNext = (BaseInStructure*) (_headPtr + Item9Offset); - ((BaseInStructure*)(_headPtr + Item9Offset))->PNext = (BaseInStructure*) (_headPtr + Item10Offset); - ((BaseInStructure*)(_headPtr + previousSize))->PNext = null; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item8Ptr => (BaseInStructure*) (_headPtr + Item8Offset); + + /// + /// Gets or sets item #8 in the chain. + /// + public T8 Item8 + { + get => Unsafe.AsRef(Item8Ptr); + set + { + value.StructureType(); + var ptr = Item8Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } } /// - /// Creates a new with 10 items, by removing the last item - /// from this chain. + /// Gets a pointer to the second item in the chain. /// - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Truncate() + public BaseInStructure* Item9Ptr => (BaseInStructure*) (_headPtr + Item9Offset); + + /// + /// Gets or sets item #9 in the chain. + /// + public T9 Item9 { - return Truncate(out var _); + get => Unsafe.AsRef(Item9Ptr); + set + { + value.StructureType(); + var ptr = Item9Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } } /// - /// Creates a new with 10 items, by removing - /// from the end of this chain. + /// Creates a new with 10 items from an existing memory block. /// + /// The pointer to the head of the chain. /// - /// Do not forget to dispose this chain if you are no longer using it. + /// Callers are responsible for ensuring the size of the memory is correct. /// - public ManagedChain Truncate(out T10 item10) + internal ManagedChain(nint headPtr) { - item10 = Item10; - - var newSize = MemorySize - Item10Size; - var newHeadPtr = Marshal.AllocHGlobal(newSize); - // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); - // Update all pointers - ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); - ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); - ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); - ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); - ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item5Offset); - ((BaseInStructure*)(newHeadPtr + Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item6Offset); - ((BaseInStructure*)(newHeadPtr + Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item7Offset); - ((BaseInStructure*)(newHeadPtr + Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item8Offset); - ((BaseInStructure*)(newHeadPtr + Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item9Offset); - ((BaseInStructure*)(newHeadPtr + Item9Offset))->PNext = null; - return new ManagedChain(newHeadPtr); + _headPtr = headPtr; } /// - /// Creates a new with 12 items, by appending to - /// the end of this chain. + /// Creates a new with 10 items. /// - /// Item 11. - /// Type of Item 11 - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Append(T11 item11 = default) - where T11: struct, IExtendsChain + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + internal ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default) + : this(Marshal.AllocHGlobal(MemorySize)) { - return new ManagedChain(this, item11); + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + var itemPtr = Item1Ptr; + item1.StructureType(); + Marshal.StructureToPtr(item1, (nint)itemPtr, false); + HeadPtr->PNext = itemPtr; + itemPtr = Item2Ptr; + item2.StructureType(); + Marshal.StructureToPtr(item2, (nint)itemPtr, false); + Item1Ptr->PNext = itemPtr; + itemPtr = Item3Ptr; + item3.StructureType(); + Marshal.StructureToPtr(item3, (nint)itemPtr, false); + Item2Ptr->PNext = itemPtr; + itemPtr = Item4Ptr; + item4.StructureType(); + Marshal.StructureToPtr(item4, (nint)itemPtr, false); + Item3Ptr->PNext = itemPtr; + itemPtr = Item5Ptr; + item5.StructureType(); + Marshal.StructureToPtr(item5, (nint)itemPtr, false); + Item4Ptr->PNext = itemPtr; + itemPtr = Item6Ptr; + item6.StructureType(); + Marshal.StructureToPtr(item6, (nint)itemPtr, false); + Item5Ptr->PNext = itemPtr; + itemPtr = Item7Ptr; + item7.StructureType(); + Marshal.StructureToPtr(item7, (nint)itemPtr, false); + Item6Ptr->PNext = itemPtr; + itemPtr = Item8Ptr; + item8.StructureType(); + Marshal.StructureToPtr(item8, (nint)itemPtr, false); + Item7Ptr->PNext = itemPtr; + itemPtr = Item9Ptr; + item9.StructureType(); + Marshal.StructureToPtr(item9, (nint)itemPtr, false); + Item8Ptr->PNext = itemPtr; + Item9Ptr->PNext = null; } /// @@ -7089,11 +14038,10 @@ public override IEnumerator GetEnumerator() yield return Item7; yield return Item8; yield return Item9; - yield return Item10; } /// - public override int Count => 11; + public override int Count => 10; /// public override IChainable this[int index] @@ -7109,10 +14057,150 @@ public override IChainable this[int index] 7 => Item7, 8 => Item8, 9 => Item9, - 10 => Item10, _ => throw new IndexOutOfRangeException() }; + /// + /// Compares the supplied memory block with this one, ignoring the structure headers. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + protected override bool MemoryEquals(ManagedChain other) + { + var ptr = HeadPtr; + var otherPtr = other.HeadPtr; + if (ptr == otherPtr) { + return true; + } + var span = new ReadOnlySpan((void*) ptr, MemorySize); + var otherSpan = new ReadOnlySpan((void*) otherPtr, MemorySize); + var start = 0; + var length = HeadSize; + var sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item1Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item2Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item3Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item4Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item5Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item6Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item7Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item8Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item9Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + return true; + } + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Equals(ManagedChain other) + => !ReferenceEquals(null, other) && (ReferenceEquals(this, other) || MemoryEquals(other)); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator ==(ManagedChain left, ManagedChain right) => + ReferenceEquals(null, left) + ? ReferenceEquals(null, right) + : !ReferenceEquals(null, right) && (ReferenceEquals(left, right) || left.MemoryEquals(right)); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator !=(ManagedChain left, ManagedChain right) => + ReferenceEquals(null, left) + ? !ReferenceEquals(null, right) + : ReferenceEquals(null, right) || (!ReferenceEquals(left, right) && !left.MemoryEquals(right)); + + /// + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append("("); + sb.Append((object) Head); sb.Append(", "); + sb.Append((object) Item1); + sb.Append(", "); + sb.Append((object) Item2); + sb.Append(", "); + sb.Append((object) Item3); + sb.Append(", "); + sb.Append((object) Item4); + sb.Append(", "); + sb.Append((object) Item5); + sb.Append(", "); + sb.Append((object) Item6); + sb.Append(", "); + sb.Append((object) Item7); + sb.Append(", "); + sb.Append((object) Item8); + sb.Append(", "); + sb.Append((object) Item9); + sb.Append(")"); + return sb.ToString(); + } + /// /// Deconstructs this chain. /// @@ -7126,8 +14214,7 @@ public override IChainable this[int index] /// Item 7. /// Item 8. /// Item 9. - /// Item 10. - public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6, out T7 item7, out T8 item8, out T9 item9, out T10 item10) + public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6, out T7 item7, out T8 item8, out T9 item9) { head = Head; item1 = Item1; @@ -7139,7 +14226,6 @@ public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item item7 = Item7; item8 = Item8; item9 = Item9; - item10 = Item10; } /// @@ -7161,7 +14247,6 @@ public override void Dispose() Marshal.DestroyStructure(headPtr + Item7Offset); Marshal.DestroyStructure(headPtr + Item8Offset); Marshal.DestroyStructure(headPtr + Item9Offset); - Marshal.DestroyStructure(headPtr + Item10Offset); // Free memory block Marshal.FreeHGlobal(headPtr); @@ -7169,7 +14254,7 @@ public override void Dispose() } /// -/// A safely manages the pointers of a managed structure chain. +/// A safely manages the pointers of a managed structure chain. /// /// The chain type /// Type of Item 1. @@ -7182,21 +14267,24 @@ public override void Dispose() /// Type of Item 8. /// Type of Item 9. /// Type of Item 10. -/// Type of Item 11. -public unsafe class ManagedChain : ManagedChain - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain - where T8 : struct, IExtendsChain - where T9 : struct, IExtendsChain - where T10 : struct, IExtendsChain - where T11 : struct, IExtendsChain +public unsafe sealed class ManagedChain : ManagedChain, IEquatable> + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable { + /// + /// Gets the size (in bytes) of the default structure header. + /// + public static readonly int HeaderSize = Marshal.SizeOf(); + /// /// Gets the size (in bytes) of the head structure. /// @@ -7302,27 +14390,18 @@ public unsafe class ManagedChain public static readonly int Item10Size = Marshal.SizeOf(); - /// - /// Gets the offset to the start of . - /// - public static readonly int Item11Offset = Item10Offset + Item10Size; - - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item11Size = Marshal.SizeOf(); - /// /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. /// - public static readonly int MemorySize = Item11Offset + Item11Size; - + public static readonly int MemorySize = Item10Offset + Item10Size; + + /// + public override int Size => MemorySize; + private nint _headPtr; - /// - /// Gets a pointer to the current head. - /// - public BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; + /// + public override BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; /// /// Gets or sets the head of the chain. @@ -7335,175 +14414,7 @@ public TChain Head value.StructureType(); var ptr = (BaseInStructure*) _headPtr; var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, _headPtr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item1Ptr => (BaseInStructure*) (_headPtr + Item1Offset); - - /// - /// Gets or sets item #1 in the chain. - /// - public T1 Item1 - { - get => Unsafe.AsRef(Item1Ptr); - set - { - value.StructureType(); - var ptr = Item1Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item2Ptr => (BaseInStructure*) (_headPtr + Item2Offset); - - /// - /// Gets or sets item #2 in the chain. - /// - public T2 Item2 - { - get => Unsafe.AsRef(Item2Ptr); - set - { - value.StructureType(); - var ptr = Item2Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item3Ptr => (BaseInStructure*) (_headPtr + Item3Offset); - - /// - /// Gets or sets item #3 in the chain. - /// - public T3 Item3 - { - get => Unsafe.AsRef(Item3Ptr); - set - { - value.StructureType(); - var ptr = Item3Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item4Ptr => (BaseInStructure*) (_headPtr + Item4Offset); - - /// - /// Gets or sets item #4 in the chain. - /// - public T4 Item4 - { - get => Unsafe.AsRef(Item4Ptr); - set - { - value.StructureType(); - var ptr = Item4Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item5Ptr => (BaseInStructure*) (_headPtr + Item5Offset); - - /// - /// Gets or sets item #5 in the chain. - /// - public T5 Item5 - { - get => Unsafe.AsRef(Item5Ptr); - set - { - value.StructureType(); - var ptr = Item5Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item6Ptr => (BaseInStructure*) (_headPtr + Item6Offset); - - /// - /// Gets or sets item #6 in the chain. - /// - public T6 Item6 - { - get => Unsafe.AsRef(Item6Ptr); - set - { - value.StructureType(); - var ptr = Item6Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item7Ptr => (BaseInStructure*) (_headPtr + Item7Offset); - - /// - /// Gets or sets item #7 in the chain. - /// - public T7 Item7 - { - get => Unsafe.AsRef(Item7Ptr); - set - { - value.StructureType(); - var ptr = Item7Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item8Ptr => (BaseInStructure*) (_headPtr + Item8Offset); - - /// - /// Gets or sets item #8 in the chain. - /// - public T8 Item8 - { - get => Unsafe.AsRef(Item8Ptr); - set - { - value.StructureType(); - var ptr = Item8Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); + Marshal.StructureToPtr(value, _headPtr, true); ptr->PNext = nextPtr; } } @@ -7511,18 +14422,18 @@ public T8 Item8 /// /// Gets a pointer to the second item in the chain. /// - public BaseInStructure* Item9Ptr => (BaseInStructure*) (_headPtr + Item9Offset); + public BaseInStructure* Item1Ptr => (BaseInStructure*) (_headPtr + Item1Offset); /// - /// Gets or sets item #9 in the chain. + /// Gets or sets item #1 in the chain. /// - public T9 Item9 + public T1 Item1 { - get => Unsafe.AsRef(Item9Ptr); + get => Unsafe.AsRef(Item1Ptr); set { value.StructureType(); - var ptr = Item9Ptr; + var ptr = Item1Ptr; var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, (nint)ptr, true); ptr->PNext = nextPtr; @@ -7532,18 +14443,18 @@ public T9 Item9 /// /// Gets a pointer to the second item in the chain. /// - public BaseInStructure* Item10Ptr => (BaseInStructure*) (_headPtr + Item10Offset); + public BaseInStructure* Item2Ptr => (BaseInStructure*) (_headPtr + Item2Offset); /// - /// Gets or sets item #10 in the chain. + /// Gets or sets item #2 in the chain. /// - public T10 Item10 + public T2 Item2 { - get => Unsafe.AsRef(Item10Ptr); + get => Unsafe.AsRef(Item2Ptr); set { value.StructureType(); - var ptr = Item10Ptr; + var ptr = Item2Ptr; var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, (nint)ptr, true); ptr->PNext = nextPtr; @@ -7553,18 +14464,18 @@ public T10 Item10 /// /// Gets a pointer to the second item in the chain. /// - public BaseInStructure* Item11Ptr => (BaseInStructure*) (_headPtr + Item11Offset); + public BaseInStructure* Item3Ptr => (BaseInStructure*) (_headPtr + Item3Offset); /// - /// Gets or sets item #11 in the chain. + /// Gets or sets item #3 in the chain. /// - public T11 Item11 + public T3 Item3 { - get => Unsafe.AsRef(Item11Ptr); + get => Unsafe.AsRef(Item3Ptr); set { value.StructureType(); - var ptr = Item11Ptr; + var ptr = Item3Ptr; var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, (nint)ptr, true); ptr->PNext = nextPtr; @@ -7572,453 +14483,224 @@ public T11 Item11 } /// - /// Creates a new with 12 items from an existing memory block. - /// - /// The pointer to the head of the chain.. - /// - /// Callers are responsible for ensuring the size of the memory is correct. - /// - internal ManagedChain(nint headPtr) - { - _headPtr = headPtr; - } - - /// - /// Creates a new with 12 items. + /// Gets a pointer to the second item in the chain. /// - /// The head of the chain. - /// Item 1. - /// Item 2. - /// Item 3. - /// Item 4. - /// Item 5. - /// Item 6. - /// Item 7. - /// Item 8. - /// Item 9. - /// Item 10. - /// Item 11. - public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default) - : this(Marshal.AllocHGlobal(MemorySize)) - { - head.StructureType(); - Marshal.StructureToPtr(head, _headPtr, false); - BaseInStructure* itemPtr = Item1Ptr; - item1.StructureType(); - Marshal.StructureToPtr(item1, (nint)itemPtr, false); - HeadPtr->PNext = itemPtr; - itemPtr = Item2Ptr; - item2.StructureType(); - Marshal.StructureToPtr(item2, (nint)itemPtr, false); - Item1Ptr->PNext = itemPtr; - itemPtr = Item3Ptr; - item3.StructureType(); - Marshal.StructureToPtr(item3, (nint)itemPtr, false); - Item2Ptr->PNext = itemPtr; - itemPtr = Item4Ptr; - item4.StructureType(); - Marshal.StructureToPtr(item4, (nint)itemPtr, false); - Item3Ptr->PNext = itemPtr; - itemPtr = Item5Ptr; - item5.StructureType(); - Marshal.StructureToPtr(item5, (nint)itemPtr, false); - Item4Ptr->PNext = itemPtr; - itemPtr = Item6Ptr; - item6.StructureType(); - Marshal.StructureToPtr(item6, (nint)itemPtr, false); - Item5Ptr->PNext = itemPtr; - itemPtr = Item7Ptr; - item7.StructureType(); - Marshal.StructureToPtr(item7, (nint)itemPtr, false); - Item6Ptr->PNext = itemPtr; - itemPtr = Item8Ptr; - item8.StructureType(); - Marshal.StructureToPtr(item8, (nint)itemPtr, false); - Item7Ptr->PNext = itemPtr; - itemPtr = Item9Ptr; - item9.StructureType(); - Marshal.StructureToPtr(item9, (nint)itemPtr, false); - Item8Ptr->PNext = itemPtr; - itemPtr = Item10Ptr; - item10.StructureType(); - Marshal.StructureToPtr(item10, (nint)itemPtr, false); - Item9Ptr->PNext = itemPtr; - itemPtr = Item11Ptr; - item11.StructureType(); - Marshal.StructureToPtr(item11, (nint)itemPtr, false); - Item10Ptr->PNext = itemPtr; - Item11Ptr->PNext = null; - } + public BaseInStructure* Item4Ptr => (BaseInStructure*) (_headPtr + Item4Offset); /// - /// Creates a new with 12 items from an existing unmanaged chain. + /// Gets or sets item #4 in the chain. /// - /// Any errors loading the chain. - /// The unmanaged chain to use as the basis of this chain. - public ManagedChain(out string errors, TChain chain) - : this(Marshal.AllocHGlobal(MemorySize)) - { - chain.StructureType(); - Marshal.StructureToPtr(chain, _headPtr, false); - StringBuilder errorBuilder = new StringBuilder(); - var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); - var newPtr = (BaseInStructure*) _headPtr; - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item1Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T1 item1 = default; - var expectedStructureType = item1.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 12"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 2; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item1 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item1, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item2Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T2 item2 = default; - expectedStructureType = item2.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 12"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 3; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item2 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item2, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item3Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T3 item3 = default; - expectedStructureType = item3.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 12"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 4; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item3 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item3, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item4Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T4 item4 = default; - expectedStructureType = item4.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 12"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 5; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item4 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item4, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item5Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T5 item5 = default; - expectedStructureType = item5.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 12"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 6; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item5 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item5, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item6Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T6 item6 = default; - expectedStructureType = item6.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 12"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 7; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item6 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item6, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item7Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T7 item7 = default; - expectedStructureType = item7.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 12"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 8; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item7 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item7, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item8Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T8 item8 = default; - expectedStructureType = item8.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 12"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 9; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item8 = Unsafe.AsRef(existingPtr); - } + public T4 Item4 + { + get => Unsafe.AsRef(Item4Ptr); + set + { + value.StructureType(); + var ptr = Item4Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item8, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item9Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item5Ptr => (BaseInStructure*) (_headPtr + Item5Offset); - T9 item9 = default; - expectedStructureType = item9.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 9, expected length 12"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 10; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item9 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #5 in the chain. + /// + public T5 Item5 + { + get => Unsafe.AsRef(Item5Ptr); + set + { + value.StructureType(); + var ptr = Item5Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item9, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item10Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item6Ptr => (BaseInStructure*) (_headPtr + Item6Offset); - T10 item10 = default; - expectedStructureType = item10.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 10, expected length 12"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 11; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item10 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #6 in the chain. + /// + public T6 Item6 + { + get => Unsafe.AsRef(Item6Ptr); + set + { + value.StructureType(); + var ptr = Item6Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item10, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item11Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item7Ptr => (BaseInStructure*) (_headPtr + Item7Offset); - T11 item11 = default; - expectedStructureType = item11.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 11, expected length 12"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 12; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - if (existingPtr->PNext is not null) { - errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 12"); - existingPtr->PNext = null; - } - item11 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #7 in the chain. + /// + public T7 Item7 + { + get => Unsafe.AsRef(Item7Ptr); + set + { + value.StructureType(); + var ptr = Item7Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item11, (nint) newPtr, false); - - // Create string of errors - errors = errorBuilder.ToString().Trim(); } /// - /// Creates a new with 12 by copying this chain. + /// Gets a pointer to the second item in the chain. /// - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Duplicate() + public BaseInStructure* Item8Ptr => (BaseInStructure*) (_headPtr + Item8Offset); + + /// + /// Gets or sets item #8 in the chain. + /// + public T8 Item8 { - var newHeadPtr = Marshal.AllocHGlobal(MemorySize); - // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); - // Update all pointers - ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); - ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); - ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); - ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); - ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item5Offset); - ((BaseInStructure*)(newHeadPtr + Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item6Offset); - ((BaseInStructure*)(newHeadPtr + Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item7Offset); - ((BaseInStructure*)(newHeadPtr + Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item8Offset); - ((BaseInStructure*)(newHeadPtr + Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item9Offset); - ((BaseInStructure*)(newHeadPtr + Item9Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item10Offset); - ((BaseInStructure*)(newHeadPtr + Item10Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item11Offset); - return new ManagedChain(newHeadPtr); + get => Unsafe.AsRef(Item8Ptr); + set + { + value.StructureType(); + var ptr = Item8Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } } /// - /// Creates a new with 12 items, by appending - /// to the end of this chain. + /// Gets a pointer to the second item in the chain. /// - /// The chain to append to. - /// Item 11. - /// - /// Do not forget to dispose the chain if you are no longer using it. - /// - public ManagedChain(ManagedChain previous, T11 item11 = default) - : this(Marshal.AllocHGlobal(MemorySize)) - { - var previousSize = MemorySize - Item11Size; - // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); - - // Append item 11 - item11.StructureType(); - Marshal.StructureToPtr(item11, _headPtr + previousSize, false); + public BaseInStructure* Item9Ptr => (BaseInStructure*) (_headPtr + Item9Offset); - // Update all pointers - ((BaseInStructure*)_headPtr)->PNext = (BaseInStructure*) (_headPtr + Item1Offset); - ((BaseInStructure*)(_headPtr + Item1Offset))->PNext = (BaseInStructure*) (_headPtr + Item2Offset); - ((BaseInStructure*)(_headPtr + Item2Offset))->PNext = (BaseInStructure*) (_headPtr + Item3Offset); - ((BaseInStructure*)(_headPtr + Item3Offset))->PNext = (BaseInStructure*) (_headPtr + Item4Offset); - ((BaseInStructure*)(_headPtr + Item4Offset))->PNext = (BaseInStructure*) (_headPtr + Item5Offset); - ((BaseInStructure*)(_headPtr + Item5Offset))->PNext = (BaseInStructure*) (_headPtr + Item6Offset); - ((BaseInStructure*)(_headPtr + Item6Offset))->PNext = (BaseInStructure*) (_headPtr + Item7Offset); - ((BaseInStructure*)(_headPtr + Item7Offset))->PNext = (BaseInStructure*) (_headPtr + Item8Offset); - ((BaseInStructure*)(_headPtr + Item8Offset))->PNext = (BaseInStructure*) (_headPtr + Item9Offset); - ((BaseInStructure*)(_headPtr + Item9Offset))->PNext = (BaseInStructure*) (_headPtr + Item10Offset); - ((BaseInStructure*)(_headPtr + Item10Offset))->PNext = (BaseInStructure*) (_headPtr + Item11Offset); - ((BaseInStructure*)(_headPtr + previousSize))->PNext = null; + /// + /// Gets or sets item #9 in the chain. + /// + public T9 Item9 + { + get => Unsafe.AsRef(Item9Ptr); + set + { + value.StructureType(); + var ptr = Item9Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } } /// - /// Creates a new with 11 items, by removing the last item - /// from this chain. + /// Gets a pointer to the second item in the chain. /// - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Truncate() + public BaseInStructure* Item10Ptr => (BaseInStructure*) (_headPtr + Item10Offset); + + /// + /// Gets or sets item #10 in the chain. + /// + public T10 Item10 { - return Truncate(out var _); + get => Unsafe.AsRef(Item10Ptr); + set + { + value.StructureType(); + var ptr = Item10Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } } /// - /// Creates a new with 11 items, by removing - /// from the end of this chain. + /// Creates a new with 11 items from an existing memory block. /// + /// The pointer to the head of the chain. /// - /// Do not forget to dispose this chain if you are no longer using it. + /// Callers are responsible for ensuring the size of the memory is correct. /// - public ManagedChain Truncate(out T11 item11) + internal ManagedChain(nint headPtr) { - item11 = Item11; - - var newSize = MemorySize - Item11Size; - var newHeadPtr = Marshal.AllocHGlobal(newSize); - // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); - // Update all pointers - ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); - ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); - ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); - ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); - ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item5Offset); - ((BaseInStructure*)(newHeadPtr + Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item6Offset); - ((BaseInStructure*)(newHeadPtr + Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item7Offset); - ((BaseInStructure*)(newHeadPtr + Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item8Offset); - ((BaseInStructure*)(newHeadPtr + Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item9Offset); - ((BaseInStructure*)(newHeadPtr + Item9Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item10Offset); - ((BaseInStructure*)(newHeadPtr + Item10Offset))->PNext = null; - return new ManagedChain(newHeadPtr); + _headPtr = headPtr; } /// - /// Creates a new with 13 items, by appending to - /// the end of this chain. + /// Creates a new with 11 items. /// - /// Item 12. - /// Type of Item 12 - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Append(T12 item12 = default) - where T12: struct, IExtendsChain + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + internal ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default) + : this(Marshal.AllocHGlobal(MemorySize)) { - return new ManagedChain(this, item12); + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + var itemPtr = Item1Ptr; + item1.StructureType(); + Marshal.StructureToPtr(item1, (nint)itemPtr, false); + HeadPtr->PNext = itemPtr; + itemPtr = Item2Ptr; + item2.StructureType(); + Marshal.StructureToPtr(item2, (nint)itemPtr, false); + Item1Ptr->PNext = itemPtr; + itemPtr = Item3Ptr; + item3.StructureType(); + Marshal.StructureToPtr(item3, (nint)itemPtr, false); + Item2Ptr->PNext = itemPtr; + itemPtr = Item4Ptr; + item4.StructureType(); + Marshal.StructureToPtr(item4, (nint)itemPtr, false); + Item3Ptr->PNext = itemPtr; + itemPtr = Item5Ptr; + item5.StructureType(); + Marshal.StructureToPtr(item5, (nint)itemPtr, false); + Item4Ptr->PNext = itemPtr; + itemPtr = Item6Ptr; + item6.StructureType(); + Marshal.StructureToPtr(item6, (nint)itemPtr, false); + Item5Ptr->PNext = itemPtr; + itemPtr = Item7Ptr; + item7.StructureType(); + Marshal.StructureToPtr(item7, (nint)itemPtr, false); + Item6Ptr->PNext = itemPtr; + itemPtr = Item8Ptr; + item8.StructureType(); + Marshal.StructureToPtr(item8, (nint)itemPtr, false); + Item7Ptr->PNext = itemPtr; + itemPtr = Item9Ptr; + item9.StructureType(); + Marshal.StructureToPtr(item9, (nint)itemPtr, false); + Item8Ptr->PNext = itemPtr; + itemPtr = Item10Ptr; + item10.StructureType(); + Marshal.StructureToPtr(item10, (nint)itemPtr, false); + Item9Ptr->PNext = itemPtr; + Item10Ptr->PNext = null; } /// @@ -8035,11 +14717,10 @@ public override IEnumerator GetEnumerator() yield return Item8; yield return Item9; yield return Item10; - yield return Item11; } /// - public override int Count => 12; + public override int Count => 11; /// public override IChainable this[int index] @@ -8056,10 +14737,160 @@ public override IChainable this[int index] 8 => Item8, 9 => Item9, 10 => Item10, - 11 => Item11, _ => throw new IndexOutOfRangeException() }; + /// + /// Compares the supplied memory block with this one, ignoring the structure headers. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + protected override bool MemoryEquals(ManagedChain other) + { + var ptr = HeadPtr; + var otherPtr = other.HeadPtr; + if (ptr == otherPtr) { + return true; + } + var span = new ReadOnlySpan((void*) ptr, MemorySize); + var otherSpan = new ReadOnlySpan((void*) otherPtr, MemorySize); + var start = 0; + var length = HeadSize; + var sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item1Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item2Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item3Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item4Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item5Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item6Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item7Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item8Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item9Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item10Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + return true; + } + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Equals(ManagedChain other) + => !ReferenceEquals(null, other) && (ReferenceEquals(this, other) || MemoryEquals(other)); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator ==(ManagedChain left, ManagedChain right) => + ReferenceEquals(null, left) + ? ReferenceEquals(null, right) + : !ReferenceEquals(null, right) && (ReferenceEquals(left, right) || left.MemoryEquals(right)); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator !=(ManagedChain left, ManagedChain right) => + ReferenceEquals(null, left) + ? !ReferenceEquals(null, right) + : ReferenceEquals(null, right) || (!ReferenceEquals(left, right) && !left.MemoryEquals(right)); + + /// + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append("("); + sb.Append((object) Head); sb.Append(", "); + sb.Append((object) Item1); + sb.Append(", "); + sb.Append((object) Item2); + sb.Append(", "); + sb.Append((object) Item3); + sb.Append(", "); + sb.Append((object) Item4); + sb.Append(", "); + sb.Append((object) Item5); + sb.Append(", "); + sb.Append((object) Item6); + sb.Append(", "); + sb.Append((object) Item7); + sb.Append(", "); + sb.Append((object) Item8); + sb.Append(", "); + sb.Append((object) Item9); + sb.Append(", "); + sb.Append((object) Item10); + sb.Append(")"); + return sb.ToString(); + } + /// /// Deconstructs this chain. /// @@ -8074,8 +14905,7 @@ public override IChainable this[int index] /// Item 8. /// Item 9. /// Item 10. - /// Item 11. - public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6, out T7 item7, out T8 item8, out T9 item9, out T10 item10, out T11 item11) + public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6, out T7 item7, out T8 item8, out T9 item9, out T10 item10) { head = Head; item1 = Item1; @@ -8088,7 +14918,6 @@ public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item item8 = Item8; item9 = Item9; item10 = Item10; - item11 = Item11; } /// @@ -8111,7 +14940,6 @@ public override void Dispose() Marshal.DestroyStructure(headPtr + Item8Offset); Marshal.DestroyStructure(headPtr + Item9Offset); Marshal.DestroyStructure(headPtr + Item10Offset); - Marshal.DestroyStructure(headPtr + Item11Offset); // Free memory block Marshal.FreeHGlobal(headPtr); @@ -8119,7 +14947,7 @@ public override void Dispose() } /// -/// A safely manages the pointers of a managed structure chain. +/// A safely manages the pointers of a managed structure chain. /// /// The chain type /// Type of Item 1. @@ -8133,22 +14961,25 @@ public override void Dispose() /// Type of Item 9. /// Type of Item 10. /// Type of Item 11. -/// Type of Item 12. -public unsafe class ManagedChain : ManagedChain - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain - where T8 : struct, IExtendsChain - where T9 : struct, IExtendsChain - where T10 : struct, IExtendsChain - where T11 : struct, IExtendsChain - where T12 : struct, IExtendsChain +public unsafe sealed class ManagedChain : ManagedChain, IEquatable> + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + where T11 : struct, IChainable { + /// + /// Gets the size (in bytes) of the default structure header. + /// + public static readonly int HeaderSize = Marshal.SizeOf(); + /// /// Gets the size (in bytes) of the head structure. /// @@ -8257,257 +15088,38 @@ public unsafe class ManagedChain /// Gets the offset to the start of . /// - public static readonly int Item11Offset = Item10Offset + Item10Size; - - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item11Size = Marshal.SizeOf(); - - /// - /// Gets the offset to the start of . - /// - public static readonly int Item12Offset = Item11Offset + Item11Size; - - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item12Size = Marshal.SizeOf(); - - /// - /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. - /// - public static readonly int MemorySize = Item12Offset + Item12Size; - - private nint _headPtr; - - /// - /// Gets a pointer to the current head. - /// - public BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; - - /// - /// Gets or sets the head of the chain. - /// - public TChain Head - { - get => Unsafe.AsRef((BaseInStructure*) _headPtr); - set - { - value.StructureType(); - var ptr = (BaseInStructure*) _headPtr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, _headPtr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item1Ptr => (BaseInStructure*) (_headPtr + Item1Offset); - - /// - /// Gets or sets item #1 in the chain. - /// - public T1 Item1 - { - get => Unsafe.AsRef(Item1Ptr); - set - { - value.StructureType(); - var ptr = Item1Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item2Ptr => (BaseInStructure*) (_headPtr + Item2Offset); - - /// - /// Gets or sets item #2 in the chain. - /// - public T2 Item2 - { - get => Unsafe.AsRef(Item2Ptr); - set - { - value.StructureType(); - var ptr = Item2Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item3Ptr => (BaseInStructure*) (_headPtr + Item3Offset); - - /// - /// Gets or sets item #3 in the chain. - /// - public T3 Item3 - { - get => Unsafe.AsRef(Item3Ptr); - set - { - value.StructureType(); - var ptr = Item3Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item4Ptr => (BaseInStructure*) (_headPtr + Item4Offset); - - /// - /// Gets or sets item #4 in the chain. - /// - public T4 Item4 - { - get => Unsafe.AsRef(Item4Ptr); - set - { - value.StructureType(); - var ptr = Item4Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item5Ptr => (BaseInStructure*) (_headPtr + Item5Offset); - - /// - /// Gets or sets item #5 in the chain. - /// - public T5 Item5 - { - get => Unsafe.AsRef(Item5Ptr); - set - { - value.StructureType(); - var ptr = Item5Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item6Ptr => (BaseInStructure*) (_headPtr + Item6Offset); - - /// - /// Gets or sets item #6 in the chain. - /// - public T6 Item6 - { - get => Unsafe.AsRef(Item6Ptr); - set - { - value.StructureType(); - var ptr = Item6Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item7Ptr => (BaseInStructure*) (_headPtr + Item7Offset); - - /// - /// Gets or sets item #7 in the chain. - /// - public T7 Item7 - { - get => Unsafe.AsRef(Item7Ptr); - set - { - value.StructureType(); - var ptr = Item7Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item8Ptr => (BaseInStructure*) (_headPtr + Item8Offset); - - /// - /// Gets or sets item #8 in the chain. - /// - public T8 Item8 - { - get => Unsafe.AsRef(Item8Ptr); - set - { - value.StructureType(); - var ptr = Item8Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item9Ptr => (BaseInStructure*) (_headPtr + Item9Offset); - - /// - /// Gets or sets item #9 in the chain. - /// - public T9 Item9 - { - get => Unsafe.AsRef(Item9Ptr); - set - { - value.StructureType(); - var ptr = Item9Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } + public static readonly int Item11Offset = Item10Offset + Item10Size; /// - /// Gets a pointer to the second item in the chain. + /// Gets the size (in bytes) of the Item 1. /// - public BaseInStructure* Item10Ptr => (BaseInStructure*) (_headPtr + Item10Offset); + public static readonly int Item11Size = Marshal.SizeOf(); /// - /// Gets or sets item #10 in the chain. + /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. /// - public T10 Item10 + public static readonly int MemorySize = Item11Offset + Item11Size; + + /// + public override int Size => MemorySize; + + private nint _headPtr; + + /// + public override BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; + + /// + /// Gets or sets the head of the chain. + /// + public TChain Head { - get => Unsafe.AsRef(Item10Ptr); + get => Unsafe.AsRef((BaseInStructure*) _headPtr); set { value.StructureType(); - var ptr = Item10Ptr; + var ptr = (BaseInStructure*) _headPtr; var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); + Marshal.StructureToPtr(value, _headPtr, true); ptr->PNext = nextPtr; } } @@ -8515,18 +15127,18 @@ public T10 Item10 /// /// Gets a pointer to the second item in the chain. /// - public BaseInStructure* Item11Ptr => (BaseInStructure*) (_headPtr + Item11Offset); + public BaseInStructure* Item1Ptr => (BaseInStructure*) (_headPtr + Item1Offset); /// - /// Gets or sets item #11 in the chain. + /// Gets or sets item #1 in the chain. /// - public T11 Item11 + public T1 Item1 { - get => Unsafe.AsRef(Item11Ptr); + get => Unsafe.AsRef(Item1Ptr); set { value.StructureType(); - var ptr = Item11Ptr; + var ptr = Item1Ptr; var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, (nint)ptr, true); ptr->PNext = nextPtr; @@ -8536,18 +15148,18 @@ public T11 Item11 /// /// Gets a pointer to the second item in the chain. /// - public BaseInStructure* Item12Ptr => (BaseInStructure*) (_headPtr + Item12Offset); + public BaseInStructure* Item2Ptr => (BaseInStructure*) (_headPtr + Item2Offset); /// - /// Gets or sets item #12 in the chain. + /// Gets or sets item #2 in the chain. /// - public T12 Item12 + public T2 Item2 { - get => Unsafe.AsRef(Item12Ptr); + get => Unsafe.AsRef(Item2Ptr); set { value.StructureType(); - var ptr = Item12Ptr; + var ptr = Item2Ptr; var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, (nint)ptr, true); ptr->PNext = nextPtr; @@ -8555,482 +15167,271 @@ public T12 Item12 } /// - /// Creates a new with 13 items from an existing memory block. - /// - /// The pointer to the head of the chain.. - /// - /// Callers are responsible for ensuring the size of the memory is correct. - /// - internal ManagedChain(nint headPtr) - { - _headPtr = headPtr; - } - - /// - /// Creates a new with 13 items. - /// - /// The head of the chain. - /// Item 1. - /// Item 2. - /// Item 3. - /// Item 4. - /// Item 5. - /// Item 6. - /// Item 7. - /// Item 8. - /// Item 9. - /// Item 10. - /// Item 11. - /// Item 12. - public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default) - : this(Marshal.AllocHGlobal(MemorySize)) - { - head.StructureType(); - Marshal.StructureToPtr(head, _headPtr, false); - BaseInStructure* itemPtr = Item1Ptr; - item1.StructureType(); - Marshal.StructureToPtr(item1, (nint)itemPtr, false); - HeadPtr->PNext = itemPtr; - itemPtr = Item2Ptr; - item2.StructureType(); - Marshal.StructureToPtr(item2, (nint)itemPtr, false); - Item1Ptr->PNext = itemPtr; - itemPtr = Item3Ptr; - item3.StructureType(); - Marshal.StructureToPtr(item3, (nint)itemPtr, false); - Item2Ptr->PNext = itemPtr; - itemPtr = Item4Ptr; - item4.StructureType(); - Marshal.StructureToPtr(item4, (nint)itemPtr, false); - Item3Ptr->PNext = itemPtr; - itemPtr = Item5Ptr; - item5.StructureType(); - Marshal.StructureToPtr(item5, (nint)itemPtr, false); - Item4Ptr->PNext = itemPtr; - itemPtr = Item6Ptr; - item6.StructureType(); - Marshal.StructureToPtr(item6, (nint)itemPtr, false); - Item5Ptr->PNext = itemPtr; - itemPtr = Item7Ptr; - item7.StructureType(); - Marshal.StructureToPtr(item7, (nint)itemPtr, false); - Item6Ptr->PNext = itemPtr; - itemPtr = Item8Ptr; - item8.StructureType(); - Marshal.StructureToPtr(item8, (nint)itemPtr, false); - Item7Ptr->PNext = itemPtr; - itemPtr = Item9Ptr; - item9.StructureType(); - Marshal.StructureToPtr(item9, (nint)itemPtr, false); - Item8Ptr->PNext = itemPtr; - itemPtr = Item10Ptr; - item10.StructureType(); - Marshal.StructureToPtr(item10, (nint)itemPtr, false); - Item9Ptr->PNext = itemPtr; - itemPtr = Item11Ptr; - item11.StructureType(); - Marshal.StructureToPtr(item11, (nint)itemPtr, false); - Item10Ptr->PNext = itemPtr; - itemPtr = Item12Ptr; - item12.StructureType(); - Marshal.StructureToPtr(item12, (nint)itemPtr, false); - Item11Ptr->PNext = itemPtr; - Item12Ptr->PNext = null; - } - - /// - /// Creates a new with 13 items from an existing unmanaged chain. + /// Gets a pointer to the second item in the chain. /// - /// Any errors loading the chain. - /// The unmanaged chain to use as the basis of this chain. - public ManagedChain(out string errors, TChain chain) - : this(Marshal.AllocHGlobal(MemorySize)) - { - chain.StructureType(); - Marshal.StructureToPtr(chain, _headPtr, false); - StringBuilder errorBuilder = new StringBuilder(); - var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); - var newPtr = (BaseInStructure*) _headPtr; - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item1Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T1 item1 = default; - var expectedStructureType = item1.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 13"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 2; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item1 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item1, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item2Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T2 item2 = default; - expectedStructureType = item2.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 13"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 3; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item2 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item2, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item3Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T3 item3 = default; - expectedStructureType = item3.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 13"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 4; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item3 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item3, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item4Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T4 item4 = default; - expectedStructureType = item4.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 13"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 5; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item4 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item4, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item5Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T5 item5 = default; - expectedStructureType = item5.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 13"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 6; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item5 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item5, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item6Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T6 item6 = default; - expectedStructureType = item6.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 13"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 7; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item6 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item6, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item7Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + public BaseInStructure* Item3Ptr => (BaseInStructure*) (_headPtr + Item3Offset); - T7 item7 = default; - expectedStructureType = item7.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 13"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 8; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item7 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #3 in the chain. + /// + public T3 Item3 + { + get => Unsafe.AsRef(Item3Ptr); + set + { + value.StructureType(); + var ptr = Item3Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item7, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item8Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item4Ptr => (BaseInStructure*) (_headPtr + Item4Offset); - T8 item8 = default; - expectedStructureType = item8.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 13"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 9; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item8 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #4 in the chain. + /// + public T4 Item4 + { + get => Unsafe.AsRef(Item4Ptr); + set + { + value.StructureType(); + var ptr = Item4Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item8, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item9Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item5Ptr => (BaseInStructure*) (_headPtr + Item5Offset); - T9 item9 = default; - expectedStructureType = item9.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 9, expected length 13"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 10; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item9 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #5 in the chain. + /// + public T5 Item5 + { + get => Unsafe.AsRef(Item5Ptr); + set + { + value.StructureType(); + var ptr = Item5Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item9, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item10Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item6Ptr => (BaseInStructure*) (_headPtr + Item6Offset); - T10 item10 = default; - expectedStructureType = item10.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 10, expected length 13"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 11; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item10 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #6 in the chain. + /// + public T6 Item6 + { + get => Unsafe.AsRef(Item6Ptr); + set + { + value.StructureType(); + var ptr = Item6Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item10, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item11Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item7Ptr => (BaseInStructure*) (_headPtr + Item7Offset); - T11 item11 = default; - expectedStructureType = item11.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 11, expected length 13"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 12; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item11 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #7 in the chain. + /// + public T7 Item7 + { + get => Unsafe.AsRef(Item7Ptr); + set + { + value.StructureType(); + var ptr = Item7Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item11, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item12Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item8Ptr => (BaseInStructure*) (_headPtr + Item8Offset); - T12 item12 = default; - expectedStructureType = item12.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 12, expected length 13"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 13; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - if (existingPtr->PNext is not null) { - errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 13"); - existingPtr->PNext = null; - } - item12 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #8 in the chain. + /// + public T8 Item8 + { + get => Unsafe.AsRef(Item8Ptr); + set + { + value.StructureType(); + var ptr = Item8Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item12, (nint) newPtr, false); - - // Create string of errors - errors = errorBuilder.ToString().Trim(); } /// - /// Creates a new with 13 by copying this chain. + /// Gets a pointer to the second item in the chain. /// - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Duplicate() + public BaseInStructure* Item9Ptr => (BaseInStructure*) (_headPtr + Item9Offset); + + /// + /// Gets or sets item #9 in the chain. + /// + public T9 Item9 { - var newHeadPtr = Marshal.AllocHGlobal(MemorySize); - // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); - // Update all pointers - ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); - ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); - ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); - ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); - ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item5Offset); - ((BaseInStructure*)(newHeadPtr + Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item6Offset); - ((BaseInStructure*)(newHeadPtr + Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item7Offset); - ((BaseInStructure*)(newHeadPtr + Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item8Offset); - ((BaseInStructure*)(newHeadPtr + Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item9Offset); - ((BaseInStructure*)(newHeadPtr + Item9Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item10Offset); - ((BaseInStructure*)(newHeadPtr + Item10Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item11Offset); - ((BaseInStructure*)(newHeadPtr + Item11Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item12Offset); - return new ManagedChain(newHeadPtr); + get => Unsafe.AsRef(Item9Ptr); + set + { + value.StructureType(); + var ptr = Item9Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } } /// - /// Creates a new with 13 items, by appending - /// to the end of this chain. + /// Gets a pointer to the second item in the chain. /// - /// The chain to append to. - /// Item 12. - /// - /// Do not forget to dispose the chain if you are no longer using it. - /// - public ManagedChain(ManagedChain previous, T12 item12 = default) - : this(Marshal.AllocHGlobal(MemorySize)) - { - var previousSize = MemorySize - Item12Size; - // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); - - // Append item 12 - item12.StructureType(); - Marshal.StructureToPtr(item12, _headPtr + previousSize, false); + public BaseInStructure* Item10Ptr => (BaseInStructure*) (_headPtr + Item10Offset); - // Update all pointers - ((BaseInStructure*)_headPtr)->PNext = (BaseInStructure*) (_headPtr + Item1Offset); - ((BaseInStructure*)(_headPtr + Item1Offset))->PNext = (BaseInStructure*) (_headPtr + Item2Offset); - ((BaseInStructure*)(_headPtr + Item2Offset))->PNext = (BaseInStructure*) (_headPtr + Item3Offset); - ((BaseInStructure*)(_headPtr + Item3Offset))->PNext = (BaseInStructure*) (_headPtr + Item4Offset); - ((BaseInStructure*)(_headPtr + Item4Offset))->PNext = (BaseInStructure*) (_headPtr + Item5Offset); - ((BaseInStructure*)(_headPtr + Item5Offset))->PNext = (BaseInStructure*) (_headPtr + Item6Offset); - ((BaseInStructure*)(_headPtr + Item6Offset))->PNext = (BaseInStructure*) (_headPtr + Item7Offset); - ((BaseInStructure*)(_headPtr + Item7Offset))->PNext = (BaseInStructure*) (_headPtr + Item8Offset); - ((BaseInStructure*)(_headPtr + Item8Offset))->PNext = (BaseInStructure*) (_headPtr + Item9Offset); - ((BaseInStructure*)(_headPtr + Item9Offset))->PNext = (BaseInStructure*) (_headPtr + Item10Offset); - ((BaseInStructure*)(_headPtr + Item10Offset))->PNext = (BaseInStructure*) (_headPtr + Item11Offset); - ((BaseInStructure*)(_headPtr + Item11Offset))->PNext = (BaseInStructure*) (_headPtr + Item12Offset); - ((BaseInStructure*)(_headPtr + previousSize))->PNext = null; + /// + /// Gets or sets item #10 in the chain. + /// + public T10 Item10 + { + get => Unsafe.AsRef(Item10Ptr); + set + { + value.StructureType(); + var ptr = Item10Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } } /// - /// Creates a new with 12 items, by removing the last item - /// from this chain. + /// Gets a pointer to the second item in the chain. /// - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Truncate() + public BaseInStructure* Item11Ptr => (BaseInStructure*) (_headPtr + Item11Offset); + + /// + /// Gets or sets item #11 in the chain. + /// + public T11 Item11 { - return Truncate(out var _); + get => Unsafe.AsRef(Item11Ptr); + set + { + value.StructureType(); + var ptr = Item11Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } } /// - /// Creates a new with 12 items, by removing - /// from the end of this chain. + /// Creates a new with 12 items from an existing memory block. /// + /// The pointer to the head of the chain. /// - /// Do not forget to dispose this chain if you are no longer using it. + /// Callers are responsible for ensuring the size of the memory is correct. /// - public ManagedChain Truncate(out T12 item12) + internal ManagedChain(nint headPtr) { - item12 = Item12; - - var newSize = MemorySize - Item12Size; - var newHeadPtr = Marshal.AllocHGlobal(newSize); - // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); - // Update all pointers - ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); - ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); - ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); - ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); - ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item5Offset); - ((BaseInStructure*)(newHeadPtr + Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item6Offset); - ((BaseInStructure*)(newHeadPtr + Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item7Offset); - ((BaseInStructure*)(newHeadPtr + Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item8Offset); - ((BaseInStructure*)(newHeadPtr + Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item9Offset); - ((BaseInStructure*)(newHeadPtr + Item9Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item10Offset); - ((BaseInStructure*)(newHeadPtr + Item10Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item11Offset); - ((BaseInStructure*)(newHeadPtr + Item11Offset))->PNext = null; - return new ManagedChain(newHeadPtr); + _headPtr = headPtr; } /// - /// Creates a new with 14 items, by appending to - /// the end of this chain. + /// Creates a new with 12 items. /// - /// Item 13. - /// Type of Item 13 - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Append(T13 item13 = default) - where T13: struct, IExtendsChain + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// Item 11. + internal ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default) + : this(Marshal.AllocHGlobal(MemorySize)) { - return new ManagedChain(this, item13); + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + var itemPtr = Item1Ptr; + item1.StructureType(); + Marshal.StructureToPtr(item1, (nint)itemPtr, false); + HeadPtr->PNext = itemPtr; + itemPtr = Item2Ptr; + item2.StructureType(); + Marshal.StructureToPtr(item2, (nint)itemPtr, false); + Item1Ptr->PNext = itemPtr; + itemPtr = Item3Ptr; + item3.StructureType(); + Marshal.StructureToPtr(item3, (nint)itemPtr, false); + Item2Ptr->PNext = itemPtr; + itemPtr = Item4Ptr; + item4.StructureType(); + Marshal.StructureToPtr(item4, (nint)itemPtr, false); + Item3Ptr->PNext = itemPtr; + itemPtr = Item5Ptr; + item5.StructureType(); + Marshal.StructureToPtr(item5, (nint)itemPtr, false); + Item4Ptr->PNext = itemPtr; + itemPtr = Item6Ptr; + item6.StructureType(); + Marshal.StructureToPtr(item6, (nint)itemPtr, false); + Item5Ptr->PNext = itemPtr; + itemPtr = Item7Ptr; + item7.StructureType(); + Marshal.StructureToPtr(item7, (nint)itemPtr, false); + Item6Ptr->PNext = itemPtr; + itemPtr = Item8Ptr; + item8.StructureType(); + Marshal.StructureToPtr(item8, (nint)itemPtr, false); + Item7Ptr->PNext = itemPtr; + itemPtr = Item9Ptr; + item9.StructureType(); + Marshal.StructureToPtr(item9, (nint)itemPtr, false); + Item8Ptr->PNext = itemPtr; + itemPtr = Item10Ptr; + item10.StructureType(); + Marshal.StructureToPtr(item10, (nint)itemPtr, false); + Item9Ptr->PNext = itemPtr; + itemPtr = Item11Ptr; + item11.StructureType(); + Marshal.StructureToPtr(item11, (nint)itemPtr, false); + Item10Ptr->PNext = itemPtr; + Item11Ptr->PNext = null; } /// @@ -9048,11 +15449,10 @@ public override IEnumerator GetEnumerator() yield return Item9; yield return Item10; yield return Item11; - yield return Item12; } /// - public override int Count => 13; + public override int Count => 12; /// public override IChainable this[int index] @@ -9070,10 +15470,170 @@ public override IChainable this[int index] 9 => Item9, 10 => Item10, 11 => Item11, - 12 => Item12, _ => throw new IndexOutOfRangeException() }; + /// + /// Compares the supplied memory block with this one, ignoring the structure headers. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + protected override bool MemoryEquals(ManagedChain other) + { + var ptr = HeadPtr; + var otherPtr = other.HeadPtr; + if (ptr == otherPtr) { + return true; + } + var span = new ReadOnlySpan((void*) ptr, MemorySize); + var otherSpan = new ReadOnlySpan((void*) otherPtr, MemorySize); + var start = 0; + var length = HeadSize; + var sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item1Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item2Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item3Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item4Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item5Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item6Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item7Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item8Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item9Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item10Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item11Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + return true; + } + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Equals(ManagedChain other) + => !ReferenceEquals(null, other) && (ReferenceEquals(this, other) || MemoryEquals(other)); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator ==(ManagedChain left, ManagedChain right) => + ReferenceEquals(null, left) + ? ReferenceEquals(null, right) + : !ReferenceEquals(null, right) && (ReferenceEquals(left, right) || left.MemoryEquals(right)); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator !=(ManagedChain left, ManagedChain right) => + ReferenceEquals(null, left) + ? !ReferenceEquals(null, right) + : ReferenceEquals(null, right) || (!ReferenceEquals(left, right) && !left.MemoryEquals(right)); + + /// + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append("("); + sb.Append((object) Head); sb.Append(", "); + sb.Append((object) Item1); + sb.Append(", "); + sb.Append((object) Item2); + sb.Append(", "); + sb.Append((object) Item3); + sb.Append(", "); + sb.Append((object) Item4); + sb.Append(", "); + sb.Append((object) Item5); + sb.Append(", "); + sb.Append((object) Item6); + sb.Append(", "); + sb.Append((object) Item7); + sb.Append(", "); + sb.Append((object) Item8); + sb.Append(", "); + sb.Append((object) Item9); + sb.Append(", "); + sb.Append((object) Item10); + sb.Append(", "); + sb.Append((object) Item11); + sb.Append(")"); + return sb.ToString(); + } + /// /// Deconstructs this chain. /// @@ -9089,8 +15649,7 @@ public override IChainable this[int index] /// Item 9. /// Item 10. /// Item 11. - /// Item 12. - public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6, out T7 item7, out T8 item8, out T9 item9, out T10 item10, out T11 item11, out T12 item12) + public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6, out T7 item7, out T8 item8, out T9 item9, out T10 item10, out T11 item11) { head = Head; item1 = Item1; @@ -9104,7 +15663,6 @@ public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item item9 = Item9; item10 = Item10; item11 = Item11; - item12 = Item12; } /// @@ -9128,7 +15686,6 @@ public override void Dispose() Marshal.DestroyStructure(headPtr + Item9Offset); Marshal.DestroyStructure(headPtr + Item10Offset); Marshal.DestroyStructure(headPtr + Item11Offset); - Marshal.DestroyStructure(headPtr + Item12Offset); // Free memory block Marshal.FreeHGlobal(headPtr); @@ -9136,7 +15693,7 @@ public override void Dispose() } /// -/// A safely manages the pointers of a managed structure chain. +/// A safely manages the pointers of a managed structure chain. /// /// The chain type /// Type of Item 1. @@ -9151,23 +15708,26 @@ public override void Dispose() /// Type of Item 10. /// Type of Item 11. /// Type of Item 12. -/// Type of Item 13. -public unsafe class ManagedChain : ManagedChain - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain - where T8 : struct, IExtendsChain - where T9 : struct, IExtendsChain - where T10 : struct, IExtendsChain - where T11 : struct, IExtendsChain - where T12 : struct, IExtendsChain - where T13 : struct, IExtendsChain +public unsafe sealed class ManagedChain : ManagedChain, IEquatable> + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + where T11 : struct, IChainable + where T12 : struct, IChainable { + /// + /// Gets the size (in bytes) of the default structure header. + /// + public static readonly int HeaderSize = Marshal.SizeOf(); + /// /// Gets the size (in bytes) of the head structure. /// @@ -9211,905 +15771,1288 @@ public unsafe class ManagedChain /// Gets the size (in bytes) of the Item 1. /// - public static readonly int Item4Size = Marshal.SizeOf(); + public static readonly int Item4Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item5Offset = Item4Offset + Item4Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item5Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item6Offset = Item5Offset + Item5Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item6Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item7Offset = Item6Offset + Item6Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item7Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item8Offset = Item7Offset + Item7Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item8Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item9Offset = Item8Offset + Item8Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item9Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item10Offset = Item9Offset + Item9Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item10Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item11Offset = Item10Offset + Item10Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item11Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item12Offset = Item11Offset + Item11Size; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item12Size = Marshal.SizeOf(); + + /// + /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. + /// + public static readonly int MemorySize = Item12Offset + Item12Size; + + /// + public override int Size => MemorySize; + + private nint _headPtr; + + /// + public override BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; + + /// + /// Gets or sets the head of the chain. + /// + public TChain Head + { + get => Unsafe.AsRef((BaseInStructure*) _headPtr); + set + { + value.StructureType(); + var ptr = (BaseInStructure*) _headPtr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, _headPtr, true); + ptr->PNext = nextPtr; + } + } + + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item1Ptr => (BaseInStructure*) (_headPtr + Item1Offset); + + /// + /// Gets or sets item #1 in the chain. + /// + public T1 Item1 + { + get => Unsafe.AsRef(Item1Ptr); + set + { + value.StructureType(); + var ptr = Item1Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } + } + + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item2Ptr => (BaseInStructure*) (_headPtr + Item2Offset); + + /// + /// Gets or sets item #2 in the chain. + /// + public T2 Item2 + { + get => Unsafe.AsRef(Item2Ptr); + set + { + value.StructureType(); + var ptr = Item2Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } + } + + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item3Ptr => (BaseInStructure*) (_headPtr + Item3Offset); + + /// + /// Gets or sets item #3 in the chain. + /// + public T3 Item3 + { + get => Unsafe.AsRef(Item3Ptr); + set + { + value.StructureType(); + var ptr = Item3Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } + } /// - /// Gets the offset to the start of . + /// Gets a pointer to the second item in the chain. /// - public static readonly int Item5Offset = Item4Offset + Item4Size; + public BaseInStructure* Item4Ptr => (BaseInStructure*) (_headPtr + Item4Offset); /// - /// Gets the size (in bytes) of the Item 1. + /// Gets or sets item #4 in the chain. /// - public static readonly int Item5Size = Marshal.SizeOf(); + public T4 Item4 + { + get => Unsafe.AsRef(Item4Ptr); + set + { + value.StructureType(); + var ptr = Item4Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } + } /// - /// Gets the offset to the start of . + /// Gets a pointer to the second item in the chain. /// - public static readonly int Item6Offset = Item5Offset + Item5Size; + public BaseInStructure* Item5Ptr => (BaseInStructure*) (_headPtr + Item5Offset); /// - /// Gets the size (in bytes) of the Item 1. + /// Gets or sets item #5 in the chain. /// - public static readonly int Item6Size = Marshal.SizeOf(); + public T5 Item5 + { + get => Unsafe.AsRef(Item5Ptr); + set + { + value.StructureType(); + var ptr = Item5Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } + } /// - /// Gets the offset to the start of . + /// Gets a pointer to the second item in the chain. /// - public static readonly int Item7Offset = Item6Offset + Item6Size; + public BaseInStructure* Item6Ptr => (BaseInStructure*) (_headPtr + Item6Offset); /// - /// Gets the size (in bytes) of the Item 1. + /// Gets or sets item #6 in the chain. /// - public static readonly int Item7Size = Marshal.SizeOf(); + public T6 Item6 + { + get => Unsafe.AsRef(Item6Ptr); + set + { + value.StructureType(); + var ptr = Item6Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } + } /// - /// Gets the offset to the start of . + /// Gets a pointer to the second item in the chain. /// - public static readonly int Item8Offset = Item7Offset + Item7Size; + public BaseInStructure* Item7Ptr => (BaseInStructure*) (_headPtr + Item7Offset); /// - /// Gets the size (in bytes) of the Item 1. + /// Gets or sets item #7 in the chain. /// - public static readonly int Item8Size = Marshal.SizeOf(); + public T7 Item7 + { + get => Unsafe.AsRef(Item7Ptr); + set + { + value.StructureType(); + var ptr = Item7Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } + } /// - /// Gets the offset to the start of . + /// Gets a pointer to the second item in the chain. /// - public static readonly int Item9Offset = Item8Offset + Item8Size; + public BaseInStructure* Item8Ptr => (BaseInStructure*) (_headPtr + Item8Offset); /// - /// Gets the size (in bytes) of the Item 1. + /// Gets or sets item #8 in the chain. /// - public static readonly int Item9Size = Marshal.SizeOf(); + public T8 Item8 + { + get => Unsafe.AsRef(Item8Ptr); + set + { + value.StructureType(); + var ptr = Item8Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } + } /// - /// Gets the offset to the start of . + /// Gets a pointer to the second item in the chain. /// - public static readonly int Item10Offset = Item9Offset + Item9Size; + public BaseInStructure* Item9Ptr => (BaseInStructure*) (_headPtr + Item9Offset); /// - /// Gets the size (in bytes) of the Item 1. + /// Gets or sets item #9 in the chain. /// - public static readonly int Item10Size = Marshal.SizeOf(); + public T9 Item9 + { + get => Unsafe.AsRef(Item9Ptr); + set + { + value.StructureType(); + var ptr = Item9Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } + } /// - /// Gets the offset to the start of . + /// Gets a pointer to the second item in the chain. /// - public static readonly int Item11Offset = Item10Offset + Item10Size; + public BaseInStructure* Item10Ptr => (BaseInStructure*) (_headPtr + Item10Offset); /// - /// Gets the size (in bytes) of the Item 1. + /// Gets or sets item #10 in the chain. /// - public static readonly int Item11Size = Marshal.SizeOf(); + public T10 Item10 + { + get => Unsafe.AsRef(Item10Ptr); + set + { + value.StructureType(); + var ptr = Item10Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } + } /// - /// Gets the offset to the start of . + /// Gets a pointer to the second item in the chain. /// - public static readonly int Item12Offset = Item11Offset + Item11Size; + public BaseInStructure* Item11Ptr => (BaseInStructure*) (_headPtr + Item11Offset); /// - /// Gets the size (in bytes) of the Item 1. + /// Gets or sets item #11 in the chain. /// - public static readonly int Item12Size = Marshal.SizeOf(); + public T11 Item11 + { + get => Unsafe.AsRef(Item11Ptr); + set + { + value.StructureType(); + var ptr = Item11Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } + } /// - /// Gets the offset to the start of . + /// Gets a pointer to the second item in the chain. /// - public static readonly int Item13Offset = Item12Offset + Item12Size; + public BaseInStructure* Item12Ptr => (BaseInStructure*) (_headPtr + Item12Offset); /// - /// Gets the size (in bytes) of the Item 1. + /// Gets or sets item #12 in the chain. /// - public static readonly int Item13Size = Marshal.SizeOf(); + public T12 Item12 + { + get => Unsafe.AsRef(Item12Ptr); + set + { + value.StructureType(); + var ptr = Item12Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } + } /// - /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. + /// Creates a new with 13 items from an existing memory block. /// - public static readonly int MemorySize = Item13Offset + Item13Size; - - private nint _headPtr; + /// The pointer to the head of the chain. + /// + /// Callers are responsible for ensuring the size of the memory is correct. + /// + internal ManagedChain(nint headPtr) + { + _headPtr = headPtr; + } /// - /// Gets a pointer to the current head. + /// Creates a new with 13 items. /// - public BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// Item 11. + /// Item 12. + internal ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default) + : this(Marshal.AllocHGlobal(MemorySize)) + { + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + var itemPtr = Item1Ptr; + item1.StructureType(); + Marshal.StructureToPtr(item1, (nint)itemPtr, false); + HeadPtr->PNext = itemPtr; + itemPtr = Item2Ptr; + item2.StructureType(); + Marshal.StructureToPtr(item2, (nint)itemPtr, false); + Item1Ptr->PNext = itemPtr; + itemPtr = Item3Ptr; + item3.StructureType(); + Marshal.StructureToPtr(item3, (nint)itemPtr, false); + Item2Ptr->PNext = itemPtr; + itemPtr = Item4Ptr; + item4.StructureType(); + Marshal.StructureToPtr(item4, (nint)itemPtr, false); + Item3Ptr->PNext = itemPtr; + itemPtr = Item5Ptr; + item5.StructureType(); + Marshal.StructureToPtr(item5, (nint)itemPtr, false); + Item4Ptr->PNext = itemPtr; + itemPtr = Item6Ptr; + item6.StructureType(); + Marshal.StructureToPtr(item6, (nint)itemPtr, false); + Item5Ptr->PNext = itemPtr; + itemPtr = Item7Ptr; + item7.StructureType(); + Marshal.StructureToPtr(item7, (nint)itemPtr, false); + Item6Ptr->PNext = itemPtr; + itemPtr = Item8Ptr; + item8.StructureType(); + Marshal.StructureToPtr(item8, (nint)itemPtr, false); + Item7Ptr->PNext = itemPtr; + itemPtr = Item9Ptr; + item9.StructureType(); + Marshal.StructureToPtr(item9, (nint)itemPtr, false); + Item8Ptr->PNext = itemPtr; + itemPtr = Item10Ptr; + item10.StructureType(); + Marshal.StructureToPtr(item10, (nint)itemPtr, false); + Item9Ptr->PNext = itemPtr; + itemPtr = Item11Ptr; + item11.StructureType(); + Marshal.StructureToPtr(item11, (nint)itemPtr, false); + Item10Ptr->PNext = itemPtr; + itemPtr = Item12Ptr; + item12.StructureType(); + Marshal.StructureToPtr(item12, (nint)itemPtr, false); + Item11Ptr->PNext = itemPtr; + Item12Ptr->PNext = null; + } - /// - /// Gets or sets the head of the chain. - /// - public TChain Head + /// + public override IEnumerator GetEnumerator() { - get => Unsafe.AsRef((BaseInStructure*) _headPtr); - set - { - value.StructureType(); - var ptr = (BaseInStructure*) _headPtr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, _headPtr, true); - ptr->PNext = nextPtr; - } + yield return Head; + yield return Item1; + yield return Item2; + yield return Item3; + yield return Item4; + yield return Item5; + yield return Item6; + yield return Item7; + yield return Item8; + yield return Item9; + yield return Item10; + yield return Item11; + yield return Item12; } - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item1Ptr => (BaseInStructure*) (_headPtr + Item1Offset); + /// + public override int Count => 13; - /// - /// Gets or sets item #1 in the chain. - /// - public T1 Item1 - { - get => Unsafe.AsRef(Item1Ptr); - set + /// + public override IChainable this[int index] + => index switch { - value.StructureType(); - var ptr = Item1Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } + 0 => Head, + 1 => Item1, + 2 => Item2, + 3 => Item3, + 4 => Item4, + 5 => Item5, + 6 => Item6, + 7 => Item7, + 8 => Item8, + 9 => Item9, + 10 => Item10, + 11 => Item11, + 12 => Item12, + _ => throw new IndexOutOfRangeException() + }; /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item2Ptr => (BaseInStructure*) (_headPtr + Item2Offset); + /// Compares the supplied memory block with this one, ignoring the structure headers. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + protected override bool MemoryEquals(ManagedChain other) + { + var ptr = HeadPtr; + var otherPtr = other.HeadPtr; + if (ptr == otherPtr) { + return true; + } + var span = new ReadOnlySpan((void*) ptr, MemorySize); + var otherSpan = new ReadOnlySpan((void*) otherPtr, MemorySize); + var start = 0; + var length = HeadSize; + var sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item1Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item2Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item3Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item4Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item5Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item6Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item7Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item8Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item9Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item10Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item11Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item12Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + return true; + } + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Equals(ManagedChain other) + => !ReferenceEquals(null, other) && (ReferenceEquals(this, other) || MemoryEquals(other)); - /// - /// Gets or sets item #2 in the chain. - /// - public T2 Item2 - { - get => Unsafe.AsRef(Item2Ptr); - set - { - value.StructureType(); - var ptr = Item2Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator ==(ManagedChain left, ManagedChain right) => + ReferenceEquals(null, left) + ? ReferenceEquals(null, right) + : !ReferenceEquals(null, right) && (ReferenceEquals(left, right) || left.MemoryEquals(right)); - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item3Ptr => (BaseInStructure*) (_headPtr + Item3Offset); + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator !=(ManagedChain left, ManagedChain right) => + ReferenceEquals(null, left) + ? !ReferenceEquals(null, right) + : ReferenceEquals(null, right) || (!ReferenceEquals(left, right) && !left.MemoryEquals(right)); - /// - /// Gets or sets item #3 in the chain. - /// - public T3 Item3 - { - get => Unsafe.AsRef(Item3Ptr); - set - { - value.StructureType(); - var ptr = Item3Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } + /// + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append("("); + sb.Append((object) Head); sb.Append(", "); + sb.Append((object) Item1); + sb.Append(", "); + sb.Append((object) Item2); + sb.Append(", "); + sb.Append((object) Item3); + sb.Append(", "); + sb.Append((object) Item4); + sb.Append(", "); + sb.Append((object) Item5); + sb.Append(", "); + sb.Append((object) Item6); + sb.Append(", "); + sb.Append((object) Item7); + sb.Append(", "); + sb.Append((object) Item8); + sb.Append(", "); + sb.Append((object) Item9); + sb.Append(", "); + sb.Append((object) Item10); + sb.Append(", "); + sb.Append((object) Item11); + sb.Append(", "); + sb.Append((object) Item12); + sb.Append(")"); + return sb.ToString(); } /// - /// Gets a pointer to the second item in the chain. + /// Deconstructs this chain. /// - public BaseInStructure* Item4Ptr => (BaseInStructure*) (_headPtr + Item4Offset); + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// Item 11. + /// Item 12. + public void Deconstruct(out TChain head, out T1 item1, out T2 item2, out T3 item3, out T4 item4, out T5 item5, out T6 item6, out T7 item7, out T8 item8, out T9 item9, out T10 item10, out T11 item11, out T12 item12) + { + head = Head; + item1 = Item1; + item2 = Item2; + item3 = Item3; + item4 = Item4; + item5 = Item5; + item6 = Item6; + item7 = Item7; + item8 = Item8; + item9 = Item9; + item10 = Item10; + item11 = Item11; + item12 = Item12; + } - /// - /// Gets or sets item #4 in the chain. - /// - public T4 Item4 + /// + public override void Dispose() { - get => Unsafe.AsRef(Item4Ptr); - set - { - value.StructureType(); - var ptr = Item4Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; + var headPtr = Interlocked.Exchange(ref _headPtr, (nint)0); + if (headPtr == (nint)0) { + return; } + + // Destroy all structures + Marshal.DestroyStructure(headPtr); + Marshal.DestroyStructure(headPtr + Item1Offset); + Marshal.DestroyStructure(headPtr + Item2Offset); + Marshal.DestroyStructure(headPtr + Item3Offset); + Marshal.DestroyStructure(headPtr + Item4Offset); + Marshal.DestroyStructure(headPtr + Item5Offset); + Marshal.DestroyStructure(headPtr + Item6Offset); + Marshal.DestroyStructure(headPtr + Item7Offset); + Marshal.DestroyStructure(headPtr + Item8Offset); + Marshal.DestroyStructure(headPtr + Item9Offset); + Marshal.DestroyStructure(headPtr + Item10Offset); + Marshal.DestroyStructure(headPtr + Item11Offset); + Marshal.DestroyStructure(headPtr + Item12Offset); + + // Free memory block + Marshal.FreeHGlobal(headPtr); } +} +/// +/// A safely manages the pointers of a managed structure chain. +/// +/// The chain type +/// Type of Item 1. +/// Type of Item 2. +/// Type of Item 3. +/// Type of Item 4. +/// Type of Item 5. +/// Type of Item 6. +/// Type of Item 7. +/// Type of Item 8. +/// Type of Item 9. +/// Type of Item 10. +/// Type of Item 11. +/// Type of Item 12. +/// Type of Item 13. +public unsafe sealed class ManagedChain : ManagedChain, IEquatable> + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + where T11 : struct, IChainable + where T12 : struct, IChainable + where T13 : struct, IChainable +{ /// - /// Gets a pointer to the second item in the chain. + /// Gets the size (in bytes) of the default structure header. /// - public BaseInStructure* Item5Ptr => (BaseInStructure*) (_headPtr + Item5Offset); + public static readonly int HeaderSize = Marshal.SizeOf(); /// - /// Gets or sets item #5 in the chain. + /// Gets the size (in bytes) of the head structure. /// - public T5 Item5 - { - get => Unsafe.AsRef(Item5Ptr); - set - { - value.StructureType(); - var ptr = Item5Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } + public static readonly int HeadSize = Marshal.SizeOf(); /// - /// Gets a pointer to the second item in the chain. + /// Gets the offset to the start of . /// - public BaseInStructure* Item6Ptr => (BaseInStructure*) (_headPtr + Item6Offset); + public static readonly int Item1Offset = HeadSize; /// - /// Gets or sets item #6 in the chain. + /// Gets the size (in bytes) of the Item 1. /// - public T6 Item6 - { - get => Unsafe.AsRef(Item6Ptr); - set - { - value.StructureType(); - var ptr = Item6Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } + public static readonly int Item1Size = Marshal.SizeOf(); /// - /// Gets a pointer to the second item in the chain. + /// Gets the offset to the start of . /// - public BaseInStructure* Item7Ptr => (BaseInStructure*) (_headPtr + Item7Offset); + public static readonly int Item2Offset = Item1Offset + Item1Size; /// - /// Gets or sets item #7 in the chain. + /// Gets the size (in bytes) of the Item 1. /// - public T7 Item7 - { - get => Unsafe.AsRef(Item7Ptr); - set - { - value.StructureType(); - var ptr = Item7Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } + public static readonly int Item2Size = Marshal.SizeOf(); + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item3Offset = Item2Offset + Item2Size; /// - /// Gets a pointer to the second item in the chain. + /// Gets the size (in bytes) of the Item 1. /// - public BaseInStructure* Item8Ptr => (BaseInStructure*) (_headPtr + Item8Offset); + public static readonly int Item3Size = Marshal.SizeOf(); /// - /// Gets or sets item #8 in the chain. + /// Gets the offset to the start of . /// - public T8 Item8 - { - get => Unsafe.AsRef(Item8Ptr); - set - { - value.StructureType(); - var ptr = Item8Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } + public static readonly int Item4Offset = Item3Offset + Item3Size; /// - /// Gets a pointer to the second item in the chain. + /// Gets the size (in bytes) of the Item 1. /// - public BaseInStructure* Item9Ptr => (BaseInStructure*) (_headPtr + Item9Offset); + public static readonly int Item4Size = Marshal.SizeOf(); /// - /// Gets or sets item #9 in the chain. + /// Gets the offset to the start of . /// - public T9 Item9 - { - get => Unsafe.AsRef(Item9Ptr); - set - { - value.StructureType(); - var ptr = Item9Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } + public static readonly int Item5Offset = Item4Offset + Item4Size; /// - /// Gets a pointer to the second item in the chain. + /// Gets the size (in bytes) of the Item 1. /// - public BaseInStructure* Item10Ptr => (BaseInStructure*) (_headPtr + Item10Offset); + public static readonly int Item5Size = Marshal.SizeOf(); /// - /// Gets or sets item #10 in the chain. + /// Gets the offset to the start of . /// - public T10 Item10 - { - get => Unsafe.AsRef(Item10Ptr); - set - { - value.StructureType(); - var ptr = Item10Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } + public static readonly int Item6Offset = Item5Offset + Item5Size; /// - /// Gets a pointer to the second item in the chain. + /// Gets the size (in bytes) of the Item 1. /// - public BaseInStructure* Item11Ptr => (BaseInStructure*) (_headPtr + Item11Offset); + public static readonly int Item6Size = Marshal.SizeOf(); /// - /// Gets or sets item #11 in the chain. + /// Gets the offset to the start of . /// - public T11 Item11 - { - get => Unsafe.AsRef(Item11Ptr); - set - { - value.StructureType(); - var ptr = Item11Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } + public static readonly int Item7Offset = Item6Offset + Item6Size; /// - /// Gets a pointer to the second item in the chain. + /// Gets the size (in bytes) of the Item 1. /// - public BaseInStructure* Item12Ptr => (BaseInStructure*) (_headPtr + Item12Offset); + public static readonly int Item7Size = Marshal.SizeOf(); /// - /// Gets or sets item #12 in the chain. + /// Gets the offset to the start of . /// - public T12 Item12 - { - get => Unsafe.AsRef(Item12Ptr); - set - { - value.StructureType(); - var ptr = Item12Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } + public static readonly int Item8Offset = Item7Offset + Item7Size; /// - /// Gets a pointer to the second item in the chain. + /// Gets the size (in bytes) of the Item 1. /// - public BaseInStructure* Item13Ptr => (BaseInStructure*) (_headPtr + Item13Offset); + public static readonly int Item8Size = Marshal.SizeOf(); /// - /// Gets or sets item #13 in the chain. + /// Gets the offset to the start of . /// - public T13 Item13 - { - get => Unsafe.AsRef(Item13Ptr); - set - { - value.StructureType(); - var ptr = Item13Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } + public static readonly int Item9Offset = Item8Offset + Item8Size; /// - /// Creates a new with 14 items from an existing memory block. + /// Gets the size (in bytes) of the Item 1. /// - /// The pointer to the head of the chain.. - /// - /// Callers are responsible for ensuring the size of the memory is correct. - /// - internal ManagedChain(nint headPtr) - { - _headPtr = headPtr; - } + public static readonly int Item9Size = Marshal.SizeOf(); /// - /// Creates a new with 14 items. + /// Gets the offset to the start of . /// - /// The head of the chain. - /// Item 1. - /// Item 2. - /// Item 3. - /// Item 4. - /// Item 5. - /// Item 6. - /// Item 7. - /// Item 8. - /// Item 9. - /// Item 10. - /// Item 11. - /// Item 12. - /// Item 13. - public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default, T13 item13 = default) - : this(Marshal.AllocHGlobal(MemorySize)) - { - head.StructureType(); - Marshal.StructureToPtr(head, _headPtr, false); - BaseInStructure* itemPtr = Item1Ptr; - item1.StructureType(); - Marshal.StructureToPtr(item1, (nint)itemPtr, false); - HeadPtr->PNext = itemPtr; - itemPtr = Item2Ptr; - item2.StructureType(); - Marshal.StructureToPtr(item2, (nint)itemPtr, false); - Item1Ptr->PNext = itemPtr; - itemPtr = Item3Ptr; - item3.StructureType(); - Marshal.StructureToPtr(item3, (nint)itemPtr, false); - Item2Ptr->PNext = itemPtr; - itemPtr = Item4Ptr; - item4.StructureType(); - Marshal.StructureToPtr(item4, (nint)itemPtr, false); - Item3Ptr->PNext = itemPtr; - itemPtr = Item5Ptr; - item5.StructureType(); - Marshal.StructureToPtr(item5, (nint)itemPtr, false); - Item4Ptr->PNext = itemPtr; - itemPtr = Item6Ptr; - item6.StructureType(); - Marshal.StructureToPtr(item6, (nint)itemPtr, false); - Item5Ptr->PNext = itemPtr; - itemPtr = Item7Ptr; - item7.StructureType(); - Marshal.StructureToPtr(item7, (nint)itemPtr, false); - Item6Ptr->PNext = itemPtr; - itemPtr = Item8Ptr; - item8.StructureType(); - Marshal.StructureToPtr(item8, (nint)itemPtr, false); - Item7Ptr->PNext = itemPtr; - itemPtr = Item9Ptr; - item9.StructureType(); - Marshal.StructureToPtr(item9, (nint)itemPtr, false); - Item8Ptr->PNext = itemPtr; - itemPtr = Item10Ptr; - item10.StructureType(); - Marshal.StructureToPtr(item10, (nint)itemPtr, false); - Item9Ptr->PNext = itemPtr; - itemPtr = Item11Ptr; - item11.StructureType(); - Marshal.StructureToPtr(item11, (nint)itemPtr, false); - Item10Ptr->PNext = itemPtr; - itemPtr = Item12Ptr; - item12.StructureType(); - Marshal.StructureToPtr(item12, (nint)itemPtr, false); - Item11Ptr->PNext = itemPtr; - itemPtr = Item13Ptr; - item13.StructureType(); - Marshal.StructureToPtr(item13, (nint)itemPtr, false); - Item12Ptr->PNext = itemPtr; - Item13Ptr->PNext = null; - } + public static readonly int Item10Offset = Item9Offset + Item9Size; /// - /// Creates a new with 14 items from an existing unmanaged chain. + /// Gets the size (in bytes) of the Item 1. /// - /// Any errors loading the chain. - /// The unmanaged chain to use as the basis of this chain. - public ManagedChain(out string errors, TChain chain) - : this(Marshal.AllocHGlobal(MemorySize)) - { - chain.StructureType(); - Marshal.StructureToPtr(chain, _headPtr, false); - StringBuilder errorBuilder = new StringBuilder(); - var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); - var newPtr = (BaseInStructure*) _headPtr; + public static readonly int Item10Size = Marshal.SizeOf(); - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item1Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets the offset to the start of . + /// + public static readonly int Item11Offset = Item10Offset + Item10Size; - T1 item1 = default; - var expectedStructureType = item1.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 14"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 2; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item1 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item1, (nint) newPtr, false); + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item11Size = Marshal.SizeOf(); - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item2Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets the offset to the start of . + /// + public static readonly int Item12Offset = Item11Offset + Item11Size; - T2 item2 = default; - expectedStructureType = item2.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 14"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 3; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item2 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item2, (nint) newPtr, false); + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item12Size = Marshal.SizeOf(); - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item3Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets the offset to the start of . + /// + public static readonly int Item13Offset = Item12Offset + Item12Size; - T3 item3 = default; - expectedStructureType = item3.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 14"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 4; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item3 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item3, (nint) newPtr, false); + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item13Size = Marshal.SizeOf(); - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item4Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. + /// + public static readonly int MemorySize = Item13Offset + Item13Size; + + /// + public override int Size => MemorySize; - T4 item4 = default; - expectedStructureType = item4.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 14"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 5; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item4 = Unsafe.AsRef(existingPtr); - } + private nint _headPtr; + + /// + public override BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; + + /// + /// Gets or sets the head of the chain. + /// + public TChain Head + { + get => Unsafe.AsRef((BaseInStructure*) _headPtr); + set + { + value.StructureType(); + var ptr = (BaseInStructure*) _headPtr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, _headPtr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item4, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item5Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item1Ptr => (BaseInStructure*) (_headPtr + Item1Offset); - T5 item5 = default; - expectedStructureType = item5.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 14"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 6; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item5 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #1 in the chain. + /// + public T1 Item1 + { + get => Unsafe.AsRef(Item1Ptr); + set + { + value.StructureType(); + var ptr = Item1Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item5, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item6Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item2Ptr => (BaseInStructure*) (_headPtr + Item2Offset); - T6 item6 = default; - expectedStructureType = item6.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 14"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 7; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item6 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #2 in the chain. + /// + public T2 Item2 + { + get => Unsafe.AsRef(Item2Ptr); + set + { + value.StructureType(); + var ptr = Item2Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item6, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item7Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item3Ptr => (BaseInStructure*) (_headPtr + Item3Offset); - T7 item7 = default; - expectedStructureType = item7.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 14"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 8; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item7 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #3 in the chain. + /// + public T3 Item3 + { + get => Unsafe.AsRef(Item3Ptr); + set + { + value.StructureType(); + var ptr = Item3Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item7, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item8Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item4Ptr => (BaseInStructure*) (_headPtr + Item4Offset); - T8 item8 = default; - expectedStructureType = item8.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 14"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 9; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item8 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #4 in the chain. + /// + public T4 Item4 + { + get => Unsafe.AsRef(Item4Ptr); + set + { + value.StructureType(); + var ptr = Item4Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item8, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item9Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item5Ptr => (BaseInStructure*) (_headPtr + Item5Offset); - T9 item9 = default; - expectedStructureType = item9.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 9, expected length 14"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 10; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item9 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #5 in the chain. + /// + public T5 Item5 + { + get => Unsafe.AsRef(Item5Ptr); + set + { + value.StructureType(); + var ptr = Item5Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item9, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item10Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item6Ptr => (BaseInStructure*) (_headPtr + Item6Offset); - T10 item10 = default; - expectedStructureType = item10.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 10, expected length 14"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 11; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item10 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #6 in the chain. + /// + public T6 Item6 + { + get => Unsafe.AsRef(Item6Ptr); + set + { + value.StructureType(); + var ptr = Item6Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item10, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item11Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item7Ptr => (BaseInStructure*) (_headPtr + Item7Offset); - T11 item11 = default; - expectedStructureType = item11.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 11, expected length 14"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 12; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item11 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #7 in the chain. + /// + public T7 Item7 + { + get => Unsafe.AsRef(Item7Ptr); + set + { + value.StructureType(); + var ptr = Item7Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item11, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item12Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item8Ptr => (BaseInStructure*) (_headPtr + Item8Offset); - T12 item12 = default; - expectedStructureType = item12.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 12, expected length 14"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 13; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item12 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #8 in the chain. + /// + public T8 Item8 + { + get => Unsafe.AsRef(Item8Ptr); + set + { + value.StructureType(); + var ptr = Item8Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item12, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item13Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item9Ptr => (BaseInStructure*) (_headPtr + Item9Offset); - T13 item13 = default; - expectedStructureType = item13.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 13, expected length 14"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 14; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - if (existingPtr->PNext is not null) { - errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 14"); - existingPtr->PNext = null; - } - item13 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #9 in the chain. + /// + public T9 Item9 + { + get => Unsafe.AsRef(Item9Ptr); + set + { + value.StructureType(); + var ptr = Item9Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item13, (nint) newPtr, false); - - // Create string of errors - errors = errorBuilder.ToString().Trim(); } /// - /// Creates a new with 14 by copying this chain. + /// Gets a pointer to the second item in the chain. /// - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Duplicate() + public BaseInStructure* Item10Ptr => (BaseInStructure*) (_headPtr + Item10Offset); + + /// + /// Gets or sets item #10 in the chain. + /// + public T10 Item10 { - var newHeadPtr = Marshal.AllocHGlobal(MemorySize); - // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); - // Update all pointers - ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); - ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); - ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); - ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); - ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item5Offset); - ((BaseInStructure*)(newHeadPtr + Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item6Offset); - ((BaseInStructure*)(newHeadPtr + Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item7Offset); - ((BaseInStructure*)(newHeadPtr + Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item8Offset); - ((BaseInStructure*)(newHeadPtr + Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item9Offset); - ((BaseInStructure*)(newHeadPtr + Item9Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item10Offset); - ((BaseInStructure*)(newHeadPtr + Item10Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item11Offset); - ((BaseInStructure*)(newHeadPtr + Item11Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item12Offset); - ((BaseInStructure*)(newHeadPtr + Item12Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item13Offset); - return new ManagedChain(newHeadPtr); + get => Unsafe.AsRef(Item10Ptr); + set + { + value.StructureType(); + var ptr = Item10Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } } /// - /// Creates a new with 14 items, by appending - /// to the end of this chain. + /// Gets a pointer to the second item in the chain. /// - /// The chain to append to. - /// Item 13. - /// - /// Do not forget to dispose the chain if you are no longer using it. - /// - public ManagedChain(ManagedChain previous, T13 item13 = default) - : this(Marshal.AllocHGlobal(MemorySize)) + public BaseInStructure* Item11Ptr => (BaseInStructure*) (_headPtr + Item11Offset); + + /// + /// Gets or sets item #11 in the chain. + /// + public T11 Item11 { - var previousSize = MemorySize - Item13Size; - // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); - - // Append item 13 - item13.StructureType(); - Marshal.StructureToPtr(item13, _headPtr + previousSize, false); + get => Unsafe.AsRef(Item11Ptr); + set + { + value.StructureType(); + var ptr = Item11Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } + } - // Update all pointers - ((BaseInStructure*)_headPtr)->PNext = (BaseInStructure*) (_headPtr + Item1Offset); - ((BaseInStructure*)(_headPtr + Item1Offset))->PNext = (BaseInStructure*) (_headPtr + Item2Offset); - ((BaseInStructure*)(_headPtr + Item2Offset))->PNext = (BaseInStructure*) (_headPtr + Item3Offset); - ((BaseInStructure*)(_headPtr + Item3Offset))->PNext = (BaseInStructure*) (_headPtr + Item4Offset); - ((BaseInStructure*)(_headPtr + Item4Offset))->PNext = (BaseInStructure*) (_headPtr + Item5Offset); - ((BaseInStructure*)(_headPtr + Item5Offset))->PNext = (BaseInStructure*) (_headPtr + Item6Offset); - ((BaseInStructure*)(_headPtr + Item6Offset))->PNext = (BaseInStructure*) (_headPtr + Item7Offset); - ((BaseInStructure*)(_headPtr + Item7Offset))->PNext = (BaseInStructure*) (_headPtr + Item8Offset); - ((BaseInStructure*)(_headPtr + Item8Offset))->PNext = (BaseInStructure*) (_headPtr + Item9Offset); - ((BaseInStructure*)(_headPtr + Item9Offset))->PNext = (BaseInStructure*) (_headPtr + Item10Offset); - ((BaseInStructure*)(_headPtr + Item10Offset))->PNext = (BaseInStructure*) (_headPtr + Item11Offset); - ((BaseInStructure*)(_headPtr + Item11Offset))->PNext = (BaseInStructure*) (_headPtr + Item12Offset); - ((BaseInStructure*)(_headPtr + Item12Offset))->PNext = (BaseInStructure*) (_headPtr + Item13Offset); - ((BaseInStructure*)(_headPtr + previousSize))->PNext = null; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item12Ptr => (BaseInStructure*) (_headPtr + Item12Offset); + + /// + /// Gets or sets item #12 in the chain. + /// + public T12 Item12 + { + get => Unsafe.AsRef(Item12Ptr); + set + { + value.StructureType(); + var ptr = Item12Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } } /// - /// Creates a new with 13 items, by removing the last item - /// from this chain. + /// Gets a pointer to the second item in the chain. /// - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Truncate() + public BaseInStructure* Item13Ptr => (BaseInStructure*) (_headPtr + Item13Offset); + + /// + /// Gets or sets item #13 in the chain. + /// + public T13 Item13 { - return Truncate(out var _); + get => Unsafe.AsRef(Item13Ptr); + set + { + value.StructureType(); + var ptr = Item13Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } } /// - /// Creates a new with 13 items, by removing - /// from the end of this chain. + /// Creates a new with 14 items from an existing memory block. /// + /// The pointer to the head of the chain. /// - /// Do not forget to dispose this chain if you are no longer using it. + /// Callers are responsible for ensuring the size of the memory is correct. /// - public ManagedChain Truncate(out T13 item13) + internal ManagedChain(nint headPtr) { - item13 = Item13; - - var newSize = MemorySize - Item13Size; - var newHeadPtr = Marshal.AllocHGlobal(newSize); - // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); - // Update all pointers - ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); - ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); - ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); - ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); - ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item5Offset); - ((BaseInStructure*)(newHeadPtr + Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item6Offset); - ((BaseInStructure*)(newHeadPtr + Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item7Offset); - ((BaseInStructure*)(newHeadPtr + Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item8Offset); - ((BaseInStructure*)(newHeadPtr + Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item9Offset); - ((BaseInStructure*)(newHeadPtr + Item9Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item10Offset); - ((BaseInStructure*)(newHeadPtr + Item10Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item11Offset); - ((BaseInStructure*)(newHeadPtr + Item11Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item12Offset); - ((BaseInStructure*)(newHeadPtr + Item12Offset))->PNext = null; - return new ManagedChain(newHeadPtr); + _headPtr = headPtr; } /// - /// Creates a new with 15 items, by appending to - /// the end of this chain. + /// Creates a new with 14 items. /// - /// Item 14. - /// Type of Item 14 - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Append(T14 item14 = default) - where T14: struct, IExtendsChain + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// Item 11. + /// Item 12. + /// Item 13. + internal ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default, T13 item13 = default) + : this(Marshal.AllocHGlobal(MemorySize)) { - return new ManagedChain(this, item14); + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + var itemPtr = Item1Ptr; + item1.StructureType(); + Marshal.StructureToPtr(item1, (nint)itemPtr, false); + HeadPtr->PNext = itemPtr; + itemPtr = Item2Ptr; + item2.StructureType(); + Marshal.StructureToPtr(item2, (nint)itemPtr, false); + Item1Ptr->PNext = itemPtr; + itemPtr = Item3Ptr; + item3.StructureType(); + Marshal.StructureToPtr(item3, (nint)itemPtr, false); + Item2Ptr->PNext = itemPtr; + itemPtr = Item4Ptr; + item4.StructureType(); + Marshal.StructureToPtr(item4, (nint)itemPtr, false); + Item3Ptr->PNext = itemPtr; + itemPtr = Item5Ptr; + item5.StructureType(); + Marshal.StructureToPtr(item5, (nint)itemPtr, false); + Item4Ptr->PNext = itemPtr; + itemPtr = Item6Ptr; + item6.StructureType(); + Marshal.StructureToPtr(item6, (nint)itemPtr, false); + Item5Ptr->PNext = itemPtr; + itemPtr = Item7Ptr; + item7.StructureType(); + Marshal.StructureToPtr(item7, (nint)itemPtr, false); + Item6Ptr->PNext = itemPtr; + itemPtr = Item8Ptr; + item8.StructureType(); + Marshal.StructureToPtr(item8, (nint)itemPtr, false); + Item7Ptr->PNext = itemPtr; + itemPtr = Item9Ptr; + item9.StructureType(); + Marshal.StructureToPtr(item9, (nint)itemPtr, false); + Item8Ptr->PNext = itemPtr; + itemPtr = Item10Ptr; + item10.StructureType(); + Marshal.StructureToPtr(item10, (nint)itemPtr, false); + Item9Ptr->PNext = itemPtr; + itemPtr = Item11Ptr; + item11.StructureType(); + Marshal.StructureToPtr(item11, (nint)itemPtr, false); + Item10Ptr->PNext = itemPtr; + itemPtr = Item12Ptr; + item12.StructureType(); + Marshal.StructureToPtr(item12, (nint)itemPtr, false); + Item11Ptr->PNext = itemPtr; + itemPtr = Item13Ptr; + item13.StructureType(); + Marshal.StructureToPtr(item13, (nint)itemPtr, false); + Item12Ptr->PNext = itemPtr; + Item13Ptr->PNext = null; } /// @@ -10155,6 +17098,187 @@ public override IChainable this[int index] _ => throw new IndexOutOfRangeException() }; + /// + /// Compares the supplied memory block with this one, ignoring the structure headers. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + protected override bool MemoryEquals(ManagedChain other) + { + var ptr = HeadPtr; + var otherPtr = other.HeadPtr; + if (ptr == otherPtr) { + return true; + } + var span = new ReadOnlySpan((void*) ptr, MemorySize); + var otherSpan = new ReadOnlySpan((void*) otherPtr, MemorySize); + var start = 0; + var length = HeadSize; + var sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item1Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item2Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item3Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item4Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item5Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item6Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item7Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item8Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item9Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item10Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item11Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item12Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item13Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + return true; + } + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Equals(ManagedChain other) + => !ReferenceEquals(null, other) && (ReferenceEquals(this, other) || MemoryEquals(other)); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator ==(ManagedChain left, ManagedChain right) => + ReferenceEquals(null, left) + ? ReferenceEquals(null, right) + : !ReferenceEquals(null, right) && (ReferenceEquals(left, right) || left.MemoryEquals(right)); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator !=(ManagedChain left, ManagedChain right) => + ReferenceEquals(null, left) + ? !ReferenceEquals(null, right) + : ReferenceEquals(null, right) || (!ReferenceEquals(left, right) && !left.MemoryEquals(right)); + + /// + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append("("); + sb.Append((object) Head); sb.Append(", "); + sb.Append((object) Item1); + sb.Append(", "); + sb.Append((object) Item2); + sb.Append(", "); + sb.Append((object) Item3); + sb.Append(", "); + sb.Append((object) Item4); + sb.Append(", "); + sb.Append((object) Item5); + sb.Append(", "); + sb.Append((object) Item6); + sb.Append(", "); + sb.Append((object) Item7); + sb.Append(", "); + sb.Append((object) Item8); + sb.Append(", "); + sb.Append((object) Item9); + sb.Append(", "); + sb.Append((object) Item10); + sb.Append(", "); + sb.Append((object) Item11); + sb.Append(", "); + sb.Append((object) Item12); + sb.Append(", "); + sb.Append((object) Item13); + sb.Append(")"); + return sb.ToString(); + } + /// /// Deconstructs this chain. /// @@ -10237,23 +17361,28 @@ public override void Dispose() /// Type of Item 12. /// Type of Item 13. /// Type of Item 14. -public unsafe class ManagedChain : ManagedChain - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain - where T8 : struct, IExtendsChain - where T9 : struct, IExtendsChain - where T10 : struct, IExtendsChain - where T11 : struct, IExtendsChain - where T12 : struct, IExtendsChain - where T13 : struct, IExtendsChain - where T14 : struct, IExtendsChain +public unsafe sealed class ManagedChain : ManagedChain, IEquatable> + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + where T11 : struct, IChainable + where T12 : struct, IChainable + where T13 : struct, IChainable + where T14 : struct, IChainable { + /// + /// Gets the size (in bytes) of the default structure header. + /// + public static readonly int HeaderSize = Marshal.SizeOf(); + /// /// Gets the size (in bytes) of the head structure. /// @@ -10403,13 +17532,14 @@ public unsafe class ManagedChain public static readonly int MemorySize = Item14Offset + Item14Size; - + + /// + public override int Size => MemorySize; + private nint _headPtr; - /// - /// Gets a pointer to the current head. - /// - public BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; + /// + public override BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; /// /// Gets or sets the head of the chain. @@ -10451,228 +17581,18 @@ public T1 Item1 /// /// Gets a pointer to the second item in the chain. /// - public BaseInStructure* Item2Ptr => (BaseInStructure*) (_headPtr + Item2Offset); - - /// - /// Gets or sets item #2 in the chain. - /// - public T2 Item2 - { - get => Unsafe.AsRef(Item2Ptr); - set - { - value.StructureType(); - var ptr = Item2Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item3Ptr => (BaseInStructure*) (_headPtr + Item3Offset); - - /// - /// Gets or sets item #3 in the chain. - /// - public T3 Item3 - { - get => Unsafe.AsRef(Item3Ptr); - set - { - value.StructureType(); - var ptr = Item3Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item4Ptr => (BaseInStructure*) (_headPtr + Item4Offset); - - /// - /// Gets or sets item #4 in the chain. - /// - public T4 Item4 - { - get => Unsafe.AsRef(Item4Ptr); - set - { - value.StructureType(); - var ptr = Item4Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item5Ptr => (BaseInStructure*) (_headPtr + Item5Offset); - - /// - /// Gets or sets item #5 in the chain. - /// - public T5 Item5 - { - get => Unsafe.AsRef(Item5Ptr); - set - { - value.StructureType(); - var ptr = Item5Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item6Ptr => (BaseInStructure*) (_headPtr + Item6Offset); - - /// - /// Gets or sets item #6 in the chain. - /// - public T6 Item6 - { - get => Unsafe.AsRef(Item6Ptr); - set - { - value.StructureType(); - var ptr = Item6Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item7Ptr => (BaseInStructure*) (_headPtr + Item7Offset); - - /// - /// Gets or sets item #7 in the chain. - /// - public T7 Item7 - { - get => Unsafe.AsRef(Item7Ptr); - set - { - value.StructureType(); - var ptr = Item7Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item8Ptr => (BaseInStructure*) (_headPtr + Item8Offset); - - /// - /// Gets or sets item #8 in the chain. - /// - public T8 Item8 - { - get => Unsafe.AsRef(Item8Ptr); - set - { - value.StructureType(); - var ptr = Item8Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item9Ptr => (BaseInStructure*) (_headPtr + Item9Offset); - - /// - /// Gets or sets item #9 in the chain. - /// - public T9 Item9 - { - get => Unsafe.AsRef(Item9Ptr); - set - { - value.StructureType(); - var ptr = Item9Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item10Ptr => (BaseInStructure*) (_headPtr + Item10Offset); - - /// - /// Gets or sets item #10 in the chain. - /// - public T10 Item10 - { - get => Unsafe.AsRef(Item10Ptr); - set - { - value.StructureType(); - var ptr = Item10Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item11Ptr => (BaseInStructure*) (_headPtr + Item11Offset); - - /// - /// Gets or sets item #11 in the chain. - /// - public T11 Item11 - { - get => Unsafe.AsRef(Item11Ptr); - set - { - value.StructureType(); - var ptr = Item11Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item12Ptr => (BaseInStructure*) (_headPtr + Item12Offset); + public BaseInStructure* Item2Ptr => (BaseInStructure*) (_headPtr + Item2Offset); /// - /// Gets or sets item #12 in the chain. + /// Gets or sets item #2 in the chain. /// - public T12 Item12 + public T2 Item2 { - get => Unsafe.AsRef(Item12Ptr); + get => Unsafe.AsRef(Item2Ptr); set { value.StructureType(); - var ptr = Item12Ptr; + var ptr = Item2Ptr; var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, (nint)ptr, true); ptr->PNext = nextPtr; @@ -10682,18 +17602,18 @@ public T12 Item12 /// /// Gets a pointer to the second item in the chain. /// - public BaseInStructure* Item13Ptr => (BaseInStructure*) (_headPtr + Item13Offset); + public BaseInStructure* Item3Ptr => (BaseInStructure*) (_headPtr + Item3Offset); /// - /// Gets or sets item #13 in the chain. + /// Gets or sets item #3 in the chain. /// - public T13 Item13 + public T3 Item3 { - get => Unsafe.AsRef(Item13Ptr); + get => Unsafe.AsRef(Item3Ptr); set { value.StructureType(); - var ptr = Item13Ptr; + var ptr = Item3Ptr; var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, (nint)ptr, true); ptr->PNext = nextPtr; @@ -10703,18 +17623,18 @@ public T13 Item13 /// /// Gets a pointer to the second item in the chain. /// - public BaseInStructure* Item14Ptr => (BaseInStructure*) (_headPtr + Item14Offset); + public BaseInStructure* Item4Ptr => (BaseInStructure*) (_headPtr + Item4Offset); /// - /// Gets or sets item #14 in the chain. + /// Gets or sets item #4 in the chain. /// - public T14 Item14 + public T4 Item4 { - get => Unsafe.AsRef(Item14Ptr); + get => Unsafe.AsRef(Item4Ptr); set { value.StructureType(); - var ptr = Item14Ptr; + var ptr = Item4Ptr; var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, (nint)ptr, true); ptr->PNext = nextPtr; @@ -10722,540 +17642,307 @@ public T14 Item14 } /// - /// Creates a new with 15 items from an existing memory block. - /// - /// The pointer to the head of the chain.. - /// - /// Callers are responsible for ensuring the size of the memory is correct. - /// - internal ManagedChain(nint headPtr) - { - _headPtr = headPtr; - } - - /// - /// Creates a new with 15 items. + /// Gets a pointer to the second item in the chain. /// - /// The head of the chain. - /// Item 1. - /// Item 2. - /// Item 3. - /// Item 4. - /// Item 5. - /// Item 6. - /// Item 7. - /// Item 8. - /// Item 9. - /// Item 10. - /// Item 11. - /// Item 12. - /// Item 13. - /// Item 14. - public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default, T13 item13 = default, T14 item14 = default) - : this(Marshal.AllocHGlobal(MemorySize)) - { - head.StructureType(); - Marshal.StructureToPtr(head, _headPtr, false); - BaseInStructure* itemPtr = Item1Ptr; - item1.StructureType(); - Marshal.StructureToPtr(item1, (nint)itemPtr, false); - HeadPtr->PNext = itemPtr; - itemPtr = Item2Ptr; - item2.StructureType(); - Marshal.StructureToPtr(item2, (nint)itemPtr, false); - Item1Ptr->PNext = itemPtr; - itemPtr = Item3Ptr; - item3.StructureType(); - Marshal.StructureToPtr(item3, (nint)itemPtr, false); - Item2Ptr->PNext = itemPtr; - itemPtr = Item4Ptr; - item4.StructureType(); - Marshal.StructureToPtr(item4, (nint)itemPtr, false); - Item3Ptr->PNext = itemPtr; - itemPtr = Item5Ptr; - item5.StructureType(); - Marshal.StructureToPtr(item5, (nint)itemPtr, false); - Item4Ptr->PNext = itemPtr; - itemPtr = Item6Ptr; - item6.StructureType(); - Marshal.StructureToPtr(item6, (nint)itemPtr, false); - Item5Ptr->PNext = itemPtr; - itemPtr = Item7Ptr; - item7.StructureType(); - Marshal.StructureToPtr(item7, (nint)itemPtr, false); - Item6Ptr->PNext = itemPtr; - itemPtr = Item8Ptr; - item8.StructureType(); - Marshal.StructureToPtr(item8, (nint)itemPtr, false); - Item7Ptr->PNext = itemPtr; - itemPtr = Item9Ptr; - item9.StructureType(); - Marshal.StructureToPtr(item9, (nint)itemPtr, false); - Item8Ptr->PNext = itemPtr; - itemPtr = Item10Ptr; - item10.StructureType(); - Marshal.StructureToPtr(item10, (nint)itemPtr, false); - Item9Ptr->PNext = itemPtr; - itemPtr = Item11Ptr; - item11.StructureType(); - Marshal.StructureToPtr(item11, (nint)itemPtr, false); - Item10Ptr->PNext = itemPtr; - itemPtr = Item12Ptr; - item12.StructureType(); - Marshal.StructureToPtr(item12, (nint)itemPtr, false); - Item11Ptr->PNext = itemPtr; - itemPtr = Item13Ptr; - item13.StructureType(); - Marshal.StructureToPtr(item13, (nint)itemPtr, false); - Item12Ptr->PNext = itemPtr; - itemPtr = Item14Ptr; - item14.StructureType(); - Marshal.StructureToPtr(item14, (nint)itemPtr, false); - Item13Ptr->PNext = itemPtr; - Item14Ptr->PNext = null; - } + public BaseInStructure* Item5Ptr => (BaseInStructure*) (_headPtr + Item5Offset); /// - /// Creates a new with 15 items from an existing unmanaged chain. + /// Gets or sets item #5 in the chain. /// - /// Any errors loading the chain. - /// The unmanaged chain to use as the basis of this chain. - public ManagedChain(out string errors, TChain chain) - : this(Marshal.AllocHGlobal(MemorySize)) + public T5 Item5 { - chain.StructureType(); - Marshal.StructureToPtr(chain, _headPtr, false); - StringBuilder errorBuilder = new StringBuilder(); - var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); - var newPtr = (BaseInStructure*) _headPtr; - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item1Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T1 item1 = default; - var expectedStructureType = item1.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 15"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 2; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item1 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item1, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item2Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T2 item2 = default; - expectedStructureType = item2.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 15"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 3; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item2 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item2, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item3Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T3 item3 = default; - expectedStructureType = item3.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 15"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 4; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item3 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item3, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item4Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T4 item4 = default; - expectedStructureType = item4.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 15"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 5; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item4 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item4, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item5Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T5 item5 = default; - expectedStructureType = item5.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 15"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 6; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item5 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item5, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item6Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T6 item6 = default; - expectedStructureType = item6.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 15"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 7; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item6 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item6, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item7Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T7 item7 = default; - expectedStructureType = item7.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 15"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 8; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item7 = Unsafe.AsRef(existingPtr); - } + get => Unsafe.AsRef(Item5Ptr); + set + { + value.StructureType(); + var ptr = Item5Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item7, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item8Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item6Ptr => (BaseInStructure*) (_headPtr + Item6Offset); - T8 item8 = default; - expectedStructureType = item8.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 15"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 9; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item8 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #6 in the chain. + /// + public T6 Item6 + { + get => Unsafe.AsRef(Item6Ptr); + set + { + value.StructureType(); + var ptr = Item6Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item8, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item9Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item7Ptr => (BaseInStructure*) (_headPtr + Item7Offset); - T9 item9 = default; - expectedStructureType = item9.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 9, expected length 15"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 10; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item9 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #7 in the chain. + /// + public T7 Item7 + { + get => Unsafe.AsRef(Item7Ptr); + set + { + value.StructureType(); + var ptr = Item7Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item9, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item10Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item8Ptr => (BaseInStructure*) (_headPtr + Item8Offset); - T10 item10 = default; - expectedStructureType = item10.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 10, expected length 15"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 11; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item10 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #8 in the chain. + /// + public T8 Item8 + { + get => Unsafe.AsRef(Item8Ptr); + set + { + value.StructureType(); + var ptr = Item8Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item10, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item11Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item9Ptr => (BaseInStructure*) (_headPtr + Item9Offset); - T11 item11 = default; - expectedStructureType = item11.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 11, expected length 15"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 12; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item11 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #9 in the chain. + /// + public T9 Item9 + { + get => Unsafe.AsRef(Item9Ptr); + set + { + value.StructureType(); + var ptr = Item9Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item11, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item12Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item10Ptr => (BaseInStructure*) (_headPtr + Item10Offset); - T12 item12 = default; - expectedStructureType = item12.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 12, expected length 15"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 13; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item12 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #10 in the chain. + /// + public T10 Item10 + { + get => Unsafe.AsRef(Item10Ptr); + set + { + value.StructureType(); + var ptr = Item10Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item12, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item13Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item11Ptr => (BaseInStructure*) (_headPtr + Item11Offset); - T13 item13 = default; - expectedStructureType = item13.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 13, expected length 15"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 14; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item13 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #11 in the chain. + /// + public T11 Item11 + { + get => Unsafe.AsRef(Item11Ptr); + set + { + value.StructureType(); + var ptr = Item11Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item13, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item14Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item12Ptr => (BaseInStructure*) (_headPtr + Item12Offset); - T14 item14 = default; - expectedStructureType = item14.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 14, expected length 15"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 15; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - if (existingPtr->PNext is not null) { - errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 15"); - existingPtr->PNext = null; - } - item14 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #12 in the chain. + /// + public T12 Item12 + { + get => Unsafe.AsRef(Item12Ptr); + set + { + value.StructureType(); + var ptr = Item12Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item14, (nint) newPtr, false); - - // Create string of errors - errors = errorBuilder.ToString().Trim(); } /// - /// Creates a new with 15 by copying this chain. + /// Gets a pointer to the second item in the chain. /// - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Duplicate() + public BaseInStructure* Item13Ptr => (BaseInStructure*) (_headPtr + Item13Offset); + + /// + /// Gets or sets item #13 in the chain. + /// + public T13 Item13 { - var newHeadPtr = Marshal.AllocHGlobal(MemorySize); - // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); - // Update all pointers - ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); - ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); - ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); - ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); - ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item5Offset); - ((BaseInStructure*)(newHeadPtr + Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item6Offset); - ((BaseInStructure*)(newHeadPtr + Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item7Offset); - ((BaseInStructure*)(newHeadPtr + Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item8Offset); - ((BaseInStructure*)(newHeadPtr + Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item9Offset); - ((BaseInStructure*)(newHeadPtr + Item9Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item10Offset); - ((BaseInStructure*)(newHeadPtr + Item10Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item11Offset); - ((BaseInStructure*)(newHeadPtr + Item11Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item12Offset); - ((BaseInStructure*)(newHeadPtr + Item12Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item13Offset); - ((BaseInStructure*)(newHeadPtr + Item13Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item14Offset); - return new ManagedChain(newHeadPtr); + get => Unsafe.AsRef(Item13Ptr); + set + { + value.StructureType(); + var ptr = Item13Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } } /// - /// Creates a new with 15 items, by appending - /// to the end of this chain. + /// Gets a pointer to the second item in the chain. /// - /// The chain to append to. - /// Item 14. - /// - /// Do not forget to dispose the chain if you are no longer using it. - /// - public ManagedChain(ManagedChain previous, T14 item14 = default) - : this(Marshal.AllocHGlobal(MemorySize)) - { - var previousSize = MemorySize - Item14Size; - // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); - - // Append item 14 - item14.StructureType(); - Marshal.StructureToPtr(item14, _headPtr + previousSize, false); - - // Update all pointers - ((BaseInStructure*)_headPtr)->PNext = (BaseInStructure*) (_headPtr + Item1Offset); - ((BaseInStructure*)(_headPtr + Item1Offset))->PNext = (BaseInStructure*) (_headPtr + Item2Offset); - ((BaseInStructure*)(_headPtr + Item2Offset))->PNext = (BaseInStructure*) (_headPtr + Item3Offset); - ((BaseInStructure*)(_headPtr + Item3Offset))->PNext = (BaseInStructure*) (_headPtr + Item4Offset); - ((BaseInStructure*)(_headPtr + Item4Offset))->PNext = (BaseInStructure*) (_headPtr + Item5Offset); - ((BaseInStructure*)(_headPtr + Item5Offset))->PNext = (BaseInStructure*) (_headPtr + Item6Offset); - ((BaseInStructure*)(_headPtr + Item6Offset))->PNext = (BaseInStructure*) (_headPtr + Item7Offset); - ((BaseInStructure*)(_headPtr + Item7Offset))->PNext = (BaseInStructure*) (_headPtr + Item8Offset); - ((BaseInStructure*)(_headPtr + Item8Offset))->PNext = (BaseInStructure*) (_headPtr + Item9Offset); - ((BaseInStructure*)(_headPtr + Item9Offset))->PNext = (BaseInStructure*) (_headPtr + Item10Offset); - ((BaseInStructure*)(_headPtr + Item10Offset))->PNext = (BaseInStructure*) (_headPtr + Item11Offset); - ((BaseInStructure*)(_headPtr + Item11Offset))->PNext = (BaseInStructure*) (_headPtr + Item12Offset); - ((BaseInStructure*)(_headPtr + Item12Offset))->PNext = (BaseInStructure*) (_headPtr + Item13Offset); - ((BaseInStructure*)(_headPtr + Item13Offset))->PNext = (BaseInStructure*) (_headPtr + Item14Offset); - ((BaseInStructure*)(_headPtr + previousSize))->PNext = null; - } + public BaseInStructure* Item14Ptr => (BaseInStructure*) (_headPtr + Item14Offset); /// - /// Creates a new with 14 items, by removing the last item - /// from this chain. + /// Gets or sets item #14 in the chain. /// - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Truncate() + public T14 Item14 { - return Truncate(out var _); + get => Unsafe.AsRef(Item14Ptr); + set + { + value.StructureType(); + var ptr = Item14Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } } /// - /// Creates a new with 14 items, by removing - /// from the end of this chain. + /// Creates a new with 15 items from an existing memory block. /// + /// The pointer to the head of the chain. /// - /// Do not forget to dispose this chain if you are no longer using it. + /// Callers are responsible for ensuring the size of the memory is correct. /// - public ManagedChain Truncate(out T14 item14) + internal ManagedChain(nint headPtr) { - item14 = Item14; - - var newSize = MemorySize - Item14Size; - var newHeadPtr = Marshal.AllocHGlobal(newSize); - // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); - // Update all pointers - ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); - ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); - ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); - ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); - ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item5Offset); - ((BaseInStructure*)(newHeadPtr + Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item6Offset); - ((BaseInStructure*)(newHeadPtr + Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item7Offset); - ((BaseInStructure*)(newHeadPtr + Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item8Offset); - ((BaseInStructure*)(newHeadPtr + Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item9Offset); - ((BaseInStructure*)(newHeadPtr + Item9Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item10Offset); - ((BaseInStructure*)(newHeadPtr + Item10Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item11Offset); - ((BaseInStructure*)(newHeadPtr + Item11Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item12Offset); - ((BaseInStructure*)(newHeadPtr + Item12Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item13Offset); - ((BaseInStructure*)(newHeadPtr + Item13Offset))->PNext = null; - return new ManagedChain(newHeadPtr); + _headPtr = headPtr; } /// - /// Creates a new with 16 items, by appending to - /// the end of this chain. + /// Creates a new with 15 items. /// - /// Item 15. - /// Type of Item 15 - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Append(T15 item15 = default) - where T15: struct, IExtendsChain + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// Item 11. + /// Item 12. + /// Item 13. + /// Item 14. + internal ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default, T13 item13 = default, T14 item14 = default) + : this(Marshal.AllocHGlobal(MemorySize)) { - return new ManagedChain(this, item15); + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + var itemPtr = Item1Ptr; + item1.StructureType(); + Marshal.StructureToPtr(item1, (nint)itemPtr, false); + HeadPtr->PNext = itemPtr; + itemPtr = Item2Ptr; + item2.StructureType(); + Marshal.StructureToPtr(item2, (nint)itemPtr, false); + Item1Ptr->PNext = itemPtr; + itemPtr = Item3Ptr; + item3.StructureType(); + Marshal.StructureToPtr(item3, (nint)itemPtr, false); + Item2Ptr->PNext = itemPtr; + itemPtr = Item4Ptr; + item4.StructureType(); + Marshal.StructureToPtr(item4, (nint)itemPtr, false); + Item3Ptr->PNext = itemPtr; + itemPtr = Item5Ptr; + item5.StructureType(); + Marshal.StructureToPtr(item5, (nint)itemPtr, false); + Item4Ptr->PNext = itemPtr; + itemPtr = Item6Ptr; + item6.StructureType(); + Marshal.StructureToPtr(item6, (nint)itemPtr, false); + Item5Ptr->PNext = itemPtr; + itemPtr = Item7Ptr; + item7.StructureType(); + Marshal.StructureToPtr(item7, (nint)itemPtr, false); + Item6Ptr->PNext = itemPtr; + itemPtr = Item8Ptr; + item8.StructureType(); + Marshal.StructureToPtr(item8, (nint)itemPtr, false); + Item7Ptr->PNext = itemPtr; + itemPtr = Item9Ptr; + item9.StructureType(); + Marshal.StructureToPtr(item9, (nint)itemPtr, false); + Item8Ptr->PNext = itemPtr; + itemPtr = Item10Ptr; + item10.StructureType(); + Marshal.StructureToPtr(item10, (nint)itemPtr, false); + Item9Ptr->PNext = itemPtr; + itemPtr = Item11Ptr; + item11.StructureType(); + Marshal.StructureToPtr(item11, (nint)itemPtr, false); + Item10Ptr->PNext = itemPtr; + itemPtr = Item12Ptr; + item12.StructureType(); + Marshal.StructureToPtr(item12, (nint)itemPtr, false); + Item11Ptr->PNext = itemPtr; + itemPtr = Item13Ptr; + item13.StructureType(); + Marshal.StructureToPtr(item13, (nint)itemPtr, false); + Item12Ptr->PNext = itemPtr; + itemPtr = Item14Ptr; + item14.StructureType(); + Marshal.StructureToPtr(item14, (nint)itemPtr, false); + Item13Ptr->PNext = itemPtr; + Item14Ptr->PNext = null; } /// @@ -11303,6 +17990,197 @@ public override IChainable this[int index] _ => throw new IndexOutOfRangeException() }; + /// + /// Compares the supplied memory block with this one, ignoring the structure headers. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + protected override bool MemoryEquals(ManagedChain other) + { + var ptr = HeadPtr; + var otherPtr = other.HeadPtr; + if (ptr == otherPtr) { + return true; + } + var span = new ReadOnlySpan((void*) ptr, MemorySize); + var otherSpan = new ReadOnlySpan((void*) otherPtr, MemorySize); + var start = 0; + var length = HeadSize; + var sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item1Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item2Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item3Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item4Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item5Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item6Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item7Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item8Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item9Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item10Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item11Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item12Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item13Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item14Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + return true; + } + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Equals(ManagedChain other) + => !ReferenceEquals(null, other) && (ReferenceEquals(this, other) || MemoryEquals(other)); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator ==(ManagedChain left, ManagedChain right) => + ReferenceEquals(null, left) + ? ReferenceEquals(null, right) + : !ReferenceEquals(null, right) && (ReferenceEquals(left, right) || left.MemoryEquals(right)); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator !=(ManagedChain left, ManagedChain right) => + ReferenceEquals(null, left) + ? !ReferenceEquals(null, right) + : ReferenceEquals(null, right) || (!ReferenceEquals(left, right) && !left.MemoryEquals(right)); + + /// + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append("("); + sb.Append((object) Head); sb.Append(", "); + sb.Append((object) Item1); + sb.Append(", "); + sb.Append((object) Item2); + sb.Append(", "); + sb.Append((object) Item3); + sb.Append(", "); + sb.Append((object) Item4); + sb.Append(", "); + sb.Append((object) Item5); + sb.Append(", "); + sb.Append((object) Item6); + sb.Append(", "); + sb.Append((object) Item7); + sb.Append(", "); + sb.Append((object) Item8); + sb.Append(", "); + sb.Append((object) Item9); + sb.Append(", "); + sb.Append((object) Item10); + sb.Append(", "); + sb.Append((object) Item11); + sb.Append(", "); + sb.Append((object) Item12); + sb.Append(", "); + sb.Append((object) Item13); + sb.Append(", "); + sb.Append((object) Item14); + sb.Append(")"); + return sb.ToString(); + } + /// /// Deconstructs this chain. /// @@ -11387,478 +18265,211 @@ public override void Dispose() /// Type of Item 11. /// Type of Item 12. /// Type of Item 13. -/// Type of Item 14. -/// Type of Item 15. -public unsafe class ManagedChain : ManagedChain - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain - where T2 : struct, IExtendsChain - where T3 : struct, IExtendsChain - where T4 : struct, IExtendsChain - where T5 : struct, IExtendsChain - where T6 : struct, IExtendsChain - where T7 : struct, IExtendsChain - where T8 : struct, IExtendsChain - where T9 : struct, IExtendsChain - where T10 : struct, IExtendsChain - where T11 : struct, IExtendsChain - where T12 : struct, IExtendsChain - where T13 : struct, IExtendsChain - where T14 : struct, IExtendsChain - where T15 : struct, IExtendsChain -{ - /// - /// Gets the size (in bytes) of the head structure. - /// - public static readonly int HeadSize = Marshal.SizeOf(); - - /// - /// Gets the offset to the start of . - /// - public static readonly int Item1Offset = HeadSize; - - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item1Size = Marshal.SizeOf(); - - /// - /// Gets the offset to the start of . - /// - public static readonly int Item2Offset = Item1Offset + Item1Size; - - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item2Size = Marshal.SizeOf(); - - /// - /// Gets the offset to the start of . - /// - public static readonly int Item3Offset = Item2Offset + Item2Size; - - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item3Size = Marshal.SizeOf(); - - /// - /// Gets the offset to the start of . - /// - public static readonly int Item4Offset = Item3Offset + Item3Size; - - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item4Size = Marshal.SizeOf(); - - /// - /// Gets the offset to the start of . - /// - public static readonly int Item5Offset = Item4Offset + Item4Size; - - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item5Size = Marshal.SizeOf(); - - /// - /// Gets the offset to the start of . - /// - public static readonly int Item6Offset = Item5Offset + Item5Size; - - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item6Size = Marshal.SizeOf(); - - /// - /// Gets the offset to the start of . - /// - public static readonly int Item7Offset = Item6Offset + Item6Size; - - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item7Size = Marshal.SizeOf(); - - /// - /// Gets the offset to the start of . - /// - public static readonly int Item8Offset = Item7Offset + Item7Size; - - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item8Size = Marshal.SizeOf(); - - /// - /// Gets the offset to the start of . - /// - public static readonly int Item9Offset = Item8Offset + Item8Size; - - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item9Size = Marshal.SizeOf(); - - /// - /// Gets the offset to the start of . - /// - public static readonly int Item10Offset = Item9Offset + Item9Size; - - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item10Size = Marshal.SizeOf(); - - /// - /// Gets the offset to the start of . - /// - public static readonly int Item11Offset = Item10Offset + Item10Size; - - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item11Size = Marshal.SizeOf(); - +/// Type of Item 14. +/// Type of Item 15. +public unsafe sealed class ManagedChain : ManagedChain, IEquatable> + where TChain : struct, IChainable + where T1 : struct, IChainable + where T2 : struct, IChainable + where T3 : struct, IChainable + where T4 : struct, IChainable + where T5 : struct, IChainable + where T6 : struct, IChainable + where T7 : struct, IChainable + where T8 : struct, IChainable + where T9 : struct, IChainable + where T10 : struct, IChainable + where T11 : struct, IChainable + where T12 : struct, IChainable + where T13 : struct, IChainable + where T14 : struct, IChainable + where T15 : struct, IChainable +{ /// - /// Gets the offset to the start of . + /// Gets the size (in bytes) of the default structure header. /// - public static readonly int Item12Offset = Item11Offset + Item11Size; + public static readonly int HeaderSize = Marshal.SizeOf(); /// - /// Gets the size (in bytes) of the Item 1. + /// Gets the size (in bytes) of the head structure. /// - public static readonly int Item12Size = Marshal.SizeOf(); + public static readonly int HeadSize = Marshal.SizeOf(); /// /// Gets the offset to the start of . /// - public static readonly int Item13Offset = Item12Offset + Item12Size; + public static readonly int Item1Offset = HeadSize; /// /// Gets the size (in bytes) of the Item 1. /// - public static readonly int Item13Size = Marshal.SizeOf(); + public static readonly int Item1Size = Marshal.SizeOf(); /// /// Gets the offset to the start of . /// - public static readonly int Item14Offset = Item13Offset + Item13Size; + public static readonly int Item2Offset = Item1Offset + Item1Size; /// /// Gets the size (in bytes) of the Item 1. /// - public static readonly int Item14Size = Marshal.SizeOf(); + public static readonly int Item2Size = Marshal.SizeOf(); /// /// Gets the offset to the start of . /// - public static readonly int Item15Offset = Item14Offset + Item14Size; + public static readonly int Item3Offset = Item2Offset + Item2Size; /// /// Gets the size (in bytes) of the Item 1. /// - public static readonly int Item15Size = Marshal.SizeOf(); - - /// - /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. - /// - public static readonly int MemorySize = Item15Offset + Item15Size; - - private nint _headPtr; - - /// - /// Gets a pointer to the current head. - /// - public BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; - - /// - /// Gets or sets the head of the chain. - /// - public TChain Head - { - get => Unsafe.AsRef((BaseInStructure*) _headPtr); - set - { - value.StructureType(); - var ptr = (BaseInStructure*) _headPtr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, _headPtr, true); - ptr->PNext = nextPtr; - } - } + public static readonly int Item3Size = Marshal.SizeOf(); /// - /// Gets a pointer to the second item in the chain. + /// Gets the offset to the start of . /// - public BaseInStructure* Item1Ptr => (BaseInStructure*) (_headPtr + Item1Offset); + public static readonly int Item4Offset = Item3Offset + Item3Size; /// - /// Gets or sets item #1 in the chain. + /// Gets the size (in bytes) of the Item 1. /// - public T1 Item1 - { - get => Unsafe.AsRef(Item1Ptr); - set - { - value.StructureType(); - var ptr = Item1Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } + public static readonly int Item4Size = Marshal.SizeOf(); /// - /// Gets a pointer to the second item in the chain. + /// Gets the offset to the start of . /// - public BaseInStructure* Item2Ptr => (BaseInStructure*) (_headPtr + Item2Offset); + public static readonly int Item5Offset = Item4Offset + Item4Size; /// - /// Gets or sets item #2 in the chain. + /// Gets the size (in bytes) of the Item 1. /// - public T2 Item2 - { - get => Unsafe.AsRef(Item2Ptr); - set - { - value.StructureType(); - var ptr = Item2Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } + public static readonly int Item5Size = Marshal.SizeOf(); /// - /// Gets a pointer to the second item in the chain. + /// Gets the offset to the start of . /// - public BaseInStructure* Item3Ptr => (BaseInStructure*) (_headPtr + Item3Offset); + public static readonly int Item6Offset = Item5Offset + Item5Size; /// - /// Gets or sets item #3 in the chain. + /// Gets the size (in bytes) of the Item 1. /// - public T3 Item3 - { - get => Unsafe.AsRef(Item3Ptr); - set - { - value.StructureType(); - var ptr = Item3Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } + public static readonly int Item6Size = Marshal.SizeOf(); /// - /// Gets a pointer to the second item in the chain. + /// Gets the offset to the start of . /// - public BaseInStructure* Item4Ptr => (BaseInStructure*) (_headPtr + Item4Offset); + public static readonly int Item7Offset = Item6Offset + Item6Size; /// - /// Gets or sets item #4 in the chain. + /// Gets the size (in bytes) of the Item 1. /// - public T4 Item4 - { - get => Unsafe.AsRef(Item4Ptr); - set - { - value.StructureType(); - var ptr = Item4Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } + public static readonly int Item7Size = Marshal.SizeOf(); /// - /// Gets a pointer to the second item in the chain. + /// Gets the offset to the start of . /// - public BaseInStructure* Item5Ptr => (BaseInStructure*) (_headPtr + Item5Offset); + public static readonly int Item8Offset = Item7Offset + Item7Size; /// - /// Gets or sets item #5 in the chain. + /// Gets the size (in bytes) of the Item 1. /// - public T5 Item5 - { - get => Unsafe.AsRef(Item5Ptr); - set - { - value.StructureType(); - var ptr = Item5Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } + public static readonly int Item8Size = Marshal.SizeOf(); /// - /// Gets a pointer to the second item in the chain. + /// Gets the offset to the start of . /// - public BaseInStructure* Item6Ptr => (BaseInStructure*) (_headPtr + Item6Offset); + public static readonly int Item9Offset = Item8Offset + Item8Size; /// - /// Gets or sets item #6 in the chain. + /// Gets the size (in bytes) of the Item 1. /// - public T6 Item6 - { - get => Unsafe.AsRef(Item6Ptr); - set - { - value.StructureType(); - var ptr = Item6Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } + public static readonly int Item9Size = Marshal.SizeOf(); /// - /// Gets a pointer to the second item in the chain. + /// Gets the offset to the start of . /// - public BaseInStructure* Item7Ptr => (BaseInStructure*) (_headPtr + Item7Offset); + public static readonly int Item10Offset = Item9Offset + Item9Size; /// - /// Gets or sets item #7 in the chain. + /// Gets the size (in bytes) of the Item 1. /// - public T7 Item7 - { - get => Unsafe.AsRef(Item7Ptr); - set - { - value.StructureType(); - var ptr = Item7Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } + public static readonly int Item10Size = Marshal.SizeOf(); /// - /// Gets a pointer to the second item in the chain. + /// Gets the offset to the start of . /// - public BaseInStructure* Item8Ptr => (BaseInStructure*) (_headPtr + Item8Offset); + public static readonly int Item11Offset = Item10Offset + Item10Size; /// - /// Gets or sets item #8 in the chain. + /// Gets the size (in bytes) of the Item 1. /// - public T8 Item8 - { - get => Unsafe.AsRef(Item8Ptr); - set - { - value.StructureType(); - var ptr = Item8Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } + public static readonly int Item11Size = Marshal.SizeOf(); /// - /// Gets a pointer to the second item in the chain. + /// Gets the offset to the start of . /// - public BaseInStructure* Item9Ptr => (BaseInStructure*) (_headPtr + Item9Offset); + public static readonly int Item12Offset = Item11Offset + Item11Size; /// - /// Gets or sets item #9 in the chain. + /// Gets the size (in bytes) of the Item 1. /// - public T9 Item9 - { - get => Unsafe.AsRef(Item9Ptr); - set - { - value.StructureType(); - var ptr = Item9Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } + public static readonly int Item12Size = Marshal.SizeOf(); /// - /// Gets a pointer to the second item in the chain. + /// Gets the offset to the start of . /// - public BaseInStructure* Item10Ptr => (BaseInStructure*) (_headPtr + Item10Offset); + public static readonly int Item13Offset = Item12Offset + Item12Size; /// - /// Gets or sets item #10 in the chain. + /// Gets the size (in bytes) of the Item 1. /// - public T10 Item10 - { - get => Unsafe.AsRef(Item10Ptr); - set - { - value.StructureType(); - var ptr = Item10Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } + public static readonly int Item13Size = Marshal.SizeOf(); /// - /// Gets a pointer to the second item in the chain. + /// Gets the offset to the start of . /// - public BaseInStructure* Item11Ptr => (BaseInStructure*) (_headPtr + Item11Offset); + public static readonly int Item14Offset = Item13Offset + Item13Size; /// - /// Gets or sets item #11 in the chain. + /// Gets the size (in bytes) of the Item 1. /// - public T11 Item11 - { - get => Unsafe.AsRef(Item11Ptr); - set - { - value.StructureType(); - var ptr = Item11Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } + public static readonly int Item14Size = Marshal.SizeOf(); /// - /// Gets a pointer to the second item in the chain. + /// Gets the offset to the start of . /// - public BaseInStructure* Item12Ptr => (BaseInStructure*) (_headPtr + Item12Offset); + public static readonly int Item15Offset = Item14Offset + Item14Size; /// - /// Gets or sets item #12 in the chain. + /// Gets the size (in bytes) of the Item 1. /// - public T12 Item12 - { - get => Unsafe.AsRef(Item12Ptr); - set - { - value.StructureType(); - var ptr = Item12Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } + public static readonly int Item15Size = Marshal.SizeOf(); /// - /// Gets a pointer to the second item in the chain. + /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. /// - public BaseInStructure* Item13Ptr => (BaseInStructure*) (_headPtr + Item13Offset); + public static readonly int MemorySize = Item15Offset + Item15Size; + + /// + public override int Size => MemorySize; + + private nint _headPtr; + + /// + public override BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; /// - /// Gets or sets item #13 in the chain. + /// Gets or sets the head of the chain. /// - public T13 Item13 + public TChain Head { - get => Unsafe.AsRef(Item13Ptr); + get => Unsafe.AsRef((BaseInStructure*) _headPtr); set { value.StructureType(); - var ptr = Item13Ptr; + var ptr = (BaseInStructure*) _headPtr; var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); + Marshal.StructureToPtr(value, _headPtr, true); ptr->PNext = nextPtr; } } @@ -11866,18 +18477,18 @@ public T13 Item13 /// /// Gets a pointer to the second item in the chain. /// - public BaseInStructure* Item14Ptr => (BaseInStructure*) (_headPtr + Item14Offset); + public BaseInStructure* Item1Ptr => (BaseInStructure*) (_headPtr + Item1Offset); /// - /// Gets or sets item #14 in the chain. + /// Gets or sets item #1 in the chain. /// - public T14 Item14 + public T1 Item1 { - get => Unsafe.AsRef(Item14Ptr); + get => Unsafe.AsRef(Item1Ptr); set { value.StructureType(); - var ptr = Item14Ptr; + var ptr = Item1Ptr; var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, (nint)ptr, true); ptr->PNext = nextPtr; @@ -11887,573 +18498,394 @@ public T14 Item14 /// /// Gets a pointer to the second item in the chain. /// - public BaseInStructure* Item15Ptr => (BaseInStructure*) (_headPtr + Item15Offset); + public BaseInStructure* Item2Ptr => (BaseInStructure*) (_headPtr + Item2Offset); /// - /// Gets or sets item #15 in the chain. + /// Gets or sets item #2 in the chain. /// - public T15 Item15 + public T2 Item2 { - get => Unsafe.AsRef(Item15Ptr); + get => Unsafe.AsRef(Item2Ptr); set { value.StructureType(); - var ptr = Item15Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } - - /// - /// Creates a new with 16 items from an existing memory block. - /// - /// The pointer to the head of the chain.. - /// - /// Callers are responsible for ensuring the size of the memory is correct. - /// - internal ManagedChain(nint headPtr) - { - _headPtr = headPtr; - } - - /// - /// Creates a new with 16 items. - /// - /// The head of the chain. - /// Item 1. - /// Item 2. - /// Item 3. - /// Item 4. - /// Item 5. - /// Item 6. - /// Item 7. - /// Item 8. - /// Item 9. - /// Item 10. - /// Item 11. - /// Item 12. - /// Item 13. - /// Item 14. - /// Item 15. - public ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default, T13 item13 = default, T14 item14 = default, T15 item15 = default) - : this(Marshal.AllocHGlobal(MemorySize)) - { - head.StructureType(); - Marshal.StructureToPtr(head, _headPtr, false); - BaseInStructure* itemPtr = Item1Ptr; - item1.StructureType(); - Marshal.StructureToPtr(item1, (nint)itemPtr, false); - HeadPtr->PNext = itemPtr; - itemPtr = Item2Ptr; - item2.StructureType(); - Marshal.StructureToPtr(item2, (nint)itemPtr, false); - Item1Ptr->PNext = itemPtr; - itemPtr = Item3Ptr; - item3.StructureType(); - Marshal.StructureToPtr(item3, (nint)itemPtr, false); - Item2Ptr->PNext = itemPtr; - itemPtr = Item4Ptr; - item4.StructureType(); - Marshal.StructureToPtr(item4, (nint)itemPtr, false); - Item3Ptr->PNext = itemPtr; - itemPtr = Item5Ptr; - item5.StructureType(); - Marshal.StructureToPtr(item5, (nint)itemPtr, false); - Item4Ptr->PNext = itemPtr; - itemPtr = Item6Ptr; - item6.StructureType(); - Marshal.StructureToPtr(item6, (nint)itemPtr, false); - Item5Ptr->PNext = itemPtr; - itemPtr = Item7Ptr; - item7.StructureType(); - Marshal.StructureToPtr(item7, (nint)itemPtr, false); - Item6Ptr->PNext = itemPtr; - itemPtr = Item8Ptr; - item8.StructureType(); - Marshal.StructureToPtr(item8, (nint)itemPtr, false); - Item7Ptr->PNext = itemPtr; - itemPtr = Item9Ptr; - item9.StructureType(); - Marshal.StructureToPtr(item9, (nint)itemPtr, false); - Item8Ptr->PNext = itemPtr; - itemPtr = Item10Ptr; - item10.StructureType(); - Marshal.StructureToPtr(item10, (nint)itemPtr, false); - Item9Ptr->PNext = itemPtr; - itemPtr = Item11Ptr; - item11.StructureType(); - Marshal.StructureToPtr(item11, (nint)itemPtr, false); - Item10Ptr->PNext = itemPtr; - itemPtr = Item12Ptr; - item12.StructureType(); - Marshal.StructureToPtr(item12, (nint)itemPtr, false); - Item11Ptr->PNext = itemPtr; - itemPtr = Item13Ptr; - item13.StructureType(); - Marshal.StructureToPtr(item13, (nint)itemPtr, false); - Item12Ptr->PNext = itemPtr; - itemPtr = Item14Ptr; - item14.StructureType(); - Marshal.StructureToPtr(item14, (nint)itemPtr, false); - Item13Ptr->PNext = itemPtr; - itemPtr = Item15Ptr; - item15.StructureType(); - Marshal.StructureToPtr(item15, (nint)itemPtr, false); - Item14Ptr->PNext = itemPtr; - Item15Ptr->PNext = null; - } - - /// - /// Creates a new with 16 items from an existing unmanaged chain. - /// - /// Any errors loading the chain. - /// The unmanaged chain to use as the basis of this chain. - public ManagedChain(out string errors, TChain chain) - : this(Marshal.AllocHGlobal(MemorySize)) - { - chain.StructureType(); - Marshal.StructureToPtr(chain, _headPtr, false); - StringBuilder errorBuilder = new StringBuilder(); - var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); - var newPtr = (BaseInStructure*) _headPtr; - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item1Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T1 item1 = default; - var expectedStructureType = item1.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 16"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 2; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item1 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item1, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item2Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T2 item2 = default; - expectedStructureType = item2.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 2, expected length 16"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 3; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item2 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item2, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item3Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T3 item3 = default; - expectedStructureType = item3.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 3, expected length 16"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 4; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item3 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item3, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item4Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T4 item4 = default; - expectedStructureType = item4.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 4, expected length 16"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 5; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item4 = Unsafe.AsRef(existingPtr); - } - } - Marshal.StructureToPtr(item4, (nint) newPtr, false); - - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item5Offset); - newPtr = (BaseInStructure*)newPtr->PNext; - - T5 item5 = default; - expectedStructureType = item5.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 5, expected length 16"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 6; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item5 = Unsafe.AsRef(existingPtr); - } + var ptr = Item2Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item5, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item6Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item3Ptr => (BaseInStructure*) (_headPtr + Item3Offset); - T6 item6 = default; - expectedStructureType = item6.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 6, expected length 16"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 7; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item6 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #3 in the chain. + /// + public T3 Item3 + { + get => Unsafe.AsRef(Item3Ptr); + set + { + value.StructureType(); + var ptr = Item3Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item6, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item7Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item4Ptr => (BaseInStructure*) (_headPtr + Item4Offset); - T7 item7 = default; - expectedStructureType = item7.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 7, expected length 16"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 8; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item7 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #4 in the chain. + /// + public T4 Item4 + { + get => Unsafe.AsRef(Item4Ptr); + set + { + value.StructureType(); + var ptr = Item4Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item7, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item8Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item5Ptr => (BaseInStructure*) (_headPtr + Item5Offset); - T8 item8 = default; - expectedStructureType = item8.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 8, expected length 16"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 9; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item8 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #5 in the chain. + /// + public T5 Item5 + { + get => Unsafe.AsRef(Item5Ptr); + set + { + value.StructureType(); + var ptr = Item5Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item8, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item9Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item6Ptr => (BaseInStructure*) (_headPtr + Item6Offset); - T9 item9 = default; - expectedStructureType = item9.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 9, expected length 16"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 10; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item9 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #6 in the chain. + /// + public T6 Item6 + { + get => Unsafe.AsRef(Item6Ptr); + set + { + value.StructureType(); + var ptr = Item6Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item9, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item10Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item7Ptr => (BaseInStructure*) (_headPtr + Item7Offset); - T10 item10 = default; - expectedStructureType = item10.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 10, expected length 16"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 11; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item10 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #7 in the chain. + /// + public T7 Item7 + { + get => Unsafe.AsRef(Item7Ptr); + set + { + value.StructureType(); + var ptr = Item7Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item10, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item11Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item8Ptr => (BaseInStructure*) (_headPtr + Item8Offset); - T11 item11 = default; - expectedStructureType = item11.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 11, expected length 16"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 12; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item11 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #8 in the chain. + /// + public T8 Item8 + { + get => Unsafe.AsRef(Item8Ptr); + set + { + value.StructureType(); + var ptr = Item8Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item11, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item12Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item9Ptr => (BaseInStructure*) (_headPtr + Item9Offset); - T12 item12 = default; - expectedStructureType = item12.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 12, expected length 16"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 13; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item12 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #9 in the chain. + /// + public T9 Item9 + { + get => Unsafe.AsRef(Item9Ptr); + set + { + value.StructureType(); + var ptr = Item9Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item12, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item13Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item10Ptr => (BaseInStructure*) (_headPtr + Item10Offset); - T13 item13 = default; - expectedStructureType = item13.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 13, expected length 16"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 14; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item13 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #10 in the chain. + /// + public T10 Item10 + { + get => Unsafe.AsRef(Item10Ptr); + set + { + value.StructureType(); + var ptr = Item10Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item13, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item14Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item11Ptr => (BaseInStructure*) (_headPtr + Item11Offset); - T14 item14 = default; - expectedStructureType = item14.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 14, expected length 16"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 15; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - item14 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #11 in the chain. + /// + public T11 Item11 + { + get => Unsafe.AsRef(Item11Ptr); + set + { + value.StructureType(); + var ptr = Item11Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item14, (nint) newPtr, false); + } - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item15Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item12Ptr => (BaseInStructure*) (_headPtr + Item12Offset); - T15 item15 = default; - expectedStructureType = item15.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 15, expected length 16"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 16; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - if (existingPtr->PNext is not null) { - errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 16"); - existingPtr->PNext = null; - } - item15 = Unsafe.AsRef(existingPtr); - } + /// + /// Gets or sets item #12 in the chain. + /// + public T12 Item12 + { + get => Unsafe.AsRef(Item12Ptr); + set + { + value.StructureType(); + var ptr = Item12Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; } - Marshal.StructureToPtr(item15, (nint) newPtr, false); - - // Create string of errors - errors = errorBuilder.ToString().Trim(); } /// - /// Creates a new with 16 by copying this chain. + /// Gets a pointer to the second item in the chain. /// - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Duplicate() + public BaseInStructure* Item13Ptr => (BaseInStructure*) (_headPtr + Item13Offset); + + /// + /// Gets or sets item #13 in the chain. + /// + public T13 Item13 { - var newHeadPtr = Marshal.AllocHGlobal(MemorySize); - // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); - // Update all pointers - ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); - ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); - ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); - ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); - ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item5Offset); - ((BaseInStructure*)(newHeadPtr + Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item6Offset); - ((BaseInStructure*)(newHeadPtr + Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item7Offset); - ((BaseInStructure*)(newHeadPtr + Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item8Offset); - ((BaseInStructure*)(newHeadPtr + Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item9Offset); - ((BaseInStructure*)(newHeadPtr + Item9Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item10Offset); - ((BaseInStructure*)(newHeadPtr + Item10Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item11Offset); - ((BaseInStructure*)(newHeadPtr + Item11Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item12Offset); - ((BaseInStructure*)(newHeadPtr + Item12Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item13Offset); - ((BaseInStructure*)(newHeadPtr + Item13Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item14Offset); - ((BaseInStructure*)(newHeadPtr + Item14Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item15Offset); - return new ManagedChain(newHeadPtr); + get => Unsafe.AsRef(Item13Ptr); + set + { + value.StructureType(); + var ptr = Item13Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } } /// - /// Creates a new with 16 items, by appending - /// to the end of this chain. + /// Gets a pointer to the second item in the chain. /// - /// The chain to append to. - /// Item 15. - /// - /// Do not forget to dispose the chain if you are no longer using it. - /// - public ManagedChain(ManagedChain previous, T15 item15 = default) - : this(Marshal.AllocHGlobal(MemorySize)) - { - var previousSize = MemorySize - Item15Size; - // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); - - // Append item 15 - item15.StructureType(); - Marshal.StructureToPtr(item15, _headPtr + previousSize, false); + public BaseInStructure* Item14Ptr => (BaseInStructure*) (_headPtr + Item14Offset); - // Update all pointers - ((BaseInStructure*)_headPtr)->PNext = (BaseInStructure*) (_headPtr + Item1Offset); - ((BaseInStructure*)(_headPtr + Item1Offset))->PNext = (BaseInStructure*) (_headPtr + Item2Offset); - ((BaseInStructure*)(_headPtr + Item2Offset))->PNext = (BaseInStructure*) (_headPtr + Item3Offset); - ((BaseInStructure*)(_headPtr + Item3Offset))->PNext = (BaseInStructure*) (_headPtr + Item4Offset); - ((BaseInStructure*)(_headPtr + Item4Offset))->PNext = (BaseInStructure*) (_headPtr + Item5Offset); - ((BaseInStructure*)(_headPtr + Item5Offset))->PNext = (BaseInStructure*) (_headPtr + Item6Offset); - ((BaseInStructure*)(_headPtr + Item6Offset))->PNext = (BaseInStructure*) (_headPtr + Item7Offset); - ((BaseInStructure*)(_headPtr + Item7Offset))->PNext = (BaseInStructure*) (_headPtr + Item8Offset); - ((BaseInStructure*)(_headPtr + Item8Offset))->PNext = (BaseInStructure*) (_headPtr + Item9Offset); - ((BaseInStructure*)(_headPtr + Item9Offset))->PNext = (BaseInStructure*) (_headPtr + Item10Offset); - ((BaseInStructure*)(_headPtr + Item10Offset))->PNext = (BaseInStructure*) (_headPtr + Item11Offset); - ((BaseInStructure*)(_headPtr + Item11Offset))->PNext = (BaseInStructure*) (_headPtr + Item12Offset); - ((BaseInStructure*)(_headPtr + Item12Offset))->PNext = (BaseInStructure*) (_headPtr + Item13Offset); - ((BaseInStructure*)(_headPtr + Item13Offset))->PNext = (BaseInStructure*) (_headPtr + Item14Offset); - ((BaseInStructure*)(_headPtr + Item14Offset))->PNext = (BaseInStructure*) (_headPtr + Item15Offset); - ((BaseInStructure*)(_headPtr + previousSize))->PNext = null; + /// + /// Gets or sets item #14 in the chain. + /// + public T14 Item14 + { + get => Unsafe.AsRef(Item14Ptr); + set + { + value.StructureType(); + var ptr = Item14Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } } /// - /// Creates a new with 15 items, by removing the last item - /// from this chain. + /// Gets a pointer to the second item in the chain. /// - /// - /// Do not forget to dispose this chain if you are no longer using it. - /// - public ManagedChain Truncate() + public BaseInStructure* Item15Ptr => (BaseInStructure*) (_headPtr + Item15Offset); + + /// + /// Gets or sets item #15 in the chain. + /// + public T15 Item15 { - return Truncate(out var _); + get => Unsafe.AsRef(Item15Ptr); + set + { + value.StructureType(); + var ptr = Item15Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } } /// - /// Creates a new with 15 items, by removing - /// from the end of this chain. + /// Creates a new with 16 items from an existing memory block. /// + /// The pointer to the head of the chain. /// - /// Do not forget to dispose this chain if you are no longer using it. + /// Callers are responsible for ensuring the size of the memory is correct. /// - public ManagedChain Truncate(out T15 item15) + internal ManagedChain(nint headPtr) { - item15 = Item15; + _headPtr = headPtr; + } - var newSize = MemorySize - Item15Size; - var newHeadPtr = Marshal.AllocHGlobal(newSize); - // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); - // Update all pointers - ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); - ((BaseInStructure*)(newHeadPtr + Item1Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item2Offset); - ((BaseInStructure*)(newHeadPtr + Item2Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item3Offset); - ((BaseInStructure*)(newHeadPtr + Item3Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item4Offset); - ((BaseInStructure*)(newHeadPtr + Item4Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item5Offset); - ((BaseInStructure*)(newHeadPtr + Item5Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item6Offset); - ((BaseInStructure*)(newHeadPtr + Item6Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item7Offset); - ((BaseInStructure*)(newHeadPtr + Item7Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item8Offset); - ((BaseInStructure*)(newHeadPtr + Item8Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item9Offset); - ((BaseInStructure*)(newHeadPtr + Item9Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item10Offset); - ((BaseInStructure*)(newHeadPtr + Item10Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item11Offset); - ((BaseInStructure*)(newHeadPtr + Item11Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item12Offset); - ((BaseInStructure*)(newHeadPtr + Item12Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item13Offset); - ((BaseInStructure*)(newHeadPtr + Item13Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item14Offset); - ((BaseInStructure*)(newHeadPtr + Item14Offset))->PNext = null; - return new ManagedChain(newHeadPtr); + /// + /// Creates a new with 16 items. + /// + /// The head of the chain. + /// Item 1. + /// Item 2. + /// Item 3. + /// Item 4. + /// Item 5. + /// Item 6. + /// Item 7. + /// Item 8. + /// Item 9. + /// Item 10. + /// Item 11. + /// Item 12. + /// Item 13. + /// Item 14. + /// Item 15. + internal ManagedChain(TChain head = default, T1 item1 = default, T2 item2 = default, T3 item3 = default, T4 item4 = default, T5 item5 = default, T6 item6 = default, T7 item7 = default, T8 item8 = default, T9 item9 = default, T10 item10 = default, T11 item11 = default, T12 item12 = default, T13 item13 = default, T14 item14 = default, T15 item15 = default) + : this(Marshal.AllocHGlobal(MemorySize)) + { + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); + var itemPtr = Item1Ptr; + item1.StructureType(); + Marshal.StructureToPtr(item1, (nint)itemPtr, false); + HeadPtr->PNext = itemPtr; + itemPtr = Item2Ptr; + item2.StructureType(); + Marshal.StructureToPtr(item2, (nint)itemPtr, false); + Item1Ptr->PNext = itemPtr; + itemPtr = Item3Ptr; + item3.StructureType(); + Marshal.StructureToPtr(item3, (nint)itemPtr, false); + Item2Ptr->PNext = itemPtr; + itemPtr = Item4Ptr; + item4.StructureType(); + Marshal.StructureToPtr(item4, (nint)itemPtr, false); + Item3Ptr->PNext = itemPtr; + itemPtr = Item5Ptr; + item5.StructureType(); + Marshal.StructureToPtr(item5, (nint)itemPtr, false); + Item4Ptr->PNext = itemPtr; + itemPtr = Item6Ptr; + item6.StructureType(); + Marshal.StructureToPtr(item6, (nint)itemPtr, false); + Item5Ptr->PNext = itemPtr; + itemPtr = Item7Ptr; + item7.StructureType(); + Marshal.StructureToPtr(item7, (nint)itemPtr, false); + Item6Ptr->PNext = itemPtr; + itemPtr = Item8Ptr; + item8.StructureType(); + Marshal.StructureToPtr(item8, (nint)itemPtr, false); + Item7Ptr->PNext = itemPtr; + itemPtr = Item9Ptr; + item9.StructureType(); + Marshal.StructureToPtr(item9, (nint)itemPtr, false); + Item8Ptr->PNext = itemPtr; + itemPtr = Item10Ptr; + item10.StructureType(); + Marshal.StructureToPtr(item10, (nint)itemPtr, false); + Item9Ptr->PNext = itemPtr; + itemPtr = Item11Ptr; + item11.StructureType(); + Marshal.StructureToPtr(item11, (nint)itemPtr, false); + Item10Ptr->PNext = itemPtr; + itemPtr = Item12Ptr; + item12.StructureType(); + Marshal.StructureToPtr(item12, (nint)itemPtr, false); + Item11Ptr->PNext = itemPtr; + itemPtr = Item13Ptr; + item13.StructureType(); + Marshal.StructureToPtr(item13, (nint)itemPtr, false); + Item12Ptr->PNext = itemPtr; + itemPtr = Item14Ptr; + item14.StructureType(); + Marshal.StructureToPtr(item14, (nint)itemPtr, false); + Item13Ptr->PNext = itemPtr; + itemPtr = Item15Ptr; + item15.StructureType(); + Marshal.StructureToPtr(item15, (nint)itemPtr, false); + Item14Ptr->PNext = itemPtr; + Item15Ptr->PNext = null; } /// @@ -12503,6 +18935,207 @@ public override IChainable this[int index] _ => throw new IndexOutOfRangeException() }; + /// + /// Compares the supplied memory block with this one, ignoring the structure headers. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + protected override bool MemoryEquals(ManagedChain other) + { + var ptr = HeadPtr; + var otherPtr = other.HeadPtr; + if (ptr == otherPtr) { + return true; + } + var span = new ReadOnlySpan((void*) ptr, MemorySize); + var otherSpan = new ReadOnlySpan((void*) otherPtr, MemorySize); + var start = 0; + var length = HeadSize; + var sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item1Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item2Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item3Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item4Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item5Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item6Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item7Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item8Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item9Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item10Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item11Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item12Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item13Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item14Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item15Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + return true; + } + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Equals(ManagedChain other) + => !ReferenceEquals(null, other) && (ReferenceEquals(this, other) || MemoryEquals(other)); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator ==(ManagedChain left, ManagedChain right) => + ReferenceEquals(null, left) + ? ReferenceEquals(null, right) + : !ReferenceEquals(null, right) && (ReferenceEquals(left, right) || left.MemoryEquals(right)); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator !=(ManagedChain left, ManagedChain right) => + ReferenceEquals(null, left) + ? !ReferenceEquals(null, right) + : ReferenceEquals(null, right) || (!ReferenceEquals(left, right) && !left.MemoryEquals(right)); + + /// + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append("("); + sb.Append((object) Head); sb.Append(", "); + sb.Append((object) Item1); + sb.Append(", "); + sb.Append((object) Item2); + sb.Append(", "); + sb.Append((object) Item3); + sb.Append(", "); + sb.Append((object) Item4); + sb.Append(", "); + sb.Append((object) Item5); + sb.Append(", "); + sb.Append((object) Item6); + sb.Append(", "); + sb.Append((object) Item7); + sb.Append(", "); + sb.Append((object) Item8); + sb.Append(", "); + sb.Append((object) Item9); + sb.Append(", "); + sb.Append((object) Item10); + sb.Append(", "); + sb.Append((object) Item11); + sb.Append(", "); + sb.Append((object) Item12); + sb.Append(", "); + sb.Append((object) Item13); + sb.Append(", "); + sb.Append((object) Item14); + sb.Append(", "); + sb.Append((object) Item15); + sb.Append(")"); + return sb.ToString(); + } + /// /// Deconstructs this chain. /// diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.tt b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.tt index 7b072af330..9e6777b740 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.tt +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.tt @@ -93,20 +93,47 @@ } return builder.ToString(); } + + string ConstraintListLoose(int index, string prefix) + { + var builder = new StringBuilder(prefix); + builder.Append("where TChain : struct, IChainable"); + for (var i = 1; i < index; i++) + { + builder + .AppendLine() + .Append(prefix) + .Append("where T") + .Append(i) + .Append(" : struct, IChainable"); + } + return builder.ToString(); + } #> // ReSharper disable StaticMemberInGenericType +#pragma warning disable CS0659, CS0660, CS0661 using System.Collections; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Text; -namespace Silk.Net.Vulkan; +namespace Silk.NET.Vulkan; /// -/// Static class for creating Managed Chains. +/// Base class for all Managed Chains. /// -public abstract class ManagedChain : IReadOnlyList, IDisposable +public abstract unsafe class ManagedChain : IReadOnlyList, IDisposable { + /// + /// Gets a pointer to the current head. + /// + public abstract BaseInStructure* HeadPtr { get; } + + /// + /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. + /// + public abstract int Size { get; } + /// public abstract IEnumerator GetEnumerator(); IEnumerator IEnumerable.GetEnumerator() @@ -120,6 +147,19 @@ public abstract class ManagedChain : IReadOnlyList, IDisposable /// public abstract IChainable this[int index] { get; } + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public override bool Equals(object obj) + { + return !ReferenceEquals(null, obj) && + (ReferenceEquals(this, obj) || obj.GetType() == this.GetType() && MemoryEquals((ManagedChain) obj)); + } + + /// + /// Compares the supplied memory block with this one. + /// + protected abstract bool MemoryEquals(ManagedChain other); + /// public abstract void Dispose(); @@ -127,30 +167,37 @@ public abstract class ManagedChain : IReadOnlyList, IDisposable for (var i = 1; i <= maximumItems; i++) { var tList = TypeList(i); + var pDocs = ParameterDocs(i, " /// "); + var pTypeDocs = ParameterTypeDocs(i, " /// "); + var constraints = ConstraintList(i, " "); + var constraintsLoose = ConstraintListLoose(i, " "); #> /// /// Creates a new with <#= i #> items. /// -<#= ParameterDocs(i, " /// ") #> -<#= ParameterTypeDocs(i, " /// ") #> +<#= pDocs #> +<#= pTypeDocs #> /// A new with <#= i #> items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ManagedChain<<#= tList #>> Create<<#= tList #>>(<#= ParamList(i) #>) -<#= ConstraintList(i, " ") #> - { - return new(<#= ArgList(i) #>); - } +<#= constraints #> + => new(<#= ArgList(i) #>); /// - /// Loads a new with <#= i #> items from an existing unmanaged chain. + /// Creates a new with <#= i #> items. /// - /// Any errors loading the chain. - /// The unmanaged chain to use as the basis of this chain. +<#= pDocs #> +<#= pTypeDocs #> /// A new with <#= i #> items. - public static ManagedChain<<#= tList #>> Load<<#= tList #>>(out string errors, TChain chain) -<#= ConstraintList(i, " ") #> - { - return new(out errors, chain); - } + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain<<#= tList #>> CreateAny<<#= tList #>>(<#= ParamList(i) #>) +<#= constraintsLoose #> + => new(<#= ArgList(i) #>); /// /// Loads a new with <#= i #> items from an existing unmanaged chain, @@ -158,152 +205,57 @@ public abstract class ManagedChain : IReadOnlyList, IDisposable /// /// The unmanaged chain to use as the basis of this chain. /// A new with <#= i #> items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ManagedChain<<#= tList #>> Load<<#= tList #>>(TChain chain) -<#= ConstraintList(i, " ") #> - { - return new(out var _, chain); - } - -<# - } // for (var i = 1; i <= maximumItems; i++) -#> -} -<# - for (var i = 1; i <= maximumItems; i++) - { - var tList = TypeList(i); -#> - -/// -/// A safely manages the pointers of a managed structure chain. -/// -<#= ParameterTypeDocs(i, "/// ") #> -public unsafe class ManagedChain<<#= tList #>> : ManagedChain -<#= ConstraintList(i, " ") #> -{ - /// - /// Gets the size (in bytes) of the head structure. - /// - public static readonly int HeadSize = Marshal.SizeOf(); -<# - for (var j = 1; j < i; j++) - { -#> - - /// - /// Gets the offset to the start of . - /// - public static readonly int Item<#= j #>Offset = <#= j == 1 ? "HeadSize" : $"Item{j - 1}Offset + Item{j - 1}Size" #>; - - /// - /// Gets the size (in bytes) of the Item 1. - /// - public static readonly int Item<#= j #>Size = Marshal.SizeOf>(); -<# - } // for (int j = 1; j < i; j++) { -#> - - /// - /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. - /// - public static readonly int MemorySize = <#= i == 1 ? "HeadSize" : $"Item{i - 1}Offset + Item{i - 1}Size" #>; - - private nint _headPtr; - - /// - /// Gets a pointer to the current head. - /// - public BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; - - /// - /// Gets or sets the head of the chain. - /// - public TChain Head - { - get => Unsafe.AsRef((BaseInStructure*) _headPtr); - set - { - value.StructureType(); - var ptr = (BaseInStructure*) _headPtr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, _headPtr, true); - ptr->PNext = nextPtr; - } - } -<# - for (var j = 1; j < i; j++) - { -#> - - /// - /// Gets a pointer to the second item in the chain. - /// - public BaseInStructure* Item<#= j #>Ptr => (BaseInStructure*) (_headPtr + Item<#= j #>Offset); - - /// - /// Gets or sets item #<#= j #> in the chain. - /// - public T<#= j #> Item<#= j #> - { - get => Unsafe.AsRef>(Item<#= j #>Ptr); - set - { - value.StructureType(); - var ptr = Item<#= j #>Ptr; - var nextPtr = ptr->PNext; - Marshal.StructureToPtr(value, (nint)ptr, true); - ptr->PNext = nextPtr; - } - } -<# - } // for (int j = 1; j < i; j++) { -#> +<#= constraints #> + => LoadAny<<#= tList #>>(out var _, chain); /// - /// Creates a new with <#= i #> items from an existing memory block. + /// Loads a new with <#= i #> items from an existing unmanaged chain, + /// ignoring any errors. /// - /// The pointer to the head of the chain.. - /// - /// Callers are responsible for ensuring the size of the memory is correct. - /// - internal ManagedChain(nint headPtr) - { - _headPtr = headPtr; - } + /// The unmanaged chain to use as the basis of this chain. + /// A new with <#= i #> items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain<<#= tList #>> LoadAny<<#= tList #>>(TChain chain) +<#= constraintsLoose #> + => LoadAny<<#= tList #>>(out var _, chain); /// - /// Creates a new with <#= i #> items. + /// Loads a new with <#= i #> items from an existing unmanaged chain. /// -<#= ParameterDocs(i, " /// ") #> - public ManagedChain(<#= ParamList(i) #>) - : this(Marshal.AllocHGlobal(MemorySize)) - { - head.StructureType(); - Marshal.StructureToPtr(head, _headPtr, false); -<# - for (var j = 1; j < i; j++) - { -#> - <#= j == 1 ? "BaseInStructure* " : "" #>itemPtr = Item<#= j #>Ptr; - item<#= j #>.StructureType(); - Marshal.StructureToPtr(item<#= j #>, (nint)itemPtr, false); - <#= j == 1 ? "HeadPtr" : $"Item{j - 1}Ptr" #>->PNext = itemPtr; -<# - } // for (int j = 1; j < i; j++) { -#> - <#= i == 1 ? "HeadPtr" : $"Item{i - 1}Ptr" #>->PNext = null; - } + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + /// A new with <#= i #> items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain<<#= tList #>> Load<<#= tList #>>(out string errors, TChain chain) +<#= constraints #> + => LoadAny<<#= tList #>>(out errors, chain); /// - /// Creates a new with <#= i #> items from an existing unmanaged chain. + /// Loads a new with <#= i #> items from an existing unmanaged chain. /// /// Any errors loading the chain. /// The unmanaged chain to use as the basis of this chain. - public ManagedChain(out string errors, TChain chain) - : this(Marshal.AllocHGlobal(MemorySize)) + /// A new with <#= i #> items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain<<#= tList #>> LoadAny<<#= tList #>>(out string errors, TChain chain) +<#= constraintsLoose #> { + var size = ManagedChain<<#= tList #>>.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(size); chain.StructureType(); - Marshal.StructureToPtr(chain, _headPtr, false); + Marshal.StructureToPtr(chain, newHeadPtr, false); <# if (i == 1) { @@ -314,17 +266,17 @@ public unsafe class ManagedChain<<#= tList #>> : ManagedChain else { #> - StringBuilder errorBuilder = new StringBuilder(); + var errorBuilder = new StringBuilder(); var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); - var newPtr = (BaseInStructure*) _headPtr; + var newPtr = (BaseInStructure*) newHeadPtr; <# for (var j = 1; j < i; j++) { #> - existingPtr = (BaseInStructure*)existingPtr->PNext; - newPtr->PNext = (BaseInStructure*)(_headPtr + Item<#= j #>Offset); - newPtr = (BaseInStructure*)newPtr->PNext; + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain<<#= tList #>>.Item<#= j #>Offset); + newPtr = newPtr->PNext; T<#= j #> item<#= j #> = default; <#= j == 1 ? "var " : "" #>expectedStructureType = item<#= j #>.StructureType(); @@ -362,25 +314,70 @@ public unsafe class ManagedChain<<#= tList #>> : ManagedChain <# } // if (i == 1) {} else {... #> + return new ManagedChain<<#= tList #>>(newHeadPtr); } +<# + } // for (var i = 1; i <= maximumItems; i++) +#> +} + +/// +/// Static class providing extension methods for manipulating managed chains. +/// +/// The `Any` versions of chain methods do not validate that items belong in the chain, this is +/// useful for situations where the specification does not indicate required chain constraints. You should generally +/// try to use the none `Any` version in preference. +public static unsafe class ManagedChainExtensions +{ +<# + for (var i = 1; i <= maximumItems; i++) + { + var tList = TypeList(i); + var pTypeDocs = ParameterTypeDocs(i, " /// "); + var constraints = ConstraintList(i, " "); + var constraintsLoose = ConstraintListLoose(i, " "); +#> /// - /// Creates a new with <#= i #> by copying this chain. + /// Creates a new with <#= i #> by copying the . /// + /// The chain. +<#= pTypeDocs #> /// /// Do not forget to dispose this chain if you are no longer using it. /// - public ManagedChain<<#= tList #>> Duplicate() + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain<<#= tList #>> Duplicate<<#= tList #>>(this ManagedChain<<#= tList #>> chain) +<#= constraints #> + => chain.DuplicateAny(); + + /// + /// Creates a new with <#= i #> by copying the . + /// + /// The chain. +<#= pTypeDocs #> + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain<<#= tList #>> DuplicateAny<<#= tList #>>(this ManagedChain<<#= tList #>> chain) +<#= constraintsLoose #> { - var newHeadPtr = Marshal.AllocHGlobal(MemorySize); + var size = ManagedChain<<#= tList #>>.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(size); // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, size, size); <# if (i > 1) { #> // Update all pointers - ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain<<#= tList #>>.Item1Offset); <# } // if (i > 1) #> @@ -388,127 +385,333 @@ public unsafe class ManagedChain<<#= tList #>> : ManagedChain for (var j = 2; j < i; j++) { #> - ((BaseInStructure*)(newHeadPtr + Item<#= j - 1 #>Offset))->PNext = (BaseInStructure*) (newHeadPtr + Item<#= j #>Offset); + ((BaseInStructure*)(newHeadPtr + ManagedChain<<#= tList #>>.Item<#= j - 1 #>Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain<<#= tList #>>.Item<#= j #>Offset); <# } // for (int j = 1; j < i; j++) { #> return new ManagedChain<<#= tList #>>(newHeadPtr); } + <# if (i > 1) { var shortTList = TypeList(i - 1); #> - /// - /// Creates a new with <#= i #> items, by appending - /// to the end of this chain. + /// Creates a new with <#= i - 1 #> items, by removing the last item + /// from the . /// - /// The chain to append to. - /// Item <#= i - 1 #>. + /// The chain. +<#= pTypeDocs #> /// - /// Do not forget to dispose the chain if you are no longer using it. + /// Do not forget to dispose this chain if you are no longer using it. /// - public ManagedChain(ManagedChain<<#= shortTList #>> previous, T<#= i - 1 #> item<#= i - 1 #> = default) - : this(Marshal.AllocHGlobal(MemorySize)) - { - var previousSize = MemorySize - Item<#= i - 1 #>Size; - // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); - - // Append item <#= i - 1 #> - item<#= i - 1 #>.StructureType(); - Marshal.StructureToPtr(item<#= i - 1 #>, _headPtr + previousSize, false); - - // Update all pointers - ((BaseInStructure*)_headPtr)->PNext = (BaseInStructure*) (_headPtr + Item1Offset); -<# - for (var j = 2; j < i; j++) - { -#> - ((BaseInStructure*)(_headPtr + Item<#= j - 1 #>Offset))->PNext = (BaseInStructure*) (_headPtr + Item<#= j #>Offset); -<# - } // for (int j = 1; j < i; j++) { -#> - ((BaseInStructure*)(_headPtr + previousSize))->PNext = null; - } + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain<<#= shortTList #>> Truncate<<#= tList #>>(this ManagedChain<<#= tList #>> chain) +<#= constraints #> + => chain.TruncateAny(out var _); /// /// Creates a new with <#= i - 1 #> items, by removing the last item - /// from this chain. + /// from the . + /// + /// The chain. +<#= pTypeDocs #> + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain<<#= shortTList #>> TruncateAny<<#= tList #>>(this ManagedChain<<#= tList #>> chain) +<#= constraintsLoose #> + => chain.TruncateAny(out var _); + + /// + /// Creates a new with <#= i - 1 #> items, by removing + /// from the end of the . /// + /// The chain. + /// The item removed from the . +<#= pTypeDocs #> /// /// Do not forget to dispose this chain if you are no longer using it. /// - public ManagedChain<<#= shortTList #>> Truncate() - { - return Truncate(out var _); - } + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain<<#= shortTList #>> Truncate<<#= tList #>>(this ManagedChain<<#= tList #>> chain, out T<#= i - 1 #> item<#= i - 1 #>) +<#= constraints #> + => chain.TruncateAny(out item<#= i - 1 #>); /// /// Creates a new with <#= i - 1 #> items, by removing - /// from the end of this chain. + /// from the end of the . /// + /// The chain. + /// The item removed from the . +<#= pTypeDocs #> /// - /// Do not forget to dispose this chain if you are no longer using it. + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. /// - public ManagedChain<<#= shortTList #>> Truncate(out T<#= i - 1 #> item<#= i - 1 #>) + /// + /// + /// + public static ManagedChain<<#= shortTList #>> TruncateAny<<#= tList #>>(this ManagedChain<<#= tList #>> chain, out T<#= i - 1 #> item<#= i - 1 #>) +<#= constraintsLoose #> { - item<#= i - 1 #> = Item<#= i - 1 #>; + // Retrieve last item. + item<#= i - 1 #> = chain.Item<#= i - 1 #>; - var newSize = MemorySize - Item<#= i - 1 #>Size; + var newSize = ManagedChain<<#= tList #>>.MemorySize - ManagedChain<<#= tList #>>.Item<#= i - 1 #>Size; var newHeadPtr = Marshal.AllocHGlobal(newSize); // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, newSize, newSize); // Update all pointers <# if (i > 2) { #> - ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + Item1Offset); + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain<<#= tList #>>.Item1Offset); <# for (var j = 2; j < i; j++) { #> - ((BaseInStructure*)(newHeadPtr + Item<#= j - 1 #>Offset))->PNext = <#= j == i -1 ? "null" : $"(BaseInStructure*) (newHeadPtr + Item{j}Offset)"#>; + ((BaseInStructure*)(newHeadPtr + ManagedChain<<#= tList #>>.Item<#= j - 1 #>Offset))->PNext = <#= + j == i - 1 + ? "null" + : $"(BaseInStructure*) (newHeadPtr + ManagedChain<{tList}>.Item{j}Offset)" #>; <# } // for (int j = 1; j < i - 1; j++) } else // if (i > 1) { - #> +#> ((BaseInStructure*)newHeadPtr)->PNext = null; <# } #> return new ManagedChain<<#= shortTList #>>(newHeadPtr); } + <# - } // if (i > 1) + } // (i > 1) if (i < maximumItems) { var bigTList = TypeList(i + 1); + var bigPTypeDocs = ParameterTypeDocs(i + 1, " /// "); + var bigConstraints = ConstraintList(i + 1, " "); + var bigConstraintsLoose = ConstraintListLoose(i + 1, " "); #> + /// + /// Creates a new with <#= i + 1 #> items, by appending to + /// the end of the . + /// + /// The chain. + /// The item to append. +<#= bigPTypeDocs #> + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + public static ManagedChain<<#= bigTList #>> Add<<#= bigTList #>>(this ManagedChain<<#= tList #>> chain, T<#= i #> item<#= i #> = default) +<#= bigConstraints #> + => chain.AddAny(item<#= i #>); /// /// Creates a new with <#= i + 1 #> items, by appending to - /// the end of this chain. + /// the end of the . /// - /// Item <#= i #>. - /// Type of Item <#= i #> + /// The chain. + /// The item to append. +<#= bigPTypeDocs #> /// - /// Do not forget to dispose this chain if you are no longer using it. + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. /// - public ManagedChain<<#= bigTList #>> Append>(T<#= i #> item<#= i #> = default) - where T<#= i #>: struct, IExtendsChain + /// + public static ManagedChain<<#= bigTList #>> AddAny<<#= bigTList #>>(this ManagedChain<<#= tList #>> chain, T<#= i #> item<#= i #> = default) +<#= bigConstraintsLoose #> { - return new ManagedChain<<#= tList #>, T<#= i #>>(this, item<#= i #>); + var previousSize = ManagedChain<<#= tList #>>.MemorySize; + var newSize = ManagedChain<<#= bigTList #>>.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, previousSize, previousSize); + + // Append item <#= i - 1 #> + item<#= i #>.StructureType(); + Marshal.StructureToPtr(item<#= i #>, newHeadPtr + previousSize, false); + + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain<<#= bigTList #>>.Item1Offset); +<# + for (var j = 1; j < i; j++) + { +#> + ((BaseInStructure*)(newHeadPtr + ManagedChain<<#= bigTList #>>.Item<#= j #>Offset))->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain<<#= bigTList #>>.Item<#= j + 1 #>Offset); +<# + } // for (int j = 1; j < i; j++) { +#> + ((BaseInStructure*)(newHeadPtr + previousSize))->PNext = null; + return new ManagedChain<<#= bigTList #>>(newHeadPtr); } + <# } // if (i < maximumItems) + } // for (var i = 1; i <= maximumItems; i++) +#> +} +<# + for (var i = 1; i <= maximumItems; i++) + { + var tList = TypeList(i); + var pDocs = ParameterDocs(i, " /// "); +#> + +/// +/// A safely manages the pointers of a managed structure chain. +/// +<#= ParameterTypeDocs(i, "/// ") #> +public unsafe sealed class ManagedChain<<#= tList #>> : ManagedChain, IEquatable>> +<#= ConstraintListLoose(i, " ") #> +{ + /// + /// Gets the size (in bytes) of the default structure header. + /// + public static readonly int HeaderSize = Marshal.SizeOf(); + + /// + /// Gets the size (in bytes) of the head structure. + /// + public static readonly int HeadSize = Marshal.SizeOf(); +<# + for (var j = 1; j < i; j++) + { +#> + + /// + /// Gets the offset to the start of . + /// + public static readonly int Item<#= j #>Offset = <#= j == 1 ? "HeadSize" : $"Item{j - 1}Offset + Item{j - 1}Size" #>; + + /// + /// Gets the size (in bytes) of the Item 1. + /// + public static readonly int Item<#= j #>Size = Marshal.SizeOf>(); +<# + } // for (int j = 1; j < i; j++) { #> + /// + /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. + /// + public static readonly int MemorySize = <#= i == 1 ? "HeadSize" : $"Item{i - 1}Offset + Item{i - 1}Size" #>; + + /// + public override int Size => MemorySize; + + private nint _headPtr; + + /// + public override BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; + + /// + /// Gets or sets the head of the chain. + /// + public TChain Head + { + get => Unsafe.AsRef((BaseInStructure*) _headPtr); + set + { + value.StructureType(); + var ptr = (BaseInStructure*) _headPtr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, _headPtr, true); + ptr->PNext = nextPtr; + } + } +<# + for (var j = 1; j < i; j++) + { +#> + + /// + /// Gets a pointer to the second item in the chain. + /// + public BaseInStructure* Item<#= j #>Ptr => (BaseInStructure*) (_headPtr + Item<#= j #>Offset); + + /// + /// Gets or sets item #<#= j #> in the chain. + /// + public T<#= j #> Item<#= j #> + { + get => Unsafe.AsRef>(Item<#= j #>Ptr); + set + { + value.StructureType(); + var ptr = Item<#= j #>Ptr; + var nextPtr = ptr->PNext; + Marshal.StructureToPtr(value, (nint)ptr, true); + ptr->PNext = nextPtr; + } + } +<# + } // for (int j = 1; j < i; j++) { +#> + + /// + /// Creates a new with <#= i #> items from an existing memory block. + /// + /// The pointer to the head of the chain. + /// + /// Callers are responsible for ensuring the size of the memory is correct. + /// + internal ManagedChain(nint headPtr) + { + _headPtr = headPtr; + } + + /// + /// Creates a new with <#= i #> items. + /// +<#= pDocs #> + internal ManagedChain(<#= ParamList(i) #>) + : this(Marshal.AllocHGlobal(MemorySize)) + { + head.StructureType(); + Marshal.StructureToPtr(head, _headPtr, false); +<# + for (var j = 1; j < i; j++) + { +#> + <#= j == 1 ? "var " : "" #>itemPtr = Item<#= j #>Ptr; + item<#= j #>.StructureType(); + Marshal.StructureToPtr(item<#= j #>, (nint)itemPtr, false); + <#= j == 1 ? "HeadPtr" : $"Item{j - 1}Ptr" #>->PNext = itemPtr; +<# + } // for (int j = 1; j < i; j++) { +#> + <#= i == 1 ? "HeadPtr" : $"Item{i - 1}Ptr" #>->PNext = null; + } + /// public override IEnumerator GetEnumerator() { @@ -542,10 +745,85 @@ public unsafe class ManagedChain<<#= tList #>> : ManagedChain _ => throw new IndexOutOfRangeException() }; + /// + /// Compares the supplied memory block with this one, ignoring the structure headers. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + protected override bool MemoryEquals(ManagedChain other) + { + var ptr = HeadPtr; + var otherPtr = other.HeadPtr; + if (ptr == otherPtr) { + return true; + } + var span = new ReadOnlySpan((void*) ptr, MemorySize); + var otherSpan = new ReadOnlySpan((void*) otherPtr, MemorySize); + var start = 0; + var length = HeadSize; + var sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; +<# + for (var j = 1; j < i; j++) + { +#> + + start += length; + length = Item<#=j#>Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; +<# + } // for (int j = 1; j < i; j++) { +#> + return true; + } + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Equals(ManagedChain<<#=tList#>> other) + => !ReferenceEquals(null, other) && (ReferenceEquals(this, other) || MemoryEquals(other)); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator ==(ManagedChain<<#=tList#>> left, ManagedChain<<#=tList#>> right) => + ReferenceEquals(null, left) + ? ReferenceEquals(null, right) + : !ReferenceEquals(null, right) && (ReferenceEquals(left, right) || left.MemoryEquals(right)); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator !=(ManagedChain<<#=tList#>> left, ManagedChain<<#=tList#>> right) => + ReferenceEquals(null, left) + ? !ReferenceEquals(null, right) + : ReferenceEquals(null, right) || (!ReferenceEquals(left, right) && !left.MemoryEquals(right)); + + /// + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append("("); + sb.Append((object) Head);<# + for (var j = 1; j < i; j++) + { +#> + sb.Append(", "); + sb.Append((object) Item<#= j #>); +<# +} // for (int j = 1; j < i; j++) { +#> + sb.Append(")"); + return sb.ToString(); + } + /// /// Deconstructs this chain. /// -<#= ParameterDocs(i, " /// ") #> +<#= pDocs #> public void Deconstruct(out TChain head<# for (var j = 1; j < i; j++) { diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceAccelerationStructureFeaturesKhr.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceAccelerationStructureFeaturesKhr.cs index c642f30156..ea33002ba1 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceAccelerationStructureFeaturesKhr.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceAccelerationStructureFeaturesKhr.cs @@ -1,4 +1,4 @@ -namespace Silk.Net.Vulkan; +namespace Silk.NET.Vulkan; public struct PhysicalDeviceAccelerationStructureFeaturesKhr : IExtendsChain, diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceDescriptorIndexingFeatures.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceDescriptorIndexingFeatures.cs index f370c44dc0..baaf642e87 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceDescriptorIndexingFeatures.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceDescriptorIndexingFeatures.cs @@ -1,4 +1,4 @@ -namespace Silk.Net.Vulkan; +namespace Silk.NET.Vulkan; public struct PhysicalDeviceDescriptorIndexingFeatures : IExtendsChain, diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceFeatures.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceFeatures.cs index d38a0d2e30..cecb0b3267 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceFeatures.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceFeatures.cs @@ -1,4 +1,4 @@ -namespace Silk.Net.Vulkan; +namespace Silk.NET.Vulkan; public struct PhysicalDeviceFeatures { diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceFeatures2.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceFeatures2.cs index 0f3bc822ff..b5fe21e56e 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceFeatures2.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PhysicalDeviceFeatures2.cs @@ -1,4 +1,4 @@ -namespace Silk.Net.Vulkan; +namespace Silk.NET.Vulkan; public struct PhysicalDeviceFeatures2 : IChainStart, diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PrototypeStructChaining.csproj b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PrototypeStructChaining.csproj index 79d8733662..9762caf80c 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PrototypeStructChaining.csproj +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PrototypeStructChaining.csproj @@ -4,9 +4,8 @@ netstandard2.0;netstandard2.1;netcoreapp3.1;net5.0 10 enable - enable true - Silk.Net.Vulkan + Silk.NET.Vulkan diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/StructureType.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/StructureType.cs index 28a3e988f7..f56cee31b8 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/StructureType.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/StructureType.cs @@ -1,4 +1,4 @@ -namespace Silk.Net.Vulkan; +namespace Silk.NET.Vulkan; public enum StructureType { From aebe0d25b2952cd38ffcb478b807131c115a6c86 Mon Sep 17 00:00:00 2001 From: Craig Dean Date: Sun, 14 Nov 2021 09:17:58 +0000 Subject: [PATCH 40/42] feat: Added `GetHashCode` implementation This is a proposed implementation that only checks the start of the payload. We may change this to check the full payload Also updated the proposals to match the new `Any` functionality. --- ...Struct Chaining - #2 Unmanaged Chaining.md | 2 +- ...n Struct Chaining - #3 Managed Chaining.md | 688 ++++++-- .../TestManagedChains.cs | 57 + .../PrototypeStructChaining/IChainable.cs | 3 + .../ManagedChain.gen.cs | 1417 ++++++++++++++++- .../ManagedChain.gen.tt | 53 + 6 files changed, 2014 insertions(+), 206 deletions(-) diff --git a/documentation/proposals/Proposal - Vulkan Struct Chaining - #2 Unmanaged Chaining.md b/documentation/proposals/Proposal - Vulkan Struct Chaining - #2 Unmanaged Chaining.md index 983c501d2b..35f13a7d9b 100644 --- a/documentation/proposals/Proposal - Vulkan Struct Chaining - #2 Unmanaged Chaining.md +++ b/documentation/proposals/Proposal - Vulkan Struct Chaining - #2 Unmanaged Chaining.md @@ -147,7 +147,7 @@ To be discussed: The proposal provides for the following usages. Note that where an `Any` extension method is mentioned, it is identical to the non-`Any` version (e.g. `AddNext` and `AddNextAny` are equivalent), save that the `Any` version does not -constrain the types to those associated with a defined chain. +constrain the types to those associated with a defined chain, instead types only need to be `IChainable`. ### Chain Building diff --git a/documentation/proposals/Proposal - Vulkan Struct Chaining - #3 Managed Chaining.md b/documentation/proposals/Proposal - Vulkan Struct Chaining - #3 Managed Chaining.md index 86f6456027..abb1f84939 100644 --- a/documentation/proposals/Proposal - Vulkan Struct Chaining - #3 Managed Chaining.md +++ b/documentation/proposals/Proposal - Vulkan Struct Chaining - #3 Managed Chaining.md @@ -17,7 +17,8 @@ performance. However, many consumers are uncomfortable with pointers, and are especially prone to introducing bugs when placing structs onto the heap. This proposal provides a convenient `ManagedChain` class, and multiple -descendent `ManagedChain` (similar to the `System.Tuple` classes) classes to safely fix the structures in memory and prevent pointer bugs. +descendent `ManagedChain` (similar to the `System.Tuple` classes) classes to safely fix the structures +in memory and prevent pointer bugs. Whenever a structure is loaded into the `ManagedChain` its `SType` and `PNext` are forced to be correct, preventing errors. Structures can be replaced at any time, and will be inserted efficiently into the chain as an O(1) operation. @@ -46,6 +47,9 @@ errors. Structures can be replaced at any time, and will be inserted efficiently - The structure accessors return a copy of the structures, and always correct the `SType` and `PNext` on input. Even though the `PNext` values are exposed there is no way to modify them from outside the class, guaranteeing their safety. +- The managed chains implement `IEquatable`, allowing two chains with identical content to be efficiently compared ( + ignoring the `PNext` pointers, but already being confident the `SType` and ordering is correct). They also implement + the equality operator overloads, and `GetHashCode`. Open questions: @@ -62,6 +66,9 @@ Open questions: found in the unmanaged chain, no matter at what position they are found. This is not entirely unreasonable as the order of chains (after the start) is not fixed in Vulkan, and it will allow importing existing chains where the order doesn't matter. +- `GetHasCode` only includes the `SType` and, at most, the first 8 bytes of the payload, for speed. This is because a + HashCode only needs to generate reasonable separation, but does not need to be unique. It is possible, to hash the + entire memory block if desired, though at slightly worse performance. - Similar to `Append` and `Truncate` we could also add `Insert` and `Remove` methods, though slightly more complex, as we'd have to generate multiples of each, it is not difficult to do, for example: @@ -85,16 +92,31 @@ pubilc class ManagedCache ... { # Usage -### Creation +## The Any versions + +As with unmanaged chains, the managed chains system includes `Any` versions of all methods. In fact, +the `ManagedChain` constraints are 'loose', that is they only require types to be `IChainable` rather than +requiring the stricter constraints that prevent unrelated chain elements being added, or used as the start of a chain. + +With the exception of the setters on chain items, you cannot manipulate a chain save through the static methods, and the +preferred versions do include the tighter constraints. + +## Instance-Based Methods + +### Creation (Create/CreateAny) The following will create a chain starting with `PhysicalDeviceFeatures2`, pointing to `PhysicalDeviceDescriptorIndexingFeatures` and finishing with a `PhysicalDeviceAccelerationStructureFeaturesKHR` structure: ```csharp -using var chain = new ManagedChain(); - +using var chain = ManagedChain.Create + ( + default(PhysicalDeviceFeatures2), + default(PhysicalDeviceDescriptorIndexingFeatures), + default(PhysicalDeviceAccelerationStructureFeaturesKhr) + ); + // Ensure all STypes set correctly Assert.Equal(StructureType.PhysicalDeviceFeatures2, chain.Head.SType); Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, chain.Item1.SType); @@ -108,7 +130,7 @@ Assert.Equal((nint) 0, (nint) chain.Item2.PNext); The structures are held in unmanaged memory, preventing movement by the GC, and ensuring that the pointers remain fixed. -You can also use the `ManagedChain.Create(...)` static methods to create `ManagedChain`s, e.g.: +You can also use specify the generic types directly, e.g.: ```csharp using var chain = ManagedChain.Create< @@ -117,19 +139,10 @@ using var chain = ManagedChain.Create< PhysicalDeviceDescriptorIndexingFeatures>(); ``` -or, using generic type inference: - -```csharp -using var chain = ManagedChain.Create( - new DeviceCreateInfo { Flags = 1U }, - default(PhysicalDeviceFeatures2), - default(PhysicalDeviceDescriptorIndexingFeatures) -); -``` - -### Modifying values +### Modifying values (Head/Item# properties) -We can easily modify any value in the `ManagedChain`, and it will maintain the pointers automatically, e.g.: +We can easily modify any value in the `ManagedChain`, and it will maintain the pointers automatically. You do this using +the `Head` property, or one of the `Item#` properties (e.g. `Item1`), for example: ```csharp using var chain = ManagedChain.Create< @@ -169,13 +182,15 @@ Assert.Equal((nint) chain.Item1Ptr, (nint) chain.Head.PNext); **Note** When we update any item in the chain it overwrites the existing memory, so the pointers remain fixed. It also ensures the `PNext` value pointing to it is maintained. -### Appending to a chain +## Extension Methods + +### Appending to a chain (Append/AppendAny) You can call `Append` on a `ManagedChain` (of length < 16) to efficiently create a new, larger, `ManagedChain` with a new item appended to the end, e.g: ```csharp -using var chain = new ManagedChain( +using var chain = ManagedChain.Create( item1: new PhysicalDeviceDescriptorIndexingFeatures {ShaderInputAttachmentArrayDynamicIndexing = true}); // The new chain, will efficiently copy the old chain and append a new structure to the end @@ -190,9 +205,10 @@ Assert.True(newChain.Item1.ShaderInputAttachmentArrayDynamicIndexing); finished with, when using the `Append` method you will produce a new `ManagedChain` and should not forget to dispose the original if it is no longer needed. -### Truncate +### Truncating (Truncate/TruncateAny) Similarly, you can `Truncate` a chain (of length > 1) to get an instance of a smaller chain: + ```csharp using var chain = ManagedChain.Create(); using var chain2 = chain.Append(); @@ -204,16 +220,23 @@ Assert.Equal(2, chain2.Count); Assert.Equal(1, chain3.Count); ``` -### Duplicate +### Duplication (Duplicate/DuplicateAny) You can efficiently duplicate a managed chain by calling Duplicate on it: + ```csharp -using var chain = new ManagedChain(); using var copy = chain.Duplicate(); + +// Test equality +Assert.Equal(chain, copy); +Assert.True(chain == copy); ``` -### Loading from an unmanaged chain +**Note** The `copy` is 'equal' to the `chain` until you modify it's contents. + +### Loading from an unmanaged chain (Load/LoadAny) If you have created an unmanaged chain and would like to load that into a `ManagedChain` you can use one of the `ManagedChain.Load` methods: @@ -284,6 +307,8 @@ Assert.True(managedChain.Item2.ShaderInputAttachmentArrayDynamicIndexing); Notice that the above form uses the equivalent constructor as an alternative to the `Load` method. There is no equivalent constructor to `Load(TChain)` as that would be ambiguous. +## Additional interfaces + ### IReadOnlyList All the fully generic `ManageChain` types extend `ManagedChain` which implements `IDisposable` @@ -311,6 +336,11 @@ Assert.IsType(structures[1]); Assert.IsType(structures[2]); ``` +### Equality (IEquatable<T>) + +ll the fully generic `ManageChain` types implement the corresponding `IEquatable>` +interface, and equality operators. As well as `GetHashCode`. + ### Deconstruction Each `ManageChain` has a corresponding deconstructor for convenience, e.g.: @@ -327,7 +357,7 @@ Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, indexingFea Assert.Equal(StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr, accelerationStructureFeaturesKhr.SType); ``` -### Disposal +### Disposal (IDisposable) As each `ManagedChain` holds the underlying structures in unmanaged memory (to prevent them being moved and their pointers being invalidated), then it is critical you dispose them; either by calling `Dispose()` or by using a `using` @@ -341,8 +371,22 @@ The `ManagedChain`, non-generic abstract base class provides an abstract impleme and defines static `Create` and `Load` methods for each size of chain. ```csharp -public abstract class ManagedChain : IReadOnlyList, IDisposable + +/// +/// Base class for all Managed Chains. +/// +public abstract unsafe class ManagedChain : IReadOnlyList, IDisposable { + /// + /// Gets a pointer to the current head. + /// + public abstract BaseInStructure* HeadPtr { get; } + + /// + /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. + /// + public abstract int Size { get; } + /// public abstract IEnumerator GetEnumerator(); IEnumerator IEnumerable.GetEnumerator() @@ -356,9 +400,40 @@ public abstract class ManagedChain : IReadOnlyList, IDisposable /// public abstract IChainable this[int index] { get; } + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public override bool Equals(object obj) + { + return !ReferenceEquals(null, obj) && + (ReferenceEquals(this, obj) || obj.GetType() == this.GetType() && MemoryEquals((ManagedChain) obj)); + } + + /// + /// Compares the supplied memory block with this one. + /// + protected abstract bool MemoryEquals(ManagedChain other); + /// public abstract void Dispose(); + /// + /// Combines a hashcode with the first part of a slice. + /// + /// + /// + /// + protected static void CombineHash(ref int hashCode, ReadOnlySpan slice) => + hashCode = slice.Length switch + { + < 2 => HashCode.Combine(hashCode, slice[0]), + < 4 => HashCode.Combine(hashCode, MemoryMarshal.Cast(slice)[0]), + < 8 => HashCode.Combine(hashCode, MemoryMarshal.Cast(slice)[0]), + _ => HashCode.Combine(hashCode, MemoryMarshal.Cast(slice)[0]) + }; + + // Skipping methods for `ManagedChain{TChain}` to show more completed example + ... + /// /// Creates a new with 2 items. /// @@ -367,12 +442,59 @@ public abstract class ManagedChain : IReadOnlyList, IDisposable /// The chain type /// Type of Item 1. /// A new with 2 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ManagedChain Create(TChain head = default, T1 item1 = default) where TChain : struct, IChainStart where T1 : struct, IExtendsChain - { - return new(head, item1); - } + => new(head, item1); + + /// + /// Creates a new with 2 items. + /// + /// The head of the chain. + /// Item 1. + /// The chain type + /// Type of Item 1. + /// A new with 2 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain CreateAny(TChain head = default, T1 item1 = default) + where TChain : struct, IChainable + where T1 : struct, IChainable + => new(head, item1); + + /// + /// Loads a new with 2 items from an existing unmanaged chain, + /// ignoring any errors. + /// + /// The unmanaged chain to use as the basis of this chain. + /// A new with 2 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Load(TChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + => LoadAny(out var _, chain); + + /// + /// Loads a new with 2 items from an existing unmanaged chain, + /// ignoring any errors. + /// + /// The unmanaged chain to use as the basis of this chain. + /// A new with 2 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain LoadAny(TChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + => LoadAny(out var _, chain); /// /// Loads a new with 2 items from an existing unmanaged chain. @@ -380,11 +502,64 @@ public abstract class ManagedChain : IReadOnlyList, IDisposable /// Any errors loading the chain. /// The unmanaged chain to use as the basis of this chain. /// A new with 2 items. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] public static ManagedChain Load(out string errors, TChain chain) where TChain : struct, IChainStart where T1 : struct, IExtendsChain + => LoadAny(out errors, chain); + + /// + /// Loads a new with 2 items from an existing unmanaged chain. + /// + /// Any errors loading the chain. + /// The unmanaged chain to use as the basis of this chain. + /// A new with 2 items. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain LoadAny(out string errors, TChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable { - return new(out errors, chain); + var size = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(size); + chain.StructureType(); + Marshal.StructureToPtr(chain, newHeadPtr, false); + var errorBuilder = new StringBuilder(); + var existingPtr = (BaseInStructure*) Unsafe.AsPointer(ref chain); + var newPtr = (BaseInStructure*) newHeadPtr; + + existingPtr = existingPtr->PNext; + newPtr->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + newPtr = newPtr->PNext; + + T1 item1 = default; + var expectedStructureType = item1.StructureType(); + if (existingPtr is null) { + errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 2"); + } else { + if (existingPtr->SType != expectedStructureType) { + errorBuilder.Append("The unmanaged chain has a structure type ") + .Append(existingPtr->SType) + .Append(" at position 2; expected ") + .Append(expectedStructureType) + .AppendLine(); + } else { + if (existingPtr->PNext is not null) { + errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 2"); + existingPtr->PNext = null; + } + item1 = Unsafe.AsRef(existingPtr); + } + } + Marshal.StructureToPtr(item1, (nint) newPtr, false); + + // Create string of errors + errors = errorBuilder.ToString().Trim(); + return new ManagedChain(newHeadPtr); } // Only showing one example of Create/Load methods @@ -397,16 +572,20 @@ public abstract class ManagedChain : IReadOnlyList, IDisposable A class is generated for each valid size of a chain, here is one example: ```csharp - /// /// A safely manages the pointers of a managed structure chain. /// /// The chain type /// Type of Item 1. -public unsafe class ManagedChain : ManagedChain - where TChain : struct, IChainStart - where T1 : struct, IExtendsChain +public unsafe sealed class ManagedChain : ManagedChain, IEquatable> + where TChain : struct, IChainable + where T1 : struct, IChainable { + /// + /// Gets the size (in bytes) of the default structure header. + /// + public static readonly int HeaderSize = Marshal.SizeOf(); + /// /// Gets the size (in bytes) of the head structure. /// @@ -426,24 +605,25 @@ public unsafe class ManagedChain : ManagedChain /// Gets the total size (in bytes) of the unmanaged memory, managed by this chain. /// public static readonly int MemorySize = Item1Offset + Item1Size; - + + /// + public override int Size => MemorySize; + private nint _headPtr; - /// - /// Gets a pointer to the current head. - /// - public Chain* HeadPtr => (Chain*) _headPtr; + /// + public override BaseInStructure* HeadPtr => (BaseInStructure*) _headPtr; /// /// Gets or sets the head of the chain. /// public TChain Head { - get => Unsafe.AsRef((Chain*) _headPtr); + get => Unsafe.AsRef((BaseInStructure*) _headPtr); set { value.StructureType(); - var ptr = (Chain*) _headPtr; + var ptr = (BaseInStructure*) _headPtr; var nextPtr = ptr->PNext; Marshal.StructureToPtr(value, _headPtr, true); ptr->PNext = nextPtr; @@ -453,7 +633,7 @@ public unsafe class ManagedChain : ManagedChain /// /// Gets a pointer to the second item in the chain. /// - public Chain* Item1Ptr => (Chain*) (_headPtr + Item1Offset); + public BaseInStructure* Item1Ptr => (BaseInStructure*) (_headPtr + Item1Offset); /// /// Gets or sets item #1 in the chain. @@ -474,7 +654,7 @@ public unsafe class ManagedChain : ManagedChain /// /// Creates a new with 2 items from an existing memory block. /// - /// The pointer to the head of the chain.. + /// The pointer to the head of the chain. /// /// Callers are responsible for ensuring the size of the memory is correct. /// @@ -488,193 +668,365 @@ public unsafe class ManagedChain : ManagedChain /// /// The head of the chain. /// Item 1. - public ManagedChain(TChain head = default, T1 item1 = default) + internal ManagedChain(TChain head = default, T1 item1 = default) : this(Marshal.AllocHGlobal(MemorySize)) { head.StructureType(); Marshal.StructureToPtr(head, _headPtr, false); - Chain* itemPtr = Item1Ptr; + var itemPtr = Item1Ptr; item1.StructureType(); Marshal.StructureToPtr(item1, (nint)itemPtr, false); HeadPtr->PNext = itemPtr; Item1Ptr->PNext = null; } + /// + public override IEnumerator GetEnumerator() + { + yield return Head; + yield return Item1; + } + + /// + public override int Count => 2; + + /// + public override IChainable this[int index] + => index switch + { + 0 => Head, + 1 => Item1, + _ => throw new IndexOutOfRangeException() + }; + /// - /// Creates a new with 2 items from an existing unmanaged chain. + /// Compares the supplied memory block with this one, ignoring the structure headers. /// - /// Any errors loading the chain. - /// The unmanaged chain to use as the basis of this chain. - public ManagedChain(out string errors, TChain chain) - : this(Marshal.AllocHGlobal(MemorySize)) + [MethodImpl(MethodImplOptions.AggressiveInlining)] + protected override bool MemoryEquals(ManagedChain other) { - chain.StructureType(); - Marshal.StructureToPtr(chain, _headPtr, false); - StringBuilder errorBuilder = new StringBuilder(); - var existingPtr = (Chain*) Unsafe.AsPointer(ref chain); - var newPtr = (Chain*) _headPtr; + var ptr = HeadPtr; + var otherPtr = other.HeadPtr; + if (ptr == otherPtr) { + return true; + } + var span = new ReadOnlySpan((void*) ptr, MemorySize); + var otherSpan = new ReadOnlySpan((void*) otherPtr, MemorySize); + var start = 0; + var length = HeadSize; + var sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + + start += length; + length = Item1Size; + sliceLength = length - HeaderSize; + if (sliceLength > 0 && + !span.Slice(start + HeaderSize, sliceLength) + .SequenceEqual(otherSpan.Slice(start + HeaderSize, sliceLength))) + return false; + return true; + } - existingPtr = existingPtr->PNext; - newPtr->PNext = (Chain*) (_headPtr + Item1Offset); - newPtr = newPtr->PNext; + /// + /// HashCodes do not need to be unique, so ww only sample the structure type and the start of each + /// structure's 'payload'. + public override int GetHashCode() + { + var ptr = HeadPtr; + var span = new ReadOnlySpan((void*) ptr, MemorySize); + var start = 0; + var length = HeadSize; + var sliceLength = length - HeaderSize; + var hashCode = 0; + // Hash the structure type + var sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + + // Hash any payload + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item1Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + return hashCode; + } - T1 item1 = default; - var expectedStructureType = item1.StructureType(); - if (existingPtr is null) { - errorBuilder.AppendLine("The unmanaged chain was length 1, expected length 2"); - } else { - if (existingPtr->SType != expectedStructureType) { - errorBuilder.Append("The unmanaged chain has a structure type ") - .Append(existingPtr->SType) - .Append(" at position 2; expected ") - .Append(expectedStructureType) - .AppendLine(); - } else { - if (existingPtr->PNext is not null) { - errorBuilder.AppendLine("The unmanaged chain was longer than the expected length 2"); - existingPtr->PNext = null; - } - item1 = Unsafe.AsRef(existingPtr); - } + + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Equals(ManagedChain other) + => !ReferenceEquals(null, other) && (ReferenceEquals(this, other) || MemoryEquals(other)); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator ==(ManagedChain left, ManagedChain right) => + ReferenceEquals(null, left) + ? ReferenceEquals(null, right) + : !ReferenceEquals(null, right) && (ReferenceEquals(left, right) || left.MemoryEquals(right)); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator !=(ManagedChain left, ManagedChain right) => + ReferenceEquals(null, left) + ? !ReferenceEquals(null, right) + : ReferenceEquals(null, right) || (!ReferenceEquals(left, right) && !left.MemoryEquals(right)); + + /// + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append("("); + sb.Append((object) Head); sb.Append(", "); + sb.Append((object) Item1); + sb.Append(")"); + return sb.ToString(); + } + + /// + /// Deconstructs this chain. + /// + /// The head of the chain. + /// Item 1. + public void Deconstruct(out TChain head, out T1 item1) + { + head = Head; + item1 = Item1; + } + + /// + public override void Dispose() + { + var headPtr = Interlocked.Exchange(ref _headPtr, (nint)0); + if (headPtr == (nint)0) { + return; } - Marshal.StructureToPtr(item1, (nint) newPtr, false); - // Create string of errors - errors = errorBuilder.ToString().Trim(); + // Destroy all structures + Marshal.DestroyStructure(headPtr); + Marshal.DestroyStructure(headPtr + Item1Offset); + + // Free memory block + Marshal.FreeHGlobal(headPtr); } +} +``` + +## Extension methods +A static class is generated to hold the extension methods (showing one example set): +```csharp + +/// +/// Static class providing extension methods for manipulating managed chains. +/// +/// The `Any` versions of chain methods do not validate that items belong in the chain, this is +/// useful for situations where the specification does not indicate required chain constraints. You should generally +/// try to use the none `Any` version in preference. +public static unsafe class ManagedChainExtensions +{ + ... + /// - /// Creates a new with 2 by copying this chain. + /// Creates a new with 2 items, by appending to + /// the end of the . /// + /// The chain. + /// The item to append. + /// The chain type + /// Type of Item 1. /// - /// Do not forget to dispose this chain if you are no longer using it. + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. /// - public ManagedChain Duplicate() - { - var newHeadPtr = Marshal.AllocHGlobal(MemorySize); - // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, MemorySize, MemorySize); - // Update all pointers - ((Chain*)newHeadPtr)->PNext = (Chain*) (newHeadPtr + Item1Offset); - return new ManagedChain(newHeadPtr); - } + /// + public static ManagedChain Add(this ManagedChain chain, T1 item1 = default) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + => chain.AddAny(item1); /// - /// Creates a new with 2 items, by appending - /// to the end of this chain. + /// Creates a new with 2 items, by appending to + /// the end of the . /// - /// The chain to append to. - /// Item 1. + /// The chain. + /// The item to append. + /// The chain type + /// Type of Item 1. /// - /// Do not forget to dispose the chain if you are no longer using it. + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. /// - public ManagedChain(ManagedChain previous, T1 item1 = default) - : this(Marshal.AllocHGlobal(MemorySize)) + /// + public static ManagedChain AddAny(this ManagedChain chain, T1 item1 = default) + where TChain : struct, IChainable + where T1 : struct, IChainable { - var previousSize = MemorySize - Item1Size; + var previousSize = ManagedChain.MemorySize; + var newSize = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(newSize); // Block copy original struct data for speed - Buffer.MemoryCopy(previous.HeadPtr, (void*)_headPtr, previousSize, previousSize); + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, previousSize, previousSize); - // Append item 1 + // Append item 0 item1.StructureType(); - Marshal.StructureToPtr(item1, _headPtr + previousSize, false); + Marshal.StructureToPtr(item1, newHeadPtr + previousSize, false); // Update all pointers - ((Chain*)_headPtr)->PNext = (Chain*) (_headPtr + Item1Offset); - ((Chain*)(_headPtr + previousSize))->PNext = null; + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + ((BaseInStructure*)(newHeadPtr + previousSize))->PNext = null; + return new ManagedChain(newHeadPtr); } /// - /// Creates a new with 1 items, by removing the last item - /// from this chain. + /// Creates a new with 2 by copying the . /// + /// The chain. + /// The chain type + /// Type of Item 1. /// /// Do not forget to dispose this chain if you are no longer using it. /// - public ManagedChain Truncate() - { - return Truncate(out var _); - } - + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Duplicate(this ManagedChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + => chain.DuplicateAny(); + /// - /// Creates a new with 1 items, by removing - /// from the end of this chain. + /// Creates a new with 2 by copying the . /// + /// The chain. + /// The chain type + /// Type of Item 1. /// - /// Do not forget to dispose this chain if you are no longer using it. + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. /// - public ManagedChain Truncate(out T1 item1) + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain DuplicateAny(this ManagedChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable { - item1 = Item1; - - var newSize = MemorySize - Item1Size; - var newHeadPtr = Marshal.AllocHGlobal(newSize); + var size = ManagedChain.MemorySize; + var newHeadPtr = Marshal.AllocHGlobal(size); // Block copy original struct data for speed - Buffer.MemoryCopy((void*)_headPtr, (void*)newHeadPtr, newSize, newSize); + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, size, size); // Update all pointers - ((Chain*)newHeadPtr)->PNext = null; - return new ManagedChain(newHeadPtr); + ((BaseInStructure*)newHeadPtr)->PNext = (BaseInStructure*) (newHeadPtr + ManagedChain.Item1Offset); + return new ManagedChain(newHeadPtr); } /// - /// Creates a new with 3 items, by appending to - /// the end of this chain. + /// Creates a new with 1 items, by removing the last item + /// from the . /// - /// Item 2. - /// Type of Item 2 + /// The chain. + /// The chain type + /// Type of Item 1. /// /// Do not forget to dispose this chain if you are no longer using it. /// - public ManagedChain Append(T2 item2 = default) - where T2: struct, IExtendsChain - { - return new ManagedChain(this, item2); - } - - /// - public override IEnumerator GetEnumerator() - { - yield return Head; - yield return Item1; - } - - /// - public override int Count => 2; + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Truncate(this ManagedChain chain) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + => chain.TruncateAny(out var _); - /// - public override IChainable this[int index] - => index switch - { - 0 => Head, - 1 => Item1, - _ => throw new IndexOutOfRangeException() - }; + /// + /// Creates a new with 1 items, by removing the last item + /// from the . + /// + /// The chain. + /// The chain type + /// Type of Item 1. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain TruncateAny(this ManagedChain chain) + where TChain : struct, IChainable + where T1 : struct, IChainable + => chain.TruncateAny(out var _); /// - /// Deconstructs this chain. + /// Creates a new with 1 items, by removing + /// from the end of the . /// - /// The head of the chain. - /// Item 1. - public void Deconstruct(out TChain head, out T1 item1) - { - head = Head; - item1 = Item1; - } + /// The chain. + /// The item removed from the . + /// The chain type + /// Type of Item 1. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// + /// + /// + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static ManagedChain Truncate(this ManagedChain chain, out T1 item1) + where TChain : struct, IChainStart + where T1 : struct, IExtendsChain + => chain.TruncateAny(out item1); - /// - public override void Dispose() + /// + /// Creates a new with 1 items, by removing + /// from the end of the . + /// + /// The chain. + /// The item removed from the . + /// The chain type + /// Type of Item 1. + /// + /// Do not forget to dispose this chain if you are no longer using it. + /// The `Any` versions of chain methods do not validate that items belong in the chain, this is + /// useful for situations where the specification does not indicate required chain constraints. You should generally + /// try to use the none `Any` version in preference. + /// + /// + /// + /// + public static ManagedChain TruncateAny(this ManagedChain chain, out T1 item1) + where TChain : struct, IChainable + where T1 : struct, IChainable { - var headPtr = Interlocked.Exchange(ref _headPtr, (nint)0); - if (headPtr == (nint)0) { - return; - } + // Retrieve last item. + item1 = chain.Item1; - // Destroy all structures - Marshal.DestroyStructure(headPtr); - Marshal.DestroyStructure(headPtr + Item1Offset); - - // Free memory block - Marshal.FreeHGlobal(headPtr); + var newSize = ManagedChain.MemorySize - ManagedChain.Item1Size; + var newHeadPtr = Marshal.AllocHGlobal(newSize); + // Block copy original struct data for speed + System.Buffer.MemoryCopy(chain.HeadPtr, (void*)newHeadPtr, newSize, newSize); + // Update all pointers + ((BaseInStructure*)newHeadPtr)->PNext = null; + return new ManagedChain(newHeadPtr); } + + ... } ``` \ No newline at end of file diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestManagedChains.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestManagedChains.cs index fe83c428cb..33a512a15a 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestManagedChains.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining.Test/TestManagedChains.cs @@ -393,4 +393,61 @@ public void TestDeconstructor() Assert.Equal (StructureType.PhysicalDeviceAccelerationStructureFeaturesKhr, accelerationStructureFeaturesKhr.SType); } + + [Fact] + public unsafe void TestManagedChainGetHashCode() + { + using var chain = ManagedChain.Create + ( + item1: new PhysicalDeviceDescriptorIndexingFeatures {ShaderInputAttachmentArrayDynamicIndexing = true} + ); + + // Ensure all STypes set correctly + Assert.Equal(StructureType.PhysicalDeviceFeatures2, chain.Head.SType); + Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, chain.Item1.SType); + + // Ensure pointers set correctly + Assert.Equal((nint) chain.Item1Ptr, (nint) chain.Head.PNext); + Assert.Equal(0, (nint) chain.Item1.PNext); + + // Check flag set + Assert.True(chain.Item1.ShaderInputAttachmentArrayDynamicIndexing); + + using var newChain = chain.Duplicate(); + + // Ensure all STypes set correctly + Assert.Equal(StructureType.PhysicalDeviceFeatures2, chain.Head.SType); + Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, chain.Item1.SType); + + Assert.Equal(StructureType.PhysicalDeviceDescriptorIndexingFeatures, chain.Item1Ptr->SType); + + // Ensure pointers set correctly + Assert.Equal((nint) chain.Item1Ptr, (nint) chain.Head.PNext); + Assert.Equal(0, (nint) chain.Item1.PNext); + + // Check flag set + Assert.True(chain.Item1.ShaderInputAttachmentArrayDynamicIndexing); + + // Check we have new copies + Assert.NotEqual((nint) chain.HeadPtr, (nint) newChain.HeadPtr); + Assert.NotEqual((nint) chain.Item1Ptr, (nint) newChain.Item1Ptr); + + // Test equality + Assert.Equal(chain, newChain); + Assert.True(chain == newChain); + var hashCode = chain.GetHashCode(); + var newHashCode = newChain.GetHashCode(); + Assert.Equal(hashCode, newHashCode); + + // Modify second chain + newChain.Item1 = default; + + // Test equality + Assert.NotEqual(chain, newChain); + Assert.False(chain == newChain); + Assert.Equal(hashCode, chain.GetHashCode()); + var newHashCode2 = newChain.GetHashCode(); + Assert.NotEqual(hashCode, newHashCode2); + Assert.NotEqual(newHashCode, newHashCode2); + } } diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IChainable.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IChainable.cs index 03bf0e16ae..1680728d74 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IChainable.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/IChainable.cs @@ -8,5 +8,8 @@ namespace Silk.NET.Vulkan; /// to a pointer to a . public interface IChainable : IStructuredType { + /// + /// Points to the next in this chain, if any; otherwise . + /// unsafe BaseInStructure* PNext { get; set; } } diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.cs index c46b5f41b6..2c000b5c64 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.cs @@ -51,6 +51,21 @@ public override bool Equals(object obj) /// public abstract void Dispose(); + /// + /// Combines a hashcode with the first part of a slice. + /// + /// + /// + /// + protected static void CombineHash(ref int hashCode, ReadOnlySpan slice) => + hashCode = slice.Length switch + { + < 2 => HashCode.Combine(hashCode, slice[0]), + < 4 => HashCode.Combine(hashCode, MemoryMarshal.Cast(slice)[0]), + < 8 => HashCode.Combine(hashCode, MemoryMarshal.Cast(slice)[0]), + _ => HashCode.Combine(hashCode, MemoryMarshal.Cast(slice)[0]) + }; + /// /// Creates a new with 1 items. /// @@ -10347,6 +10362,29 @@ protected override bool MemoryEquals(ManagedChain other) return false; return true; } + + /// + /// HashCodes do not need to be unique, so ww only sample the structure type and the start of each + /// structure's 'payload'. + public override int GetHashCode() + { + var ptr = HeadPtr; + var span = new ReadOnlySpan((void*) ptr, MemorySize); + var start = 0; + var length = HeadSize; + var sliceLength = length - HeaderSize; + var hashCode = 0; + // Hash the structure type + var sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + + // Hash any payload + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + return hashCode; + } + + /// [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -10558,6 +10596,37 @@ protected override bool MemoryEquals(ManagedChain other) return false; return true; } + + /// + /// HashCodes do not need to be unique, so ww only sample the structure type and the start of each + /// structure's 'payload'. + public override int GetHashCode() + { + var ptr = HeadPtr; + var span = new ReadOnlySpan((void*) ptr, MemorySize); + var start = 0; + var length = HeadSize; + var sliceLength = length - HeaderSize; + var hashCode = 0; + // Hash the structure type + var sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + + // Hash any payload + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item1Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + return hashCode; + } + + /// [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -10822,6 +10891,45 @@ protected override bool MemoryEquals(ManagedChain other) return false; return true; } + + /// + /// HashCodes do not need to be unique, so ww only sample the structure type and the start of each + /// structure's 'payload'. + public override int GetHashCode() + { + var ptr = HeadPtr; + var span = new ReadOnlySpan((void*) ptr, MemorySize); + var start = 0; + var length = HeadSize; + var sliceLength = length - HeaderSize; + var hashCode = 0; + // Hash the structure type + var sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + + // Hash any payload + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item1Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item2Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + return hashCode; + } + + /// [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -11139,6 +11247,53 @@ protected override bool MemoryEquals(ManagedChain other) return false; return true; } + + /// + /// HashCodes do not need to be unique, so ww only sample the structure type and the start of each + /// structure's 'payload'. + public override int GetHashCode() + { + var ptr = HeadPtr; + var span = new ReadOnlySpan((void*) ptr, MemorySize); + var start = 0; + var length = HeadSize; + var sliceLength = length - HeaderSize; + var hashCode = 0; + // Hash the structure type + var sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + + // Hash any payload + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item1Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item2Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item3Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + return hashCode; + } + + /// [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -11509,6 +11664,61 @@ protected override bool MemoryEquals(ManagedChain other) return false; return true; } + + /// + /// HashCodes do not need to be unique, so ww only sample the structure type and the start of each + /// structure's 'payload'. + public override int GetHashCode() + { + var ptr = HeadPtr; + var span = new ReadOnlySpan((void*) ptr, MemorySize); + var start = 0; + var length = HeadSize; + var sliceLength = length - HeaderSize; + var hashCode = 0; + // Hash the structure type + var sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + + // Hash any payload + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item1Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item2Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item3Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item4Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + return hashCode; + } + + /// [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -11932,6 +12142,69 @@ protected override bool MemoryEquals(ManagedChain other) return false; return true; } + + /// + /// HashCodes do not need to be unique, so ww only sample the structure type and the start of each + /// structure's 'payload'. + public override int GetHashCode() + { + var ptr = HeadPtr; + var span = new ReadOnlySpan((void*) ptr, MemorySize); + var start = 0; + var length = HeadSize; + var sliceLength = length - HeaderSize; + var hashCode = 0; + // Hash the structure type + var sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + + // Hash any payload + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item1Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item2Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item3Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item4Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item5Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + return hashCode; + } + + /// [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -12408,6 +12681,77 @@ protected override bool MemoryEquals(ManagedChain other) return false; return true; } + + /// + /// HashCodes do not need to be unique, so ww only sample the structure type and the start of each + /// structure's 'payload'. + public override int GetHashCode() + { + var ptr = HeadPtr; + var span = new ReadOnlySpan((void*) ptr, MemorySize); + var start = 0; + var length = HeadSize; + var sliceLength = length - HeaderSize; + var hashCode = 0; + // Hash the structure type + var sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + + // Hash any payload + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item1Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item2Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item3Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item4Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item5Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item6Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + return hashCode; + } + + /// [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -12937,6 +13281,85 @@ protected override bool MemoryEquals(ManagedChain other) return false; return true; } + + /// + /// HashCodes do not need to be unique, so ww only sample the structure type and the start of each + /// structure's 'payload'. + public override int GetHashCode() + { + var ptr = HeadPtr; + var span = new ReadOnlySpan((void*) ptr, MemorySize); + var start = 0; + var length = HeadSize; + var sliceLength = length - HeaderSize; + var hashCode = 0; + // Hash the structure type + var sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + + // Hash any payload + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item1Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item2Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item3Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item4Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item5Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item6Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item7Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + return hashCode; + } + + /// [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -13519,47 +13942,134 @@ protected override bool MemoryEquals(ManagedChain other) return false; return true; } - - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public bool Equals(ManagedChain other) - => !ReferenceEquals(null, other) && (ReferenceEquals(this, other) || MemoryEquals(other)); /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool operator ==(ManagedChain left, ManagedChain right) => - ReferenceEquals(null, left) - ? ReferenceEquals(null, right) - : !ReferenceEquals(null, right) && (ReferenceEquals(left, right) || left.MemoryEquals(right)); + /// HashCodes do not need to be unique, so ww only sample the structure type and the start of each + /// structure's 'payload'. + public override int GetHashCode() + { + var ptr = HeadPtr; + var span = new ReadOnlySpan((void*) ptr, MemorySize); + var start = 0; + var length = HeadSize; + var sliceLength = length - HeaderSize; + var hashCode = 0; + // Hash the structure type + var sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); - /// - [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static bool operator !=(ManagedChain left, ManagedChain right) => - ReferenceEquals(null, left) - ? !ReferenceEquals(null, right) - : ReferenceEquals(null, right) || (!ReferenceEquals(left, right) && !left.MemoryEquals(right)); + // Hash any payload + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); - /// - public override string ToString() - { - StringBuilder sb = new StringBuilder(); - sb.Append("("); - sb.Append((object) Head); sb.Append(", "); - sb.Append((object) Item1); - sb.Append(", "); - sb.Append((object) Item2); - sb.Append(", "); - sb.Append((object) Item3); - sb.Append(", "); - sb.Append((object) Item4); - sb.Append(", "); - sb.Append((object) Item5); - sb.Append(", "); - sb.Append((object) Item6); - sb.Append(", "); - sb.Append((object) Item7); - sb.Append(", "); - sb.Append((object) Item8); + start += length; + length = Item1Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item2Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item3Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item4Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item5Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item6Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item7Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item8Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + return hashCode; + } + + + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public bool Equals(ManagedChain other) + => !ReferenceEquals(null, other) && (ReferenceEquals(this, other) || MemoryEquals(other)); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator ==(ManagedChain left, ManagedChain right) => + ReferenceEquals(null, left) + ? ReferenceEquals(null, right) + : !ReferenceEquals(null, right) && (ReferenceEquals(left, right) || left.MemoryEquals(right)); + + /// + [MethodImpl(MethodImplOptions.AggressiveInlining)] + public static bool operator !=(ManagedChain left, ManagedChain right) => + ReferenceEquals(null, left) + ? !ReferenceEquals(null, right) + : ReferenceEquals(null, right) || (!ReferenceEquals(left, right) && !left.MemoryEquals(right)); + + /// + public override string ToString() + { + StringBuilder sb = new StringBuilder(); + sb.Append("("); + sb.Append((object) Head); sb.Append(", "); + sb.Append((object) Item1); + sb.Append(", "); + sb.Append((object) Item2); + sb.Append(", "); + sb.Append((object) Item3); + sb.Append(", "); + sb.Append((object) Item4); + sb.Append(", "); + sb.Append((object) Item5); + sb.Append(", "); + sb.Append((object) Item6); + sb.Append(", "); + sb.Append((object) Item7); + sb.Append(", "); + sb.Append((object) Item8); sb.Append(")"); return sb.ToString(); } @@ -14154,6 +14664,101 @@ protected override bool MemoryEquals(ManagedChain other) return false; return true; } + + /// + /// HashCodes do not need to be unique, so ww only sample the structure type and the start of each + /// structure's 'payload'. + public override int GetHashCode() + { + var ptr = HeadPtr; + var span = new ReadOnlySpan((void*) ptr, MemorySize); + var start = 0; + var length = HeadSize; + var sliceLength = length - HeaderSize; + var hashCode = 0; + // Hash the structure type + var sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + + // Hash any payload + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item1Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item2Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item3Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item4Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item5Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item6Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item7Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item8Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item9Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + return hashCode; + } + + /// [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -14842,6 +15447,109 @@ protected override bool MemoryEquals(ManagedChain other) return false; return true; } + + /// + /// HashCodes do not need to be unique, so ww only sample the structure type and the start of each + /// structure's 'payload'. + public override int GetHashCode() + { + var ptr = HeadPtr; + var span = new ReadOnlySpan((void*) ptr, MemorySize); + var start = 0; + var length = HeadSize; + var sliceLength = length - HeaderSize; + var hashCode = 0; + // Hash the structure type + var sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + + // Hash any payload + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item1Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item2Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item3Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item4Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item5Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item6Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item7Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item8Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item9Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item10Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + return hashCode; + } + + /// [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -15583,6 +16291,117 @@ protected override bool MemoryEquals(ManagedChain other) return false; return true; } + + /// + /// HashCodes do not need to be unique, so ww only sample the structure type and the start of each + /// structure's 'payload'. + public override int GetHashCode() + { + var ptr = HeadPtr; + var span = new ReadOnlySpan((void*) ptr, MemorySize); + var start = 0; + var length = HeadSize; + var sliceLength = length - HeaderSize; + var hashCode = 0; + // Hash the structure type + var sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + + // Hash any payload + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item1Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item2Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item3Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item4Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item5Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item6Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item7Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item8Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item9Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item10Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item11Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + return hashCode; + } + + /// [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -16377,6 +17196,125 @@ protected override bool MemoryEquals(ManagedChain other) return false; return true; } + + /// + /// HashCodes do not need to be unique, so ww only sample the structure type and the start of each + /// structure's 'payload'. + public override int GetHashCode() + { + var ptr = HeadPtr; + var span = new ReadOnlySpan((void*) ptr, MemorySize); + var start = 0; + var length = HeadSize; + var sliceLength = length - HeaderSize; + var hashCode = 0; + // Hash the structure type + var sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + + // Hash any payload + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item1Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item2Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item3Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item4Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item5Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item6Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item7Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item8Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item9Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item10Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item11Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item12Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + return hashCode; + } + + /// [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -17224,6 +18162,133 @@ protected override bool MemoryEquals(ManagedChain other) return false; return true; } + + /// + /// HashCodes do not need to be unique, so ww only sample the structure type and the start of each + /// structure's 'payload'. + public override int GetHashCode() + { + var ptr = HeadPtr; + var span = new ReadOnlySpan((void*) ptr, MemorySize); + var start = 0; + var length = HeadSize; + var sliceLength = length - HeaderSize; + var hashCode = 0; + // Hash the structure type + var sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + + // Hash any payload + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item1Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item2Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item3Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item4Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item5Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item6Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item7Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item8Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item9Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item10Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item11Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item12Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item13Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + return hashCode; + } + + /// [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -18124,6 +19189,141 @@ protected override bool MemoryEquals(ManagedChain other) return false; return true; } + + /// + /// HashCodes do not need to be unique, so ww only sample the structure type and the start of each + /// structure's 'payload'. + public override int GetHashCode() + { + var ptr = HeadPtr; + var span = new ReadOnlySpan((void*) ptr, MemorySize); + var start = 0; + var length = HeadSize; + var sliceLength = length - HeaderSize; + var hashCode = 0; + // Hash the structure type + var sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + + // Hash any payload + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item1Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item2Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item3Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item4Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item5Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item6Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item7Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item8Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item9Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item10Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item11Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item12Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item13Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item14Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + return hashCode; + } + + /// [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -19077,6 +20277,149 @@ protected override bool MemoryEquals(ManagedChain other) return false; return true; } + + /// + /// HashCodes do not need to be unique, so ww only sample the structure type and the start of each + /// structure's 'payload'. + public override int GetHashCode() + { + var ptr = HeadPtr; + var span = new ReadOnlySpan((void*) ptr, MemorySize); + var start = 0; + var length = HeadSize; + var sliceLength = length - HeaderSize; + var hashCode = 0; + // Hash the structure type + var sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + + // Hash any payload + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item1Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item2Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item3Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item4Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item5Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item6Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item7Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item8Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item9Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item10Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item11Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item12Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item13Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item14Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + + start += length; + length = Item15Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); + return hashCode; + } + + /// [MethodImpl(MethodImplOptions.AggressiveInlining)] diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.tt b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.tt index 9e6777b740..b973d45cf8 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.tt +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.tt @@ -163,6 +163,21 @@ public abstract unsafe class ManagedChain : IReadOnlyList, IDisposab /// public abstract void Dispose(); + /// + /// Combines a hashcode with the first part of a slice. + /// + /// + /// + /// + protected static void CombineHash(ref int hashCode, ReadOnlySpan slice) => + hashCode = slice.Length switch + { + < 2 => HashCode.Combine(hashCode, slice[0]), + < 4 => HashCode.Combine(hashCode, MemoryMarshal.Cast(slice)[0]), + < 8 => HashCode.Combine(hashCode, MemoryMarshal.Cast(slice)[0]), + _ => HashCode.Combine(hashCode, MemoryMarshal.Cast(slice)[0]) + }; + <# for (var i = 1; i <= maximumItems; i++) { @@ -782,6 +797,44 @@ public unsafe sealed class ManagedChain<<#= tList #>> : ManagedChain, IEquatable #> return true; } + + /// + /// HashCodes do not need to be unique, so ww only sample the structure type and the start of each + /// structure's 'payload'. + public override int GetHashCode() + { + var ptr = HeadPtr; + var span = new ReadOnlySpan((void*) ptr, MemorySize); + var start = 0; + var length = HeadSize; + var sliceLength = length - HeaderSize; + var hashCode = 0; + // Hash the structure type + var sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + + // Hash any payload + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); +<# + for (var j = 1; j < i; j++) + { +#> + + start += length; + length = Item<#=j#>Size; + sliceLength = length - HeaderSize; + sTYpe = (ptr + start)->SType; + hashCode = HashCode.Combine(hashCode, sTYpe); + if (sliceLength >= 0) + CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); +<# + } // for (int j = 1; j < i; j++) { +#> + return hashCode; + } + + /// [MethodImpl(MethodImplOptions.AggressiveInlining)] From 930a2fc2690c39a06b862afb0484e6489fb87874 Mon Sep 17 00:00:00 2001 From: Craig Dean Date: Mon, 15 Nov 2021 13:45:32 +0000 Subject: [PATCH 41/42] fix: Fixed GetHashCode Fixed broken pointer arithmetic. Also changed to hash entire structure for better separation. --- ...n Struct Chaining - #3 Managed Chaining.md | 21 +- .../ManagedChain.gen.cs | 426 ++++++++---------- .../ManagedChain.gen.tt | 53 ++- 3 files changed, 231 insertions(+), 269 deletions(-) diff --git a/documentation/proposals/Proposal - Vulkan Struct Chaining - #3 Managed Chaining.md b/documentation/proposals/Proposal - Vulkan Struct Chaining - #3 Managed Chaining.md index abb1f84939..d055b133ee 100644 --- a/documentation/proposals/Proposal - Vulkan Struct Chaining - #3 Managed Chaining.md +++ b/documentation/proposals/Proposal - Vulkan Struct Chaining - #3 Managed Chaining.md @@ -49,7 +49,7 @@ errors. Structures can be replaced at any time, and will be inserted efficiently safety. - The managed chains implement `IEquatable`, allowing two chains with identical content to be efficiently compared ( ignoring the `PNext` pointers, but already being confident the `SType` and ordering is correct). They also implement - the equality operator overloads, and `GetHashCode`. + the equality operator overloads, and `GetHashCode`. Open questions: @@ -66,9 +66,8 @@ Open questions: found in the unmanaged chain, no matter at what position they are found. This is not entirely unreasonable as the order of chains (after the start) is not fixed in Vulkan, and it will allow importing existing chains where the order doesn't matter. -- `GetHasCode` only includes the `SType` and, at most, the first 8 bytes of the payload, for speed. This is because a - HashCode only needs to generate reasonable separation, but does not need to be unique. It is possible, to hash the - entire memory block if desired, though at slightly worse performance. +- `GetHasCode` current hashes the entire struct's data, except the `PNext` fields. However, a hashcode only needs to + create reasonable separation so a 'sampling' method could be used for increased performance. - Similar to `Append` and `Truncate` we could also add `Insert` and `Remove` methods, though slightly more complex, as we'd have to generate multiples of each, it is not difficult to do, for example: @@ -339,7 +338,7 @@ Assert.IsType(structures[2]); ### Equality (IEquatable<T>) ll the fully generic `ManageChain` types implement the corresponding `IEquatable>` -interface, and equality operators. As well as `GetHashCode`. +interface, and equality operators. As well as `GetHashCode`. ### Deconstruction @@ -731,18 +730,15 @@ public unsafe sealed class ManagedChain : ManagedChain, IEquatable - /// HashCodes do not need to be unique, so ww only sample the structure type and the start of each - /// structure's 'payload'. public override int GetHashCode() { - var ptr = HeadPtr; - var span = new ReadOnlySpan((void*) ptr, MemorySize); + var span = new ReadOnlySpan((void*)_headPtr, MemorySize); var start = 0; var length = HeadSize; var sliceLength = length - HeaderSize; var hashCode = 0; // Hash the structure type - var sTYpe = (ptr + start)->SType; + var sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); // Hash any payload @@ -752,14 +748,12 @@ public unsafe sealed class ManagedChain : ManagedChain, IEquatableSType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); return hashCode; } - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] @@ -823,6 +817,7 @@ public unsafe sealed class ManagedChain : ManagedChain, IEquatable diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.cs index 2c000b5c64..f7dc2b43b7 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.cs +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.cs @@ -52,19 +52,45 @@ public override bool Equals(object obj) public abstract void Dispose(); /// - /// Combines a hashcode with the first part of a slice. + /// Combines a hashcode with the contents of a slice. /// /// /// /// - protected static void CombineHash(ref int hashCode, ReadOnlySpan slice) => - hashCode = slice.Length switch + protected static void CombineHash(ref int hashCode, ReadOnlySpan slice) + { + if (slice.Length >= 8) { - < 2 => HashCode.Combine(hashCode, slice[0]), - < 4 => HashCode.Combine(hashCode, MemoryMarshal.Cast(slice)[0]), - < 8 => HashCode.Combine(hashCode, MemoryMarshal.Cast(slice)[0]), - _ => HashCode.Combine(hashCode, MemoryMarshal.Cast(slice)[0]) - }; + // Process slice in 8 byte chunks + var s8 = MemoryMarshal.Cast(slice); + foreach (var l in s8) + { + hashCode = HashCode.Combine(hashCode, l); + } + + slice = slice.Slice(s8.Length*8); + } + + // Process remainder of slice + if (slice.Length >= 4) + { + var s4 = MemoryMarshal.Cast(slice); + hashCode = HashCode.Combine(hashCode, s4[0]); + slice = slice.Slice(s4.Length*4); + } + + if (slice.Length >= 2) + { + var s2 = MemoryMarshal.Cast(slice); + hashCode = HashCode.Combine(hashCode, s2[0]); + slice = slice.Slice(s2.Length*2); + } + + if (slice.Length > 0) + { + hashCode = HashCode.Combine(hashCode, slice[0]); + } + } /// /// Creates a new with 1 items. @@ -10364,18 +10390,15 @@ protected override bool MemoryEquals(ManagedChain other) } /// - /// HashCodes do not need to be unique, so ww only sample the structure type and the start of each - /// structure's 'payload'. public override int GetHashCode() { - var ptr = HeadPtr; - var span = new ReadOnlySpan((void*) ptr, MemorySize); + var span = new ReadOnlySpan((void*)_headPtr, MemorySize); var start = 0; var length = HeadSize; var sliceLength = length - HeaderSize; var hashCode = 0; // Hash the structure type - var sTYpe = (ptr + start)->SType; + var sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); // Hash any payload @@ -10384,8 +10407,6 @@ public override int GetHashCode() return hashCode; } - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Equals(ManagedChain other) @@ -10598,18 +10619,15 @@ protected override bool MemoryEquals(ManagedChain other) } /// - /// HashCodes do not need to be unique, so ww only sample the structure type and the start of each - /// structure's 'payload'. public override int GetHashCode() { - var ptr = HeadPtr; - var span = new ReadOnlySpan((void*) ptr, MemorySize); + var span = new ReadOnlySpan((void*)_headPtr, MemorySize); var start = 0; var length = HeadSize; var sliceLength = length - HeaderSize; var hashCode = 0; // Hash the structure type - var sTYpe = (ptr + start)->SType; + var sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); // Hash any payload @@ -10619,15 +10637,13 @@ public override int GetHashCode() start += length; length = Item1Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); return hashCode; } - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Equals(ManagedChain other) @@ -10893,18 +10909,15 @@ protected override bool MemoryEquals(ManagedChain other) } /// - /// HashCodes do not need to be unique, so ww only sample the structure type and the start of each - /// structure's 'payload'. public override int GetHashCode() { - var ptr = HeadPtr; - var span = new ReadOnlySpan((void*) ptr, MemorySize); + var span = new ReadOnlySpan((void*)_headPtr, MemorySize); var start = 0; var length = HeadSize; var sliceLength = length - HeaderSize; var hashCode = 0; // Hash the structure type - var sTYpe = (ptr + start)->SType; + var sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); // Hash any payload @@ -10914,7 +10927,7 @@ public override int GetHashCode() start += length; length = Item1Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -10922,15 +10935,13 @@ public override int GetHashCode() start += length; length = Item2Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); return hashCode; } - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Equals(ManagedChain other) @@ -11249,18 +11260,15 @@ protected override bool MemoryEquals(ManagedChain other) } /// - /// HashCodes do not need to be unique, so ww only sample the structure type and the start of each - /// structure's 'payload'. public override int GetHashCode() { - var ptr = HeadPtr; - var span = new ReadOnlySpan((void*) ptr, MemorySize); + var span = new ReadOnlySpan((void*)_headPtr, MemorySize); var start = 0; var length = HeadSize; var sliceLength = length - HeaderSize; var hashCode = 0; // Hash the structure type - var sTYpe = (ptr + start)->SType; + var sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); // Hash any payload @@ -11270,7 +11278,7 @@ public override int GetHashCode() start += length; length = Item1Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -11278,7 +11286,7 @@ public override int GetHashCode() start += length; length = Item2Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -11286,15 +11294,13 @@ public override int GetHashCode() start += length; length = Item3Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); return hashCode; } - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Equals(ManagedChain other) @@ -11666,18 +11672,15 @@ protected override bool MemoryEquals(ManagedChain other) } /// - /// HashCodes do not need to be unique, so ww only sample the structure type and the start of each - /// structure's 'payload'. public override int GetHashCode() { - var ptr = HeadPtr; - var span = new ReadOnlySpan((void*) ptr, MemorySize); + var span = new ReadOnlySpan((void*)_headPtr, MemorySize); var start = 0; var length = HeadSize; var sliceLength = length - HeaderSize; var hashCode = 0; // Hash the structure type - var sTYpe = (ptr + start)->SType; + var sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); // Hash any payload @@ -11687,7 +11690,7 @@ public override int GetHashCode() start += length; length = Item1Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -11695,7 +11698,7 @@ public override int GetHashCode() start += length; length = Item2Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -11703,7 +11706,7 @@ public override int GetHashCode() start += length; length = Item3Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -11711,15 +11714,13 @@ public override int GetHashCode() start += length; length = Item4Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); return hashCode; } - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Equals(ManagedChain other) @@ -12144,18 +12145,15 @@ protected override bool MemoryEquals(ManagedChain other) } /// - /// HashCodes do not need to be unique, so ww only sample the structure type and the start of each - /// structure's 'payload'. public override int GetHashCode() { - var ptr = HeadPtr; - var span = new ReadOnlySpan((void*) ptr, MemorySize); + var span = new ReadOnlySpan((void*)_headPtr, MemorySize); var start = 0; var length = HeadSize; var sliceLength = length - HeaderSize; var hashCode = 0; // Hash the structure type - var sTYpe = (ptr + start)->SType; + var sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); // Hash any payload @@ -12165,7 +12163,7 @@ public override int GetHashCode() start += length; length = Item1Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -12173,7 +12171,7 @@ public override int GetHashCode() start += length; length = Item2Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -12181,7 +12179,7 @@ public override int GetHashCode() start += length; length = Item3Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -12189,7 +12187,7 @@ public override int GetHashCode() start += length; length = Item4Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -12197,15 +12195,13 @@ public override int GetHashCode() start += length; length = Item5Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); return hashCode; } - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Equals(ManagedChain other) @@ -12683,18 +12679,15 @@ protected override bool MemoryEquals(ManagedChain other) } /// - /// HashCodes do not need to be unique, so ww only sample the structure type and the start of each - /// structure's 'payload'. public override int GetHashCode() { - var ptr = HeadPtr; - var span = new ReadOnlySpan((void*) ptr, MemorySize); + var span = new ReadOnlySpan((void*)_headPtr, MemorySize); var start = 0; var length = HeadSize; var sliceLength = length - HeaderSize; var hashCode = 0; // Hash the structure type - var sTYpe = (ptr + start)->SType; + var sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); // Hash any payload @@ -12704,7 +12697,7 @@ public override int GetHashCode() start += length; length = Item1Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -12712,7 +12705,7 @@ public override int GetHashCode() start += length; length = Item2Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -12720,7 +12713,7 @@ public override int GetHashCode() start += length; length = Item3Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -12728,7 +12721,7 @@ public override int GetHashCode() start += length; length = Item4Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -12736,7 +12729,7 @@ public override int GetHashCode() start += length; length = Item5Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -12744,15 +12737,13 @@ public override int GetHashCode() start += length; length = Item6Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); return hashCode; } - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Equals(ManagedChain other) @@ -13283,18 +13274,15 @@ protected override bool MemoryEquals(ManagedChain other) } /// - /// HashCodes do not need to be unique, so ww only sample the structure type and the start of each - /// structure's 'payload'. public override int GetHashCode() { - var ptr = HeadPtr; - var span = new ReadOnlySpan((void*) ptr, MemorySize); + var span = new ReadOnlySpan((void*)_headPtr, MemorySize); var start = 0; var length = HeadSize; var sliceLength = length - HeaderSize; var hashCode = 0; // Hash the structure type - var sTYpe = (ptr + start)->SType; + var sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); // Hash any payload @@ -13304,7 +13292,7 @@ public override int GetHashCode() start += length; length = Item1Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -13312,7 +13300,7 @@ public override int GetHashCode() start += length; length = Item2Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -13320,7 +13308,7 @@ public override int GetHashCode() start += length; length = Item3Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -13328,7 +13316,7 @@ public override int GetHashCode() start += length; length = Item4Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -13336,7 +13324,7 @@ public override int GetHashCode() start += length; length = Item5Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -13344,7 +13332,7 @@ public override int GetHashCode() start += length; length = Item6Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -13352,15 +13340,13 @@ public override int GetHashCode() start += length; length = Item7Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); return hashCode; } - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Equals(ManagedChain other) @@ -13944,18 +13930,15 @@ protected override bool MemoryEquals(ManagedChain other) } /// - /// HashCodes do not need to be unique, so ww only sample the structure type and the start of each - /// structure's 'payload'. public override int GetHashCode() { - var ptr = HeadPtr; - var span = new ReadOnlySpan((void*) ptr, MemorySize); + var span = new ReadOnlySpan((void*)_headPtr, MemorySize); var start = 0; var length = HeadSize; var sliceLength = length - HeaderSize; var hashCode = 0; // Hash the structure type - var sTYpe = (ptr + start)->SType; + var sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); // Hash any payload @@ -13965,7 +13948,7 @@ public override int GetHashCode() start += length; length = Item1Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -13973,7 +13956,7 @@ public override int GetHashCode() start += length; length = Item2Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -13981,7 +13964,7 @@ public override int GetHashCode() start += length; length = Item3Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -13989,7 +13972,7 @@ public override int GetHashCode() start += length; length = Item4Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -13997,7 +13980,7 @@ public override int GetHashCode() start += length; length = Item5Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -14005,7 +13988,7 @@ public override int GetHashCode() start += length; length = Item6Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -14013,7 +13996,7 @@ public override int GetHashCode() start += length; length = Item7Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -14021,15 +14004,13 @@ public override int GetHashCode() start += length; length = Item8Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); return hashCode; } - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Equals(ManagedChain other) @@ -14666,18 +14647,15 @@ protected override bool MemoryEquals(ManagedChain other) } /// - /// HashCodes do not need to be unique, so ww only sample the structure type and the start of each - /// structure's 'payload'. public override int GetHashCode() { - var ptr = HeadPtr; - var span = new ReadOnlySpan((void*) ptr, MemorySize); + var span = new ReadOnlySpan((void*)_headPtr, MemorySize); var start = 0; var length = HeadSize; var sliceLength = length - HeaderSize; var hashCode = 0; // Hash the structure type - var sTYpe = (ptr + start)->SType; + var sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); // Hash any payload @@ -14687,7 +14665,7 @@ public override int GetHashCode() start += length; length = Item1Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -14695,7 +14673,7 @@ public override int GetHashCode() start += length; length = Item2Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -14703,7 +14681,7 @@ public override int GetHashCode() start += length; length = Item3Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -14711,7 +14689,7 @@ public override int GetHashCode() start += length; length = Item4Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -14719,7 +14697,7 @@ public override int GetHashCode() start += length; length = Item5Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -14727,7 +14705,7 @@ public override int GetHashCode() start += length; length = Item6Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -14735,7 +14713,7 @@ public override int GetHashCode() start += length; length = Item7Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -14743,7 +14721,7 @@ public override int GetHashCode() start += length; length = Item8Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -14751,15 +14729,13 @@ public override int GetHashCode() start += length; length = Item9Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); return hashCode; } - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Equals(ManagedChain other) @@ -15449,18 +15425,15 @@ protected override bool MemoryEquals(ManagedChain other) } /// - /// HashCodes do not need to be unique, so ww only sample the structure type and the start of each - /// structure's 'payload'. public override int GetHashCode() { - var ptr = HeadPtr; - var span = new ReadOnlySpan((void*) ptr, MemorySize); + var span = new ReadOnlySpan((void*)_headPtr, MemorySize); var start = 0; var length = HeadSize; var sliceLength = length - HeaderSize; var hashCode = 0; // Hash the structure type - var sTYpe = (ptr + start)->SType; + var sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); // Hash any payload @@ -15470,7 +15443,7 @@ public override int GetHashCode() start += length; length = Item1Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -15478,7 +15451,7 @@ public override int GetHashCode() start += length; length = Item2Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -15486,7 +15459,7 @@ public override int GetHashCode() start += length; length = Item3Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -15494,7 +15467,7 @@ public override int GetHashCode() start += length; length = Item4Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -15502,7 +15475,7 @@ public override int GetHashCode() start += length; length = Item5Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -15510,7 +15483,7 @@ public override int GetHashCode() start += length; length = Item6Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -15518,7 +15491,7 @@ public override int GetHashCode() start += length; length = Item7Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -15526,7 +15499,7 @@ public override int GetHashCode() start += length; length = Item8Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -15534,7 +15507,7 @@ public override int GetHashCode() start += length; length = Item9Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -15542,15 +15515,13 @@ public override int GetHashCode() start += length; length = Item10Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); return hashCode; } - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Equals(ManagedChain other) @@ -16293,18 +16264,15 @@ protected override bool MemoryEquals(ManagedChain other) } /// - /// HashCodes do not need to be unique, so ww only sample the structure type and the start of each - /// structure's 'payload'. public override int GetHashCode() { - var ptr = HeadPtr; - var span = new ReadOnlySpan((void*) ptr, MemorySize); + var span = new ReadOnlySpan((void*)_headPtr, MemorySize); var start = 0; var length = HeadSize; var sliceLength = length - HeaderSize; var hashCode = 0; // Hash the structure type - var sTYpe = (ptr + start)->SType; + var sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); // Hash any payload @@ -16314,7 +16282,7 @@ public override int GetHashCode() start += length; length = Item1Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -16322,7 +16290,7 @@ public override int GetHashCode() start += length; length = Item2Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -16330,7 +16298,7 @@ public override int GetHashCode() start += length; length = Item3Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -16338,7 +16306,7 @@ public override int GetHashCode() start += length; length = Item4Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -16346,7 +16314,7 @@ public override int GetHashCode() start += length; length = Item5Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -16354,7 +16322,7 @@ public override int GetHashCode() start += length; length = Item6Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -16362,7 +16330,7 @@ public override int GetHashCode() start += length; length = Item7Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -16370,7 +16338,7 @@ public override int GetHashCode() start += length; length = Item8Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -16378,7 +16346,7 @@ public override int GetHashCode() start += length; length = Item9Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -16386,7 +16354,7 @@ public override int GetHashCode() start += length; length = Item10Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -16394,15 +16362,13 @@ public override int GetHashCode() start += length; length = Item11Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); return hashCode; } - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Equals(ManagedChain other) @@ -17198,18 +17164,15 @@ protected override bool MemoryEquals(ManagedChain other) } /// - /// HashCodes do not need to be unique, so ww only sample the structure type and the start of each - /// structure's 'payload'. public override int GetHashCode() { - var ptr = HeadPtr; - var span = new ReadOnlySpan((void*) ptr, MemorySize); + var span = new ReadOnlySpan((void*)_headPtr, MemorySize); var start = 0; var length = HeadSize; var sliceLength = length - HeaderSize; var hashCode = 0; // Hash the structure type - var sTYpe = (ptr + start)->SType; + var sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); // Hash any payload @@ -17219,7 +17182,7 @@ public override int GetHashCode() start += length; length = Item1Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -17227,7 +17190,7 @@ public override int GetHashCode() start += length; length = Item2Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -17235,7 +17198,7 @@ public override int GetHashCode() start += length; length = Item3Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -17243,7 +17206,7 @@ public override int GetHashCode() start += length; length = Item4Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -17251,7 +17214,7 @@ public override int GetHashCode() start += length; length = Item5Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -17259,7 +17222,7 @@ public override int GetHashCode() start += length; length = Item6Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -17267,7 +17230,7 @@ public override int GetHashCode() start += length; length = Item7Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -17275,7 +17238,7 @@ public override int GetHashCode() start += length; length = Item8Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -17283,7 +17246,7 @@ public override int GetHashCode() start += length; length = Item9Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -17291,7 +17254,7 @@ public override int GetHashCode() start += length; length = Item10Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -17299,7 +17262,7 @@ public override int GetHashCode() start += length; length = Item11Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -17307,15 +17270,13 @@ public override int GetHashCode() start += length; length = Item12Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); return hashCode; } - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Equals(ManagedChain other) @@ -18164,18 +18125,15 @@ protected override bool MemoryEquals(ManagedChain other) } /// - /// HashCodes do not need to be unique, so ww only sample the structure type and the start of each - /// structure's 'payload'. public override int GetHashCode() { - var ptr = HeadPtr; - var span = new ReadOnlySpan((void*) ptr, MemorySize); + var span = new ReadOnlySpan((void*)_headPtr, MemorySize); var start = 0; var length = HeadSize; var sliceLength = length - HeaderSize; var hashCode = 0; // Hash the structure type - var sTYpe = (ptr + start)->SType; + var sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); // Hash any payload @@ -18185,7 +18143,7 @@ public override int GetHashCode() start += length; length = Item1Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -18193,7 +18151,7 @@ public override int GetHashCode() start += length; length = Item2Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -18201,7 +18159,7 @@ public override int GetHashCode() start += length; length = Item3Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -18209,7 +18167,7 @@ public override int GetHashCode() start += length; length = Item4Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -18217,7 +18175,7 @@ public override int GetHashCode() start += length; length = Item5Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -18225,7 +18183,7 @@ public override int GetHashCode() start += length; length = Item6Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -18233,7 +18191,7 @@ public override int GetHashCode() start += length; length = Item7Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -18241,7 +18199,7 @@ public override int GetHashCode() start += length; length = Item8Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -18249,7 +18207,7 @@ public override int GetHashCode() start += length; length = Item9Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -18257,7 +18215,7 @@ public override int GetHashCode() start += length; length = Item10Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -18265,7 +18223,7 @@ public override int GetHashCode() start += length; length = Item11Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -18273,7 +18231,7 @@ public override int GetHashCode() start += length; length = Item12Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -18281,15 +18239,13 @@ public override int GetHashCode() start += length; length = Item13Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); return hashCode; } - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Equals(ManagedChain other) @@ -19191,18 +19147,15 @@ protected override bool MemoryEquals(ManagedChain other) } /// - /// HashCodes do not need to be unique, so ww only sample the structure type and the start of each - /// structure's 'payload'. public override int GetHashCode() { - var ptr = HeadPtr; - var span = new ReadOnlySpan((void*) ptr, MemorySize); + var span = new ReadOnlySpan((void*)_headPtr, MemorySize); var start = 0; var length = HeadSize; var sliceLength = length - HeaderSize; var hashCode = 0; // Hash the structure type - var sTYpe = (ptr + start)->SType; + var sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); // Hash any payload @@ -19212,7 +19165,7 @@ public override int GetHashCode() start += length; length = Item1Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -19220,7 +19173,7 @@ public override int GetHashCode() start += length; length = Item2Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -19228,7 +19181,7 @@ public override int GetHashCode() start += length; length = Item3Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -19236,7 +19189,7 @@ public override int GetHashCode() start += length; length = Item4Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -19244,7 +19197,7 @@ public override int GetHashCode() start += length; length = Item5Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -19252,7 +19205,7 @@ public override int GetHashCode() start += length; length = Item6Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -19260,7 +19213,7 @@ public override int GetHashCode() start += length; length = Item7Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -19268,7 +19221,7 @@ public override int GetHashCode() start += length; length = Item8Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -19276,7 +19229,7 @@ public override int GetHashCode() start += length; length = Item9Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -19284,7 +19237,7 @@ public override int GetHashCode() start += length; length = Item10Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -19292,7 +19245,7 @@ public override int GetHashCode() start += length; length = Item11Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -19300,7 +19253,7 @@ public override int GetHashCode() start += length; length = Item12Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -19308,7 +19261,7 @@ public override int GetHashCode() start += length; length = Item13Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -19316,15 +19269,13 @@ public override int GetHashCode() start += length; length = Item14Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); return hashCode; } - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Equals(ManagedChain other) @@ -20279,18 +20230,15 @@ protected override bool MemoryEquals(ManagedChain other) } /// - /// HashCodes do not need to be unique, so ww only sample the structure type and the start of each - /// structure's 'payload'. public override int GetHashCode() { - var ptr = HeadPtr; - var span = new ReadOnlySpan((void*) ptr, MemorySize); + var span = new ReadOnlySpan((void*)_headPtr, MemorySize); var start = 0; var length = HeadSize; var sliceLength = length - HeaderSize; var hashCode = 0; // Hash the structure type - var sTYpe = (ptr + start)->SType; + var sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); // Hash any payload @@ -20300,7 +20248,7 @@ public override int GetHashCode() start += length; length = Item1Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -20308,7 +20256,7 @@ public override int GetHashCode() start += length; length = Item2Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -20316,7 +20264,7 @@ public override int GetHashCode() start += length; length = Item3Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -20324,7 +20272,7 @@ public override int GetHashCode() start += length; length = Item4Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -20332,7 +20280,7 @@ public override int GetHashCode() start += length; length = Item5Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -20340,7 +20288,7 @@ public override int GetHashCode() start += length; length = Item6Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -20348,7 +20296,7 @@ public override int GetHashCode() start += length; length = Item7Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -20356,7 +20304,7 @@ public override int GetHashCode() start += length; length = Item8Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -20364,7 +20312,7 @@ public override int GetHashCode() start += length; length = Item9Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -20372,7 +20320,7 @@ public override int GetHashCode() start += length; length = Item10Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -20380,7 +20328,7 @@ public override int GetHashCode() start += length; length = Item11Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -20388,7 +20336,7 @@ public override int GetHashCode() start += length; length = Item12Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -20396,7 +20344,7 @@ public override int GetHashCode() start += length; length = Item13Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -20404,7 +20352,7 @@ public override int GetHashCode() start += length; length = Item14Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -20412,15 +20360,13 @@ public override int GetHashCode() start += length; length = Item15Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); return hashCode; } - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Equals(ManagedChain other) diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.tt b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.tt index b973d45cf8..2b24298029 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.tt +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.tt @@ -164,19 +164,45 @@ public abstract unsafe class ManagedChain : IReadOnlyList, IDisposab public abstract void Dispose(); /// - /// Combines a hashcode with the first part of a slice. + /// Combines a hashcode with the contents of a slice. /// /// /// /// - protected static void CombineHash(ref int hashCode, ReadOnlySpan slice) => - hashCode = slice.Length switch + protected static void CombineHash(ref int hashCode, ReadOnlySpan slice) + { + if (slice.Length >= 8) { - < 2 => HashCode.Combine(hashCode, slice[0]), - < 4 => HashCode.Combine(hashCode, MemoryMarshal.Cast(slice)[0]), - < 8 => HashCode.Combine(hashCode, MemoryMarshal.Cast(slice)[0]), - _ => HashCode.Combine(hashCode, MemoryMarshal.Cast(slice)[0]) - }; + // Process slice in 8 byte chunks + var s8 = MemoryMarshal.Cast(slice); + foreach (var l in s8) + { + hashCode = HashCode.Combine(hashCode, l); + } + + slice = slice.Slice(s8.Length*8); + } + + // Process remainder of slice + if (slice.Length >= 4) + { + var s4 = MemoryMarshal.Cast(slice); + hashCode = HashCode.Combine(hashCode, s4[0]); + slice = slice.Slice(s4.Length*4); + } + + if (slice.Length >= 2) + { + var s2 = MemoryMarshal.Cast(slice); + hashCode = HashCode.Combine(hashCode, s2[0]); + slice = slice.Slice(s2.Length*2); + } + + if (slice.Length > 0) + { + hashCode = HashCode.Combine(hashCode, slice[0]); + } + } <# for (var i = 1; i <= maximumItems; i++) @@ -799,18 +825,15 @@ public unsafe sealed class ManagedChain<<#= tList #>> : ManagedChain, IEquatable } /// - /// HashCodes do not need to be unique, so ww only sample the structure type and the start of each - /// structure's 'payload'. public override int GetHashCode() { - var ptr = HeadPtr; - var span = new ReadOnlySpan((void*) ptr, MemorySize); + var span = new ReadOnlySpan((void*)_headPtr, MemorySize); var start = 0; var length = HeadSize; var sliceLength = length - HeaderSize; var hashCode = 0; // Hash the structure type - var sTYpe = (ptr + start)->SType; + var sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); // Hash any payload @@ -824,7 +847,7 @@ public unsafe sealed class ManagedChain<<#= tList #>> : ManagedChain, IEquatable start += length; length = Item<#=j#>Size; sliceLength = length - HeaderSize; - sTYpe = (ptr + start)->SType; + sTYpe = ((BaseInStructure*) (_headPtr + start))->SType; hashCode = HashCode.Combine(hashCode, sTYpe); if (sliceLength >= 0) CombineHash(ref hashCode, span.Slice(start + HeaderSize, sliceLength)); @@ -834,8 +857,6 @@ public unsafe sealed class ManagedChain<<#= tList #>> : ManagedChain, IEquatable return hashCode; } - - /// [MethodImpl(MethodImplOptions.AggressiveInlining)] public bool Equals(ManagedChain<<#=tList#>> other) From 8a2eb80b7c1ccc96c893a51eb741ef3d334856ed Mon Sep 17 00:00:00 2001 From: Craig Dean Date: Mon, 15 Nov 2021 13:56:24 +0000 Subject: [PATCH 42/42] feat: Moved ManagedChain.gen.tt to Silk.NET.Vulkan --- .../PrototypeStructChaining/Buffer.cs | 12 ------------ .../PrototypeStructChaining.csproj | 15 --------------- .../Silk.NET.Vulkan}/ManagedChain.gen.cs | 5 ++++- .../Silk.NET.Vulkan}/ManagedChain.gen.tt | 5 ++++- src/Vulkan/Silk.NET.Vulkan/Silk.NET.Vulkan.csproj | 15 +++++++++++++++ 5 files changed, 23 insertions(+), 29 deletions(-) delete mode 100644 src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/Buffer.cs rename src/{Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining => Vulkan/Silk.NET.Vulkan}/ManagedChain.gen.cs (99%) rename src/{Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining => Vulkan/Silk.NET.Vulkan}/ManagedChain.gen.tt (99%) diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/Buffer.cs b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/Buffer.cs deleted file mode 100644 index 37044ff381..0000000000 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/Buffer.cs +++ /dev/null @@ -1,12 +0,0 @@ -// Licensed to the .NET Foundation under one or more agreements. -// The .NET Foundation licenses this file to you under the MIT license. - -namespace Silk.NET.Vulkan; - -/// -/// PlaceHolder - to ensure disambiguation works. -/// -[Obsolete("This class is here to indicate the the real Silk.NET.Vulkan contains a `Buffer` class.")] -public class Buffer -{ -} diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PrototypeStructChaining.csproj b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PrototypeStructChaining.csproj index 764a0a4469..b5f170722a 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PrototypeStructChaining.csproj +++ b/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/PrototypeStructChaining.csproj @@ -18,23 +18,8 @@ - - - TextTemplatingFileGenerator - ManagedChain.gen.cs - - - - - - True - True - ManagedChain.gen.tt - - - diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.cs b/src/Vulkan/Silk.NET.Vulkan/ManagedChain.gen.cs similarity index 99% rename from src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.cs rename to src/Vulkan/Silk.NET.Vulkan/ManagedChain.gen.cs index f7dc2b43b7..147681fdba 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.cs +++ b/src/Vulkan/Silk.NET.Vulkan/ManagedChain.gen.cs @@ -1,9 +1,12 @@ // ReSharper disable StaticMemberInGenericType -#pragma warning disable CS0659, CS0660, CS0661 +#pragma warning disable CS0659, CS0660 +using System; using System.Collections; +using System.Collections.Generic; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Text; +using System.Threading; namespace Silk.NET.Vulkan; diff --git a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.tt b/src/Vulkan/Silk.NET.Vulkan/ManagedChain.gen.tt similarity index 99% rename from src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.tt rename to src/Vulkan/Silk.NET.Vulkan/ManagedChain.gen.tt index 2b24298029..59477e4e7c 100644 --- a/src/Lab/Experiments/PrototypeStructChaining/PrototypeStructChaining/ManagedChain.gen.tt +++ b/src/Vulkan/Silk.NET.Vulkan/ManagedChain.gen.tt @@ -111,11 +111,14 @@ } #> // ReSharper disable StaticMemberInGenericType -#pragma warning disable CS0659, CS0660, CS0661 +#pragma warning disable CS0659, CS0660 +using System; using System.Collections; +using System.Collections.Generic; using System.Runtime.CompilerServices; using System.Runtime.InteropServices; using System.Text; +using System.Threading; namespace Silk.NET.Vulkan; diff --git a/src/Vulkan/Silk.NET.Vulkan/Silk.NET.Vulkan.csproj b/src/Vulkan/Silk.NET.Vulkan/Silk.NET.Vulkan.csproj index 9825eaefd3..00f8ca3283 100644 --- a/src/Vulkan/Silk.NET.Vulkan/Silk.NET.Vulkan.csproj +++ b/src/Vulkan/Silk.NET.Vulkan/Silk.NET.Vulkan.csproj @@ -9,5 +9,20 @@ + + + TextTemplatingFileGenerator + ManagedChain.gen.cs + + + + + + True + True + ManagedChain.gen.tt + + +