From 0dbc800e38f168570e59a37fbf9fc1e1639235d2 Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Tue, 19 May 2020 14:34:20 +0200 Subject: [PATCH] Better handling of PokemonLibrary that requires less reflection (but is slightly more verbose) --- .../Library/GrowthRates/GrowthRateLibrary.cs | 4 + PkmnLibSharp/Library/Moves/MoveLibrary.cs | 2 +- PkmnLibSharp/Library/NatureLibrary.cs | 6 ++ PkmnLibSharp/Library/PokemonLibrary.cs | 100 +++++++++++++++--- PkmnLibSharp/Library/TypeLibrary.cs | 4 + PkmnLibSharp/Utilities/PointerWrapper.cs | 22 ---- 6 files changed, 102 insertions(+), 36 deletions(-) diff --git a/PkmnLibSharp/Library/GrowthRates/GrowthRateLibrary.cs b/PkmnLibSharp/Library/GrowthRates/GrowthRateLibrary.cs index 463d97f..afa1ec4 100644 --- a/PkmnLibSharp/Library/GrowthRates/GrowthRateLibrary.cs +++ b/PkmnLibSharp/Library/GrowthRates/GrowthRateLibrary.cs @@ -5,6 +5,10 @@ namespace PkmnLibSharp.Library.GrowthRates { public class GrowthRateLibrary : PointerWrapper { + internal GrowthRateLibrary(IntPtr ptr) : base(ptr) + { + } + public GrowthRateLibrary(ulong initialCapacity) : base( Creatureliblibrary.Generated.GrowthRateLibrary.Construct(initialCapacity)) { diff --git a/PkmnLibSharp/Library/Moves/MoveLibrary.cs b/PkmnLibSharp/Library/Moves/MoveLibrary.cs index baa1cf7..2c09877 100644 --- a/PkmnLibSharp/Library/Moves/MoveLibrary.cs +++ b/PkmnLibSharp/Library/Moves/MoveLibrary.cs @@ -62,7 +62,7 @@ namespace PkmnLibSharp.Library.Moves return new MoveLibrary(ptr); } - private MoveLibrary(IntPtr ptr) : base(ptr) + internal MoveLibrary(IntPtr ptr) : base(ptr) { } diff --git a/PkmnLibSharp/Library/NatureLibrary.cs b/PkmnLibSharp/Library/NatureLibrary.cs index 1ae2390..741b0f6 100644 --- a/PkmnLibSharp/Library/NatureLibrary.cs +++ b/PkmnLibSharp/Library/NatureLibrary.cs @@ -8,8 +8,13 @@ namespace PkmnLibSharp.Library { private readonly Dictionary _cache = new Dictionary(StringComparer.InvariantCultureIgnoreCase); + private readonly Dictionary _natureNames = new Dictionary(); + internal NatureLibrary(IntPtr ptr) : base(ptr) + { + } + public NatureLibrary(ulong initialCapacity) : base(Pkmnlib.Generated.NatureLibrary.Construct(initialCapacity)) { } @@ -33,6 +38,7 @@ namespace PkmnLibSharp.Library _natureNames.Add(ptr, name); return nature; } + nature = new Nature(ptr); _cache.Add(name, nature); _natureNames.Add(ptr, name); diff --git a/PkmnLibSharp/Library/PokemonLibrary.cs b/PkmnLibSharp/Library/PokemonLibrary.cs index 0ef191a..2e28dba 100644 --- a/PkmnLibSharp/Library/PokemonLibrary.cs +++ b/PkmnLibSharp/Library/PokemonLibrary.cs @@ -11,37 +11,111 @@ namespace PkmnLibSharp.Library { private LibrarySettings _settings; - public LibrarySettings Settings => - _settings ??= ResolveOrCreatePtr(DataLibrary.GetSettings(Ptr)); + public LibrarySettings Settings + { + get + { + if (_settings != null) return _settings; + var ptr = DataLibrary.GetSettings(Ptr); + if (TryResolvePointer(ptr, out _settings)) + return _settings; + _settings = new LibrarySettings(ptr); + return _settings; + } + } private SpeciesLibrary _species; - public SpeciesLibrary SpeciesLibrary => - _species ??= ResolveOrCreatePtr(DataLibrary.GetSpeciesLibrary(Ptr)); + public SpeciesLibrary SpeciesLibrary + { + get + { + if (_species != null) return _species; + var ptr = DataLibrary.GetSpeciesLibrary(Ptr); + if (TryResolvePointer(ptr, out _species)) + return _species; + _species = new SpeciesLibrary(ptr); + return _species; + } + } private MoveLibrary _moves; - public MoveLibrary MoveLibrary => _moves ??= ResolveOrCreatePtr(DataLibrary.GetAttackLibrary(Ptr)); + + public MoveLibrary MoveLibrary + { + get + { + if (_moves != null) return _moves; + var ptr = DataLibrary.GetAttackLibrary(Ptr); + if (TryResolvePointer(ptr, out _moves)) + return _moves; + _moves = new MoveLibrary(ptr); + return _moves; + } + } private ItemLibrary _items; - public ItemLibrary ItemLibrary => _items ??= ResolveOrCreatePtr(DataLibrary.GetItemLibrary(Ptr)); + + public ItemLibrary ItemLibrary + { + get + { + if (_items != null) return _items; + var ptr = DataLibrary.GetItemLibrary(Ptr); + if (TryResolvePointer(ptr, out _items)) + return _items; + _items = new ItemLibrary(ptr); + return _items; + } + } private GrowthRateLibrary _growthRateLibrary; - public GrowthRateLibrary GrowthRateLibrary => _growthRateLibrary ??= - ResolveOrCreatePtr(DataLibrary.GetGrowthRates(Ptr)); + public GrowthRateLibrary GrowthRateLibrary + { + get + { + if (_growthRateLibrary != null) return _growthRateLibrary; + var ptr = DataLibrary.GetGrowthRates(Ptr); + if (TryResolvePointer(ptr, out _growthRateLibrary)) + return _growthRateLibrary; + _growthRateLibrary = new GrowthRateLibrary(ptr); + return _growthRateLibrary; + } + } private TypeLibrary _typeLibrary; - public TypeLibrary TypeLibrary => - _typeLibrary ??= ResolveOrCreatePtr(DataLibrary.GetTypeLibrary(Ptr)); + public TypeLibrary TypeLibrary + { + get + { + if (_typeLibrary != null) return _typeLibrary; + var ptr = DataLibrary.GetTypeLibrary(Ptr); + if (TryResolvePointer(ptr, out _typeLibrary)) + return _typeLibrary; + _typeLibrary = new TypeLibrary(ptr); + return _typeLibrary; + } + } private NatureLibrary _natureLibrary; - public NatureLibrary NatureLibrary => _natureLibrary ??= - ResolveOrCreatePtr(Pkmnlib.Generated.PokemonLibrary.GetNatureLibrary(Ptr)); + public NatureLibrary NatureLibrary + { + get + { + if (_natureLibrary != null) return _natureLibrary; + var ptr = Pkmnlib.Generated.PokemonLibrary.GetNatureLibrary(Ptr); + if (TryResolvePointer(ptr, out _natureLibrary)) + return _natureLibrary; + _natureLibrary = new NatureLibrary(ptr); + return _natureLibrary; + } + } - internal PokemonLibrary(IntPtr ptr) : base(ptr) + private PokemonLibrary(IntPtr ptr) : base(ptr) { } diff --git a/PkmnLibSharp/Library/TypeLibrary.cs b/PkmnLibSharp/Library/TypeLibrary.cs index 42b0a9a..6860dab 100644 --- a/PkmnLibSharp/Library/TypeLibrary.cs +++ b/PkmnLibSharp/Library/TypeLibrary.cs @@ -9,6 +9,10 @@ namespace PkmnLibSharp.Library private readonly Dictionary _cache = new Dictionary(StringComparer.InvariantCultureIgnoreCase); + internal TypeLibrary(IntPtr ptr) : base(ptr) + { + } + public TypeLibrary(ulong initialCapacity) : base( Creatureliblibrary.Generated.TypeLibrary.Construct(initialCapacity)) { diff --git a/PkmnLibSharp/Utilities/PointerWrapper.cs b/PkmnLibSharp/Utilities/PointerWrapper.cs index 380264e..4aa51cc 100644 --- a/PkmnLibSharp/Utilities/PointerWrapper.cs +++ b/PkmnLibSharp/Utilities/PointerWrapper.cs @@ -63,28 +63,6 @@ namespace PkmnLibSharp.Utilities return false; } - public static T ResolveOrCreatePtr(IntPtr p) where T : PointerWrapper - { - if (TryResolvePointer(p, out var result)) - return result; - var ctor = typeof(T) - .GetConstructors( - BindingFlags.NonPublic | - BindingFlags.Public | - BindingFlags.Instance - ) - .FirstOrDefault(x => - { - var pars = x.GetParameters(); - return pars.Length == 1 && pars[0].ParameterType == typeof(IntPtr); - }); - if (ctor == null) - { - throw new Exception($"Unable to find constructor of type {typeof(T).FullName} with a single parameter of IntPtr."); - } - var instance = ctor.Invoke(new object[] {p}) as T; - return instance; - } protected abstract void DeletePtr();