2021-07-11 22:59:29 -05:00
|
|
|
// Decompiled with JetBrains decompiler
|
|
|
|
|
// Type: Microsoft.Iris.Render.TrackerBase
|
|
|
|
|
// 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;
|
|
|
|
|
using System.Collections;
|
|
|
|
|
using System.Runtime.InteropServices;
|
|
|
|
|
|
|
|
|
|
namespace Microsoft.Iris.Render
|
|
|
|
|
{
|
2021-07-11 23:04:40 -05:00
|
|
|
public abstract class TrackerBase
|
2021-07-11 22:59:29 -05:00
|
|
|
{
|
2021-07-11 23:07:04 -05:00
|
|
|
private static readonly TrackerBase.ObjectTest s_testAll = new TrackerBase.ObjectTest(AllObjectTest);
|
|
|
|
|
private static readonly TrackerBase.ObjectTest s_testDead = new TrackerBase.ObjectTest(DeadObjectTest);
|
|
|
|
|
private static readonly TrackerBase.ObjectTest s_testObject = new TrackerBase.ObjectTest(SpecificObjectTest);
|
2021-07-11 23:04:40 -05:00
|
|
|
private Map<object, GCHandle> m_tblObjects;
|
2021-07-11 22:59:29 -05:00
|
|
|
|
2021-07-11 23:04:40 -05:00
|
|
|
~TrackerBase() => this.Dispose(false);
|
2021-07-11 22:59:29 -05:00
|
|
|
|
2021-07-11 23:04:40 -05:00
|
|
|
public void Dispose()
|
2021-07-11 22:59:29 -05:00
|
|
|
{
|
2021-07-11 23:07:04 -05:00
|
|
|
GC.SuppressFinalize(this);
|
2021-07-11 23:04:40 -05:00
|
|
|
this.Dispose(true);
|
|
|
|
|
}
|
|
|
|
|
|
2021-07-11 23:07:04 -05:00
|
|
|
protected virtual void Dispose(bool fInDispose) => this.RemoveObjects(s_testAll);
|
2021-07-11 23:04:40 -05:00
|
|
|
|
|
|
|
|
public bool IsEmpty => this.m_tblObjects.Count == 0;
|
|
|
|
|
|
|
|
|
|
public ArrayList LiveObjects
|
|
|
|
|
{
|
|
|
|
|
get
|
2021-07-11 22:59:29 -05:00
|
|
|
{
|
2021-07-11 23:04:40 -05:00
|
|
|
ArrayList arrayList = new ArrayList();
|
|
|
|
|
lock (this)
|
|
|
|
|
{
|
|
|
|
|
if (this.m_tblObjects != null)
|
|
|
|
|
{
|
|
|
|
|
foreach (KeyValueEntry<object, GCHandle> tblObject in this.m_tblObjects)
|
|
|
|
|
{
|
|
|
|
|
object target = tblObject.Value.Target;
|
|
|
|
|
if (target != null)
|
|
|
|
|
arrayList.Add(target);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return arrayList;
|
2021-07-11 22:59:29 -05:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-07-11 23:04:40 -05:00
|
|
|
public void AddObject(object key, object value)
|
2021-07-11 22:59:29 -05:00
|
|
|
{
|
2021-07-11 23:04:40 -05:00
|
|
|
lock (this)
|
2021-07-11 22:59:29 -05:00
|
|
|
{
|
2021-07-11 23:04:40 -05:00
|
|
|
if (this.m_tblObjects == null)
|
|
|
|
|
this.SetupObjectTable();
|
|
|
|
|
this.m_tblObjects[key] = GCHandle.Alloc(value, GCHandleType.Weak);
|
2021-07-11 22:59:29 -05:00
|
|
|
}
|
|
|
|
|
}
|
2021-07-11 23:04:40 -05:00
|
|
|
|
|
|
|
|
public void RemoveKey(object key)
|
|
|
|
|
{
|
|
|
|
|
lock (this)
|
|
|
|
|
{
|
|
|
|
|
GCHandle gcHandle;
|
|
|
|
|
if (!this.m_tblObjects.TryGetValue(key, out gcHandle))
|
|
|
|
|
{
|
|
|
|
|
Debug2.Validate(false, typeof(InvalidOperationException), "Unable to find object with key " + key);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
gcHandle.Free();
|
|
|
|
|
this.m_tblObjects.Remove(key);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public void RemoveKeys(TrackerBase.KeyTest keyTest)
|
|
|
|
|
{
|
|
|
|
|
lock (this)
|
|
|
|
|
{
|
|
|
|
|
if (this.m_tblObjects == null)
|
|
|
|
|
return;
|
2021-07-11 23:07:04 -05:00
|
|
|
ArrayList arrayList = null;
|
2021-07-11 23:04:40 -05:00
|
|
|
foreach (string key in this.m_tblObjects.Keys)
|
|
|
|
|
{
|
|
|
|
|
if (keyTest == null || keyTest(key))
|
|
|
|
|
{
|
|
|
|
|
if (arrayList == null)
|
|
|
|
|
arrayList = new ArrayList();
|
2021-07-11 23:07:04 -05:00
|
|
|
arrayList.Add(key);
|
2021-07-11 23:04:40 -05:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (arrayList == null)
|
|
|
|
|
return;
|
|
|
|
|
foreach (object key in arrayList)
|
|
|
|
|
this.RemoveKey(key);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2021-07-11 23:07:04 -05:00
|
|
|
public void RemoveObject(object objRemove) => this.RemoveObjects(s_testObject, objRemove);
|
2021-07-11 23:04:40 -05:00
|
|
|
|
2021-07-11 23:07:04 -05:00
|
|
|
public void RemoveDeadObjects() => this.RemoveObjects(s_testDead);
|
2021-07-11 23:04:40 -05:00
|
|
|
|
2021-07-11 23:07:04 -05:00
|
|
|
public void RemoveAllObjects() => this.RemoveObjects(s_testAll);
|
2021-07-11 23:04:40 -05:00
|
|
|
|
2021-07-11 23:07:04 -05:00
|
|
|
public void RemoveObjects(TrackerBase.ObjectTest test) => this.RemoveObjects(test, null);
|
2021-07-11 23:04:40 -05:00
|
|
|
|
|
|
|
|
public void RemoveObjects(TrackerBase.ObjectTest test, object objParam)
|
|
|
|
|
{
|
|
|
|
|
lock (this)
|
|
|
|
|
{
|
|
|
|
|
if (this.m_tblObjects == null)
|
|
|
|
|
return;
|
2021-07-11 23:07:04 -05:00
|
|
|
ArrayList arrayList = null;
|
2021-07-11 23:04:40 -05:00
|
|
|
foreach (KeyValueEntry<object, GCHandle> tblObject in this.m_tblObjects)
|
|
|
|
|
{
|
|
|
|
|
GCHandle gcHandle = tblObject.Value;
|
|
|
|
|
object target = gcHandle.Target;
|
|
|
|
|
if (target == null || test(target, objParam))
|
|
|
|
|
{
|
|
|
|
|
if (arrayList == null)
|
|
|
|
|
arrayList = new ArrayList();
|
|
|
|
|
object key = tblObject.Key;
|
|
|
|
|
arrayList.Add(key);
|
|
|
|
|
gcHandle.Free();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (arrayList == null)
|
|
|
|
|
return;
|
|
|
|
|
foreach (object key in arrayList)
|
|
|
|
|
this.m_tblObjects.Remove(key);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public object Find(object key)
|
|
|
|
|
{
|
2021-07-11 23:07:04 -05:00
|
|
|
object obj = null;
|
2021-07-11 23:04:40 -05:00
|
|
|
lock (this)
|
|
|
|
|
{
|
|
|
|
|
if (this.m_tblObjects != null)
|
|
|
|
|
{
|
|
|
|
|
GCHandle gcHandle;
|
|
|
|
|
if (this.m_tblObjects.TryGetValue(key, out gcHandle))
|
|
|
|
|
{
|
|
|
|
|
obj = gcHandle.Target;
|
|
|
|
|
if (obj == null)
|
|
|
|
|
{
|
|
|
|
|
this.m_tblObjects.Remove(key);
|
|
|
|
|
gcHandle.Free();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return obj;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public bool ContainsKey(object key)
|
|
|
|
|
{
|
|
|
|
|
bool flag = false;
|
|
|
|
|
lock (this)
|
|
|
|
|
{
|
|
|
|
|
if (this.m_tblObjects != null)
|
|
|
|
|
flag = this.m_tblObjects.ContainsKey(key);
|
|
|
|
|
}
|
|
|
|
|
return flag;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
protected virtual void SetupObjectTable()
|
|
|
|
|
{
|
|
|
|
|
lock (this)
|
|
|
|
|
{
|
|
|
|
|
if (this.m_tblObjects != null)
|
|
|
|
|
return;
|
|
|
|
|
this.m_tblObjects = new Map<object, GCHandle>();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
private static bool AllObjectTest(object objSubject, object objParam) => true;
|
|
|
|
|
|
|
|
|
|
private static bool DeadObjectTest(object objSubject, object objParam) => false;
|
|
|
|
|
|
|
|
|
|
private static bool SpecificObjectTest(object objSubject, object objParam) => objSubject == objParam;
|
|
|
|
|
|
|
|
|
|
public delegate bool ObjectTest(object objSubject, object objParam);
|
|
|
|
|
|
|
|
|
|
public delegate bool KeyTest(string key);
|
2021-07-11 22:59:29 -05:00
|
|
|
}
|
|
|
|
|
}
|