diff --git a/headers/meta.hpp/meta_base.hpp b/headers/meta.hpp/meta_base.hpp index 45ab91a..7068549 100644 --- a/headers/meta.hpp/meta_base.hpp +++ b/headers/meta.hpp/meta_base.hpp @@ -47,7 +47,7 @@ namespace meta_hpp } template < typename Signature, typename Class > - constexpr auto select(Signature Class::*func) -> decltype(func) { + constexpr auto select(Signature Class::*func) noexcept -> Signature Class::* { return func; } diff --git a/headers/meta.hpp/meta_registry.hpp b/headers/meta.hpp/meta_registry.hpp index a5b8448..47efb89 100644 --- a/headers/meta.hpp/meta_registry.hpp +++ b/headers/meta.hpp/meta_registry.hpp @@ -9,6 +9,37 @@ #include "meta_base.hpp" #include "meta_states.hpp" +namespace meta_hpp::detail +{ + template < typename Class, typename... Args > + concept class_bind_ctor_kind = + class_kind && + requires(Args&&... args) { { Class{std::forward(args)...} }; }; + + template < typename Class, typename Base > + concept class_bind_base_kind = + class_kind && class_kind && + stdex::derived_from; + + template < typename Class, typename Function > + concept class_bind_function_kind = + class_kind && function_kind; + + template < typename Class, typename Member > + concept class_bind_member_kind = + class_kind && member_kind && + stdex::same_as::class_type>; + + template < typename Class, typename Method > + concept class_bind_method_kind = + class_kind && method_kind && + stdex::same_as::class_type>; + + template < typename Class, typename Pointer > + concept class_bind_variable_kind = + class_kind && pointer_kind; +} + namespace meta_hpp { template < detail::class_kind Class > @@ -18,21 +49,27 @@ namespace meta_hpp operator class_type() const noexcept; template < typename... Args > + requires detail::class_bind_ctor_kind class_bind& ctor_(); template < detail::class_kind Base > + requires detail::class_bind_base_kind class_bind& base_(); template < detail::function_kind Function > + requires detail::class_bind_function_kind class_bind& function_(std::string name, Function function); template < detail::member_kind Member > + requires detail::class_bind_member_kind class_bind& member_(std::string name, Member member); template < detail::method_kind Method > + requires detail::class_bind_method_kind class_bind& method_(std::string name, Method method); template < detail::pointer_kind Pointer > + requires detail::class_bind_variable_kind class_bind& variable_(std::string name, Pointer pointer); private: detail::class_type_data_ptr data_; diff --git a/headers/meta.hpp/meta_registry/class_bind.hpp b/headers/meta.hpp/meta_registry/class_bind.hpp index 81dce45..9dc1554 100644 --- a/headers/meta.hpp/meta_registry/class_bind.hpp +++ b/headers/meta.hpp/meta_registry/class_bind.hpp @@ -22,8 +22,8 @@ namespace meta_hpp template < detail::class_kind Class > template < typename... Args > + requires detail::class_bind_ctor_kind class_bind& class_bind::ctor_() { - static_assert(detail::stdex::constructible_from); auto ctor_state = detail::ctor_state::make(); data_->ctors.emplace(ctor_state->index, std::move(ctor_state)); return *this; @@ -31,8 +31,8 @@ namespace meta_hpp template < detail::class_kind Class > template < detail::class_kind Base > + requires detail::class_bind_base_kind class_bind& class_bind::base_() { - static_assert(detail::stdex::derived_from); data_->bases.emplace(resolve_type()); data_->bases_info.emplace(resolve_type(), detail::class_type_data::base_info{ .upcast = +[](void* derived) -> void* { @@ -44,6 +44,7 @@ namespace meta_hpp template < detail::class_kind Class > template < detail::function_kind Function > + requires detail::class_bind_function_kind class_bind& class_bind::function_(std::string name, Function function) { auto function_state = detail::function_state::make(std::move(name), std::move(function)); data_->functions.emplace(function_state->index, std::move(function_state)); @@ -52,8 +53,8 @@ namespace meta_hpp template < detail::class_kind Class > template < detail::member_kind Member > + requires detail::class_bind_member_kind class_bind& class_bind::member_(std::string name, Member member) { - static_assert(std::is_same_v::class_type>); auto member_state = detail::member_state::make(std::move(name), std::move(member)); data_->members.emplace(member_state->index, std::move(member_state)); return *this; @@ -61,8 +62,8 @@ namespace meta_hpp template < detail::class_kind Class > template < detail::method_kind Method > + requires detail::class_bind_method_kind class_bind& class_bind::method_(std::string name, Method method) { - static_assert(std::is_same_v::class_type>); auto method_state = detail::method_state::make(std::move(name), std::move(method)); data_->methods.emplace(method_state->index, std::move(method_state)); return *this; @@ -70,6 +71,7 @@ namespace meta_hpp template < detail::class_kind Class > template < detail::pointer_kind Pointer > + requires detail::class_bind_variable_kind class_bind& class_bind::variable_(std::string name, Pointer pointer) { auto variable_state = detail::variable_state::make(std::move(name), std::move(pointer)); data_->variables.emplace(variable_state->index, std::move(variable_state)); diff --git a/untests/meta_states/function_tests.cpp b/untests/meta_states/function_tests.cpp index a5b24bc..f58b630 100644 --- a/untests/meta_states/function_tests.cpp +++ b/untests/meta_states/function_tests.cpp @@ -122,7 +122,7 @@ TEST_CASE("meta/meta_states/function") { CHECK(func.is_invocable_with()); CHECK(func.is_invocable_with()); - CHECK(func.is_invocable_with()); + CHECK(func.is_invocable_with()); int i{42}; CHECK(func.invoke(&i) == false); diff --git a/untests/meta_types/any_type_tests.cpp b/untests/meta_types/any_type_tests.cpp index bf04fa7..2bf6c88 100644 --- a/untests/meta_types/any_type_tests.cpp +++ b/untests/meta_types/any_type_tests.cpp @@ -174,8 +174,8 @@ TEST_CASE("meta/meta_types/any_type") { const meta::any_type& type = meta::resolve_type(nullptr); REQUIRE(type); - REQUIRE(type == meta::resolve_type()); - REQUIRE(type.get_id() == meta::resolve_type().get_id()); + REQUIRE(type == meta::resolve_type()); + REQUIRE(type.get_id() == meta::resolve_type().get_id()); CHECK(type.is_nullptr()); CHECK(type.get_kind() == meta::type_kind::nullptr_); diff --git a/untests/meta_utilities/arg7_tests.cpp b/untests/meta_utilities/arg7_tests.cpp index 2fed809..bd515b9 100644 --- a/untests/meta_utilities/arg7_tests.cpp +++ b/untests/meta_utilities/arg7_tests.cpp @@ -134,22 +134,22 @@ TEST_CASE("meta/meta_utilities/arg7/cast/from_nullptr") { using meta::detail::arg; SUBCASE("nullptr -> *") { - static_assert(std::is_invocable_v); - static_assert(std::is_invocable_v); - static_assert(std::is_invocable_v); - static_assert(std::is_invocable_v); - static_assert(std::is_invocable_v); - static_assert(std::is_invocable_v); + static_assert(std::is_invocable_v); + static_assert(std::is_invocable_v); + static_assert(std::is_invocable_v); + static_assert(std::is_invocable_v); + static_assert(std::is_invocable_v); + static_assert(std::is_invocable_v); - static_assert(std::is_invocable_v); - static_assert(std::is_invocable_v); - static_assert(std::is_invocable_v); - static_assert(std::is_invocable_v); - static_assert(std::is_invocable_v); - static_assert(std::is_invocable_v); + static_assert(std::is_invocable_v); + static_assert(std::is_invocable_v); + static_assert(std::is_invocable_v); + static_assert(std::is_invocable_v); + static_assert(std::is_invocable_v); + static_assert(std::is_invocable_v); - nullptr_t n1{nullptr}; - const nullptr_t n2{nullptr}; + std::nullptr_t n1{nullptr}; + const std::nullptr_t n2{nullptr}; CHECK(arg{n1}.can_cast_to()); CHECK(arg{std::move(n1)}.can_cast_to());