From 0a5a78bc13eebed4aed8924a2e245552ca94b923 Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Sun, 3 May 2020 23:34:28 +0200 Subject: [PATCH] Implemented MoveLibrary --- PkmnLibSharp.sln.DotSettings | 2 + PkmnLibSharp/Library/MoveData.cs | 2 +- PkmnLibSharp/Library/MoveLibrary.cs | 74 +++++++++++++++++++++++++++++ 3 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 PkmnLibSharp.sln.DotSettings create mode 100644 PkmnLibSharp/Library/MoveLibrary.cs diff --git a/PkmnLibSharp.sln.DotSettings b/PkmnLibSharp.sln.DotSettings new file mode 100644 index 0000000..fe64f51 --- /dev/null +++ b/PkmnLibSharp.sln.DotSettings @@ -0,0 +1,2 @@ + + True \ No newline at end of file diff --git a/PkmnLibSharp/Library/MoveData.cs b/PkmnLibSharp/Library/MoveData.cs index e356ba5..3d383e1 100644 --- a/PkmnLibSharp/Library/MoveData.cs +++ b/PkmnLibSharp/Library/MoveData.cs @@ -46,7 +46,7 @@ namespace PkmnLibSharp.Library return new MoveData(ptr); } - private MoveData(IntPtr ptr) : base(ptr) + internal MoveData(IntPtr ptr) : base(ptr) { } diff --git a/PkmnLibSharp/Library/MoveLibrary.cs b/PkmnLibSharp/Library/MoveLibrary.cs new file mode 100644 index 0000000..d27ac1e --- /dev/null +++ b/PkmnLibSharp/Library/MoveLibrary.cs @@ -0,0 +1,74 @@ +using System; +using System.Collections.Generic; +using Creatureliblibrary.Generated; +using PkmnLibSharp.Utilities; + +namespace PkmnLibSharp.Library +{ + public class MoveLibrary : PointerWrapper + { + private readonly Dictionary _cache = new Dictionary(StringComparer.InvariantCultureIgnoreCase); + public ulong Count => AttackLibrary.GetCount(Ptr); + + public void Insert(string key, MoveData move) + { + AttackLibrary.Insert(Ptr, key.ToPtr(), move.Ptr).Assert(); + _cache.Add(key, move); + } + + public void Delete(string key) + { + AttackLibrary.Delete(Ptr, key.ToPtr()).Assert(); + _cache.Remove(key); + } + + public bool TryGet(string key, out MoveData move) + { + if (_cache.TryGetValue(key, out move)) + return true; + var ptr = IntPtr.Zero; + if (AttackLibrary.TryGet(Ptr, key.ToPtr(), ref ptr) != MarshalHelper.True) + return false; + if (TryResolvePointer(ptr, out move)) + { + _cache.Add(key, move); + return true; + } + move = new MoveData(ptr); + _cache.Add(key, move); + return true; + } + + public MoveData Get(string key) + { + if (_cache.TryGetValue(key, out var move)) + return move; + var ptr = IntPtr.Zero; + AttackLibrary.Get(Ptr, key.ToPtr(), ref ptr).Assert(); + if (TryResolvePointer(ptr, out move)) + { + _cache.Add(key, move); + return move; + } + move = new MoveData(ptr); + _cache.Add(key, move); + return move; + } + + public static MoveLibrary Create(ulong defaultCapacity) + { + var ptr = IntPtr.Zero; + AttackLibrary.Construct(ref ptr, defaultCapacity).Assert(); + return new MoveLibrary(ptr); + } + + private MoveLibrary(IntPtr ptr) : base(ptr) + { + } + + protected override void DeletePtr() + { + AttackLibrary.Destruct(Ptr); + } + } +} \ No newline at end of file