// Animancer // https://kybernetik.com.au/animancer // Copyright 2018-2024 Kybernetik //
using System;
namespace Animancer
{
/// An object that can be copied.
/// https://kybernetik.com.au/animancer/api/Animancer/ICopyable_1
public interface ICopyable
{
/************************************************************************************************************************/
/// Copies the contents of `copyFrom` into this object, replacing its previous contents.
void CopyFrom(T copyFrom, CloneContext context);
/************************************************************************************************************************/
}
/// Extension methods for .
/// https://kybernetik.com.au/animancer/api/Animancer/CopyableExtensions
public static partial class CopyableExtensions
{
/************************************************************************************************************************/
///
/// Calls
/// using a from the .
///
public static void CopyFrom(this T copyTo, T copyFrom)
where T : ICopyable
{
var context = CloneContext.Pool.Instance.Acquire();
copyTo.CopyFrom(copyFrom, context);
CloneContext.Pool.Instance.Release(context);
}
/************************************************************************************************************************/
///
/// Creates a new and calls .
///
public static T CopyableClone(this T original, CloneContext context)
where T : ICopyable
{
if (original == null)
return default;
var clone = (T)Activator.CreateInstance(original.GetType());
clone.CopyFrom(original, context);
return clone;
}
///
/// Creates a new and calls
/// using a from the .
///
public static T CopyableClone(this T original)
where T : ICopyable
{
var context = CloneContext.Pool.Instance.Acquire();
var clone = original.CopyableClone(context);
CloneContext.Pool.Instance.Release(context);
return clone;
}
/************************************************************************************************************************/
/// Calls using the appropriate type.
public static void CopyFromBase(this TChild copyTo, TBase copyFrom, CloneContext context)
where TChild : ICopyable, ICopyable
where TBase : ICopyable
{
if (copyFrom is TChild copyFromChild)
copyTo.CopyFrom(copyFromChild, context);
else
copyTo.CopyFrom(copyFrom, context);
}
/************************************************************************************************************************/
}
}