using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
namespace Urho
{
///
///
internal class RefCountedCache
{
Dictionary> knownObjects = new Dictionary>(256); //based on samples (average)
public int Count => knownObjects.Count;
public void Add(RefCounted refCounted)
{
lock (knownObjects)
{
ReferenceHolder knownObject;
if (knownObjects.TryGetValue(refCounted.Handle, out knownObject))
{
knownObject?.Reference?.Dispose();
}
knownObjects[refCounted.Handle] = new ReferenceHolder(refCounted, weak: refCounted.Refs() < 1);
}
}
public bool Remove(IntPtr ptr)
{
lock (knownObjects)
{
return knownObjects.Remove(ptr);
}
}
public ReferenceHolder Get(IntPtr ptr)
{
lock (knownObjects)
{
ReferenceHolder refCounted;
knownObjects.TryGetValue(ptr, out refCounted);
return refCounted;
}
}
public void Clean()
{
lock (knownObjects)
{
foreach (var referenceHolder in knownObjects.ToArray())
{
try
{
referenceHolder.Value?.Reference?.Dispose();
}
catch (Exception exc)
{
Debug.WriteLine(exc);
}
}
knownObjects.Clear();
}
}
}
}