From 07aac1b87308829f19a4a25371f2ec1f5481a241 Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Fri, 14 Jan 2022 16:33:53 +0100 Subject: [PATCH] Add helper methods to be able to get Pokemon by ID faster --- PkmnLibSharp/Library/SpeciesLibrary.cs | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) diff --git a/PkmnLibSharp/Library/SpeciesLibrary.cs b/PkmnLibSharp/Library/SpeciesLibrary.cs index 6e74b26..5c730ad 100644 --- a/PkmnLibSharp/Library/SpeciesLibrary.cs +++ b/PkmnLibSharp/Library/SpeciesLibrary.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using System.Linq; using PkmnLibSharp.Utilities; namespace PkmnLibSharp.Library @@ -7,18 +8,25 @@ namespace PkmnLibSharp.Library public class SpeciesLibrary : PointerWrapper { private readonly Dictionary _cache = new Dictionary(StringComparer.InvariantCultureIgnoreCase); + private readonly Dictionary _idCache = new Dictionary(); public ulong Count => Creaturelib.Generated.SpeciesLibrary.GetCount(Ptr); public void Insert(string key, Species species) { Creaturelib.Generated.SpeciesLibrary.Insert(Ptr, key.ToPtr(), species.Ptr).Assert(); _cache.Add(key, species); + _idCache.Add(species.Id, species); } public void Delete(string key) { Creaturelib.Generated.SpeciesLibrary.Delete(Ptr, key.ToPtr()).Assert(); - _cache.Remove(key); + if (_cache.TryGetValue(key, out var s)) + { + _cache.Remove(key); + if (s != null) + _idCache.Remove(s.Id); + } } public bool TryGet(string key, out Species? species) @@ -47,6 +55,7 @@ namespace PkmnLibSharp.Library if (TryResolvePointer(ptr, out Species? s)) { _cache.Add(key, s!); + _idCache.Add(s!.Id, s); return s!; } species = Constructor.Active.ConstructSpecies(ptr)!; @@ -56,12 +65,16 @@ namespace PkmnLibSharp.Library public Species GetById(ushort id) { + if (_idCache.TryGetValue(id, out var species)) + return species; var ptr = Creaturelib.Generated.SpeciesLibrary.GetById(Ptr, id); if (TryResolvePointer(ptr, out Species? s)) { + _idCache.Add(id, s!); return s!; } s = Constructor.Active.ConstructSpecies(ptr)!; + _idCache.Add(id, s!); return s; } @@ -89,6 +102,11 @@ namespace PkmnLibSharp.Library } } + public IEnumerable GetCachedIdEnumerator() + { + return _idCache.Keys; + } + internal SpeciesLibrary(IntPtr ptr) : base(ptr) { }