From cc2468c1d08eed8265734c6d1ebd0e51d04144e1 Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Sat, 8 Oct 2022 13:42:30 +0200 Subject: [PATCH] Rework cache handling. --- PkmnLibRSharp/FFI/IdentifiablePointer.cs | 12 ++++ PkmnLibRSharp/FFI/StaticData/Ability.cs | 4 +- .../FFI/StaticData/EffectParameter.cs | 8 +-- PkmnLibRSharp/FFI/StaticData/Form.cs | 12 ++-- PkmnLibRSharp/FFI/StaticData/Item.cs | 2 +- .../StaticData/Libraries/AbilityLibrary.cs | 4 +- .../StaticData/Libraries/GrowthRateLibrary.cs | 2 +- .../FFI/StaticData/Libraries/ItemLibrary.cs | 4 +- .../StaticData/Libraries/LibrarySettings.cs | 2 +- .../FFI/StaticData/Libraries/MoveLibrary.cs | 4 +- .../FFI/StaticData/Libraries/NatureLibrary.cs | 4 +- .../StaticData/Libraries/SpeciesLibrary.cs | 4 +- .../FFI/StaticData/Libraries/StaticData.cs | 18 ++--- .../FFI/StaticData/Libraries/TypeLibrary.cs | 2 +- PkmnLibRSharp/FFI/StaticData/MoveData.cs | 8 +-- PkmnLibRSharp/FFI/StaticData/Nature.cs | 2 +- PkmnLibRSharp/FFI/StaticData/Species.cs | 4 +- .../FFI/StaticData/StaticStatisticSet.cs | 12 ++-- PkmnLibRSharp/FFI/StaticData/StatisticSet.cs | 12 ++-- PkmnLibRSharp/PkmnLibRSharp.csproj | 4 ++ PkmnLibRSharp/StaticData/Ability.cs | 8 ++- PkmnLibRSharp/StaticData/EffectParameter.cs | 8 ++- PkmnLibRSharp/StaticData/Form.cs | 8 ++- PkmnLibRSharp/StaticData/GrowthRate.cs | 5 ++ PkmnLibRSharp/StaticData/Item.cs | 8 ++- PkmnLibRSharp/StaticData/LearnableMoves.cs | 5 ++ .../StaticData/Libraries/AbilityLibrary.cs | 10 ++- .../StaticData/Libraries/DataLibrary.cs | 8 ++- .../StaticData/Libraries/GrowthRateLibrary.cs | 8 ++- .../StaticData/Libraries/ItemLibrary.cs | 10 ++- .../StaticData/Libraries/LibrarySettings.cs | 8 ++- .../StaticData/Libraries/MoveLibrary.cs | 10 ++- .../StaticData/Libraries/NatureLibrary.cs | 22 +++--- .../StaticData/Libraries/SpeciesLibrary.cs | 10 ++- .../StaticData/Libraries/StaticData.cs | 5 ++ .../StaticData/Libraries/TypeLibrary.cs | 8 ++- PkmnLibRSharp/StaticData/MoveData.cs | 10 ++- PkmnLibRSharp/StaticData/Nature.cs | 8 ++- PkmnLibRSharp/StaticData/SecondaryEffect.cs | 15 ++-- PkmnLibRSharp/StaticData/Species.cs | 12 +++- .../StaticData/StaticStatisticSet.cs | 8 ++- PkmnLibRSharp/StaticData/StatisticSet.cs | 17 ++--- PkmnLibRSharp/Utils/BasePointer.cs | 70 +++++++++++++++++++ PkmnLibRSharp/Utils/CacheHandler.cs | 12 ++-- PkmnLibRSharp/Utils/ExternPointer.cs | 43 ++++++------ PkmnLibRSharp/Utils/Optional.cs | 39 +++++++++++ PkmnLibRSharp/libpkmn_lib.so | 4 +- PkmnLibRSharpTests/PkmnLibRSharpTests.csproj | 4 ++ PkmnLibRSharpTests/StaticData/AbilityTests.cs | 12 ++-- .../StaticData/GrowthRateTests.cs | 9 +-- .../Libraries/NatureLibraryTests.cs | 34 +++++---- 51 files changed, 412 insertions(+), 150 deletions(-) create mode 100644 PkmnLibRSharp/FFI/IdentifiablePointer.cs create mode 100644 PkmnLibRSharp/Utils/BasePointer.cs create mode 100644 PkmnLibRSharp/Utils/Optional.cs diff --git a/PkmnLibRSharp/FFI/IdentifiablePointer.cs b/PkmnLibRSharp/FFI/IdentifiablePointer.cs new file mode 100644 index 0000000..416067a --- /dev/null +++ b/PkmnLibRSharp/FFI/IdentifiablePointer.cs @@ -0,0 +1,12 @@ +using System; +using System.Runtime.InteropServices; + +namespace PkmnLibSharp.FFI +{ + [StructLayout(LayoutKind.Sequential)] + public struct IdentifiablePointer + { + public readonly IntPtr Ptr; + public readonly nuint Identifier; + } +} \ No newline at end of file diff --git a/PkmnLibRSharp/FFI/StaticData/Ability.cs b/PkmnLibRSharp/FFI/StaticData/Ability.cs index 9113d63..049adf8 100644 --- a/PkmnLibRSharp/FFI/StaticData/Ability.cs +++ b/PkmnLibRSharp/FFI/StaticData/Ability.cs @@ -6,7 +6,7 @@ namespace PkmnLibSharp.FFI.StaticData internal static class Ability { [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] - internal static extern IntPtr ability_new(IntPtr name, IntPtr effect, IntPtr parameters, ulong size); + internal static extern IdentifiablePointer ability_new(IntPtr name, IntPtr effect, IntPtr parameters, ulong size); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] internal static extern void ability_drop(IntPtr value); @@ -21,6 +21,6 @@ namespace PkmnLibSharp.FFI.StaticData internal static extern ulong ability_parameter_length(IntPtr value); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] - internal static extern IntPtr ability_parameter_get(IntPtr value, ulong index); + internal static extern IdentifiablePointer ability_parameter_get(IntPtr value, ulong index); } } \ No newline at end of file diff --git a/PkmnLibRSharp/FFI/StaticData/EffectParameter.cs b/PkmnLibRSharp/FFI/StaticData/EffectParameter.cs index 98089ad..1df4c04 100644 --- a/PkmnLibRSharp/FFI/StaticData/EffectParameter.cs +++ b/PkmnLibRSharp/FFI/StaticData/EffectParameter.cs @@ -6,16 +6,16 @@ namespace PkmnLibSharp.FFI.StaticData internal static class EffectParameter { [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl)] - internal static extern IntPtr effect_parameter_new_bool(byte value); + internal static extern IdentifiablePointer effect_parameter_new_bool(byte value); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl)] - internal static extern IntPtr effect_parameter_new_int(long value); + internal static extern IdentifiablePointer effect_parameter_new_int(long value); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl)] - internal static extern IntPtr effect_parameter_new_float(float value); + internal static extern IdentifiablePointer effect_parameter_new_float(float value); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] - internal static extern IntPtr effect_parameter_new_string(IntPtr value); + internal static extern IdentifiablePointer effect_parameter_new_string(IntPtr value); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl)] internal static extern void effect_parameter_drop(IntPtr value); diff --git a/PkmnLibRSharp/FFI/StaticData/Form.cs b/PkmnLibRSharp/FFI/StaticData/Form.cs index 719b032..06c3df9 100644 --- a/PkmnLibRSharp/FFI/StaticData/Form.cs +++ b/PkmnLibRSharp/FFI/StaticData/Form.cs @@ -7,14 +7,14 @@ namespace PkmnLibSharp.FFI.StaticData internal static class Form { [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl)] - internal static extern IntPtr form_new(IntPtr name, float height, float weight, uint baseExperience, - IntPtr types, ulong typesLength, IntPtr baseStats, IntPtr abilities, ulong abilitiesLength, - IntPtr hiddenAbilities, ulong hiddenAbilitiesLength, IntPtr learnableMoves, IntPtr flags, - ulong flagsLength); + internal static extern IdentifiablePointer form_new(IntPtr name, float height, float weight, + uint baseExperience, IntPtr types, ulong typesLength, IntPtr baseStats, IntPtr abilities, + ulong abilitiesLength, IntPtr hiddenAbilities, ulong hiddenAbilitiesLength, IntPtr learnableMoves, + IntPtr flags, ulong flagsLength); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl)] internal static extern void form_drop(IntPtr ptr); - + [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl)] internal static extern IntPtr form_name(IntPtr ptr); @@ -34,7 +34,7 @@ namespace PkmnLibSharp.FFI.StaticData internal static extern TypeIdentifier form_types_get(IntPtr ptr, ulong index); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl)] - internal static extern IntPtr form_base_stats(IntPtr ptr); + internal static extern IdentifiablePointer form_base_stats(IntPtr ptr); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl)] internal static extern ulong form_abilities_length(IntPtr ptr); diff --git a/PkmnLibRSharp/FFI/StaticData/Item.cs b/PkmnLibRSharp/FFI/StaticData/Item.cs index 53f66f5..7d59461 100644 --- a/PkmnLibRSharp/FFI/StaticData/Item.cs +++ b/PkmnLibRSharp/FFI/StaticData/Item.cs @@ -7,7 +7,7 @@ namespace PkmnLibSharp.FFI.StaticData internal static class Item { [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl)] - internal static extern IntPtr item_new(IntPtr name, ItemCategory category, BattleItemCategory battleCategory, + internal static extern IdentifiablePointer item_new(IntPtr name, ItemCategory category, BattleItemCategory battleCategory, int price, IntPtr flags, ulong flagsLength); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl)] diff --git a/PkmnLibRSharp/FFI/StaticData/Libraries/AbilityLibrary.cs b/PkmnLibRSharp/FFI/StaticData/Libraries/AbilityLibrary.cs index bf8a90d..cb122a4 100644 --- a/PkmnLibRSharp/FFI/StaticData/Libraries/AbilityLibrary.cs +++ b/PkmnLibRSharp/FFI/StaticData/Libraries/AbilityLibrary.cs @@ -6,13 +6,13 @@ namespace PkmnLibSharp.FFI.StaticData.Libraries internal static class AbilityLibrary { [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] - internal static extern IntPtr ability_library_new(ulong capacity); + internal static extern IdentifiablePointer ability_library_new(ulong capacity); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] internal static extern void ability_library_drop(IntPtr ptr); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] - internal static extern IntPtr ability_library_get(IntPtr ptr, IntPtr key); + internal static extern IdentifiablePointer ability_library_get(IntPtr ptr, IntPtr key); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] internal static extern IntPtr ability_library_get_key_by_index(IntPtr ptr, ulong index); diff --git a/PkmnLibRSharp/FFI/StaticData/Libraries/GrowthRateLibrary.cs b/PkmnLibRSharp/FFI/StaticData/Libraries/GrowthRateLibrary.cs index 43732e6..f112777 100644 --- a/PkmnLibRSharp/FFI/StaticData/Libraries/GrowthRateLibrary.cs +++ b/PkmnLibRSharp/FFI/StaticData/Libraries/GrowthRateLibrary.cs @@ -7,7 +7,7 @@ namespace PkmnLibSharp.FFI.StaticData.Libraries internal static class GrowthRateLibrary { [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] - internal static extern IntPtr growth_rate_library_new(ulong capacity); + internal static extern IdentifiablePointer growth_rate_library_new(ulong capacity); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] internal static extern void growth_rate_library_drop(IntPtr ptr); diff --git a/PkmnLibRSharp/FFI/StaticData/Libraries/ItemLibrary.cs b/PkmnLibRSharp/FFI/StaticData/Libraries/ItemLibrary.cs index 51b0dc4..462927b 100644 --- a/PkmnLibRSharp/FFI/StaticData/Libraries/ItemLibrary.cs +++ b/PkmnLibRSharp/FFI/StaticData/Libraries/ItemLibrary.cs @@ -6,13 +6,13 @@ namespace PkmnLibSharp.FFI.StaticData.Libraries internal static class ItemLibrary { [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] - internal static extern IntPtr item_library_new(ulong capacity); + internal static extern IdentifiablePointer item_library_new(ulong capacity); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] internal static extern void item_library_drop(IntPtr ptr); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] - internal static extern IntPtr item_library_get(IntPtr ptr, IntPtr key); + internal static extern IdentifiablePointer item_library_get(IntPtr ptr, IntPtr key); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] internal static extern IntPtr item_library_get_key_by_index(IntPtr ptr, ulong index); diff --git a/PkmnLibRSharp/FFI/StaticData/Libraries/LibrarySettings.cs b/PkmnLibRSharp/FFI/StaticData/Libraries/LibrarySettings.cs index e5259f2..e3f1475 100644 --- a/PkmnLibRSharp/FFI/StaticData/Libraries/LibrarySettings.cs +++ b/PkmnLibRSharp/FFI/StaticData/Libraries/LibrarySettings.cs @@ -7,7 +7,7 @@ namespace PkmnLibSharp.FFI.StaticData.Libraries internal static class LibrarySettings { [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] - internal static extern IntPtr library_settings_new(LevelInt maxLevel); + internal static extern IdentifiablePointer library_settings_new(LevelInt maxLevel); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] internal static extern void library_settings_drop(IntPtr ptr); diff --git a/PkmnLibRSharp/FFI/StaticData/Libraries/MoveLibrary.cs b/PkmnLibRSharp/FFI/StaticData/Libraries/MoveLibrary.cs index 68274f9..037673b 100644 --- a/PkmnLibRSharp/FFI/StaticData/Libraries/MoveLibrary.cs +++ b/PkmnLibRSharp/FFI/StaticData/Libraries/MoveLibrary.cs @@ -6,13 +6,13 @@ namespace PkmnLibSharp.FFI.StaticData.Libraries internal static class MoveLibrary { [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] - internal static extern IntPtr move_library_new(ulong capacity); + internal static extern IdentifiablePointer move_library_new(ulong capacity); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] internal static extern void move_library_drop(IntPtr ptr); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] - internal static extern IntPtr move_library_get(IntPtr ptr, IntPtr key); + internal static extern IdentifiablePointer move_library_get(IntPtr ptr, IntPtr key); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] internal static extern IntPtr move_library_get_key_by_index(IntPtr ptr, ulong index); diff --git a/PkmnLibRSharp/FFI/StaticData/Libraries/NatureLibrary.cs b/PkmnLibRSharp/FFI/StaticData/Libraries/NatureLibrary.cs index 83eb31d..f8cc953 100644 --- a/PkmnLibRSharp/FFI/StaticData/Libraries/NatureLibrary.cs +++ b/PkmnLibRSharp/FFI/StaticData/Libraries/NatureLibrary.cs @@ -6,7 +6,7 @@ namespace PkmnLibSharp.FFI.StaticData.Libraries internal static class NatureLibrary { [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] - internal static extern IntPtr nature_library_new(ulong capacity); + internal static extern IdentifiablePointer nature_library_new(ulong capacity); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] internal static extern void nature_library_drop(IntPtr ptr); @@ -15,7 +15,7 @@ namespace PkmnLibSharp.FFI.StaticData.Libraries internal static extern void nature_library_load_nature(IntPtr ptr, IntPtr name, IntPtr nature); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] - internal static extern IntPtr nature_library_get_nature(IntPtr ptr, IntPtr name); + internal static extern IdentifiablePointer nature_library_get_nature(IntPtr ptr, IntPtr name); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] internal static extern IntPtr nature_library_get_nature_name(IntPtr ptr, IntPtr nature); diff --git a/PkmnLibRSharp/FFI/StaticData/Libraries/SpeciesLibrary.cs b/PkmnLibRSharp/FFI/StaticData/Libraries/SpeciesLibrary.cs index 5ac5844..19eaacb 100644 --- a/PkmnLibRSharp/FFI/StaticData/Libraries/SpeciesLibrary.cs +++ b/PkmnLibRSharp/FFI/StaticData/Libraries/SpeciesLibrary.cs @@ -6,13 +6,13 @@ namespace PkmnLibSharp.FFI.StaticData.Libraries internal static class SpeciesLibrary { [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] - internal static extern IntPtr species_library_new(ulong capacity); + internal static extern IdentifiablePointer species_library_new(ulong capacity); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] internal static extern void species_library_drop(IntPtr ptr); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] - internal static extern IntPtr species_library_get(IntPtr ptr, IntPtr key); + internal static extern IdentifiablePointer species_library_get(IntPtr ptr, IntPtr key); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] internal static extern IntPtr species_library_get_key_by_index(IntPtr ptr, ulong index); diff --git a/PkmnLibRSharp/FFI/StaticData/Libraries/StaticData.cs b/PkmnLibRSharp/FFI/StaticData/Libraries/StaticData.cs index 2b5e955..bc185ba 100644 --- a/PkmnLibRSharp/FFI/StaticData/Libraries/StaticData.cs +++ b/PkmnLibRSharp/FFI/StaticData/Libraries/StaticData.cs @@ -6,33 +6,33 @@ namespace PkmnLibSharp.FFI.StaticData.Libraries internal static class StaticData { [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] - internal static extern IntPtr static_data_new(IntPtr settings); + internal static extern IdentifiablePointer static_data_new(IntPtr settings); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] internal static extern void static_data_drop(IntPtr ptr); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] - internal static extern IntPtr static_data_settings(IntPtr ptr); + internal static extern IdentifiablePointer static_data_settings(IntPtr ptr); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] - internal static extern IntPtr static_data_species(IntPtr ptr); + internal static extern IdentifiablePointer static_data_species(IntPtr ptr); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] - internal static extern IntPtr static_data_moves(IntPtr ptr); + internal static extern IdentifiablePointer static_data_moves(IntPtr ptr); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] - internal static extern IntPtr static_data_items(IntPtr ptr); + internal static extern IdentifiablePointer static_data_items(IntPtr ptr); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] - internal static extern IntPtr static_data_growth_rates(IntPtr ptr); + internal static extern IdentifiablePointer static_data_growth_rates(IntPtr ptr); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] - internal static extern IntPtr static_data_types(IntPtr ptr); + internal static extern IdentifiablePointer static_data_types(IntPtr ptr); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] - internal static extern IntPtr static_data_natures(IntPtr ptr); + internal static extern IdentifiablePointer static_data_natures(IntPtr ptr); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] - internal static extern IntPtr static_data_abilities(IntPtr ptr); + internal static extern IdentifiablePointer static_data_abilities(IntPtr ptr); } } \ No newline at end of file diff --git a/PkmnLibRSharp/FFI/StaticData/Libraries/TypeLibrary.cs b/PkmnLibRSharp/FFI/StaticData/Libraries/TypeLibrary.cs index be6a126..0efacff 100644 --- a/PkmnLibRSharp/FFI/StaticData/Libraries/TypeLibrary.cs +++ b/PkmnLibRSharp/FFI/StaticData/Libraries/TypeLibrary.cs @@ -7,7 +7,7 @@ namespace PkmnLibSharp.FFI.StaticData.Libraries internal static class TypeLibrary { [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] - internal static extern IntPtr type_library_new(ulong capacity); + internal static extern IdentifiablePointer type_library_new(ulong capacity); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] internal static extern void type_library_drop(IntPtr ptr); diff --git a/PkmnLibRSharp/FFI/StaticData/MoveData.cs b/PkmnLibRSharp/FFI/StaticData/MoveData.cs index 109ad26..5f4a0cb 100644 --- a/PkmnLibRSharp/FFI/StaticData/MoveData.cs +++ b/PkmnLibRSharp/FFI/StaticData/MoveData.cs @@ -7,7 +7,7 @@ namespace PkmnLibSharp.FFI.StaticData internal static class MoveData { [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl)] - internal static extern IntPtr move_data_new(IntPtr name, TypeIdentifier moveType, MoveCategory category, + internal static extern IdentifiablePointer move_data_new(IntPtr name, TypeIdentifier moveType, MoveCategory category, byte basePower, byte accuracy, byte baseUsages, MoveTarget target, sbyte priority, IntPtr secondaryEffect, IntPtr flags, ulong flagsLength); @@ -39,14 +39,14 @@ namespace PkmnLibSharp.FFI.StaticData internal static extern sbyte move_data_priority(IntPtr p); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl)] - internal static extern IntPtr move_data_secondary_effect(IntPtr p); + internal static extern IdentifiablePointer move_data_secondary_effect(IntPtr p); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl)] internal static extern byte move_data_has_flag(IntPtr p, IntPtr flag); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl)] - internal static extern IntPtr secondary_effect_new(float chance, IntPtr effectName, IntPtr parameters, + internal static extern IdentifiablePointer secondary_effect_new(float chance, IntPtr effectName, IntPtr parameters, ulong parametersLength); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl)] @@ -62,6 +62,6 @@ namespace PkmnLibSharp.FFI.StaticData internal static extern ulong secondary_effect_parameter_length(IntPtr p); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl)] - internal static extern IntPtr secondary_effect_parameter_get(IntPtr p, ulong index); + internal static extern IdentifiablePointer secondary_effect_parameter_get(IntPtr p, ulong index); } } \ No newline at end of file diff --git a/PkmnLibRSharp/FFI/StaticData/Nature.cs b/PkmnLibRSharp/FFI/StaticData/Nature.cs index 1ab4af5..13dc73d 100644 --- a/PkmnLibRSharp/FFI/StaticData/Nature.cs +++ b/PkmnLibRSharp/FFI/StaticData/Nature.cs @@ -7,7 +7,7 @@ namespace PkmnLibSharp.FFI.StaticData internal static class Nature { [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl)] - internal static extern IntPtr nature_new(Statistic increaseStat, Statistic decreaseStat, float increaseModifier, + internal static extern IdentifiablePointer nature_new(Statistic increaseStat, Statistic decreaseStat, float increaseModifier, float decreaseModifier); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl)] diff --git a/PkmnLibRSharp/FFI/StaticData/Species.cs b/PkmnLibRSharp/FFI/StaticData/Species.cs index 59dbd01..85a26b3 100644 --- a/PkmnLibRSharp/FFI/StaticData/Species.cs +++ b/PkmnLibRSharp/FFI/StaticData/Species.cs @@ -6,7 +6,7 @@ namespace PkmnLibSharp.FFI.StaticData internal static class Species { [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl)] - internal static extern IntPtr species_new(ushort id, IntPtr name, float genderRate, IntPtr growthRate, + internal static extern IdentifiablePointer species_new(ushort id, IntPtr name, float genderRate, IntPtr growthRate, byte captureRate, IntPtr defaultForm, IntPtr flags, ulong flagsLength); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl)] @@ -31,7 +31,7 @@ namespace PkmnLibSharp.FFI.StaticData internal static extern IntPtr species_add_form(IntPtr ptr, IntPtr name, IntPtr form); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl)] - internal static extern IntPtr species_get_form(IntPtr ptr, IntPtr name); + internal static extern IdentifiablePointer species_get_form(IntPtr ptr, IntPtr name); } } \ No newline at end of file diff --git a/PkmnLibRSharp/FFI/StaticData/StaticStatisticSet.cs b/PkmnLibRSharp/FFI/StaticData/StaticStatisticSet.cs index e3c0eb6..703f8d3 100644 --- a/PkmnLibRSharp/FFI/StaticData/StaticStatisticSet.cs +++ b/PkmnLibRSharp/FFI/StaticData/StaticStatisticSet.cs @@ -7,27 +7,27 @@ namespace PkmnLibSharp.FFI.StaticData internal static class StaticStatisticSet { [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] - internal static extern IntPtr static_statistic_set_u8_new(byte hp, byte attack, byte defense, + internal static extern IdentifiablePointer static_statistic_set_u8_new(byte hp, byte attack, byte defense, byte specialAttack, byte specialDefense, byte speed); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] - internal static extern IntPtr static_statistic_set_u16_new(ushort hp, ushort attack, ushort defense, + internal static extern IdentifiablePointer static_statistic_set_u16_new(ushort hp, ushort attack, ushort defense, ushort specialAttack, ushort specialDefense, ushort speed); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] - internal static extern IntPtr static_statistic_set_u32_new(uint hp, uint attack, uint defense, + internal static extern IdentifiablePointer static_statistic_set_u32_new(uint hp, uint attack, uint defense, uint specialAttack, uint specialDefense, uint speed); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] - internal static extern IntPtr static_statistic_set_i8_new(sbyte hp, sbyte attack, sbyte defense, + internal static extern IdentifiablePointer static_statistic_set_i8_new(sbyte hp, sbyte attack, sbyte defense, sbyte specialAttack, sbyte specialDefense, sbyte speed); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] - internal static extern IntPtr static_statistic_set_i16_new(short hp, short attack, short defense, + internal static extern IdentifiablePointer static_statistic_set_i16_new(short hp, short attack, short defense, short specialAttack, short specialDefense, short speed); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] - internal static extern IntPtr static_statistic_set_i32_new(int hp, int attack, int defense, int specialAttack, + internal static extern IdentifiablePointer static_statistic_set_i32_new(int hp, int attack, int defense, int specialAttack, int specialDefense, int speed); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] diff --git a/PkmnLibRSharp/FFI/StaticData/StatisticSet.cs b/PkmnLibRSharp/FFI/StaticData/StatisticSet.cs index 0a9a260..0d207a2 100644 --- a/PkmnLibRSharp/FFI/StaticData/StatisticSet.cs +++ b/PkmnLibRSharp/FFI/StaticData/StatisticSet.cs @@ -7,27 +7,27 @@ namespace PkmnLibSharp.FFI.StaticData internal static class StatisticSet { [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] - internal static extern IntPtr statistic_set_u8_new(byte hp, byte attack, byte defense, byte specialAttack, + internal static extern IdentifiablePointer statistic_set_u8_new(byte hp, byte attack, byte defense, byte specialAttack, byte specialDefense, byte speed); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] - internal static extern IntPtr statistic_set_u16_new(ushort hp, ushort attack, ushort defense, + internal static extern IdentifiablePointer statistic_set_u16_new(ushort hp, ushort attack, ushort defense, ushort specialAttack, ushort specialDefense, ushort speed); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] - internal static extern IntPtr statistic_set_u32_new(uint hp, uint attack, uint defense, uint specialAttack, + internal static extern IdentifiablePointer statistic_set_u32_new(uint hp, uint attack, uint defense, uint specialAttack, uint specialDefense, uint speed); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] - internal static extern IntPtr statistic_set_i8_new(sbyte hp, sbyte attack, sbyte defense, sbyte specialAttack, + internal static extern IdentifiablePointer statistic_set_i8_new(sbyte hp, sbyte attack, sbyte defense, sbyte specialAttack, sbyte specialDefense, sbyte speed); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] - internal static extern IntPtr statistic_set_i16_new(short hp, short attack, short defense, short specialAttack, + internal static extern IdentifiablePointer statistic_set_i16_new(short hp, short attack, short defense, short specialAttack, short specialDefense, short speed); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] - internal static extern IntPtr statistic_set_i32_new(int hp, int attack, int defense, int specialAttack, + internal static extern IdentifiablePointer statistic_set_i32_new(int hp, int attack, int defense, int specialAttack, int specialDefense, int speed); [DllImport(Data.DllName, CallingConvention = CallingConvention.Cdecl, CharSet = CharSet.Ansi)] diff --git a/PkmnLibRSharp/PkmnLibRSharp.csproj b/PkmnLibRSharp/PkmnLibRSharp.csproj index 31ec70f..dea5333 100644 --- a/PkmnLibRSharp/PkmnLibRSharp.csproj +++ b/PkmnLibRSharp/PkmnLibRSharp.csproj @@ -25,6 +25,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/PkmnLibRSharp/StaticData/Ability.cs b/PkmnLibRSharp/StaticData/Ability.cs index a1ba946..aba31b2 100644 --- a/PkmnLibRSharp/StaticData/Ability.cs +++ b/PkmnLibRSharp/StaticData/Ability.cs @@ -2,6 +2,7 @@ using System; using System.Collections.Generic; using System.Linq; using JetBrains.Annotations; +using PkmnLibSharp.FFI; using PkmnLibSharp.Utils; using Interface = PkmnLibSharp.FFI.StaticData.Ability; @@ -28,7 +29,7 @@ namespace PkmnLibSharp.StaticData true); } - internal Ability(IntPtr ptr, bool isOwner) : base(ptr, isOwner) + internal Ability(IdentifiablePointer ptr, bool isOwner) : base(ptr, isOwner) { } @@ -69,5 +70,10 @@ namespace PkmnLibSharp.StaticData cacheParameter?.Invalidate(); } } + + ~Ability() + { + Dispose(); + } } } \ No newline at end of file diff --git a/PkmnLibRSharp/StaticData/EffectParameter.cs b/PkmnLibRSharp/StaticData/EffectParameter.cs index f26f0af..db231a5 100644 --- a/PkmnLibRSharp/StaticData/EffectParameter.cs +++ b/PkmnLibRSharp/StaticData/EffectParameter.cs @@ -1,5 +1,6 @@ using System; using JetBrains.Annotations; +using PkmnLibSharp.FFI; using PkmnLibSharp.Utils; using Interface = PkmnLibSharp.FFI.StaticData.EffectParameter; @@ -14,7 +15,7 @@ namespace PkmnLibSharp.StaticData public object? Data { get; internal set; } } - internal EffectParameter(IntPtr ptr, bool isOwner) : base(ptr, isOwner) + internal EffectParameter(IdentifiablePointer ptr, bool isOwner) : base(ptr, isOwner) { } @@ -89,5 +90,10 @@ namespace PkmnLibSharp.StaticData var data = Data; return data is string ? $"{Type}(\"{data}\")" : $"{Type}({data})"; } + + ~EffectParameter() + { + Dispose(); + } } } \ No newline at end of file diff --git a/PkmnLibRSharp/StaticData/Form.cs b/PkmnLibRSharp/StaticData/Form.cs index 0ab474e..c6efa6b 100644 --- a/PkmnLibRSharp/StaticData/Form.cs +++ b/PkmnLibRSharp/StaticData/Form.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using PkmnLibSharp.FFI; using PkmnLibSharp.Utils; using Interface = PkmnLibSharp.FFI.StaticData.Form; @@ -22,7 +23,7 @@ namespace PkmnLibSharp.StaticData public LearnableMoves? LearnableMoves { get; internal set; } } - internal Form(IntPtr formPtr, bool isOwner) : base(formPtr, isOwner) + internal Form(IdentifiablePointer formPtr, bool isOwner) : base(formPtr, isOwner) { } @@ -77,5 +78,10 @@ namespace PkmnLibSharp.StaticData { Cache.LearnableMoves?.Invalidate(); } + + ~Form() + { + Dispose(); + } } } \ No newline at end of file diff --git a/PkmnLibRSharp/StaticData/GrowthRate.cs b/PkmnLibRSharp/StaticData/GrowthRate.cs index 93c6b02..cc0580f 100644 --- a/PkmnLibRSharp/StaticData/GrowthRate.cs +++ b/PkmnLibRSharp/StaticData/GrowthRate.cs @@ -44,5 +44,10 @@ namespace PkmnLibSharp.StaticData { return new object(); } + + ~LookupGrowthRate() + { + Dispose(); + } } } \ No newline at end of file diff --git a/PkmnLibRSharp/StaticData/Item.cs b/PkmnLibRSharp/StaticData/Item.cs index c328e0a..6c99432 100644 --- a/PkmnLibRSharp/StaticData/Item.cs +++ b/PkmnLibRSharp/StaticData/Item.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using PkmnLibSharp.FFI; using PkmnLibSharp.Utils; using Interface = PkmnLibSharp.FFI.StaticData.Item; @@ -103,7 +104,7 @@ namespace PkmnLibSharp.StaticData InitializePointer(ptr, true); } - internal Item(IntPtr ptr, bool isOwner) : base(ptr, isOwner) + internal Item(IdentifiablePointer ptr, bool isOwner) : base(ptr, isOwner) { } @@ -116,5 +117,10 @@ namespace PkmnLibSharp.StaticData protected override CacheData CreateCache() => new CacheData(); protected override void Destructor() => Interface.item_drop(Ptr); + + ~Item() + { + Dispose(); + } } } \ No newline at end of file diff --git a/PkmnLibRSharp/StaticData/LearnableMoves.cs b/PkmnLibRSharp/StaticData/LearnableMoves.cs index 9baed7f..ea59132 100644 --- a/PkmnLibRSharp/StaticData/LearnableMoves.cs +++ b/PkmnLibRSharp/StaticData/LearnableMoves.cs @@ -27,5 +27,10 @@ namespace PkmnLibSharp.StaticData protected override object CreateCache() => new object(); protected override void Destructor() => Interface.learnable_moves_drop(Ptr); + + ~LearnableMoves() + { + Dispose(); + } } } \ No newline at end of file diff --git a/PkmnLibRSharp/StaticData/Libraries/AbilityLibrary.cs b/PkmnLibRSharp/StaticData/Libraries/AbilityLibrary.cs index 535ad8c..98c05db 100644 --- a/PkmnLibRSharp/StaticData/Libraries/AbilityLibrary.cs +++ b/PkmnLibRSharp/StaticData/Libraries/AbilityLibrary.cs @@ -1,4 +1,5 @@ using System; +using PkmnLibSharp.FFI; using PkmnLibSharp.Utils; using Interface = PkmnLibSharp.FFI.StaticData.Libraries.ItemLibrary; @@ -10,7 +11,7 @@ namespace PkmnLibSharp.StaticData.Libraries { } - internal AbilityLibrary(IntPtr ptr, bool isOwner) : base(ptr, isOwner) + internal AbilityLibrary(IdentifiablePointer ptr, bool isOwner) : base(ptr, isOwner) { } @@ -24,7 +25,7 @@ namespace PkmnLibSharp.StaticData.Libraries protected override Ability? GetValueByKey(string key) { var ptr = Interface.item_library_get(Ptr, key.ToPtr()); - return ptr == IntPtr.Zero ? null : new Ability(ptr, false); + return ptr.Ptr == IntPtr.Zero ? null : new Ability(ptr, false); } public override string? GetKeyByIndex(ulong index) => @@ -37,5 +38,10 @@ namespace PkmnLibSharp.StaticData.Libraries value.Invalidate(); } } + + ~AbilityLibrary() + { + Dispose(); + } } } \ No newline at end of file diff --git a/PkmnLibRSharp/StaticData/Libraries/DataLibrary.cs b/PkmnLibRSharp/StaticData/Libraries/DataLibrary.cs index 9447300..41800c8 100644 --- a/PkmnLibRSharp/StaticData/Libraries/DataLibrary.cs +++ b/PkmnLibRSharp/StaticData/Libraries/DataLibrary.cs @@ -2,13 +2,14 @@ using System; using System.Collections; using System.Collections.Generic; using System.Linq; +using PkmnLibSharp.FFI; using PkmnLibSharp.Utils; namespace PkmnLibSharp.StaticData.Libraries { public abstract class DataLibrary : ExternPointer.CacheData>, IReadOnlyDictionary { - protected DataLibrary(IntPtr ptr, bool isOwner) : base(ptr, isOwner) + protected DataLibrary(IdentifiablePointer ptr, bool isOwner) : base(ptr, isOwner) { } @@ -90,5 +91,10 @@ namespace PkmnLibSharp.StaticData.Libraries { return GetEnumerator(); } + + ~DataLibrary() + { + Dispose(); + } } } \ No newline at end of file diff --git a/PkmnLibRSharp/StaticData/Libraries/GrowthRateLibrary.cs b/PkmnLibRSharp/StaticData/Libraries/GrowthRateLibrary.cs index 238e13f..81f4cf0 100644 --- a/PkmnLibRSharp/StaticData/Libraries/GrowthRateLibrary.cs +++ b/PkmnLibRSharp/StaticData/Libraries/GrowthRateLibrary.cs @@ -1,5 +1,6 @@ using System; using JetBrains.Annotations; +using PkmnLibSharp.FFI; using PkmnLibSharp.Utils; using Interface = PkmnLibSharp.FFI.StaticData.Libraries.GrowthRateLibrary; @@ -11,7 +12,7 @@ namespace PkmnLibSharp.StaticData.Libraries { } - internal GrowthRateLibrary(IntPtr ptr, bool isOwner) : base(ptr, isOwner) + internal GrowthRateLibrary(IdentifiablePointer ptr, bool isOwner) : base(ptr, isOwner) { } @@ -29,5 +30,10 @@ namespace PkmnLibSharp.StaticData.Libraries protected override object CreateCache() => new(); protected override void Destructor() => Interface.growth_rate_library_drop(Ptr); + + ~GrowthRateLibrary() + { + Dispose(); + } } } \ No newline at end of file diff --git a/PkmnLibRSharp/StaticData/Libraries/ItemLibrary.cs b/PkmnLibRSharp/StaticData/Libraries/ItemLibrary.cs index b4549e1..45c9037 100644 --- a/PkmnLibRSharp/StaticData/Libraries/ItemLibrary.cs +++ b/PkmnLibRSharp/StaticData/Libraries/ItemLibrary.cs @@ -1,4 +1,5 @@ using System; +using PkmnLibSharp.FFI; using PkmnLibSharp.Utils; using Interface = PkmnLibSharp.FFI.StaticData.Libraries.ItemLibrary; @@ -10,7 +11,7 @@ namespace PkmnLibSharp.StaticData.Libraries { } - internal ItemLibrary(IntPtr ptr, bool isOwner) : base(ptr, isOwner) + internal ItemLibrary(IdentifiablePointer ptr, bool isOwner) : base(ptr, isOwner) { } @@ -24,7 +25,7 @@ namespace PkmnLibSharp.StaticData.Libraries protected override Item? GetValueByKey(string key) { var ptr = Interface.item_library_get(Ptr, key.ToPtr()); - return ptr == IntPtr.Zero ? null : new Item(ptr, false); + return ptr.Ptr == IntPtr.Zero ? null : new Item(ptr, false); } public override string? GetKeyByIndex(ulong index) => @@ -37,5 +38,10 @@ namespace PkmnLibSharp.StaticData.Libraries value.Invalidate(); } } + + ~ItemLibrary() + { + Dispose(); + } } } \ No newline at end of file diff --git a/PkmnLibRSharp/StaticData/Libraries/LibrarySettings.cs b/PkmnLibRSharp/StaticData/Libraries/LibrarySettings.cs index 9834600..d95b930 100644 --- a/PkmnLibRSharp/StaticData/Libraries/LibrarySettings.cs +++ b/PkmnLibRSharp/StaticData/Libraries/LibrarySettings.cs @@ -1,4 +1,5 @@ using System; +using PkmnLibSharp.FFI; using PkmnLibSharp.Utils; using Interface = PkmnLibSharp.FFI.StaticData.Libraries.LibrarySettings; @@ -15,7 +16,7 @@ namespace PkmnLibSharp.StaticData.Libraries { } - internal LibrarySettings(IntPtr ptr, bool isOwner) : base(ptr, isOwner) + internal LibrarySettings(IdentifiablePointer ptr, bool isOwner) : base(ptr, isOwner) { } @@ -24,5 +25,10 @@ namespace PkmnLibSharp.StaticData.Libraries protected override CacheData CreateCache() => new(); protected override void Destructor() => Interface.library_settings_drop(Ptr); + + ~LibrarySettings() + { + Dispose(); + } } } \ No newline at end of file diff --git a/PkmnLibRSharp/StaticData/Libraries/MoveLibrary.cs b/PkmnLibRSharp/StaticData/Libraries/MoveLibrary.cs index e0a623a..e533ae8 100644 --- a/PkmnLibRSharp/StaticData/Libraries/MoveLibrary.cs +++ b/PkmnLibRSharp/StaticData/Libraries/MoveLibrary.cs @@ -1,5 +1,6 @@ using System; using System.Collections.Generic; +using PkmnLibSharp.FFI; using PkmnLibSharp.Utils; using Interface = PkmnLibSharp.FFI.StaticData.Libraries.MoveLibrary; @@ -11,7 +12,7 @@ namespace PkmnLibSharp.StaticData.Libraries { } - internal MoveLibrary(IntPtr ptr, bool isOwner) : base(ptr, isOwner) + internal MoveLibrary(IdentifiablePointer ptr, bool isOwner) : base(ptr, isOwner) { } @@ -28,7 +29,7 @@ namespace PkmnLibSharp.StaticData.Libraries protected override MoveData? GetValueByKey(string key) { var ptr = Interface.move_library_get(Ptr, key.ToPtr()); - return ptr == IntPtr.Zero ? null : new MoveData(ptr, false); + return ptr.Ptr == IntPtr.Zero ? null : new MoveData(ptr, false); } public override string? GetKeyByIndex(ulong index) => @@ -41,5 +42,10 @@ namespace PkmnLibSharp.StaticData.Libraries value.Invalidate(); } } + + ~MoveLibrary() + { + Dispose(); + } } } \ No newline at end of file diff --git a/PkmnLibRSharp/StaticData/Libraries/NatureLibrary.cs b/PkmnLibRSharp/StaticData/Libraries/NatureLibrary.cs index 8728a50..e25b435 100644 --- a/PkmnLibRSharp/StaticData/Libraries/NatureLibrary.cs +++ b/PkmnLibRSharp/StaticData/Libraries/NatureLibrary.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using PkmnLibSharp.FFI; using PkmnLibSharp.Utils; using Interface = PkmnLibSharp.FFI.StaticData.Libraries.NatureLibrary; @@ -17,20 +18,20 @@ namespace PkmnLibSharp.StaticData.Libraries { } - internal NatureLibrary(IntPtr ptr, bool isOwner) : base(ptr, isOwner) + internal NatureLibrary(IdentifiablePointer ptr, bool isOwner) : base(ptr, isOwner) { } - public bool TryGetNature(string name, out Nature nature) + public Optional TryGetNature(string name) { - if (Cache.Natures.TryGetValue(name, out nature)) - return true; + if (Cache.Natures.TryGetValue(name, out var nature)) + return nature; var naturePtr = Interface.nature_library_get_nature(Ptr, name.ToPtr()); - if (naturePtr == IntPtr.Zero) - return false; - nature = new Nature(naturePtr, false); + if (naturePtr.Ptr == IntPtr.Zero) + return Optional.None(); + nature = new Nature(naturePtr); Cache.Natures.Add(name, nature); - return true; + return nature; } public string GetNatureName(Nature nature) @@ -55,5 +56,10 @@ namespace PkmnLibSharp.StaticData.Libraries nature.Invalidate(); } } + + ~NatureLibrary() + { + Dispose(); + } } } \ No newline at end of file diff --git a/PkmnLibRSharp/StaticData/Libraries/SpeciesLibrary.cs b/PkmnLibRSharp/StaticData/Libraries/SpeciesLibrary.cs index 5222b69..928cc2d 100644 --- a/PkmnLibRSharp/StaticData/Libraries/SpeciesLibrary.cs +++ b/PkmnLibRSharp/StaticData/Libraries/SpeciesLibrary.cs @@ -1,4 +1,5 @@ using System; +using PkmnLibSharp.FFI; using PkmnLibSharp.Utils; using Interface = PkmnLibSharp.FFI.StaticData.Libraries.SpeciesLibrary; @@ -10,7 +11,7 @@ namespace PkmnLibSharp.StaticData.Libraries { } - internal SpeciesLibrary(IntPtr ptr, bool isOwner) : base(ptr, isOwner) + internal SpeciesLibrary(IdentifiablePointer ptr, bool isOwner) : base(ptr, isOwner) { } @@ -24,7 +25,7 @@ namespace PkmnLibSharp.StaticData.Libraries protected override Species? GetValueByKey(string key) { var ptr = Interface.species_library_get(Ptr, key.ToPtr()); - return ptr == IntPtr.Zero ? null : new Species(ptr, false); + return ptr.Ptr == IntPtr.Zero ? null : new Species(ptr, false); } public override string? GetKeyByIndex(ulong index) => @@ -37,5 +38,10 @@ namespace PkmnLibSharp.StaticData.Libraries value.Invalidate(); } } + + ~SpeciesLibrary() + { + Dispose(); + } } } \ No newline at end of file diff --git a/PkmnLibRSharp/StaticData/Libraries/StaticData.cs b/PkmnLibRSharp/StaticData/Libraries/StaticData.cs index ce1cd86..06619a2 100644 --- a/PkmnLibRSharp/StaticData/Libraries/StaticData.cs +++ b/PkmnLibRSharp/StaticData/Libraries/StaticData.cs @@ -64,5 +64,10 @@ namespace PkmnLibSharp.StaticData.Libraries Cache.NatureLibrary?.Invalidate(); Cache.AbilityLibrary?.Invalidate(); } + + ~StaticData() + { + Dispose(); + } } } \ No newline at end of file diff --git a/PkmnLibRSharp/StaticData/Libraries/TypeLibrary.cs b/PkmnLibRSharp/StaticData/Libraries/TypeLibrary.cs index 4859289..09b3dcb 100644 --- a/PkmnLibRSharp/StaticData/Libraries/TypeLibrary.cs +++ b/PkmnLibRSharp/StaticData/Libraries/TypeLibrary.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using PkmnLibSharp.FFI; using PkmnLibSharp.Utils; using Interface = PkmnLibSharp.FFI.StaticData.Libraries.TypeLibrary; @@ -18,7 +19,7 @@ namespace PkmnLibSharp.StaticData.Libraries { } - internal TypeLibrary(IntPtr ptr, bool isOwner) : base(ptr, isOwner) + internal TypeLibrary(IdentifiablePointer ptr, bool isOwner) : base(ptr, isOwner) { } @@ -61,5 +62,10 @@ namespace PkmnLibSharp.StaticData.Libraries protected override CacheData CreateCache() => new(); protected override void Destructor() => Interface.type_library_drop(Ptr); + + ~TypeLibrary() + { + Dispose(); + } } } \ No newline at end of file diff --git a/PkmnLibRSharp/StaticData/MoveData.cs b/PkmnLibRSharp/StaticData/MoveData.cs index b42767a..c54178a 100644 --- a/PkmnLibRSharp/StaticData/MoveData.cs +++ b/PkmnLibRSharp/StaticData/MoveData.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using PkmnLibSharp.FFI; using PkmnLibSharp.Utils; using Interface = PkmnLibSharp.FFI.StaticData.MoveData; @@ -76,7 +77,7 @@ namespace PkmnLibSharp.StaticData public SecondaryEffect? SecondaryEffect { get; internal set; } } - internal MoveData(IntPtr ptr, bool isOwner) : base(ptr, isOwner) + internal MoveData(IdentifiablePointer ptr, bool isOwner) : base(ptr, isOwner) { } @@ -108,7 +109,7 @@ namespace PkmnLibSharp.StaticData if (Cache.SecondaryEffect != null) return Cache.SecondaryEffect; var effect = Interface.move_data_secondary_effect(Ptr); - if (effect == IntPtr.Zero) + if (effect.Ptr == IntPtr.Zero) return null; Cache.SecondaryEffect = new SecondaryEffect(effect, false); return Cache.SecondaryEffect; @@ -135,5 +136,10 @@ namespace PkmnLibSharp.StaticData base.InvalidateChildren(); Cache.SecondaryEffect?.Invalidate(); } + + ~MoveData() + { + Dispose(); + } } } \ No newline at end of file diff --git a/PkmnLibRSharp/StaticData/Nature.cs b/PkmnLibRSharp/StaticData/Nature.cs index d8effe3..9814118 100644 --- a/PkmnLibRSharp/StaticData/Nature.cs +++ b/PkmnLibRSharp/StaticData/Nature.cs @@ -1,4 +1,5 @@ using System; +using PkmnLibSharp.FFI; using PkmnLibSharp.Utils; using Interface = PkmnLibSharp.FFI.StaticData.Nature; @@ -18,7 +19,7 @@ namespace PkmnLibSharp.StaticData { } - internal Nature(IntPtr ptr, bool isOwner) : base(ptr, isOwner) + internal Nature(IdentifiablePointer ptr) : base(ptr, true) { } @@ -52,5 +53,10 @@ namespace PkmnLibSharp.StaticData { Interface.nature_drop(Ptr); } + + ~Nature() + { + Dispose(); + } } } \ No newline at end of file diff --git a/PkmnLibRSharp/StaticData/SecondaryEffect.cs b/PkmnLibRSharp/StaticData/SecondaryEffect.cs index d651f96..e0e3cb0 100644 --- a/PkmnLibRSharp/StaticData/SecondaryEffect.cs +++ b/PkmnLibRSharp/StaticData/SecondaryEffect.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using PkmnLibSharp.FFI; using PkmnLibSharp.Utils; using Interface = PkmnLibSharp.FFI.StaticData.MoveData; @@ -15,7 +16,7 @@ namespace PkmnLibSharp.StaticData public CachedExternArray? Parameters { get; internal set; } } - internal SecondaryEffect(IntPtr ptr, bool isOwner) : base(ptr, isOwner) + internal SecondaryEffect(IdentifiablePointer ptr, bool isOwner) : base(ptr, isOwner) { } @@ -31,10 +32,11 @@ namespace PkmnLibSharp.StaticData public float Chance => Cache.Chance ??= Interface.secondary_effect_chance(Ptr); public string Name => Cache.Name ?? (Cache.Name = Interface.secondary_effect_effect_name(Ptr).PtrString()!); - public IReadOnlyList Parameters => - Cache.Parameters ??= new CachedExternArray( - Interface.secondary_effect_parameter_length(Ptr), + public IReadOnlyList GetParameters() + { + return Cache.Parameters ??= new CachedExternArray(Interface.secondary_effect_parameter_length(Ptr), arg => new EffectParameter(Interface.secondary_effect_parameter_get(Ptr, arg), false)); + } protected override CacheData CreateCache() { @@ -57,5 +59,10 @@ namespace PkmnLibSharp.StaticData } } } + + ~SecondaryEffect() + { + Dispose(); + } } } \ No newline at end of file diff --git a/PkmnLibRSharp/StaticData/Species.cs b/PkmnLibRSharp/StaticData/Species.cs index 72cc9d4..904fe37 100644 --- a/PkmnLibRSharp/StaticData/Species.cs +++ b/PkmnLibRSharp/StaticData/Species.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using PkmnLibSharp.FFI; using PkmnLibSharp.Utils; using Interface = PkmnLibSharp.FFI.StaticData.Species; @@ -18,7 +19,7 @@ namespace PkmnLibSharp.StaticData public Dictionary Forms { get; } = new(); } - internal Species(IntPtr ptr, bool isOwner) : base(ptr, isOwner) + internal Species(IdentifiablePointer ptr, bool isOwner) : base(ptr, isOwner) { } @@ -27,7 +28,7 @@ namespace PkmnLibSharp.StaticData { var flagsPtrArray = flags.Select(x => x.ToPtr()).ToArray(); var ptr = Interface.species_new(id, name.ToPtr(), genderRate, growthRate.ToPtr(), captureRate, - defaultForm.TakeOwnershipAndInvalidate(), flagsPtrArray.ArrayPtr(), (ulong)flags.Count); + defaultForm.Ptr, flagsPtrArray.ArrayPtr(), (ulong)flags.Count); InitializePointer(ptr, true); } @@ -42,7 +43,7 @@ namespace PkmnLibSharp.StaticData if (Cache.Forms.TryGetValue(formName, out form)) return true; var formPtr = Interface.species_get_form(Ptr, formName.ToPtr()); - if (formPtr == IntPtr.Zero) + if (formPtr.Ptr == IntPtr.Zero) { form = null; return false; @@ -66,5 +67,10 @@ namespace PkmnLibSharp.StaticData form.Value.Invalidate(); } } + + ~Species() + { + Dispose(); + } } } \ No newline at end of file diff --git a/PkmnLibRSharp/StaticData/StaticStatisticSet.cs b/PkmnLibRSharp/StaticData/StaticStatisticSet.cs index 1bbe96d..9d86f20 100644 --- a/PkmnLibRSharp/StaticData/StaticStatisticSet.cs +++ b/PkmnLibRSharp/StaticData/StaticStatisticSet.cs @@ -1,5 +1,6 @@ using System; using JetBrains.Annotations; +using PkmnLibSharp.FFI; using PkmnLibSharp.Utils; using Interface = PkmnLibSharp.FFI.StaticData.StaticStatisticSet; @@ -17,7 +18,7 @@ namespace PkmnLibSharp.StaticData public T? Speed { get; internal set; } } - internal StaticStatisticSet(IntPtr ptr, bool isOwner) : base(ptr, isOwner) + internal StaticStatisticSet(IdentifiablePointer ptr, bool isOwner) : base(ptr, isOwner) { } @@ -129,5 +130,10 @@ namespace PkmnLibSharp.StaticData else if (typeof(T) == typeof(short)) Interface.static_statistic_set_i16_drop(Ptr); else if (typeof(T) == typeof(int)) Interface.static_statistic_set_i32_drop(Ptr); } + + ~StaticStatisticSet() + { + Dispose(); + } } } \ No newline at end of file diff --git a/PkmnLibRSharp/StaticData/StatisticSet.cs b/PkmnLibRSharp/StaticData/StatisticSet.cs index 9cdbc01..8c88210 100644 --- a/PkmnLibRSharp/StaticData/StatisticSet.cs +++ b/PkmnLibRSharp/StaticData/StatisticSet.cs @@ -5,13 +5,8 @@ using Interface = PkmnLibSharp.FFI.StaticData.StatisticSet; namespace PkmnLibSharp.StaticData { - public class StatisticSet : ExternPointer.CacheData> where T : struct, IConvertible + public class StatisticSet : ExternPointer where T : struct, IConvertible { - public class CacheData - { - // While we require cache types for all pointer data, we can't make caching assumptions for this type. - // As such, this is empty (and never instantiated). - } public StatisticSet(T hp, T attack, T defense, T specialAttack, T specialDefense, T speed) { @@ -109,10 +104,7 @@ namespace PkmnLibSharp.StaticData } - protected override CacheData CreateCache() - { - return new CacheData(); - } + protected override object CreateCache() => new(); protected override void Destructor() { @@ -123,5 +115,10 @@ namespace PkmnLibSharp.StaticData else if (typeof(T) == typeof(short)) Interface.statistic_set_i16_drop(Ptr); else if (typeof(T) == typeof(int)) Interface.statistic_set_i32_drop(Ptr); } + + ~StatisticSet() + { + Dispose(); + } } } \ No newline at end of file diff --git a/PkmnLibRSharp/Utils/BasePointer.cs b/PkmnLibRSharp/Utils/BasePointer.cs new file mode 100644 index 0000000..31d7073 --- /dev/null +++ b/PkmnLibRSharp/Utils/BasePointer.cs @@ -0,0 +1,70 @@ +using System; +using PkmnLibSharp.FFI; + +namespace PkmnLibSharp.Utils +{ + public abstract class BasePointer : IDisposable + where TCache : class + { + private IntPtr _ptr; + private ulong _identifier; + private TCache? _cache; + + protected BasePointer() + { + + } + + protected BasePointer(IntPtr ptr, ulong identifier = 0) + { + _ptr = ptr; + _identifier = identifier; + } + + protected BasePointer(IdentifiablePointer ptr) + { + _ptr = ptr.Ptr; + _identifier = ptr.Identifier; + } + + protected internal void InitializePointer(IntPtr ptr, ulong identifier = 0) + { + _ptr = ptr; + _identifier = identifier; + } + + protected internal void InitializePointer(IdentifiablePointer ptr) + { + _ptr = ptr.Ptr; + _identifier = ptr.Identifier; + } + + protected internal ulong Identifier => _identifier; + + + internal virtual IntPtr Ptr => _ptr; + + protected abstract TCache CreateCache(); + + internal TCache Cache + { + get + { + if (_cache == null && _identifier != 0) + { + _cache = CacheHandler.GetCache(_identifier, CreateCache); + } + + return _cache!; + } + } + + protected bool HasCache => _cache != null; + + protected abstract void Destructor(); + public virtual void Dispose() + { + + } + } +} \ No newline at end of file diff --git a/PkmnLibRSharp/Utils/CacheHandler.cs b/PkmnLibRSharp/Utils/CacheHandler.cs index 59b1984..6a9c481 100644 --- a/PkmnLibRSharp/Utils/CacheHandler.cs +++ b/PkmnLibRSharp/Utils/CacheHandler.cs @@ -5,14 +5,14 @@ namespace PkmnLibSharp.Utils { internal static class CacheHandler { - private static readonly ConcurrentDictionary Caches = new(); + private static readonly ConcurrentDictionary Caches = new(); - internal static T GetCache(IntPtr ptr, Func ctor) + internal static T GetCache(ulong id, Func ctor) { - if (!Caches.TryGetValue(ptr, out var cache)) + if (!Caches.TryGetValue(id, out var cache)) { cache = ctor(); - Caches.TryAdd(ptr, cache); + Caches.TryAdd(id, cache); } if (cache.GetType() != typeof(T)) @@ -23,9 +23,9 @@ namespace PkmnLibSharp.Utils return (T)cache; } - internal static void RemoveCache(IntPtr ptr) + internal static void RemoveCache(ulong id) { - Caches.TryRemove(ptr, out _); + Caches.TryRemove(id, out _); } } } \ No newline at end of file diff --git a/PkmnLibRSharp/Utils/ExternPointer.cs b/PkmnLibRSharp/Utils/ExternPointer.cs index dc607fc..c7c6bdd 100644 --- a/PkmnLibRSharp/Utils/ExternPointer.cs +++ b/PkmnLibRSharp/Utils/ExternPointer.cs @@ -1,27 +1,17 @@ using System; using System.Runtime.CompilerServices; +using PkmnLibSharp.FFI; [assembly: InternalsVisibleTo("PkmnLibRSharp")] namespace PkmnLibSharp.Utils { - public abstract class ExternPointer : IDisposable + public abstract class ExternPointer : BasePointer where TCache : class { - private IntPtr _ptr; private bool _isOwner; private bool _isInvalidated; private bool _isDisposed; - private TCache? _cache; - - protected abstract TCache CreateCache(); - internal TCache Cache - { - get { return _cache ??= CacheHandler.GetCache(_ptr, CreateCache); } - } - - protected bool HasCache => _cache != null; - protected ExternPointer() { @@ -31,16 +21,26 @@ namespace PkmnLibSharp.Utils { InitializePointer(ptr, isOwner); } - - protected void InitializePointer(IntPtr ptr, bool isOwner) + + protected ExternPointer(IdentifiablePointer ptr, bool isOwner) : base(ptr) { - _ptr = ptr; _isOwner = isOwner; } - protected abstract void Destructor(); - internal IntPtr Ptr + protected void InitializePointer(IntPtr ptr, bool isOwner) + { + InitializePointer(ptr); + _isOwner = isOwner; + } + + protected void InitializePointer(IdentifiablePointer ptr, bool isOwner) + { + InitializePointer(ptr); + _isOwner = isOwner; + } + + internal override IntPtr Ptr { get { @@ -48,7 +48,7 @@ namespace PkmnLibSharp.Utils { throw new Exception("Pointer was used after invalidate"); } - return _ptr; + return base.Ptr; } } @@ -72,13 +72,13 @@ namespace PkmnLibSharp.Utils internal void Invalidate() { _isInvalidated = true; - CacheHandler.RemoveCache(_ptr); + CacheHandler.RemoveCache(Identifier); InvalidateChildren(); } public virtual void InvalidateChildren(){} - public void Dispose() + public override void Dispose() { if (_isDisposed) return; @@ -88,10 +88,11 @@ namespace PkmnLibSharp.Utils if (!_isInvalidated) Destructor(); _isOwner = false; - CacheHandler.RemoveCache(_ptr); + CacheHandler.RemoveCache(Identifier); } _isDisposed = true; _isInvalidated = true; + GC.SuppressFinalize(this); } } } \ No newline at end of file diff --git a/PkmnLibRSharp/Utils/Optional.cs b/PkmnLibRSharp/Utils/Optional.cs new file mode 100644 index 0000000..ff95ead --- /dev/null +++ b/PkmnLibRSharp/Utils/Optional.cs @@ -0,0 +1,39 @@ +using System; + +namespace PkmnLibSharp.Utils +{ + public struct Optional : IDisposable + where T: IDisposable + { + public T? Value; + public bool HasValue; + + private Optional(T? value, bool hasValue) + { + Value = value; + HasValue = hasValue; + } + + public static implicit operator Optional(T value) + { + return new Optional(value, true); + } + + public static implicit operator T(Optional value) + { + return value.Value!; + } + + public static Optional None() + { + return new Optional(default, false); + } + + public void Dispose() + { +#pragma warning disable IDISP007 + Value?.Dispose(); +#pragma warning restore IDISP007 + } + } +} \ No newline at end of file diff --git a/PkmnLibRSharp/libpkmn_lib.so b/PkmnLibRSharp/libpkmn_lib.so index 7895da4..f7b9770 100755 --- a/PkmnLibRSharp/libpkmn_lib.so +++ b/PkmnLibRSharp/libpkmn_lib.so @@ -1,3 +1,3 @@ version https://git-lfs.github.com/spec/v1 -oid sha256:6d0a4633592e95f36dcfb44a74f2dac1fcf2a422ce7bd104940b084bc6e31bf6 -size 167803104 +oid sha256:cc955e10966e8681d674e96dfa364d77ce5043c11f45fe6c58e757054f18bd87 +size 168220320 diff --git a/PkmnLibRSharpTests/PkmnLibRSharpTests.csproj b/PkmnLibRSharpTests/PkmnLibRSharpTests.csproj index a05dceb..dcce839 100644 --- a/PkmnLibRSharpTests/PkmnLibRSharpTests.csproj +++ b/PkmnLibRSharpTests/PkmnLibRSharpTests.csproj @@ -14,6 +14,10 @@ + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/PkmnLibRSharpTests/StaticData/AbilityTests.cs b/PkmnLibRSharpTests/StaticData/AbilityTests.cs index e30bae3..d754b30 100644 --- a/PkmnLibRSharpTests/StaticData/AbilityTests.cs +++ b/PkmnLibRSharpTests/StaticData/AbilityTests.cs @@ -26,10 +26,14 @@ namespace PkmnLibRSharpTests.StaticData using var ability = new Ability("", "", new EffectParameter[] { new(100), new(false), new("foobar"), new(true) }); Assert.AreEqual(4, ability.ParameterLength); - Assert.AreEqual(100, ability.GetParameter(0).Data); - Assert.AreEqual(false, ability.GetParameter(1).Data); - Assert.AreEqual("foobar", ability.GetParameter(2).Data); - Assert.AreEqual(true, ability.GetParameter(3).Data); + using var p1 = ability.GetParameter(0); + Assert.AreEqual(100, p1.Data); + using var p2 = ability.GetParameter(1); + Assert.AreEqual(false, p2.Data); + using var p3 = ability.GetParameter(2); + Assert.AreEqual("foobar", p3.Data); + using var p4 = ability.GetParameter(3); + Assert.AreEqual(true, p4.Data); } } } \ No newline at end of file diff --git a/PkmnLibRSharpTests/StaticData/GrowthRateTests.cs b/PkmnLibRSharpTests/StaticData/GrowthRateTests.cs index 617c367..1adfa2f 100644 --- a/PkmnLibRSharpTests/StaticData/GrowthRateTests.cs +++ b/PkmnLibRSharpTests/StaticData/GrowthRateTests.cs @@ -8,30 +8,27 @@ namespace PkmnLibRSharpTests.StaticData [Test] public void CreateAndDropLookupGrowthRate() { - var growthRate = new LookupGrowthRate(new uint[] { 0, 1, 5, 10, 20, 100, 200, 500 }); - growthRate.Dispose(); + using var growthRate = new LookupGrowthRate(new uint[] { 0, 1, 5, 10, 20, 100, 200, 500 }); } [Test] public void LookupGrowthRateCalculateLevel() { - var growthRate = new LookupGrowthRate(new uint[] { 0, 1, 5, 10, 20, 100, 200, 500 }); + using var growthRate = new LookupGrowthRate(new uint[] { 0, 1, 5, 10, 20, 100, 200, 500 }); Assert.AreEqual(1, growthRate.CalculateLevel(0)); Assert.AreEqual(2, growthRate.CalculateLevel(1)); Assert.AreEqual(2, growthRate.CalculateLevel(2)); Assert.AreEqual(3, growthRate.CalculateLevel(5)); - growthRate.Dispose(); } [Test] public void LookupGrowthRateCalculateExperience() { - var growthRate = new LookupGrowthRate(new uint[] { 0, 1, 5, 10, 20, 100, 200, 500 }); + using var growthRate = new LookupGrowthRate(new uint[] { 0, 1, 5, 10, 20, 100, 200, 500 }); Assert.AreEqual(0, growthRate.CalculateExperience(1)); Assert.AreEqual(1, growthRate.CalculateExperience(2)); Assert.AreEqual(5, growthRate.CalculateExperience(3)); Assert.AreEqual(10, growthRate.CalculateExperience(4)); - growthRate.Dispose(); } } diff --git a/PkmnLibRSharpTests/StaticData/Libraries/NatureLibraryTests.cs b/PkmnLibRSharpTests/StaticData/Libraries/NatureLibraryTests.cs index 27c31ef..9771d00 100644 --- a/PkmnLibRSharpTests/StaticData/Libraries/NatureLibraryTests.cs +++ b/PkmnLibRSharpTests/StaticData/Libraries/NatureLibraryTests.cs @@ -29,8 +29,10 @@ namespace PkmnLibRSharpTests.StaticData.Libraries using var nature1 = new Nature(Statistic.Attack, Statistic.Defense); library.LoadNature("foo", nature1); - Assert.That(library.TryGetNature("foo", out var n)); - Assert.AreEqual(Statistic.Attack, n.IncreasedStat); + using (var n = library.TryGetNature("foo")) + { + Assert.AreEqual(Statistic.Attack, n.Value!.IncreasedStat); + } } [Test] @@ -39,12 +41,17 @@ namespace PkmnLibRSharpTests.StaticData.Libraries using var library = new NatureLibrary(0); using var nature1 = new Nature(Statistic.Attack, Statistic.Defense); library.LoadNature("foo", nature1); - - Assert.That(library.TryGetNature("foo", out var n)); - Assert.AreEqual(Statistic.Attack, n.IncreasedStat); - - Assert.That(library.TryGetNature("foo", out n)); - Assert.AreEqual(Statistic.Attack, n.IncreasedStat); + + using (var n = library.TryGetNature("foo")) + { + Assert.That(n.HasValue); + Assert.AreEqual(Statistic.Attack, n.Value!.IncreasedStat); + } + using (var n = library.TryGetNature("foo")) + { + Assert.That(n.HasValue); + Assert.AreEqual(Statistic.Attack, n.Value!.IncreasedStat); + } } [Test] @@ -52,8 +59,9 @@ namespace PkmnLibRSharpTests.StaticData.Libraries { using var library = new NatureLibrary(0); using var nature1 = new Nature(Statistic.Attack, Statistic.Defense); - - Assert.False(library.TryGetNature("foo", out _)); + + using var n = library.TryGetNature("foo"); + Assert.False(n.HasValue); } [Test] @@ -63,8 +71,10 @@ namespace PkmnLibRSharpTests.StaticData.Libraries using var nature1 = new Nature(Statistic.Attack, Statistic.Defense); library.LoadNature("foo", nature1); - Assert.That(library.TryGetNature("foo", out var n)); - Assert.AreEqual("foo", library.GetNatureName(n)); + using (var n = library.TryGetNature("foo")) + { + Assert.AreEqual("foo", library.GetNatureName(n)); + } } }