diff --git a/develop/manuals/meta_manuals/scopes_manual.cpp b/develop/manuals/meta_manuals/scopes_manual.cpp index 47de3d5..5ab51b7 100644 --- a/develop/manuals/meta_manuals/scopes_manual.cpp +++ b/develop/manuals/meta_manuals/scopes_manual.cpp @@ -80,8 +80,8 @@ TEST_CASE("meta/meta_examples/scopes/local") { const meta::variable unit3_variable = math_scope.get_variable("unit3"); // checks and uses found variables with functions - CHECK(unit2_variable.get().get_as() == ivec2{1,1}); - CHECK(unit3_variable.get().get_as() == ivec3{1,1,1}); + CHECK(unit2_variable.get_as() == ivec2{1,1}); + CHECK(unit3_variable.get_as() == ivec3{1,1,1}); CHECK(dot2_function(unit2_variable.get(), unit2_variable.get()).get_as() == 2); CHECK(dot3_function(unit3_variable.get(), unit3_variable.get()).get_as() == 3); } diff --git a/develop/manuals/meta_manuals/variable_manual.cpp b/develop/manuals/meta_manuals/variable_manual.cpp index 8d9a261..e303db7 100644 --- a/develop/manuals/meta_manuals/variable_manual.cpp +++ b/develop/manuals/meta_manuals/variable_manual.cpp @@ -44,6 +44,6 @@ TEST_CASE("meta/meta_examples/variable/usage") { // prints all variables in the scope std::cout << "* " << constants_scope.get_name() << std::endl; for ( auto&& [index, variable] : constants_scope.get_variables() ) { - std::cout << " - " << index.get_name() << ":" << variable.get().get_as() << std::endl; + std::cout << " - " << index.get_name() << ":" << variable.get_as() << std::endl; } } diff --git a/develop/singles/headers/meta.hpp/meta_all.hpp b/develop/singles/headers/meta.hpp/meta_all.hpp index ad2ba18..a0e2c2d 100644 --- a/develop/singles/headers/meta.hpp/meta_all.hpp +++ b/develop/singles/headers/meta.hpp/meta_all.hpp @@ -2668,6 +2668,9 @@ namespace meta_hpp template < typename Instance > [[nodiscard]] uvalue get(Instance&& instance) const; + template < typename T, typename Instance > + [[nodiscard]] T get_as(Instance&& instance) const; + template < typename Instance, typename Value > void set(Instance&& instance, Value&& value) const; @@ -2777,6 +2780,9 @@ namespace meta_hpp [[nodiscard]] uvalue get() const; + template < typename T > + [[nodiscard]] T get_as() const; + template < typename Value > void set(Value&& value) const; @@ -6411,6 +6417,11 @@ namespace meta_hpp return state_->getter(vinst); } + template < typename T, typename Instance > + T member::get_as(Instance&& instance) const { + return get(std::forward(instance)).template get_as(); + } + template < typename Instance, typename Value > void member::set(Instance&& instance, Value&& value) const { using namespace detail; @@ -6899,6 +6910,11 @@ namespace meta_hpp return state_->getter(); } + template < typename T > + T variable::get_as() const { + return get().get_as(); + } + template < typename Value > void variable::set(Value&& value) const { using namespace detail; diff --git a/develop/untests/meta_states/member_tests.cpp b/develop/untests/meta_states/member_tests.cpp index b28c548..9c09201 100644 --- a/develop/untests/meta_states/member_tests.cpp +++ b/develop/untests/meta_states/member_tests.cpp @@ -86,6 +86,13 @@ TEST_CASE("meta/meta_states/member") { CHECK(vm.get(std::move(v)).get_as() == 1); CHECK(vm.get(std::move(std::as_const(v))).get_as() == 1); + CHECK(vm.get_as(v) == 1); + CHECK(vm.get_as(&v) == 1); + CHECK(vm.get_as(std::as_const(v)) == 1); + CHECK(vm.get_as(&std::as_const(v)) == 1); + CHECK(vm.get_as(std::move(v)) == 1); + CHECK(vm.get_as(std::move(std::as_const(v))) == 1); + CHECK(vm(v).get_as() == 1); CHECK(vm(&v).get_as() == 1); CHECK(vm(std::as_const(v)).get_as() == 1); @@ -279,13 +286,13 @@ TEST_CASE("meta/meta_states/member") { { clazz_1 v; CHECK(vm.get(v).get_type() == meta::resolve_type*>()); - CHECK(vm.get(v).get_as*>() == std::addressof(v.unique_int_member)); + CHECK(vm.get_as*>(v) == std::addressof(v.unique_int_member)); } { const clazz_1 v; CHECK(vm.get(v).get_type() == meta::resolve_type*>()); - CHECK(vm.get(v).get_as*>() == std::addressof(v.unique_int_member)); + CHECK(vm.get_as*>(v) == std::addressof(v.unique_int_member)); } } @@ -300,14 +307,14 @@ TEST_CASE("meta/meta_states/member") { clazz_1 v; using ref_t = std::reference_wrapper>; CHECK(vm.get(v).get_type() == meta::resolve_type()); - CHECK(vm.get(v).get_as().get() == v.unique_int_member); + CHECK(vm.get_as(v).get() == v.unique_int_member); } { const clazz_1 v; using ref_t = std::reference_wrapper>; CHECK(vm.get(v).get_type() == meta::resolve_type()); - CHECK(vm.get(v).get_as().get() == v.unique_int_member); + CHECK(vm.get_as(v).get() == v.unique_int_member); } } } diff --git a/develop/untests/meta_states/variable_tests.cpp b/develop/untests/meta_states/variable_tests.cpp index 8f249b7..a18776a 100644 --- a/develop/untests/meta_states/variable_tests.cpp +++ b/develop/untests/meta_states/variable_tests.cpp @@ -71,7 +71,7 @@ TEST_CASE("meta/meta_states/variable") { CHECK(vm.get_type() == meta::resolve_type(&clazz_1::int_variable)); CHECK(vm.get_name() == "int_variable"); - CHECK(vm.get().get_as() == 1); + CHECK(vm.get_as() == 1); CHECK(vm().get_as() == 1); CHECK(vm.is_settable_with()); @@ -84,7 +84,7 @@ TEST_CASE("meta/meta_states/variable") { CHECK_FALSE(vm.is_settable_with()); CHECK_FALSE(vm.is_settable_with(1.0)); - vm.set(10); CHECK(vm.get().get_as() == 10); + vm.set(10); CHECK(vm.get_as() == 10); vm(11); CHECK(vm().get_as() == 11); } @@ -95,7 +95,7 @@ TEST_CASE("meta/meta_states/variable") { CHECK(vm.get_type() == meta::resolve_type(&clazz_1::const_int_variable)); CHECK(vm.get_name() == "const_int_variable"); - CHECK(vm.get().get_as() == 2); + CHECK(vm.get_as() == 2); CHECK(vm().get_as() == 2); CHECK_FALSE(vm.is_settable_with()); @@ -108,7 +108,7 @@ TEST_CASE("meta/meta_states/variable") { CHECK_FALSE(vm.is_settable_with()); CHECK_FALSE(vm.is_settable_with(1.0)); - CHECK_THROWS(vm.set(10)); CHECK(vm.get().get_as() == 2); + CHECK_THROWS(vm.set(10)); CHECK(vm.get_as() == 2); CHECK_THROWS(vm(10)); CHECK(vm().get_as() == 2); } @@ -119,7 +119,7 @@ TEST_CASE("meta/meta_states/variable") { CHECK(vm.get_type() == meta::resolve_type(&clazz_1::ref_int_variable)); CHECK(vm.get_name() == "ref_int_variable"); - CHECK(vm.get().get_as() == 11); + CHECK(vm.get_as() == 11); CHECK(vm().get_as() == 11); CHECK(vm.is_settable_with()); @@ -132,7 +132,7 @@ TEST_CASE("meta/meta_states/variable") { CHECK_FALSE(vm.is_settable_with()); CHECK_FALSE(vm.is_settable_with(1.0)); - vm.set(20); CHECK(vm.get().get_as() == 20); + vm.set(20); CHECK(vm.get_as() == 20); vm(21); CHECK(vm().get_as() == 21); } @@ -143,7 +143,7 @@ TEST_CASE("meta/meta_states/variable") { CHECK(vm.get_type() == meta::resolve_type(&clazz_1::const_ref_int_variable)); CHECK(vm.get_name() == "const_ref_int_variable"); - CHECK(vm.get().get_as() == 2); + CHECK(vm.get_as() == 2); CHECK(vm().get_as() == 2); CHECK_FALSE(vm.is_settable_with()); @@ -156,7 +156,7 @@ TEST_CASE("meta/meta_states/variable") { CHECK_FALSE(vm.is_settable_with()); CHECK_FALSE(vm.is_settable_with(1.0)); - CHECK_THROWS(vm.set(10)); CHECK(vm.get().get_as() == 2); + CHECK_THROWS(vm.set(10)); CHECK(vm.get_as() == 2); CHECK_THROWS(vm(11)); CHECK(vm().get_as() == 2); } @@ -165,7 +165,7 @@ TEST_CASE("meta/meta_states/variable") { REQUIRE(vm); CHECK(vm.get().get_type() == meta::resolve_type*>()); - CHECK(vm.get().get_as*>() == std::addressof(clazz_1::unique_int_variable)); + CHECK(vm.get_as*>() == std::addressof(clazz_1::unique_int_variable)); { auto nv = std::make_unique(11); @@ -186,7 +186,7 @@ TEST_CASE("meta/meta_states/variable") { using ref_t = std::reference_wrapper>; CHECK(vm.get().get_type() == meta::resolve_type()); - CHECK(vm.get().get_as().get() == clazz_1::unique_int_variable); + CHECK(vm.get_as().get() == clazz_1::unique_int_variable); { auto nv = std::make_unique(13); @@ -206,7 +206,7 @@ TEST_CASE("meta/meta_states/variable") { REQUIRE(vm); CHECK(vm.get().get_type() == meta::resolve_type*>()); - CHECK(vm.get().get_as*>() == std::addressof(clazz_1::const_unique_int_variable)); + CHECK(vm.get_as*>() == std::addressof(clazz_1::const_unique_int_variable)); { auto nv = std::make_unique(11); @@ -222,7 +222,7 @@ TEST_CASE("meta/meta_states/variable") { using ref_t = std::reference_wrapper>; CHECK(vm.get().get_type() == meta::resolve_type()); - CHECK(vm.get().get_as().get() == clazz_1::const_unique_int_variable); + CHECK(vm.get_as().get() == clazz_1::const_unique_int_variable); { auto nv = std::make_unique(12); diff --git a/headers/meta.hpp/meta_states.hpp b/headers/meta.hpp/meta_states.hpp index 603b373..58e8cdd 100644 --- a/headers/meta.hpp/meta_states.hpp +++ b/headers/meta.hpp/meta_states.hpp @@ -254,6 +254,9 @@ namespace meta_hpp template < typename Instance > [[nodiscard]] uvalue get(Instance&& instance) const; + template < typename T, typename Instance > + [[nodiscard]] T get_as(Instance&& instance) const; + template < typename Instance, typename Value > void set(Instance&& instance, Value&& value) const; @@ -363,6 +366,9 @@ namespace meta_hpp [[nodiscard]] uvalue get() const; + template < typename T > + [[nodiscard]] T get_as() const; + template < typename Value > void set(Value&& value) const; diff --git a/headers/meta.hpp/meta_states/member.hpp b/headers/meta.hpp/meta_states/member.hpp index b2cac91..583b4a6 100644 --- a/headers/meta.hpp/meta_states/member.hpp +++ b/headers/meta.hpp/meta_states/member.hpp @@ -200,6 +200,11 @@ namespace meta_hpp return state_->getter(vinst); } + template < typename T, typename Instance > + T member::get_as(Instance&& instance) const { + return get(std::forward(instance)).template get_as(); + } + template < typename Instance, typename Value > void member::set(Instance&& instance, Value&& value) const { using namespace detail; diff --git a/headers/meta.hpp/meta_states/variable.hpp b/headers/meta.hpp/meta_states/variable.hpp index 4ec34d0..7269d12 100644 --- a/headers/meta.hpp/meta_states/variable.hpp +++ b/headers/meta.hpp/meta_states/variable.hpp @@ -145,6 +145,11 @@ namespace meta_hpp return state_->getter(); } + template < typename T > + T variable::get_as() const { + return get().get_as(); + } + template < typename Value > void variable::set(Value&& value) const { using namespace detail;