Initial sync
This commit is contained in:
64
Nbt/Tag/NbtValue.cs
Executable file
64
Nbt/Tag/NbtValue.cs
Executable file
@@ -0,0 +1,64 @@
|
||||
namespace Nbt.Tag;
|
||||
|
||||
public interface INbtValue : INbtTag
|
||||
{
|
||||
object Value { get; set; }
|
||||
}
|
||||
|
||||
public interface INbtValue<T> : INbtValue where T : notnull
|
||||
{
|
||||
new T Value { get; set; }
|
||||
}
|
||||
|
||||
public abstract class NbtValue<T> : INbtValue<T> where T : notnull
|
||||
{
|
||||
private static readonly EqualityComparer<T> ValueComparer = EqualityComparer<T>.Default;
|
||||
|
||||
protected T value;
|
||||
|
||||
internal protected NbtValue(T value) : base() => this.value = value;
|
||||
|
||||
public abstract NbtTagType Type { get; }
|
||||
|
||||
INbtTag INbtTag.this[string tagName] { get => throw new NotSupportedException(); set => throw new NotSupportedException(); }
|
||||
|
||||
INbtTag INbtTag.this[int tagIndex] { get => throw new NotSupportedException(); set => throw new NotSupportedException(); }
|
||||
|
||||
INbtTag INbtTag.this[INbtPathElement tagPath] { get => throw new NotSupportedException(); set => throw new NotSupportedException(); }
|
||||
|
||||
INbtList INbtTag.AsList() => throw new NotSupportedException();
|
||||
|
||||
INbtCompound INbtTag.AsCompound() => throw new NotSupportedException();
|
||||
|
||||
INbtValue INbtTag.AsValue() => this;
|
||||
|
||||
INbtValue<U> INbtTag.AsValue<U>() => (INbtValue<U>)this;
|
||||
|
||||
INbtArray INbtTag.AsArray() => (INbtArray)this;
|
||||
|
||||
INbtArray<U> INbtTag.AsArray<U>() => (INbtArray<U>)this;
|
||||
|
||||
INbtTag INbtTag.Copy() => Copy();
|
||||
public NbtValue<T> Copy() => NewInstance(CopyValue());
|
||||
|
||||
object INbtValue.Value
|
||||
{
|
||||
get => Value;
|
||||
set => Value = (T)Convert.ChangeType(value, typeof(T));
|
||||
}
|
||||
|
||||
public T Value
|
||||
{
|
||||
get => value;
|
||||
set => this.value = value ?? throw new ArgumentNullException(nameof(value));
|
||||
}
|
||||
|
||||
protected virtual T CopyValue() => value;
|
||||
protected abstract NbtValue<T> NewInstance(T value);
|
||||
|
||||
public bool Equals(INbtTag? other) => ReferenceEquals(other, this) || other is NbtValue<T> o && ValueComparer.Equals(value, o.value);
|
||||
|
||||
public override bool Equals(object? obj) => ReferenceEquals(obj, this) || obj is NbtValue<T> other && ValueComparer.Equals(value, other.value);
|
||||
|
||||
public override int GetHashCode() => value.GetHashCode();
|
||||
}
|
||||
Reference in New Issue
Block a user