godot/modules/mono/glue/GodotSharp/GodotSharp/Core/NodePath.cs
Ignacio Roldán Etcheverry 50b603c7dc C#: Begin move to .NET Core
We're targeting .NET 5 for now to make development easier while
.NET 6 is not yet released.

TEMPORARY REGRESSIONS
---------------------

Assembly unloading is not implemented yet. As such, many Godot
resources are leaked at exit. This will be re-implemented later
together with assembly hot-reloading.
2021-09-22 08:27:12 +02:00

109 lines
3.2 KiB
C#

using System;
using System.Runtime.CompilerServices;
using Godot.NativeInterop;
namespace Godot
{
public sealed class NodePath : IDisposable
{
public godot_node_path NativeValue;
~NodePath()
{
Dispose(false);
}
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
public void Dispose(bool disposing)
{
// Always dispose `NativeValue` even if disposing is true
NativeValue.Dispose();
}
private NodePath(godot_node_path nativeValueToOwn)
{
NativeValue = nativeValueToOwn;
}
// Explicit name to make it very clear
internal static NodePath CreateTakingOwnershipOfDisposableValue(godot_node_path nativeValueToOwn)
=> new NodePath(nativeValueToOwn);
public NodePath()
{
}
public NodePath(string path)
{
if (!string.IsNullOrEmpty(path))
NativeValue = NativeFuncs.godotsharp_node_path_new_from_string(path);
}
public static implicit operator NodePath(string from) => new NodePath(from);
public static implicit operator string(NodePath from) => from.ToString();
public override unsafe string ToString()
{
if (IsEmpty)
return string.Empty;
godot_string dest;
godot_node_path src = NativeValue;
NativeFuncs.godotsharp_node_path_as_string(&dest, &src);
using (dest)
return Marshaling.mono_string_from_godot(dest);
}
public NodePath GetAsPropertyPath()
{
godot_node_path propertyPath = default;
NativeFuncs.godotsharp_node_path_get_as_property_path(ref NativeValue, ref propertyPath);
return CreateTakingOwnershipOfDisposableValue(propertyPath);
}
public unsafe string GetConcatenatedSubNames()
{
using godot_string subNames = default;
NativeFuncs.godotsharp_node_path_get_concatenated_subnames(ref NativeValue, &subNames);
return Marshaling.mono_string_from_godot(subNames);
}
public unsafe string GetName(int idx)
{
using godot_string name = default;
NativeFuncs.godotsharp_node_path_get_name(ref NativeValue, idx, &name);
return Marshaling.mono_string_from_godot(name);
}
public int GetNameCount()
{
return NativeFuncs.godotsharp_node_path_get_name_count(ref NativeValue);
}
public unsafe string GetSubName(int idx)
{
using godot_string subName = default;
NativeFuncs.godotsharp_node_path_get_subname(ref NativeValue, idx, &subName);
return Marshaling.mono_string_from_godot(subName);
}
public int GetSubNameCount()
{
return NativeFuncs.godotsharp_node_path_get_subname_count(ref NativeValue);
}
public bool IsAbsolute()
{
return NativeFuncs.godotsharp_node_path_is_absolute(ref NativeValue).ToBool();
}
public bool IsEmpty => godot_node_path.IsEmpty(in NativeValue);
}
}