C#: Remove ConvertVariantToManagedObject

Its two usages were:

- The Array `ICollection.CopyTo` implementation.
  It's possible that this class shouldn't be implementing the
  non-generic `ICollection`, but this commit doesn't change that.
  The new implementation stores the elements as boxed `Variant` values.
- The `Variant.Obj` property.
  I'm not sure if this property's existence is justified, but for now
  I rewrote it as a simpler version of `ConvertVariantToManagedObject`.
This commit is contained in:
Ignacio Roldán Etcheverry 2022-11-28 18:17:02 +01:00
parent bcc061edae
commit 3afeb28560
3 changed files with 49 additions and 116 deletions

View File

@ -418,8 +418,8 @@ namespace Godot.Collections
{
for (int i = 0; i < count; i++)
{
object obj = Marshaling.ConvertVariantToManagedObject(NativeValue.DangerousSelfRef.Elements[i]);
array.SetValue(obj, index);
object boxedVariant = Variant.CreateCopyingBorrowed(NativeValue.DangerousSelfRef.Elements[i]);
array.SetValue(boxedVariant, index);
index++;
}
}

View File

@ -584,111 +584,6 @@ namespace Godot.NativeInterop
return false;
}
public static unsafe object? ConvertVariantToManagedObject(in godot_variant p_var)
{
switch (p_var.Type)
{
case Variant.Type.Bool:
return p_var.Bool.ToBool();
case Variant.Type.Int:
return p_var.Int;
case Variant.Type.Float:
{
#if REAL_T_IS_DOUBLE
return p_var.Float;
#else
return (float)p_var.Float;
#endif
}
case Variant.Type.String:
return ConvertStringToManaged(p_var.String);
case Variant.Type.Vector2:
return p_var.Vector2;
case Variant.Type.Vector2i:
return p_var.Vector2i;
case Variant.Type.Rect2:
return p_var.Rect2;
case Variant.Type.Rect2i:
return p_var.Rect2i;
case Variant.Type.Vector3:
return p_var.Vector3;
case Variant.Type.Vector3i:
return p_var.Vector3i;
case Variant.Type.Transform2d:
return *p_var.Transform2D;
case Variant.Type.Vector4:
return p_var.Vector4;
case Variant.Type.Vector4i:
return p_var.Vector4i;
case Variant.Type.Plane:
return p_var.Plane;
case Variant.Type.Quaternion:
return p_var.Quaternion;
case Variant.Type.Aabb:
return *p_var.AABB;
case Variant.Type.Basis:
return *p_var.Basis;
case Variant.Type.Transform3d:
return *p_var.Transform3D;
case Variant.Type.Projection:
return *p_var.Projection;
case Variant.Type.Color:
return p_var.Color;
case Variant.Type.StringName:
{
// The Variant owns the value, so we need to make a copy
return StringName.CreateTakingOwnershipOfDisposableValue(
NativeFuncs.godotsharp_string_name_new_copy(p_var.StringName));
}
case Variant.Type.NodePath:
{
// The Variant owns the value, so we need to make a copy
return NodePath.CreateTakingOwnershipOfDisposableValue(
NativeFuncs.godotsharp_node_path_new_copy(p_var.NodePath));
}
case Variant.Type.Rid:
return p_var.RID;
case Variant.Type.Object:
return InteropUtils.UnmanagedGetManaged(p_var.Object);
case Variant.Type.Callable:
return ConvertCallableToManaged(p_var.Callable);
case Variant.Type.Signal:
return ConvertSignalToManaged(p_var.Signal);
case Variant.Type.Dictionary:
{
// The Variant owns the value, so we need to make a copy
return Collections.Dictionary.CreateTakingOwnershipOfDisposableValue(
NativeFuncs.godotsharp_dictionary_new_copy(p_var.Dictionary));
}
case Variant.Type.Array:
{
// The Variant owns the value, so we need to make a copy
return Collections.Array.CreateTakingOwnershipOfDisposableValue(
NativeFuncs.godotsharp_array_new_copy(p_var.Array));
}
case Variant.Type.PackedByteArray:
return VariantUtils.ConvertAsPackedByteArrayToSystemArray(p_var);
case Variant.Type.PackedInt32Array:
return VariantUtils.ConvertAsPackedInt32ArrayToSystemArray(p_var);
case Variant.Type.PackedInt64Array:
return VariantUtils.ConvertAsPackedInt64ArrayToSystemArray(p_var);
case Variant.Type.PackedFloat32Array:
return VariantUtils.ConvertAsPackedFloat32ArrayToSystemArray(p_var);
case Variant.Type.PackedFloat64Array:
return VariantUtils.ConvertAsPackedFloat64ArrayToSystemArray(p_var);
case Variant.Type.PackedStringArray:
return VariantUtils.ConvertAsPackedStringArrayToSystemArray(p_var);
case Variant.Type.PackedVector2Array:
return VariantUtils.ConvertAsPackedVector2ArrayToSystemArray(p_var);
case Variant.Type.PackedVector3Array:
return VariantUtils.ConvertAsPackedVector3ArrayToSystemArray(p_var);
case Variant.Type.PackedColorArray:
return VariantUtils.ConvertAsPackedColorArrayToSystemArray(p_var);
default:
return null;
}
}
// String
public static unsafe godot_string ConvertStringToNative(string? p_mono_string)

View File

@ -109,16 +109,54 @@ public partial struct Variant : IDisposable
public override string ToString() => AsString();
public object? Obj
{
get
public object? Obj =>
_obj ??= NativeVar.DangerousSelfRef.Type switch
{
if (_obj == null)
_obj = Marshaling.ConvertVariantToManagedObject((godot_variant)NativeVar);
return _obj;
}
}
Type.Bool => AsBool(),
Type.Int => AsInt64(),
#if REAL_T_IS_DOUBLE
Type.Float => AsDouble(),
#else
Type.Float => AsSingle(),
#endif
Type.String => AsString(),
Type.Vector2 => AsVector2(),
Type.Vector2i => AsVector2i(),
Type.Rect2 => AsRect2(),
Type.Rect2i => AsRect2i(),
Type.Vector3 => AsVector3(),
Type.Vector3i => AsVector3i(),
Type.Transform2d => AsTransform2D(),
Type.Vector4 => AsVector4(),
Type.Vector4i => AsVector4i(),
Type.Plane => AsPlane(),
Type.Quaternion => AsQuaternion(),
Type.Aabb => AsAABB(),
Type.Basis => AsBasis(),
Type.Transform3d => AsTransform3D(),
Type.Projection => AsProjection(),
Type.Color => AsColor(),
Type.StringName => AsStringName(),
Type.NodePath => AsNodePath(),
Type.Rid => AsRID(),
Type.Object => AsGodotObject(),
Type.Callable => AsCallable(),
Type.Signal => AsSignalInfo(),
Type.Dictionary => AsGodotDictionary(),
Type.Array => AsGodotArray(),
Type.PackedByteArray => AsByteArray(),
Type.PackedInt32Array => AsInt32Array(),
Type.PackedInt64Array => AsInt64Array(),
Type.PackedFloat32Array => AsFloat32Array(),
Type.PackedFloat64Array => AsFloat64Array(),
Type.PackedStringArray => AsStringArray(),
Type.PackedVector2Array => AsVector2Array(),
Type.PackedVector3Array => AsVector3Array(),
Type.PackedColorArray => AsColorArray(),
Type.Nil => null,
Type.Max or _ =>
throw new InvalidOperationException($"Invalid Variant type: {NativeVar.DangerousSelfRef.Type}"),
};
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static Variant From<[MustBeVariant] T>(in T from) =>