using System; using System.Collections.Generic; using UnityEngine; namespace UnityEditor.ShaderGraph.Serialization { [Serializable] struct JsonRef : 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(); m_Id = m_Value.objectId; } else { m_Value = null; m_Id = null; } } catch (Exception e) { Debug.LogException(e); } } } public static implicit operator T(JsonRef jsonRef) { return jsonRef.m_Value; } public static implicit operator JsonRef(T value) { return new JsonRef { m_Value = value, m_Id = value?.objectId }; } public bool Equals(JsonRef other) { return EqualityComparer.Default.Equals(m_Value, other.m_Value); } public bool Equals(T other) { return EqualityComparer.Default.Equals(m_Value, other); } public override bool Equals(object obj) { return obj is JsonRef other && Equals(other) || obj is T otherValue && Equals(otherValue); } public override int GetHashCode() { return EqualityComparer.Default.GetHashCode(m_Value); } public static bool operator ==(JsonRef left, JsonRef right) { return left.value == right.value; } public static bool operator !=(JsonRef left, JsonRef right) { return left.value != right.value; } public static bool operator ==(JsonRef left, T right) { return left.value == right; } public static bool operator !=(JsonRef left, T right) { return left.value != right; } public static bool operator ==(T left, JsonRef right) { return left == right.value; } public static bool operator !=(T left, JsonRef right) { return left != right.value; } } }