From f7a519754d31313a5312a01a9c569edf76d15bac Mon Sep 17 00:00:00 2001 From: Green Sky Date: Wed, 22 May 2024 16:05:05 +0200 Subject: [PATCH] allow for pointer types in getters (was done for function pointers) --- solanaceae/plugin/solana_plugin_v1.h | 16 ++++++++++------ solanaceae/plugin/version_helper.inl | 15 +++++++++++++++ 2 files changed, 25 insertions(+), 6 deletions(-) diff --git a/solanaceae/plugin/solana_plugin_v1.h b/solanaceae/plugin/solana_plugin_v1.h index 58e4a1d..5a47a48 100644 --- a/solanaceae/plugin/solana_plugin_v1.h +++ b/solanaceae/plugin/solana_plugin_v1.h @@ -87,12 +87,16 @@ static void plug_provideInstance(const SolanaAPI* solana_api, const char* id, co // ---------- resolve optional ---------- template -static T* plug_resolveInstanceOptional(const SolanaAPI* solana_api, const char* id, const char* version) { - return static_cast(solana_api->resolveInstance(id, version)); +static auto plug_resolveInstanceOptional(const SolanaAPI* solana_api, const char* id, const char* version) { + if constexpr (internal::is_pointer::value) { + return reinterpret_cast(solana_api->resolveInstance(id, version)); + } else { + return static_cast(solana_api->resolveInstance(id, version)); + } } template -static T* plug_resolveInstanceOptional(const SolanaAPI* solana_api, const char* id) { +static auto plug_resolveInstanceOptional(const SolanaAPI* solana_api, const char* id) { return plug_resolveInstanceOptional(solana_api, id, internal::g_type_version::version); } @@ -104,15 +108,15 @@ struct ResolveException { }; template -static T* plug_resolveInstance(const SolanaAPI* solana_api, const char* id, const char* version) { - T* res = plug_resolveInstanceOptional(solana_api, id, version); +static auto plug_resolveInstance(const SolanaAPI* solana_api, const char* id, const char* version) { + auto res = plug_resolveInstanceOptional(solana_api, id, version); if (res == nullptr) { throw ResolveException{"missing " + std::string{id} + " " + version}; } return res; } template -static T* plug_resolveInstance(const SolanaAPI* solana_api, const char* id) { +static auto plug_resolveInstance(const SolanaAPI* solana_api, const char* id) { return plug_resolveInstance(solana_api, id, internal::g_type_version::version); } diff --git a/solanaceae/plugin/version_helper.inl b/solanaceae/plugin/version_helper.inl index 6876ed5..b19a923 100644 --- a/solanaceae/plugin/version_helper.inl +++ b/solanaceae/plugin/version_helper.inl @@ -21,5 +21,20 @@ namespace internal { public: static constexpr const char* version = get_version(); }; + + // more type support + + struct true_type { + const static bool value {true}; + }; + struct false_type { + const static bool value {false}; + }; + + template struct is_pointer : false_type {}; + template struct is_pointer : true_type {}; + template struct is_pointer : true_type {}; + template struct is_pointer : true_type {}; + template struct is_pointer : true_type {}; } // internal