Cache created wrappers for pointers, so we can resolve them later.

This commit is contained in:
Deukhoofd 2020-05-03 17:14:07 +02:00
parent 1bf2f0ad09
commit 42ec208425
Signed by: Deukhoofd
GPG Key ID: F63E044490819F6F
6 changed files with 41 additions and 10 deletions

View File

@ -54,8 +54,7 @@ namespace PkmnLibSharp.Library
}
internal override void DeletePtr()
protected override void DeletePtr()
{
Creatureliblibrary.Generated.EffectParameter.Destruct(Ptr);
}

View File

@ -67,7 +67,6 @@ namespace PkmnLibSharp.Library
return _abilities;
}
}
public ImmutableArray<string> HiddenAbilities
{
get
@ -89,13 +88,25 @@ namespace PkmnLibSharp.Library
}
}
public LearnableMoves Moves
{
get
{
if (_moves != null) return _moves;
var movesPtr = SpeciesVariant.GetLearnableAttacks(Ptr);
if (!TryResolvePointer(movesPtr, out _moves))
{
_moves = new LearnableMoves(movesPtr);
}
return _moves;
}
}
public int GetPkmnType(int index)
{
return Types[index];
}
public static unsafe Forme Create(string name, float height, float weight, uint baseExperience, byte[] types,
ushort baseHealth, ushort baseAttack, ushort baseDefense, ushort baseSpecialAttack,
ushort baseSpecialDefense, ushort baseSpeed, string[] abilities, string[] hiddenAbilities,
@ -125,7 +136,7 @@ namespace PkmnLibSharp.Library
{
}
internal override void DeletePtr()
protected override void DeletePtr()
{
SpeciesVariant.Destruct(Ptr);
}

View File

@ -5,7 +5,7 @@ namespace PkmnLibSharp.Library
{
public class LearnableMoves : PointerWrapper
{
private LearnableMoves(IntPtr ptr) : base(ptr)
internal LearnableMoves(IntPtr ptr) : base(ptr)
{
}
@ -21,7 +21,7 @@ namespace PkmnLibSharp.Library
LearnableAttacks.AddLevelAttack(Ptr, level, move.Ptr);
}
internal override void DeletePtr()
protected override void DeletePtr()
{
LearnableAttacks.Destruct(Ptr);
}

View File

@ -50,7 +50,7 @@ namespace PkmnLibSharp.Library
{
}
internal override void DeletePtr()
protected override void DeletePtr()
{
AttackData.Destruct(Ptr);
}

View File

@ -20,7 +20,7 @@ namespace PkmnLibSharp.Library
return new Species(ptr);
}
internal override void DeletePtr()
protected override void DeletePtr()
{
PokemonSpecies.Destruct(Ptr);
}

View File

@ -1,4 +1,5 @@
using System;
using System.Collections.Concurrent;
namespace PkmnLibSharp
{
@ -7,16 +8,36 @@ namespace PkmnLibSharp
internal readonly IntPtr Ptr;
private bool _isDeleted = false;
private static readonly ConcurrentDictionary<IntPtr, WeakReference<object>> Cached =
new ConcurrentDictionary<IntPtr, WeakReference<object>>();
protected PointerWrapper(IntPtr ptr)
{
Ptr = ptr;
var weakRef = new WeakReference<object>(this);
Cached.TryAdd(ptr, weakRef);
}
internal abstract void DeletePtr();
internal static bool TryResolvePointer<T>(IntPtr p, out T result) where T : PointerWrapper
{
if (Cached.TryGetValue(p, out var val))
{
if (val.TryGetTarget(out var target))
{
result = (T) target;
return true;
}
}
result = null;
return false;
}
protected abstract void DeletePtr();
public virtual void Dispose()
{
if (_isDeleted)
return;
Cached.TryRemove(Ptr, out _);
DeletePtr();
_isDeleted = true;
}