diff --git a/Il2CppInspector.Common/Model/AddressMap.cs b/Il2CppInspector.Common/Model/AddressMap.cs index 3f9a310..bb017e3 100644 --- a/Il2CppInspector.Common/Model/AddressMap.cs +++ b/Il2CppInspector.Common/Model/AddressMap.cs @@ -5,6 +5,7 @@ */ using System; +using System.Collections; using System.Collections.Generic; using System.Text; @@ -12,12 +13,37 @@ namespace Il2CppInspector.Model { // A map of absolutely everything in the binary we know about // Designed to be used by static analysis disassembly frameworks such as Capstone.NET - public class AddressMap + public class AddressMap : IDictionary { - public Dictionary Item { get; } = new Dictionary(); - + // IL2CPP application model public AppModel Model { get; } + // Underlying collection + public Dictionary Items { get; } = new Dictionary(); + + #region Surrogate implementation of IDictionary + + // Surrogate implementation of IDictionary + public ICollection Keys => ((IDictionary) Items).Keys; + public ICollection Values => ((IDictionary) Items).Values; + public int Count => ((ICollection>) Items).Count; + public bool IsReadOnly => ((ICollection>) Items).IsReadOnly; + public object this[ulong key] { get => ((IDictionary) Items)[key]; set => ((IDictionary) Items)[key] = value; } + + public bool TryAdd(ulong addr, object item) => Items.TryAdd(addr, item); + public void Add(ulong key, object value) => ((IDictionary) Items).Add(key, value); + public bool ContainsKey(ulong key) => ((IDictionary) Items).ContainsKey(key); + public bool Remove(ulong key) => ((IDictionary) Items).Remove(key); + public bool TryGetValue(ulong key, out object value) => ((IDictionary) Items).TryGetValue(key, out value); + public void Add(KeyValuePair item) => ((ICollection>) Items).Add(item); + public void Clear() => ((ICollection>) Items).Clear(); + public bool Contains(KeyValuePair item) => ((ICollection>) Items).Contains(item); + public void CopyTo(KeyValuePair[] array, int arrayIndex) => ((ICollection>) Items).CopyTo(array, arrayIndex); + public bool Remove(KeyValuePair item) => ((ICollection>) Items).Remove(item); + public IEnumerator> GetEnumerator() => ((IEnumerable>) Items).GetEnumerator(); + IEnumerator IEnumerable.GetEnumerator() => ((IEnumerable) Items).GetEnumerator(); + #endregion + public AddressMap(AppModel model) { Model = model; build(); @@ -26,9 +52,5 @@ namespace Il2CppInspector.Model private void build() { // TODO: Build address map } - - public object At(ulong addr) => Item.ContainsKey(addr)? Item[addr] : null; - - public bool TryAdd(ulong addr, object item) => Item.TryAdd(addr, item); } }