2D-Platformer/Assets/Scripts/Util/Optional.cs
2022-02-12 12:53:50 +02:00

98 lines
No EOL
1.4 KiB
C#

using DefaultNamespace;
using System;
namespace Assets.Scripts.Util
{
[Serializable]
public struct Optional<T> where T : struct
{
private bool1 hasValue;
internal T value;
public Optional(T value)
{
this.value = value;
hasValue = true;
}
public Optional(T? value)
{
hasValue = value.HasValue;
this.value = hasValue ? value.Value : default;
}
public bool HasValue => hasValue;
public T Value
{
get
{
if (!hasValue)
{
throw new InvalidOperationException("No Value");
}
return value;
}
}
public T GetValueOrDefault()
{
return value;
}
public T GetValueOrDefault(T defaultValue)
{
if (!hasValue)
{
return defaultValue;
}
return value;
}
public override bool Equals(object other)
{
if (!hasValue)
{
return other == null;
}
if (other == null)
{
return false;
}
return value.Equals(other);
}
public override int GetHashCode()
{
if (!hasValue)
{
return 0;
}
return value.GetHashCode();
}
public override string ToString()
{
if (!hasValue)
{
return "";
}
return value.ToString();
}
public static implicit operator Optional<T>(T? value)
{
return new Optional<T>(value);
}
public static implicit operator Optional<T>(T value)
{
return new Optional<T>(value);
}
public static explicit operator T(Optional<T> value)
{
return value.Value;
}
}
}