IGraphCloner
IGraphCloner is interface for cloners that are aware of cyclic object graphs.
/// <summary>Clones object with cyclic object graph references.</summary>
public interface IGraphCloner
{
/// <summary>Thread local for context while visiting non-graph cloners.</summary>
static ThreadLocal<IGraphClonerContext?> context = new();
/// <summary>Thread local for context while visiting non-graph cloners.</summary>
public static ThreadLocal<IGraphClonerContext?> Context => context;
/// <summary>Can value be cyclic</summary>
bool IsCyclical { get; }
/// <summary>Clone <paramref name="src"/></summary>
/// <param name="src"></param>
/// <param name="context">Object graph reference mapping.</param>
object Clone(object src, IGraphClonerContext context);
}
IGraphCloner<T> uses strong type generics.
/// <summary>Clones object with cyclic object graph references.</summary>
public interface IGraphCloner<T>
{
/// <summary>Can value be cyclic</summary>
bool IsCyclical { get; }
/// <summary>Clone <paramref name="src"/></summary>
/// <param name="src"></param>
/// <param name="context">Object graph reference mapping.</param>
T Clone(in T src, IGraphClonerContext context);
}
IGraphClonerContext
IGraphClonerContext is interface for contextes that track hashed objects.
/// <summary>Graph cloner context</summary>
public interface IGraphClonerContext
{
/// <summary>Associate <paramref name="clone"/> as clone of <paramref name="src"/>.</summary>
/// <returns>true if was added, false if has already been added.</returns>
bool Add<T>(in T src, in T clone);
/// <summary>Test whether <paramref name="src"/> has been marked cloned.</summary>
/// <returns>true if <paramref name="src"/> is cloned</returns>
bool Contains<T>(in T src);
/// <summary>Get cloned counterpart of <paramref name="src"/>.</summary>
/// <returns>true if <paramref name="clone"/> existed.</returns>
bool TryGet<T>(in T src, out T clone);
}
GraphClonerContext is the default implementation for IGraphClonerContext.
IGraphClonerContext graphClonerContext = new GraphClonerContext();
Full Example
Full example
using Avalanche.Utilities;
class graphcloner
{
public static void Run()
{
{
// <00>
IGraphClonerContext graphClonerContext = new GraphClonerContext();
// </00>
}
}
}