meta: make meta_arg context aware
This commit is contained in:
@@ -105,7 +105,7 @@ class meta_factory {
|
||||
(std::is_member_object_pointer_v<decltype(value_list_element_v<Index, Setter>)> && ... && std::is_const_v<std::remove_reference_t<data_type>>) ? internal::meta_traits::is_const : internal::meta_traits::is_none,
|
||||
Setter::size,
|
||||
&internal::resolve_TODO<std::remove_cv_t<std::remove_reference_t<data_type>>>,
|
||||
&meta_arg<type_list<type_list_element_t<type_list_element_t<Index, args_type>::size != 1u, type_list_element_t<Index, args_type>>...>>,
|
||||
&meta_arg_TODO<type_list<type_list_element_t<type_list_element_t<Index, args_type>::size != 1u, type_list_element_t<Index, args_type>>...>>,
|
||||
+[](meta_handle instance, meta_any value) { return (meta_setter<Type, value_list_element_v<Index, Setter>>(*instance.operator->(), value.as_ref()) || ...); },
|
||||
&meta_getter<Type, Getter, Policy>});
|
||||
|
||||
@@ -241,7 +241,7 @@ public:
|
||||
type_id<typename descriptor::args_type>().hash(),
|
||||
internal::meta_ctor_node{
|
||||
descriptor::args_type::size,
|
||||
&meta_arg<typename descriptor::args_type>,
|
||||
&meta_arg_TODO<typename descriptor::args_type>,
|
||||
&meta_construct<Type, Candidate, Policy>});
|
||||
|
||||
bucket = nullptr;
|
||||
@@ -267,7 +267,7 @@ public:
|
||||
type_id<typename descriptor::args_type>().hash(),
|
||||
internal::meta_ctor_node{
|
||||
descriptor::args_type::size,
|
||||
&meta_arg<typename descriptor::args_type>,
|
||||
&meta_arg_TODO<typename descriptor::args_type>,
|
||||
&meta_construct<Type, Args...>});
|
||||
|
||||
bucket = nullptr;
|
||||
@@ -331,7 +331,7 @@ public:
|
||||
std::is_const_v<data_type> ? internal::meta_traits::is_const : internal::meta_traits::is_none,
|
||||
1u,
|
||||
&internal::resolve_TODO<std::remove_const_t<data_type>>,
|
||||
&meta_arg<type_list<std::remove_const_t<data_type>>>,
|
||||
&meta_arg_TODO<type_list<std::remove_const_t<data_type>>>,
|
||||
&meta_setter<Type, Data>,
|
||||
&meta_getter<Type, Data, Policy>});
|
||||
|
||||
@@ -346,7 +346,7 @@ public:
|
||||
((std::is_same_v<Type, std::remove_const_t<data_type>> || std::is_const_v<data_type>) ? internal::meta_traits::is_const : internal::meta_traits::is_none) | internal::meta_traits::is_static,
|
||||
1u,
|
||||
&internal::resolve_TODO<std::remove_const_t<data_type>>,
|
||||
&meta_arg<type_list<std::remove_const_t<data_type>>>,
|
||||
&meta_arg_TODO<type_list<std::remove_const_t<data_type>>>,
|
||||
&meta_setter<Type, Data>,
|
||||
&meta_getter<Type, Data, Policy>});
|
||||
|
||||
@@ -390,7 +390,7 @@ public:
|
||||
internal::meta_traits::is_const,
|
||||
0u,
|
||||
&internal::resolve_TODO<std::remove_cv_t<std::remove_reference_t<data_type>>>,
|
||||
&meta_arg<type_list<>>,
|
||||
&meta_arg_TODO<type_list<>>,
|
||||
&meta_setter<Type, Setter>,
|
||||
&meta_getter<Type, Getter, Policy>});
|
||||
|
||||
@@ -406,7 +406,7 @@ public:
|
||||
internal::meta_traits::is_none,
|
||||
1u,
|
||||
&internal::resolve_TODO<std::remove_cv_t<std::remove_reference_t<data_type>>>,
|
||||
&meta_arg<type_list<type_list_element_t<args_type::size != 1u, args_type>>>,
|
||||
&meta_arg_TODO<type_list<type_list_element_t<args_type::size != 1u, args_type>>>,
|
||||
&meta_setter<Type, Setter>,
|
||||
&meta_getter<Type, Getter, Policy>});
|
||||
|
||||
@@ -464,7 +464,7 @@ public:
|
||||
(descriptor::is_const ? internal::meta_traits::is_const : internal::meta_traits::is_none) | (descriptor::is_static ? internal::meta_traits::is_static : internal::meta_traits::is_none),
|
||||
descriptor::args_type::size,
|
||||
&internal::resolve_TODO<std::conditional_t<std::is_same_v<Policy, as_void_t>, void, std::remove_cv_t<std::remove_reference_t<typename descriptor::return_type>>>>,
|
||||
&meta_arg<typename descriptor::args_type>,
|
||||
&meta_arg_TODO<typename descriptor::args_type>,
|
||||
&meta_invoke<Type, Candidate, Policy>});
|
||||
|
||||
bucket = &elem.prop;
|
||||
|
||||
@@ -148,11 +148,6 @@ template<typename... Args>
|
||||
return value(context);
|
||||
}
|
||||
|
||||
template<typename Args>
|
||||
[[nodiscard]] auto meta_arg_node_TODO(Args, const std::size_t index) noexcept {
|
||||
return meta_arg_node(Args{}, index, meta_context::from(locator<meta_ctx>::value_or()));
|
||||
}
|
||||
|
||||
[[nodiscard]] inline const void *try_cast(const meta_type_node &from, const meta_type_node &to, const void *instance) noexcept {
|
||||
if(from.info && to.info && *from.info == *to.info) {
|
||||
return instance;
|
||||
|
||||
@@ -172,11 +172,23 @@ meta_any meta_dispatch([[maybe_unused]] Type &&value) {
|
||||
/**
|
||||
* @brief Returns the meta type of the i-th element of a list of arguments.
|
||||
* @tparam Type Type list of the actual types of arguments.
|
||||
* @param context The context from which to search for meta types.
|
||||
* @return The meta type of the i-th element of the list of arguments.
|
||||
*/
|
||||
template<typename Type>
|
||||
[[nodiscard]] static meta_type meta_arg(const std::size_t index) noexcept {
|
||||
return internal::meta_arg_node_TODO(Type{}, index);
|
||||
[[nodiscard]] static meta_type meta_arg(const std::size_t index, const meta_ctx &context = locator<meta_ctx>::value_or()) noexcept {
|
||||
auto &&ctx = internal::meta_context::from(context);
|
||||
return internal::meta_arg_node(Type{}, index, ctx);
|
||||
}
|
||||
|
||||
/**
|
||||
* @brief Returns the meta type of the i-th element of a list of arguments.
|
||||
* @tparam Type Type list of the actual types of arguments.
|
||||
* @return The meta type of the i-th element of the list of arguments.
|
||||
*/
|
||||
template<typename Type>
|
||||
[[nodiscard]] static meta_type meta_arg_TODO(const std::size_t index) noexcept {
|
||||
return meta_arg<Type>(index);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user