IdentityInterner
Interner makes sure there is only one reference of each hash-equally same identity.
IdentityInterner is implementation to IProvider<IIdentity, IIdentity>.
// Create internalizer
IProvider<IIdentity, IIdentity> interner = new IdentityInterner();
Interner can be constructed with custom comparer.
// Create internalizer
IProvider<IIdentity, IIdentity> interner = new IdentityInterner(IdentityComparer.CaseInsensitive);
Interner returns equal and read-only version of the identity, caches it.
// Create identity
IIdentity noninterned = IdentityAccessors.Default.TypeName.Create(typeof(string));
// Internalize
IIdentity interned = interner.Intern(noninterned);
When another identity of equal content is interned, the original cached reference is returned.
// Create assembly qualified type name
string typename = typeof(string).AssemblyQualifiedName;
// Parse
IIdentity noninterned2 = IdentityAccessors.Default.TypeName.MemoryAccessors.Parse(typename.AsMemory());
// Internalize
IIdentity interned2 = interner.Intern(noninterned2);
They are same reference, including the nodes from parent to root.
// Test for reference equality: 'True'
WriteLine(object.ReferenceEquals(interned, interned2));
// 'True'
WriteLine(object.ReferenceEquals(interned.Parent, interned2.Parent));
// 'True'
WriteLine(object.ReferenceEquals(interned.Parent.Parent, interned2.Parent.Parent));
Extension method .InternWith() decorates IIdentityAccessor to apply interner on results.
// Create internalizer
IProvider<IIdentity, IIdentity> interner = new IdentityInterner();
// Create identity accessor
IIdentityAccessor<Type> identityAccessor = IdentityAccessors.Default.TypeNameWithoutAssembly;
// Decorate accessor
identityAccessor = identityAccessor.InternWith(interner);
// Create identity
IIdentity id1 = identityAccessor.Create(typeof(string));
// Create identity
IIdentity id2 = identityAccessor.Create(typeof(string));
// Create identity
IIdentity id3 = identityAccessor.MemoryAccessors.Parse("System.String");
// Compare reference: True
Console.WriteLine(object.ReferenceEquals(id1, id2));
Console.WriteLine(object.ReferenceEquals(id1, id3));
Full Example
Full example
using System;
using Avalanche.Accessor;
using Avalanche.Identity;
using Avalanche.Serialization;
using Avalanche.Utilities;
using Avalanche.Utilities.Provider;
using static System.Console;
class identityinterner
{
public static void Run()
{
{
// <01>
// Create internalizer
IProvider<IIdentity, IIdentity> interner = new IdentityInterner();
// </01>
// <02>
// Create identity
IIdentity noninterned = IdentityAccessors.Default.TypeName.Create(typeof(string));
// Internalize
IIdentity interned = interner.Intern(noninterned);
// </02>
// <03>
// Create assembly qualified type name
string typename = typeof(string).AssemblyQualifiedName;
// Parse
IIdentity noninterned2 = IdentityAccessors.Default.TypeName.MemoryAccessors.Parse(typename.AsMemory());
// Internalize
IIdentity interned2 = interner.Intern(noninterned2);
// </03>
// <04>
// Test for reference equality: 'True'
WriteLine(object.ReferenceEquals(interned, interned2));
// 'True'
WriteLine(object.ReferenceEquals(interned.Parent, interned2.Parent));
// 'True'
WriteLine(object.ReferenceEquals(interned.Parent.Parent, interned2.Parent.Parent));
// </04>
}
{
// <01B>
// Create internalizer
IProvider<IIdentity, IIdentity> interner = new IdentityInterner(IdentityComparer.CaseInsensitive);
// </01B>
}
{
// <10>
// Create internalizer
IProvider<IIdentity, IIdentity> interner = new IdentityInterner();
// Create identity accessor
IIdentityAccessor<Type> identityAccessor = IdentityAccessors.Default.TypeNameWithoutAssembly;
// Decorate accessor
identityAccessor = identityAccessor.InternWith(interner);
// Create identity
IIdentity id1 = identityAccessor.Create(typeof(string));
// Create identity
IIdentity id2 = identityAccessor.Create(typeof(string));
// Create identity
IIdentity id3 = identityAccessor.MemoryAccessors.Parse("System.String");
// Compare reference: True
Console.WriteLine(object.ReferenceEquals(id1, id2));
Console.WriteLine(object.ReferenceEquals(id1, id3));
// </10>
}
}
}