UnityGame/Library/PackageCache/com.unity.shadergraph/Editor/Serialization/JsonRef.cs
2024-10-27 10:53:47 +03:00

108 lines
2.7 KiB
C#

using System;
using System.Collections.Generic;
using UnityEngine;
namespace UnityEditor.ShaderGraph.Serialization
{
[Serializable]
struct JsonRef<T> : ISerializationCallbackReceiver
where T : JsonObject
{
[NonSerialized]
T m_Value;
[SerializeField]
string m_Id;
public T value => m_Value;
public void OnBeforeSerialize()
{
}
public void OnAfterDeserialize()
{
if (MultiJsonInternal.isDeserializing)
{
try
{
if (MultiJsonInternal.valueMap.TryGetValue(m_Id, out var value))
{
m_Value = value.CastTo<T>();
m_Id = m_Value.objectId;
}
else
{
m_Value = null;
m_Id = null;
}
}
catch (Exception e)
{
Debug.LogException(e);
}
}
}
public static implicit operator T(JsonRef<T> jsonRef)
{
return jsonRef.m_Value;
}
public static implicit operator JsonRef<T>(T value)
{
return new JsonRef<T> { m_Value = value, m_Id = value?.objectId };
}
public bool Equals(JsonRef<T> other)
{
return EqualityComparer<T>.Default.Equals(m_Value, other.m_Value);
}
public bool Equals(T other)
{
return EqualityComparer<T>.Default.Equals(m_Value, other);
}
public override bool Equals(object obj)
{
return obj is JsonRef<T> other && Equals(other) || obj is T otherValue && Equals(otherValue);
}
public override int GetHashCode()
{
return EqualityComparer<T>.Default.GetHashCode(m_Value);
}
public static bool operator ==(JsonRef<T> left, JsonRef<T> right)
{
return left.value == right.value;
}
public static bool operator !=(JsonRef<T> left, JsonRef<T> right)
{
return left.value != right.value;
}
public static bool operator ==(JsonRef<T> left, T right)
{
return left.value == right;
}
public static bool operator !=(JsonRef<T> left, T right)
{
return left.value != right;
}
public static bool operator ==(T left, JsonRef<T> right)
{
return left == right.value;
}
public static bool operator !=(T left, JsonRef<T> right)
{
return left != right.value;
}
}
}