using System;
using UnityAtoms.BaseAtoms;
<%IF TYPE_HAS_NAMESPACE%>
using {TYPE_NAMESPACE};
<%ENDIF%>
<%IF HAS_SUB_UA_NAMESPACE%>
namespace UnityAtoms.{SUB_UA_NAMESPACE}
<%ELSE%>
namespace UnityAtoms
<%ENDIF%>
{
<%IF EQUATABLE%>
///
/// Reference of type `{VALUE_TYPE}`. Inherits from `EquatableAtomReference<{VALUE_TYPE}, {VALUE_TYPE_NAME}Pair, {VALUE_TYPE_NAME}Constant, {VALUE_TYPE_NAME}Variable, {VALUE_TYPE_NAME}Event, {VALUE_TYPE_NAME}PairEvent, {VALUE_TYPE_NAME}{VALUE_TYPE_NAME}Function, {VALUE_TYPE_NAME}VariableInstancer, AtomCollection, AtomList>`.
///
[Serializable]
public sealed class {VALUE_TYPE_NAME}Reference : EquatableAtomReference<
{VALUE_TYPE},
{VALUE_TYPE_NAME}Pair,
{VALUE_TYPE_NAME}Constant,
{VALUE_TYPE_NAME}Variable,
{VALUE_TYPE_NAME}Event,
{VALUE_TYPE_NAME}PairEvent,
{VALUE_TYPE_NAME}{VALUE_TYPE_NAME}Function,
{VALUE_TYPE_NAME}VariableInstancer>, IEquatable<{VALUE_TYPE_NAME}Reference>
{
public {VALUE_TYPE_NAME}Reference() : base() { }
public {VALUE_TYPE_NAME}Reference({VALUE_TYPE} value) : base(value) { }
public bool Equals({VALUE_TYPE_NAME}Reference other) { return base.Equals(other); }
<%IF TYPE_IS_COLOR%>
///
/// Set Alpha of Color by value.
///
/// New alpha value.
public void SetAlpha(float value) => Value = new Color(Value.r, Value.g, Value.b, value);
///
/// Set Alpha of Color by Variable value.
///
/// New alpha Variable value.
public void SetAlpha(AtomBaseVariable variable) => SetAlpha(variable.Value);
<%ENDIF%>
}
<%ELSE%>
///
/// Reference of type `{VALUE_TYPE}`. Inherits from `AtomReference<{VALUE_TYPE}, {VALUE_TYPE_NAME}Pair, {VALUE_TYPE_NAME}Constant, {VALUE_TYPE_NAME}Variable, {VALUE_TYPE_NAME}Event, {VALUE_TYPE_NAME}PairEvent, {VALUE_TYPE_NAME}{VALUE_TYPE_NAME}Function, {VALUE_TYPE_NAME}VariableInstancer, AtomCollection, AtomList>`.
///
[Serializable]
public sealed class {VALUE_TYPE_NAME}Reference : AtomReference<
{VALUE_TYPE},
{VALUE_TYPE_NAME}Pair,
{VALUE_TYPE_NAME}Constant,
{VALUE_TYPE_NAME}Variable,
{VALUE_TYPE_NAME}Event,
{VALUE_TYPE_NAME}PairEvent,
{VALUE_TYPE_NAME}{VALUE_TYPE_NAME}Function,
{VALUE_TYPE_NAME}VariableInstancer>, IEquatable<{VALUE_TYPE_NAME}Reference>
{
public {VALUE_TYPE_NAME}Reference() : base() { }
public {VALUE_TYPE_NAME}Reference({VALUE_TYPE} value) : base(value) { }
public bool Equals({VALUE_TYPE_NAME}Reference other) { return base.Equals(other); }
protected override bool ValueEquals({VALUE_TYPE} other)
{
<%IF TYPE_IS_GAMEOBJECT|TYPE_IS_COLLIDER|TYPE_IS_COLLIDER2D|TYPE_IS_COLLISION|TYPE_IS_COLLISION2D%>
return Value == other;
<%ELSE%>
throw new NotImplementedException();
<%ENDIF%>
}
}
<%ENDIF%>
}