diff --git a/develop/singles/headers/meta.hpp/meta_all.hpp b/develop/singles/headers/meta.hpp/meta_all.hpp index 17229c2..3ae0d4c 100644 --- a/develop/singles/headers/meta.hpp/meta_all.hpp +++ b/develop/singles/headers/meta.hpp/meta_all.hpp @@ -3160,7 +3160,7 @@ namespace meta_hpp::detail typedef_map typedefs{}; variable_set variables{}; - [[nodiscard]] static scope_state_ptr make(std::string name, metadata_map metadata); + [[nodiscard]] static scope_state_ptr make(std::string name); }; struct variable_state final { @@ -3220,7 +3220,7 @@ namespace meta_hpp::detail return iter->second; } - auto state = scope_state::make(std::string{name}, metadata_map{}); + auto state = scope_state::make(std::string{name}); auto&& [iter, _] = scopes_.insert_or_assign(std::string{name}, std::move(state)); return iter->second; } @@ -3461,6 +3461,75 @@ namespace meta_hpp::detail }; } +namespace meta_hpp +{ + template < typename T > + [[nodiscard]] auto resolve_type() { + using namespace detail; + type_registry& registry = type_registry::instance(); + return registry.resolve_type>(); + } + + template < typename... Ts > + [[nodiscard]] any_type_list resolve_types() { + return { resolve_type()... }; + } +} + +namespace meta_hpp +{ + template < typename T > + [[nodiscard]] auto resolve_type(T&&) { + return resolve_type>(); + } + + template < typename... Ts > + [[nodiscard]] any_type_list resolve_types(type_list) { + return { resolve_type()... }; + } +} + +namespace meta_hpp +{ + template < detail::class_kind Class, typename... Args > + constructor_type resolve_constructor_type() { + using namespace detail; + type_registry& registry = type_registry::instance(); + return registry.resolve_constructor_type(); + } + + template < detail::class_kind Class > + destructor_type resolve_destructor_type() { + using namespace detail; + type_registry& registry = type_registry::instance(); + return registry.resolve_destructor_type(); + } +} + +namespace meta_hpp +{ + template < typename T > + [[nodiscard]] any_type resolve_polymorphic_type(T&& v) noexcept { + #if !defined(META_HPP_NO_RTTI) + using namespace detail; + type_registry& registry = type_registry::instance(); + return registry.get_type_by_rtti(typeid(v)); + #else + (void)v; + return any_type{}; + #endif + } +} + +namespace meta_hpp +{ + [[nodiscard]] inline scope resolve_scope(std::string_view name) { + using namespace detail; + state_registry& registry = state_registry::instance(); + return registry.resolve_scope(name); + } +} + namespace meta_hpp::detail { template < typename Class, typename... Args > @@ -3800,11 +3869,7 @@ namespace meta_hpp { class scope_bind final { public: - struct local_tag {}; - struct static_tag {}; - - explicit scope_bind(std::string name, metadata_map metadata, local_tag); - explicit scope_bind(std::string_view name, metadata_map metadata, static_tag); + explicit scope_bind(const scope& scope, metadata_map metadata); operator scope() const noexcept; // function_ @@ -3920,80 +3985,17 @@ namespace meta_hpp namespace meta_hpp { inline scope_bind local_scope_(std::string name, metadata_map metadata = {}) { - return scope_bind{std::move(name), std::move(metadata), scope_bind::local_tag()}; + scope local_scope{detail::scope_state::make(std::move(name))}; + return scope_bind{local_scope, std::move(metadata)}; } inline scope_bind static_scope_(std::string_view name, metadata_map metadata = {}) { - return scope_bind{name, std::move(metadata), scope_bind::static_tag()}; - } -} - -namespace meta_hpp -{ - template < typename T > - [[nodiscard]] auto resolve_type() { - using namespace detail; - type_registry& registry = type_registry::instance(); - return registry.resolve_type>(); + scope static_scope{resolve_scope(name)}; + return scope_bind{static_scope, std::move(metadata)}; } - template < typename... Ts > - [[nodiscard]] any_type_list resolve_types() { - return { resolve_type()... }; - } -} - -namespace meta_hpp -{ - template < typename T > - [[nodiscard]] auto resolve_type(T&&) { - return resolve_type>(); - } - - template < typename... Ts > - [[nodiscard]] any_type_list resolve_types(type_list) { - return { resolve_type()... }; - } -} - -namespace meta_hpp -{ - template < detail::class_kind Class, typename... Args > - constructor_type resolve_constructor_type() { - using namespace detail; - type_registry& registry = type_registry::instance(); - return registry.resolve_constructor_type(); - } - - template < detail::class_kind Class > - destructor_type resolve_destructor_type() { - using namespace detail; - type_registry& registry = type_registry::instance(); - return registry.resolve_destructor_type(); - } -} - -namespace meta_hpp -{ - template < typename T > - [[nodiscard]] any_type resolve_polymorphic_type(T&& v) noexcept { - #if !defined(META_HPP_NO_RTTI) - using namespace detail; - type_registry& registry = type_registry::instance(); - return registry.get_type_by_rtti(typeid(v)); - #else - (void)v; - return any_type{}; - #endif - } -} - -namespace meta_hpp -{ - [[nodiscard]] inline scope resolve_scope(std::string_view name) { - using namespace detail; - state_registry& registry = state_registry::instance(); - return registry.resolve_scope(name); + inline scope_bind extend_scope_(const scope& scope, metadata_map metadata = {}) { + return scope_bind{scope, std::move(metadata)}; } } @@ -4456,11 +4458,8 @@ namespace meta_hpp namespace meta_hpp { - inline scope_bind::scope_bind(std::string name, metadata_map metadata, local_tag) - : state_{detail::scope_state::make(std::move(name), std::move(metadata))} {} - - inline scope_bind::scope_bind(std::string_view name, metadata_map metadata, static_tag) - : state_{detail::state_access(resolve_scope(name))} { + inline scope_bind::scope_bind(const scope& scope, metadata_map metadata) + : state_{detail::state_access(scope)} { detail::insert_or_assign(state_->metadata, std::move(metadata)); } @@ -7568,10 +7567,9 @@ namespace meta_hpp namespace meta_hpp::detail { - inline scope_state_ptr scope_state::make(std::string name, metadata_map metadata) { + inline scope_state_ptr scope_state::make(std::string name) { return std::make_shared(scope_state{ .index{scope_index::make(std::move(name))}, - .metadata{std::move(metadata)}, }); } } diff --git a/develop/untests/meta_states/scope_tests.cpp b/develop/untests/meta_states/scope_tests.cpp index d788863..9cffa7b 100644 --- a/develop/untests/meta_states/scope_tests.cpp +++ b/develop/untests/meta_states/scope_tests.cpp @@ -204,3 +204,17 @@ TEST_CASE("meta/meta_states/scope") { CHECK(static_const_ivec3_var.get_type().get_data_type() == meta::resolve_type()); } } + +TEST_CASE("meta/meta_states/extend_scope") { + namespace meta = meta_hpp; + + const meta::scope math_scope = meta::local_scope_("math") + .typedef_("ivec2"); + + CHECK(math_scope.get_typedefs().size() == 1); + + meta::extend_scope_(math_scope) + .typedef_("ivec3"); + + CHECK(math_scope.get_typedefs().size() == 2); +} diff --git a/headers/meta.hpp/meta_binds.hpp b/headers/meta.hpp/meta_binds.hpp index adcd7bb..292e4f1 100644 --- a/headers/meta.hpp/meta_binds.hpp +++ b/headers/meta.hpp/meta_binds.hpp @@ -8,9 +8,7 @@ #include "meta_base.hpp" #include "meta_states.hpp" - -#include "meta_detail/state_registry.hpp" -#include "meta_detail/type_registry.hpp" +#include "meta_registry.hpp" namespace meta_hpp::detail { @@ -351,11 +349,7 @@ namespace meta_hpp { class scope_bind final { public: - struct local_tag {}; - struct static_tag {}; - - explicit scope_bind(std::string name, metadata_map metadata, local_tag); - explicit scope_bind(std::string_view name, metadata_map metadata, static_tag); + explicit scope_bind(const scope& scope, metadata_map metadata); operator scope() const noexcept; // function_ @@ -471,10 +465,16 @@ namespace meta_hpp namespace meta_hpp { inline scope_bind local_scope_(std::string name, metadata_map metadata = {}) { - return scope_bind{std::move(name), std::move(metadata), scope_bind::local_tag()}; + scope local_scope{detail::scope_state::make(std::move(name))}; + return scope_bind{local_scope, std::move(metadata)}; } inline scope_bind static_scope_(std::string_view name, metadata_map metadata = {}) { - return scope_bind{name, std::move(metadata), scope_bind::static_tag()}; + scope static_scope{resolve_scope(name)}; + return scope_bind{static_scope, std::move(metadata)}; + } + + inline scope_bind extend_scope_(const scope& scope, metadata_map metadata = {}) { + return scope_bind{scope, std::move(metadata)}; } } diff --git a/headers/meta.hpp/meta_binds/scope_bind.hpp b/headers/meta.hpp/meta_binds/scope_bind.hpp index e401fe1..c80ad82 100644 --- a/headers/meta.hpp/meta_binds/scope_bind.hpp +++ b/headers/meta.hpp/meta_binds/scope_bind.hpp @@ -12,11 +12,8 @@ namespace meta_hpp { - inline scope_bind::scope_bind(std::string name, metadata_map metadata, local_tag) - : state_{detail::scope_state::make(std::move(name), std::move(metadata))} {} - - inline scope_bind::scope_bind(std::string_view name, metadata_map metadata, static_tag) - : state_{detail::state_access(resolve_scope(name))} { + inline scope_bind::scope_bind(const scope& scope, metadata_map metadata) + : state_{detail::state_access(scope)} { detail::insert_or_assign(state_->metadata, std::move(metadata)); } diff --git a/headers/meta.hpp/meta_detail/state_registry.hpp b/headers/meta.hpp/meta_detail/state_registry.hpp index 2e57e76..2f39aef 100644 --- a/headers/meta.hpp/meta_detail/state_registry.hpp +++ b/headers/meta.hpp/meta_detail/state_registry.hpp @@ -49,7 +49,7 @@ namespace meta_hpp::detail return iter->second; } - auto state = scope_state::make(std::string{name}, metadata_map{}); + auto state = scope_state::make(std::string{name}); auto&& [iter, _] = scopes_.insert_or_assign(std::string{name}, std::move(state)); return iter->second; } diff --git a/headers/meta.hpp/meta_states.hpp b/headers/meta.hpp/meta_states.hpp index e14d33e..f0e4396 100644 --- a/headers/meta.hpp/meta_states.hpp +++ b/headers/meta.hpp/meta_states.hpp @@ -600,7 +600,7 @@ namespace meta_hpp::detail typedef_map typedefs{}; variable_set variables{}; - [[nodiscard]] static scope_state_ptr make(std::string name, metadata_map metadata); + [[nodiscard]] static scope_state_ptr make(std::string name); }; struct variable_state final { diff --git a/headers/meta.hpp/meta_states/scope.hpp b/headers/meta.hpp/meta_states/scope.hpp index 595bd56..924e7cb 100644 --- a/headers/meta.hpp/meta_states/scope.hpp +++ b/headers/meta.hpp/meta_states/scope.hpp @@ -19,10 +19,9 @@ namespace meta_hpp::detail { - inline scope_state_ptr scope_state::make(std::string name, metadata_map metadata) { + inline scope_state_ptr scope_state::make(std::string name) { return std::make_shared(scope_state{ .index{scope_index::make(std::move(name))}, - .metadata{std::move(metadata)}, }); } }