Skip to content

Instantly share code, notes, and snippets.

@arturaz
Created October 18, 2021 10:16
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save arturaz/45ab71fdce9158d57b1566aafd9e6486 to your computer and use it in GitHub Desktop.
Save arturaz/45ab71fdce9158d57b1566aafd9e6486 to your computer and use it in GitHub Desktop.
Proposal/example for Quantum union generation
// ReSharper disable all
using System;
namespace Quantum
{
public partial struct AbilityTargetData
{
public static AbilityTargetData newCharacter(EntityRefCharacter _character)
{
var data = default(AbilityTargetData);
data._field_used_ = CHARACTER;
data._character = _character;
return data;
}
public static AbilityTargetData newMob(EntityRefMob _mob)
{
var data = default(AbilityTargetData);
data._field_used_ = MOB;
data._mob = _mob;
return data;
}
public enum Discriminator : int
{
Character = AbilityTargetData.CHARACTER,
Mob = AbilityTargetData.MOB,
}
public Discriminator discriminator => (Discriminator)_field_used_;
}
}
/*
union AbilityTargetData {
EntityRefCharacter character;
EntityRefMob mob;
}
*/
[QuantumUnion(
fieldTypes = new []{typeof(EntityRefCharacter), typeof(EntityRefMob)},
fields = new []{nameof(_character), nameof(_mob)}
)]
public partial struct AbilityTargetData {}
/*
union TurretTypeData {
TurretIndex staticData;
TurretTypeDynamicData dynamicData;
}
*/
[QuantumUnion(
fieldTypes = new[] { typeof(TurretIndex), typeof(TurretTypeDynamicData) },
fields = new[] { nameof(_staticData), nameof(_dynamicData) },
discriminators = new []{ "Static", "Dynamic" }
)]
public partial struct TurretTypeData {}
[AttributeMacro(@"
{{
# Build the discriminators array
mapped_discriminators = []
if discriminators
for discriminator in discriminators
qtn_discriminator = fields[for.index] | string.slice 1 | string.upcase
obj = {name: discriminator, qtn: qtn_discriminator}
mapped_discriminators = mapped_discriminators | array.add obj
end
else
for field in fields
discriminator = field | string.slice 1 | pascal_case
qtn_discriminator = discriminator | string.upcase
obj = {name: discriminator, qtn: qtn_discriminator}
mapped_discriminators = mapped_discriminators | array.add obj
end
end
}}
{{ for fieldType in fieldTypes }}
{{
field = fields[for.index]
discriminator = mapped_discriminators[for.index]
}}
public static {{type.short_name}} new{{discriminator.name}}({{fieldType.short_name}} {{field}}) {
var data = default({{type.short_name}});
data._field_used_ = {{mapped_discriminators[for.index].qtn}};
data.{{field}} = {{field}};
return data;
}
{{ end }}
public enum Discriminator : int {
{{ for discriminator in mapped_discriminators }}
{{discriminator.name}} = {{type.short_name}}.{{discriminator.qtn}},
{{ end }}
}
public Discriminator discriminator => (Discriminator) _field_used_;
")]
public class QuantumUnionAttribute : Attribute {
/// <summary>Types of union fields. Must have same length as <see cref="fields"/>.</summary>
[UsedImplicitly] public Type[] fieldTypes;
/// <summary>Names of union fields. Must have same length as <see cref="fieldTypes"/>.</summary>
[UsedImplicitly] public string[] fields;
/// <summary>
/// Names of discriminators. Can be empty, then they will be computed out of <see cref="fields"/>.
///
/// If specified, must have same length as <see cref="fieldTypes"/>.
/// </summary>
[UsedImplicitly] public string[] discriminators;
}
namespace Quantum
{
public partial struct TurretTypeData
{
public static TurretTypeData newStatic(TurretIndex _staticData)
{
var data = default(TurretTypeData);
data._field_used_ = STATICDATA;
data._staticData = _staticData;
return data;
}
public static TurretTypeData newDynamic(TurretTypeDynamicData _dynamicData)
{
var data = default(TurretTypeData);
data._field_used_ = DYNAMICDATA;
data._dynamicData = _dynamicData;
return data;
}
public enum Discriminator : int
{
Static = TurretTypeData.STATICDATA,
Dynamic = TurretTypeData.DYNAMICDATA,
}
public Discriminator discriminator => (Discriminator)_field_used_;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment