implicit get info from registry classes

This commit is contained in:
BlackMATov
2021-07-01 05:47:53 +07:00
parent 0e65288a9c
commit 8d5d57992b
16 changed files with 103 additions and 146 deletions

View File

@@ -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>(internals)), ...);
return *this;
}
private:
template < typename InternalClass >
void add_(const class_<InternalClass>& 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_<InternalField>& 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_<InternalFunction>& 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_<InternalMethod>& 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_<InternalVariable>& 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_;

View File

@@ -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>(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_;

View File

@@ -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>(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_;

View File

@@ -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>(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_;

View File

@@ -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>(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_;

View File

@@ -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>(internals)), ...);
return *this;
}
private:
template < typename InternalClass >
void add_(const class_<InternalClass>& 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_<InternalFunction>& 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_<InternalVariable>& 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_;

View File

@@ -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>(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_;

View File

@@ -40,7 +40,7 @@ TEST_CASE("meta/class") {
meta::class_<clazz> class_{"clazz"};
const meta::class_<clazz>& 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"));

View File

@@ -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>("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"));

View File

@@ -113,7 +113,7 @@ TEST_CASE("meta/examples/simple") {
),
function_<select<ivec2(ivec2,ivec2)>(&add)>("iadd2"),
function_<select<ivec3(ivec3,ivec3)>(&add)>("iadd3")
).info();
);
class_info ivec2_info = vmath_info.get_class("ivec2").value();

View File

@@ -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;

View File

@@ -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());

View File

@@ -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;

View File

@@ -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"));

View File

@@ -31,27 +31,27 @@ TEST_CASE("meta/type") {
namespace meta = meta_hpp;
using namespace std::string_literals;
meta::type class_type = meta::class_<clazz>("clazz").info();
meta::type class_type = meta::class_<clazz>("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");
}

View File

@@ -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);