// 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); } /************************************************************************************************************************/ } }