From de77303c7aabdd4658939daf397d2c1bffb8ddb5 Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Sat, 8 Jan 2022 06:26:55 +0700 Subject: [PATCH] add member and variable call operators --- headers/meta.hpp/meta_states.hpp | 11 ++++ headers/meta.hpp/meta_states/member.hpp | 10 +++ headers/meta.hpp/meta_states/variable.hpp | 9 +++ untests/meta_states/member_tests.cpp | 78 ++++++++++++++++++----- untests/meta_states/variable_tests.cpp | 10 ++- 5 files changed, 101 insertions(+), 17 deletions(-) diff --git a/headers/meta.hpp/meta_states.hpp b/headers/meta.hpp/meta_states.hpp index ae96b16..d6484cc 100644 --- a/headers/meta.hpp/meta_states.hpp +++ b/headers/meta.hpp/meta_states.hpp @@ -147,6 +147,12 @@ namespace meta_hpp template < typename Instance, typename Value > void set(Instance&& instance, Value&& value) const; + + template < typename Instance > + [[nodiscard]] value operator()(Instance&& instance) const; + + template < typename Instance, typename Value > + void operator()(Instance&& instance, Value&& value) const; private: detail::member_state_ptr state_; }; @@ -223,6 +229,11 @@ namespace meta_hpp template < typename Value > void set(Value&& value) const; + + [[nodiscard]] value operator()() const; + + template < typename Value > + void operator()(Value&& value) const; private: detail::variable_state_ptr state_; }; diff --git a/headers/meta.hpp/meta_states/member.hpp b/headers/meta.hpp/meta_states/member.hpp index 8490c3f..b09824b 100644 --- a/headers/meta.hpp/meta_states/member.hpp +++ b/headers/meta.hpp/meta_states/member.hpp @@ -123,4 +123,14 @@ namespace meta_hpp using namespace detail; state_->setter(inst{std::forward(instance)}, arg{std::forward(value)}); } + + template < typename Instance > + value member::operator()(Instance&& instance) const { + return get(std::forward(instance)); + } + + template < typename Instance, typename Value > + void member::operator()(Instance&& instance, Value&& value) const { + set(std::forward(instance), std::forward(value)); + } } diff --git a/headers/meta.hpp/meta_states/variable.hpp b/headers/meta.hpp/meta_states/variable.hpp index 044fdf8..2b01ba7 100644 --- a/headers/meta.hpp/meta_states/variable.hpp +++ b/headers/meta.hpp/meta_states/variable.hpp @@ -103,4 +103,13 @@ namespace meta_hpp using namespace detail; state_->setter(arg{std::forward(value)}); } + + inline value variable::operator()() const { + return get(); + } + + template < typename Value > + void variable::operator()(Value&& value) const { + set(std::forward(value)); + } } diff --git a/untests/meta_states/member_tests.cpp b/untests/meta_states/member_tests.cpp index 2d771de..9fa978d 100644 --- a/untests/meta_states/member_tests.cpp +++ b/untests/meta_states/member_tests.cpp @@ -12,6 +12,8 @@ namespace int int_member = 1; const int const_int_member = 2; }; + + struct clazz_2 {}; } TEST_CASE("meta/meta_states/member") { @@ -47,16 +49,38 @@ TEST_CASE("meta/meta_states/member") { CHECK(vm.get_name() == "int_member"); clazz_1 v; + clazz_2 v2; - CHECK(vm.get(v) == 1); - CHECK(vm.get(std::as_const(v)) == 1); - CHECK(vm.get(std::move(v)) == 1); - CHECK(vm.get(std::move(std::as_const(v))) == 1); + { + CHECK(vm.get(v) == 1); + CHECK(vm.get(std::as_const(v)) == 1); + CHECK(vm.get(std::move(v)) == 1); + CHECK(vm.get(std::move(std::as_const(v))) == 1); - CHECK_NOTHROW(vm.set(v, 10)); CHECK(vm.get(v) == 10); - CHECK_THROWS(vm.set(std::as_const(v), 11)); CHECK(vm.get(v) == 10); - CHECK_NOTHROW(vm.set(std::move(v), 12)); CHECK(vm.get(v) == 12); - CHECK_THROWS(vm.set(std::move(std::as_const(v)), 13)); CHECK(vm.get(v) == 12); + CHECK(vm(v) == 1); + CHECK(vm(std::as_const(v)) == 1); + CHECK(vm(std::move(v)) == 1); + CHECK(vm(std::move(std::as_const(v))) == 1); + + CHECK_THROWS(std::ignore = vm.get(v2)); + CHECK_THROWS(std::ignore = vm(v2)); + } + + { + CHECK_NOTHROW(vm.set(v, 10)); CHECK(vm.get(v) == 10); + CHECK_THROWS(vm.set(std::as_const(v), 11)); CHECK(vm.get(v) == 10); + CHECK_NOTHROW(vm.set(std::move(v), 12)); CHECK(vm.get(v) == 12); + CHECK_THROWS(vm.set(std::move(std::as_const(v)), 13)); CHECK(vm.get(v) == 12); + + CHECK_NOTHROW(vm(v, 13)); CHECK(vm(v) == 13); + CHECK_THROWS(vm(std::as_const(v), 14)); CHECK(vm(v) == 13); + CHECK_NOTHROW(vm(std::move(v), 15)); CHECK(vm(v) == 15); + CHECK_THROWS(vm(std::move(std::as_const(v)), 16)); CHECK(vm(v) == 15); + + CHECK_THROWS(vm.set(v2, 17)); + CHECK_THROWS(vm(v2, 17)); + CHECK(vm(v) == 15); + } } SUBCASE("const int") { @@ -67,15 +91,37 @@ TEST_CASE("meta/meta_states/member") { CHECK(vm.get_name() == "const_int_member"); clazz_1 v; + clazz_2 v2; - CHECK(vm.get(v) == 2); - CHECK(vm.get(std::as_const(v)) == 2); - CHECK(vm.get(std::move(v)) == 2); - CHECK(vm.get(std::move(std::as_const(v))) == 2); + { + CHECK(vm.get(v) == 2); + CHECK(vm.get(std::as_const(v)) == 2); + CHECK(vm.get(std::move(v)) == 2); + CHECK(vm.get(std::move(std::as_const(v))) == 2); - CHECK_THROWS(vm.set(v, 10)); CHECK(vm.get(v) == 2); - CHECK_THROWS(vm.set(std::as_const(v), 11)); CHECK(vm.get(v) == 2); - CHECK_THROWS(vm.set(std::move(v), 12)); CHECK(vm.get(v) == 2); - CHECK_THROWS(vm.set(std::move(std::as_const(v)), 13)); CHECK(vm.get(v) == 2); + CHECK(vm(v) == 2); + CHECK(vm(std::as_const(v)) == 2); + CHECK(vm(std::move(v)) == 2); + CHECK(vm(std::move(std::as_const(v))) == 2); + + CHECK_THROWS(std::ignore = vm.get(v2)); + CHECK_THROWS(std::ignore = vm(v2)); + } + + { + CHECK_THROWS(vm.set(v, 10)); CHECK(vm.get(v) == 2); + CHECK_THROWS(vm.set(std::as_const(v), 11)); CHECK(vm.get(v) == 2); + CHECK_THROWS(vm.set(std::move(v), 12)); CHECK(vm.get(v) == 2); + CHECK_THROWS(vm.set(std::move(std::as_const(v)), 16)); CHECK(vm.get(v) == 2); + + CHECK_THROWS(vm(v, 13)); CHECK(vm(v) == 2); + CHECK_THROWS(vm(std::as_const(v), 14)); CHECK(vm(v) == 2); + CHECK_THROWS(vm(std::move(v), 15)); CHECK(vm(v) == 2); + CHECK_THROWS(vm(std::move(std::as_const(v)), 16)); CHECK(vm(v) == 2); + + CHECK_THROWS(vm.set(v2, 17)); + CHECK_THROWS(vm(v2, 17)); + CHECK(vm(v) == 2); + } } } diff --git a/untests/meta_states/variable_tests.cpp b/untests/meta_states/variable_tests.cpp index f15ff90..e38d85c 100644 --- a/untests/meta_states/variable_tests.cpp +++ b/untests/meta_states/variable_tests.cpp @@ -58,8 +58,10 @@ TEST_CASE("meta/meta_states/variable") { CHECK(vm.get_name() == "int_variable"); CHECK(vm.get() == 1); + CHECK(vm() == 1); CHECK_NOTHROW(vm.set(10)); CHECK(vm.get() == 10); + CHECK_NOTHROW(vm(11)); CHECK(vm() == 11); } SUBCASE("const int") { @@ -70,8 +72,10 @@ TEST_CASE("meta/meta_states/variable") { CHECK(vm.get_name() == "const_int_variable"); CHECK(vm.get() == 2); + CHECK(vm() == 2); CHECK_THROWS(vm.set(10)); CHECK(vm.get() == 2); + CHECK_THROWS(vm(10)); CHECK(vm() == 2); } SUBCASE("ref int") { @@ -81,9 +85,11 @@ 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() == 10); + CHECK(vm.get() == 11); + CHECK(vm() == 11); CHECK_NOTHROW(vm.set(20)); CHECK(vm.get() == 20); + CHECK_NOTHROW(vm(21)); CHECK(vm() == 21); } SUBCASE("const ref int") { @@ -94,7 +100,9 @@ TEST_CASE("meta/meta_states/variable") { CHECK(vm.get_name() == "const_ref_int_variable"); CHECK(vm.get() == 2); + CHECK(vm() == 2); CHECK_THROWS(vm.set(10)); CHECK(vm.get() == 2); + CHECK_THROWS(vm(11)); CHECK(vm() == 2); } }