57 lines
1.5 KiB
C#
57 lines
1.5 KiB
C#
using System;
|
|
using ln.types.collections;
|
|
namespace ln.types.odb.ng
|
|
{
|
|
public class IdentityCache
|
|
{
|
|
WeakKeyReferenceDictionary<object, Guid> reverseCache = new WeakKeyReferenceDictionary<object, Guid>();
|
|
WeakValueDictionary<Guid, object> forwardCache = new WeakValueDictionary<Guid, object>();
|
|
|
|
public IdentityCache()
|
|
{
|
|
}
|
|
|
|
public bool TryGetValue(Guid identity,out object o)
|
|
{
|
|
lock (this)
|
|
{
|
|
return forwardCache.TryGetValue(identity, out o);
|
|
}
|
|
}
|
|
|
|
public bool TryGetValue(Guid identity, out object o, Func<object> instantiator)
|
|
{
|
|
lock (this)
|
|
{
|
|
if (!TryGetValue(identity, out o))
|
|
{
|
|
o = instantiator();
|
|
forwardCache.Add(identity, o);
|
|
reverseCache.Add(o, identity);
|
|
}
|
|
return false;
|
|
}
|
|
}
|
|
|
|
public bool TryGetIdentity(object o,out Guid identity)
|
|
{
|
|
lock (this)
|
|
{
|
|
return reverseCache.TryGetValue(o, out identity);
|
|
}
|
|
}
|
|
|
|
public void Ensure(Guid identity,object o)
|
|
{
|
|
lock (this)
|
|
{
|
|
if (!forwardCache.ContainsKey(identity))
|
|
forwardCache.Add(identity, o);
|
|
if (!reverseCache.ContainsKey(o))
|
|
reverseCache.Add(o, identity);
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|