Files
Xune/UIX.RenderApi.Skia/Microsoft/Iris/Render/Protocol/ObjectCache.cs
T
2021-07-11 23:07:04 -05:00

81 lines
2.6 KiB
C#

// Decompiled with JetBrains decompiler
// Type: Microsoft.Iris.Render.Protocol.ObjectCache
// Assembly: UIX.RenderApi, Version=4.8.0.0, Culture=neutral, PublicKeyToken=ddd0da4d3e678217
// MVID: D47658B8-A8EA-43D6-8837-ECE823BFFFC1
// Assembly location: C:\Program Files\Zune\UIX.RenderApi.dll
using Microsoft.Iris.Render.Common;
using System;
namespace Microsoft.Iris.Render.Protocol
{
internal class ObjectCache
{
private ObjectCache.Callback m_callback;
private object[] m_arFreeObjs;
private int m_idxFree;
public ObjectCache(ObjectCache.Callback callback, int cFreeItems, bool fPrePopulate)
{
Debug2.Validate(callback != null, typeof(ArgumentNullException), "calback");
Debug2.Validate(cFreeItems > 0, typeof(ArgumentException), "Free list must have at least one entry", nameof(cFreeItems));
this.m_callback = callback;
this.m_arFreeObjs = new object[cFreeItems];
this.m_idxFree = -1;
if (!fPrePopulate)
return;
for (int index = 0; index < cFreeItems; ++index)
this.Push(this.DoCallback(Operation.Alloc, null));
}
public void Dispose()
{
object[] arFreeObjs = this.m_arFreeObjs;
if (arFreeObjs == null)
return;
int idxFree = this.m_idxFree;
this.m_idxFree = -1;
this.m_arFreeObjs = null;
for (; idxFree >= 0; --idxFree)
this.DoCallback(Operation.Free, arFreeObjs[idxFree]);
}
public object Pop()
{
ObjectCache.Operation operation = Operation.Alloc;
object data = null;
if (this.m_idxFree >= 0)
{
operation = Operation.Thaw;
data = this.m_arFreeObjs[this.m_idxFree--];
}
return this.DoCallback(operation, data);
}
public void Push(object data)
{
if (this.m_idxFree + 1 >= this.m_arFreeObjs.Length)
{
this.DoCallback(Operation.Free, data);
}
else
{
data = this.DoCallback(Operation.Freeze, data);
this.m_arFreeObjs[++this.m_idxFree] = data;
}
}
private object DoCallback(ObjectCache.Operation operation, object data) => this.m_callback(operation, data);
public enum Operation
{
Alloc,
Free,
Thaw,
Freeze,
}
public delegate object Callback(ObjectCache.Operation operation, object data);
}
}