From 8d5d57992b14283ff68437ee38713380769bf229 Mon Sep 17 00:00:00 2001 From: BlackMATov Date: Thu, 1 Jul 2021 05:47:53 +0700 Subject: [PATCH] implicit get info from registry classes --- headers/meta.hpp/meta_class.hpp | 57 ++++++++--------------------- headers/meta.hpp/meta_data.hpp | 12 +++--- headers/meta.hpp/meta_field.hpp | 12 +++--- headers/meta.hpp/meta_function.hpp | 12 +++--- headers/meta.hpp/meta_method.hpp | 12 +++--- headers/meta.hpp/meta_namespace.hpp | 47 +++++++----------------- headers/meta.hpp/meta_variable.hpp | 12 +++--- untests/meta_class_tests.cpp | 2 +- untests/meta_data_tests.cpp | 16 ++++---- untests/meta_examples.cpp | 2 +- untests/meta_field_tests.cpp | 4 +- untests/meta_function_tests.cpp | 12 +++--- untests/meta_method_tests.cpp | 24 ++++++------ untests/meta_namespace_tests.cpp | 5 ++- untests/meta_type_tests.cpp | 12 +++--- untests/meta_variable_tests.cpp | 8 ++-- 16 files changed, 103 insertions(+), 146 deletions(-) diff --git a/headers/meta.hpp/meta_class.hpp b/headers/meta.hpp/meta_class.hpp index 8a965ad..aff8dfb 100644 --- a/headers/meta.hpp/meta_class.hpp +++ b/headers/meta.hpp/meta_class.hpp @@ -28,63 +28,38 @@ namespace meta_hpp return info_; } + operator const class_info&() const noexcept { + return info_; + } + template < typename... Internals > class_& operator()(Internals&&...internals) { (add_(std::forward(internals)), ...); return *this; } private: - template < typename InternalClass > - void add_(const class_& internal) { - detail::merge_with( - info_.classes_, - internal.info().id(), - internal.info(), - &class_info::merge_with_); + void add_(const class_info& info) { + detail::merge_with(info_.classes_, info.id(), info, &class_info::merge_with_); } - void add_(const data_& internal) { - detail::merge_with( - info_.datas_, - internal.info().id(), - internal.info(), - &data_info::merge_with_); + void add_(const data_info& info) { + detail::merge_with(info_.datas_, info.id(), info, &data_info::merge_with_); } - template < auto InternalField > - void add_(const field_& internal) { - detail::merge_with( - info_.fields_, - internal.info().id(), - internal.info(), - &field_info::merge_with_); + void add_(const field_info& info) { + detail::merge_with(info_.fields_, info.id(), info, &field_info::merge_with_); } - template < auto InternalFunction > - void add_(const function_& internal) { - detail::merge_with( - info_.functions_, - internal.info().id(), - internal.info(), - &function_info::merge_with_); + void add_(const function_info& info) { + detail::merge_with(info_.functions_, info.id(), info, &function_info::merge_with_); } - template < auto InternalMethod > - void add_(const method_& internal) { - detail::merge_with( - info_.methods_, - internal.info().id(), - internal.info(), - &method_info::merge_with_); + void add_(const method_info& info) { + detail::merge_with(info_.methods_, info.id(), info, &method_info::merge_with_); } - template < auto InternalVariable > - void add_(const variable_& internal) { - detail::merge_with( - info_.variables_, - internal.info().id(), - internal.info(), - &variable_info::merge_with_); + void add_(const variable_info& info) { + detail::merge_with(info_.variables_, info.id(), info, &variable_info::merge_with_); } private: class_info info_; diff --git a/headers/meta.hpp/meta_data.hpp b/headers/meta.hpp/meta_data.hpp index 5a172b1..14392cf 100644 --- a/headers/meta.hpp/meta_data.hpp +++ b/headers/meta.hpp/meta_data.hpp @@ -21,18 +21,18 @@ namespace meta_hpp return info_; } + operator const data_info&() const noexcept { + return info_; + } + template < typename... Internals > data_& operator()(Internals&&...internals) { (add_(std::forward(internals)), ...); return *this; } private: - void add_(const data_& internal) { - detail::merge_with( - info_.datas_, - internal.info().id(), - internal.info(), - &data_info::merge_with_); + void add_(const data_info& info) { + detail::merge_with(info_.datas_, info.id(), info, &data_info::merge_with_); } private: data_info info_; diff --git a/headers/meta.hpp/meta_field.hpp b/headers/meta.hpp/meta_field.hpp index e4b3934..6d3dbdf 100644 --- a/headers/meta.hpp/meta_field.hpp +++ b/headers/meta.hpp/meta_field.hpp @@ -29,18 +29,18 @@ namespace meta_hpp return info_; } + operator const field_info&() const noexcept { + return info_; + } + template < typename... Internals > field_& operator()(Internals&&...internals) { (add_(std::forward(internals)), ...); return *this; } private: - void add_(const data_& internal) { - detail::merge_with( - info_.datas_, - internal.info().id(), - internal.info(), - &data_info::merge_with_); + void add_(const data_info& info) { + detail::merge_with(info_.datas_, info.id(), info, &data_info::merge_with_); } private: field_info info_; diff --git a/headers/meta.hpp/meta_function.hpp b/headers/meta.hpp/meta_function.hpp index eb77afc..7400ca5 100644 --- a/headers/meta.hpp/meta_function.hpp +++ b/headers/meta.hpp/meta_function.hpp @@ -28,18 +28,18 @@ namespace meta_hpp return info_; } + operator const function_info&() const noexcept { + return info_; + } + template < typename... Internals > function_& operator()(Internals&&...internals) { (add_(std::forward(internals)), ...); return *this; } private: - void add_(const data_& internal) { - detail::merge_with( - info_.datas_, - internal.info().id(), - internal.info(), - &data_info::merge_with_); + void add_(const data_info& info) { + detail::merge_with(info_.datas_, info.id(), info, &data_info::merge_with_); } private: function_info info_; diff --git a/headers/meta.hpp/meta_method.hpp b/headers/meta.hpp/meta_method.hpp index 6b1c419..9a6223f 100644 --- a/headers/meta.hpp/meta_method.hpp +++ b/headers/meta.hpp/meta_method.hpp @@ -29,18 +29,18 @@ namespace meta_hpp return info_; } + operator const method_info&() const { + return info_; + } + template < typename... Internals > method_& operator()(Internals&&...internals) { (add_(std::forward(internals)), ...); return *this; } private: - void add_(const data_& internal) { - detail::merge_with( - info_.datas_, - internal.info().id(), - internal.info(), - &data_info::merge_with_); + void add_(const data_info& info) { + detail::merge_with(info_.datas_, info.id(), info, &data_info::merge_with_); } private: method_info info_; diff --git a/headers/meta.hpp/meta_namespace.hpp b/headers/meta.hpp/meta_namespace.hpp index 1fd5cb9..c3fd0ce 100644 --- a/headers/meta.hpp/meta_namespace.hpp +++ b/headers/meta.hpp/meta_namespace.hpp @@ -26,53 +26,34 @@ namespace meta_hpp return info_; } + operator const namespace_info&() const noexcept { + return info_; + } + template < typename... Internals > namespace_& operator()(Internals&&...internals) { (add_(std::forward(internals)), ...); return *this; } private: - template < typename InternalClass > - void add_(const class_& internal) { - detail::merge_with( - info_.classes_, - internal.info().id(), - internal.info(), - &class_info::merge_with_); + void add_(const class_info& info) { + detail::merge_with(info_.classes_, info.id(), info, &class_info::merge_with_); } - void add_(const data_& internal) { - detail::merge_with( - info_.datas_, - internal.info().id(), - internal.info(), - &data_info::merge_with_); + void add_(const data_info& info) { + detail::merge_with(info_.datas_, info.id(), info, &data_info::merge_with_); } - template < auto InternalFunction > - void add_(const function_& internal) { - detail::merge_with( - info_.functions_, - internal.info().id(), - internal.info(), - &function_info::merge_with_); + void add_(const function_info& info) { + detail::merge_with(info_.functions_, info.id(), info, &function_info::merge_with_); } - void add_(const namespace_& internal) { - detail::merge_with( - info_.namespaces_, - internal.info().id(), - internal.info(), - &namespace_info::merge_with_); + void add_(const namespace_info& info) { + detail::merge_with(info_.namespaces_, info.id(), info, &namespace_info::merge_with_); } - template < auto InternalVariable > - void add_(const variable_& internal) { - detail::merge_with( - info_.variables_, - internal.info().id(), - internal.info(), - &variable_info::merge_with_); + void add_(const variable_info& info) { + detail::merge_with(info_.variables_, info.id(), info, &variable_info::merge_with_); } private: namespace_info info_; diff --git a/headers/meta.hpp/meta_variable.hpp b/headers/meta.hpp/meta_variable.hpp index 656219f..6718a0e 100644 --- a/headers/meta.hpp/meta_variable.hpp +++ b/headers/meta.hpp/meta_variable.hpp @@ -27,18 +27,18 @@ namespace meta_hpp return info_; } + operator const variable_info&() const noexcept { + return info_; + } + template < typename... Internals > variable_& operator()(Internals&&...internals) { (add_(std::forward(internals)), ...); return *this; } private: - void add_(const data_& internal) { - detail::merge_with( - info_.datas_, - internal.info().id(), - internal.info(), - &data_info::merge_with_); + void add_(const data_info& info) { + detail::merge_with(info_.datas_, info.id(), info, &data_info::merge_with_); } private: variable_info info_; diff --git a/untests/meta_class_tests.cpp b/untests/meta_class_tests.cpp index 4cdc650..4596024 100644 --- a/untests/meta_class_tests.cpp +++ b/untests/meta_class_tests.cpp @@ -40,7 +40,7 @@ TEST_CASE("meta/class") { meta::class_ class_{"clazz"}; const meta::class_& cclass_ = class_; - const meta::class_info& clazz_info = cclass_.info(); + const meta::class_info& clazz_info = cclass_; CHECK_FALSE(clazz_info.get_class("clazz2")); CHECK_FALSE(clazz_info.get_field("field")); diff --git a/untests/meta_data_tests.cpp b/untests/meta_data_tests.cpp index 80e9483..c66c520 100644 --- a/untests/meta_data_tests.cpp +++ b/untests/meta_data_tests.cpp @@ -31,7 +31,7 @@ TEST_CASE("meta/data") { using namespace std::string_literals; meta::data_ data_("key"s, "value"s); - const meta::data_info& data_info = data_.info(); + const meta::data_info& data_info = data_; CHECK(data_info.id() == "key"); CHECK(data_info.get().to_string() == "value"); @@ -74,7 +74,7 @@ TEST_CASE("meta/data/class") { const meta::class_info clazz_info = meta::class_("clazz")( meta::data_("hello"s, "world"s) - ).info(); + ); CHECK(clazz_info.get_data("hello")); CHECK(clazz_info.get_data("hello")->get().to_string() == "world"); @@ -88,7 +88,7 @@ TEST_CASE("meta/data/data") { meta::data_("hello"s, "world"s)( meta::data_("hello2"s, "world2"s) ) - ).info(); + ); CHECK(clazz_info.get_data("hello")); CHECK(clazz_info.get_data("hello")->get_data("hello2")); @@ -103,7 +103,7 @@ TEST_CASE("meta/data/field") { meta::field_<&clazz::field>("field")( meta::data_("hello"s, "world"s) ) - ).info(); + ); CHECK(clazz_info.get_field("field")); CHECK(clazz_info.get_field("field")->get_data("hello")); @@ -118,7 +118,7 @@ TEST_CASE("meta/data/function") { meta::function_<&clazz::function>("function")( meta::data_("hello"s, "world"s) ) - ).info(); + ); CHECK(clazz_info.get_function("function")); CHECK(clazz_info.get_function("function")->get_data("hello")); @@ -133,7 +133,7 @@ TEST_CASE("meta/data/method") { meta::method_<&clazz::method>("method")( meta::data_("hello"s, "world"s) ) - ).info(); + ); CHECK(clazz_info.get_method("method")); CHECK(clazz_info.get_method("method")->get_data("hello")); @@ -146,7 +146,7 @@ TEST_CASE("meta/data/namespace") { const meta::namespace_info ns_info = meta::namespace_("ns")( meta::data_("hello"s, "world"s) - ).info(); + ); CHECK(ns_info.get_data("hello")); CHECK(ns_info.get_data("hello")->get().to_string() == "world"); @@ -160,7 +160,7 @@ TEST_CASE("meta/data/variable") { meta::variable_<&clazz::variable>("variable")( meta::data_("hello"s, "world"s) ) - ).info(); + ); CHECK(clazz_info.get_variable("variable")); CHECK(clazz_info.get_variable("variable")->get_data("hello")); diff --git a/untests/meta_examples.cpp b/untests/meta_examples.cpp index e72e439..a3283cf 100644 --- a/untests/meta_examples.cpp +++ b/untests/meta_examples.cpp @@ -113,7 +113,7 @@ TEST_CASE("meta/examples/simple") { ), function_(&add)>("iadd2"), function_(&add)>("iadd3") - ).info(); + ); class_info ivec2_info = vmath_info.get_class("ivec2").value(); diff --git a/untests/meta_field_tests.cpp b/untests/meta_field_tests.cpp index 05adcf6..990f6cb 100644 --- a/untests/meta_field_tests.cpp +++ b/untests/meta_field_tests.cpp @@ -22,8 +22,8 @@ TEST_CASE("meta/field") { meta::field_<&clazz::field> field_{"field"}; meta::field_<&clazz::cfield> cfield_{"cfield"}; - const meta::field_info& field_info = field_.info(); - const meta::field_info& cfield_info = cfield_.info(); + const meta::field_info& field_info = field_; + const meta::field_info& cfield_info = cfield_; { clazz instance; diff --git a/untests/meta_function_tests.cpp b/untests/meta_function_tests.cpp index d599fa1..5884233 100644 --- a/untests/meta_function_tests.cpp +++ b/untests/meta_function_tests.cpp @@ -29,13 +29,13 @@ TEST_CASE("meta/function") { meta::function_<&int_f_int> int_f_int_function_("int_f_int"); meta::function_<&int_f_int2> int_f_int2_function_("int_f_int2"); - const meta::function_info& void_f_void_info = void_f_void_function_.info(); - const meta::function_info& void_f_int_info = void_f_int_function_.info(); - const meta::function_info& void_f_int2_info = void_f_int2_function_.info(); + const meta::function_info& void_f_void_info = void_f_void_function_; + const meta::function_info& void_f_int_info = void_f_int_function_; + const meta::function_info& void_f_int2_info = void_f_int2_function_; - const meta::function_info& int_f_void_info = int_f_void_function_.info(); - const meta::function_info& int_f_int_info = int_f_int_function_.info(); - const meta::function_info& int_f_int2_info = int_f_int2_function_.info(); + const meta::function_info& int_f_void_info = int_f_void_function_; + const meta::function_info& int_f_int_info = int_f_int_function_; + const meta::function_info& int_f_int2_info = int_f_int2_function_; SUBCASE("void_return") { CHECK_NOTHROW(void_f_void_info.invoke()); diff --git a/untests/meta_method_tests.cpp b/untests/meta_method_tests.cpp index 19011e2..2192b6e 100644 --- a/untests/meta_method_tests.cpp +++ b/untests/meta_method_tests.cpp @@ -40,13 +40,13 @@ TEST_CASE("meta/non_const_method") { meta::method_<&clazz::int_f_int> int_f_int_method_("int_f_int"); meta::method_<&clazz::int_f_int2> int_f_int2_method_("int_f_int2"); - const meta::method_info& void_f_void_info = void_f_void_method_.info(); - const meta::method_info& void_f_int_info = void_f_int_method_.info(); - const meta::method_info& void_f_int2_info = void_f_int2_method_.info(); + const meta::method_info& void_f_void_info = void_f_void_method_; + const meta::method_info& void_f_int_info = void_f_int_method_; + const meta::method_info& void_f_int2_info = void_f_int2_method_; - const meta::method_info& int_f_void_info = int_f_void_method_.info(); - const meta::method_info& int_f_int_info = int_f_int_method_.info(); - const meta::method_info& int_f_int2_info = int_f_int2_method_.info(); + const meta::method_info& int_f_void_info = int_f_void_method_; + const meta::method_info& int_f_int_info = int_f_int_method_; + const meta::method_info& int_f_int2_info = int_f_int2_method_; SUBCASE("void_return") { clazz instance; @@ -108,13 +108,13 @@ TEST_CASE("meta/const_method") { meta::method_<&clazz::const_int_f_int> int_f_int_method_("int_f_int"); meta::method_<&clazz::const_int_f_int2> int_f_int2_method_("int_f_int2"); - const meta::method_info& void_f_void_info = void_f_void_method_.info(); - const meta::method_info& void_f_int_info = void_f_int_method_.info(); - const meta::method_info& void_f_int2_info = void_f_int2_method_.info(); + const meta::method_info& void_f_void_info = void_f_void_method_; + const meta::method_info& void_f_int_info = void_f_int_method_; + const meta::method_info& void_f_int2_info = void_f_int2_method_; - const meta::method_info& int_f_void_info = int_f_void_method_.info(); - const meta::method_info& int_f_int_info = int_f_int_method_.info(); - const meta::method_info& int_f_int2_info = int_f_int2_method_.info(); + const meta::method_info& int_f_void_info = int_f_void_method_; + const meta::method_info& int_f_int_info = int_f_int_method_; + const meta::method_info& int_f_int2_info = int_f_int2_method_; SUBCASE("void_return") { clazz instance; diff --git a/untests/meta_namespace_tests.cpp b/untests/meta_namespace_tests.cpp index c4438cb..5613b87 100644 --- a/untests/meta_namespace_tests.cpp +++ b/untests/meta_namespace_tests.cpp @@ -24,7 +24,7 @@ TEST_CASE("meta/namespace") { meta::namespace_ namespace_{"ns"}; const meta::namespace_& cnamespace_ = namespace_; - const meta::namespace_info& ns_info = cnamespace_.info(); + const meta::namespace_info& ns_info = cnamespace_; CHECK_FALSE(ns_info.get_class("clazz")); CHECK_FALSE(ns_info.get_function("func")); @@ -75,6 +75,7 @@ TEST_CASE("meta/namespace/merge") { namespace meta = meta_hpp; meta::namespace_ namespace_{"ns"}; + const meta::namespace_info& ns_info = namespace_; namespace_( meta::namespace_{"ns2"}( @@ -96,7 +97,7 @@ TEST_CASE("meta/namespace/merge") { ) ); - const meta::namespace_info ns2_info = namespace_.info().get_namespace("ns2").value(); + const meta::namespace_info ns2_info = ns_info.get_namespace("ns2").value(); const meta::namespace_info ns3_info = ns2_info.get_namespace("ns3").value(); CHECK(ns2_info.get_class("clazz")); diff --git a/untests/meta_type_tests.cpp b/untests/meta_type_tests.cpp index f7e8585..919c577 100644 --- a/untests/meta_type_tests.cpp +++ b/untests/meta_type_tests.cpp @@ -31,27 +31,27 @@ TEST_CASE("meta/type") { namespace meta = meta_hpp; using namespace std::string_literals; - meta::type class_type = meta::class_("clazz").info(); + meta::type class_type = meta::class_("clazz"); CHECK(class_type.is_class()); CHECK(class_type.get_class_info().id() == "clazz"); - meta::type field_type = meta::field_<&clazz::field>("field").info(); + meta::type field_type = meta::field_<&clazz::field>("field"); CHECK(field_type.is_field()); CHECK(field_type.get_field_info().id() == "field"); - meta::type function_type = meta::function_<&clazz::function>("function").info(); + meta::type function_type = meta::function_<&clazz::function>("function"); CHECK(function_type.is_function()); CHECK(function_type.get_function_info().id() == "function"); - meta::type method_type = meta::method_<&clazz::method>("method").info(); + meta::type method_type = meta::method_<&clazz::method>("method"); CHECK(method_type.is_method()); CHECK(method_type.get_method_info().id() == "method"); - meta::type namespace_type = meta::namespace_("ns").info(); + meta::type namespace_type = meta::namespace_("ns"); CHECK(namespace_type.is_namespace()); CHECK(namespace_type.get_namespace_info().id() == "ns"); - meta::type variable_type = meta::variable_<&clazz::variable>("variable").info(); + meta::type variable_type = meta::variable_<&clazz::variable>("variable"); CHECK(variable_type.is_variable()); CHECK(variable_type.get_variable_info().id() == "variable"); } diff --git a/untests/meta_variable_tests.cpp b/untests/meta_variable_tests.cpp index e70a55b..0ec0f59 100644 --- a/untests/meta_variable_tests.cpp +++ b/untests/meta_variable_tests.cpp @@ -29,8 +29,8 @@ TEST_CASE("meta/variable") { meta::variable_<&variable> variable_{"variable"}; meta::variable_<&cvariable> cvariable_{"cvariable"}; - const meta::variable_info& variable_info = variable_.info(); - const meta::variable_info& cvariable_info = cvariable_.info(); + const meta::variable_info& variable_info = variable_; + const meta::variable_info& cvariable_info = cvariable_; { CHECK(variable == 1); @@ -62,8 +62,8 @@ TEST_CASE("meta/variable") { meta::variable_<&clazz::variable> variable_{"variable"}; meta::variable_<&clazz::cvariable> cvariable_{"cvariable"}; - const meta::variable_info& variable_info = variable_.info(); - const meta::variable_info& cvariable_info = cvariable_.info(); + const meta::variable_info& variable_info = variable_; + const meta::variable_info& cvariable_info = cvariable_; { CHECK(clazz::variable == 1);