|
|
@@ -170,28 +170,7 @@ template<typename... Args>
|
|
|
}
|
|
|
|
|
|
template<typename Type>
|
|
|
-[[nodiscard]] meta_type_node resolve(const meta_context &context) noexcept {
|
|
|
- static_assert(std::is_same_v<Type, std::remove_const_t<std::remove_reference_t<Type>>>, "Invalid type");
|
|
|
-
|
|
|
- if(auto *elem = try_resolve(type_id<Type>(), context); elem) {
|
|
|
- return *elem;
|
|
|
- }
|
|
|
-
|
|
|
- meta_type_node node{
|
|
|
- &type_id<Type>(),
|
|
|
- type_id<Type>().hash(),
|
|
|
- (std::is_arithmetic_v<Type> ? meta_traits::is_arithmetic : meta_traits::is_none)
|
|
|
- | (std::is_integral_v<Type> ? meta_traits::is_integral : meta_traits::is_none)
|
|
|
- | (std::is_signed_v<Type> ? meta_traits::is_signed : meta_traits::is_none)
|
|
|
- | (std::is_array_v<Type> ? meta_traits::is_array : meta_traits::is_none)
|
|
|
- | (std::is_enum_v<Type> ? meta_traits::is_enum : meta_traits::is_none)
|
|
|
- | (std::is_class_v<Type> ? meta_traits::is_class : meta_traits::is_none)
|
|
|
- | (is_meta_pointer_like_v<Type> ? meta_traits::is_meta_pointer_like : meta_traits::is_none)
|
|
|
- | (is_complete_v<meta_sequence_container_traits<Type>> ? meta_traits::is_meta_sequence_container : meta_traits::is_none)
|
|
|
- | (is_complete_v<meta_associative_container_traits<Type>> ? meta_traits::is_meta_associative_container : meta_traits::is_none),
|
|
|
- size_of_v<Type>,
|
|
|
- &resolve<std::remove_cv_t<std::remove_pointer_t<Type>>>};
|
|
|
-
|
|
|
+void meta_default_constructor([[maybe_unused]] meta_type_node &node) {
|
|
|
if constexpr(std::is_default_constructible_v<Type>) {
|
|
|
node.default_constructor = +[](const meta_ctx &ctx) {
|
|
|
// TODO it would be great if we had value and context construction support for meta_any
|
|
|
@@ -200,7 +179,10 @@ template<typename Type>
|
|
|
return elem;
|
|
|
};
|
|
|
}
|
|
|
+}
|
|
|
|
|
|
+template<typename Type>
|
|
|
+void meta_conversion_helper([[maybe_unused]] meta_type_node &node) {
|
|
|
if constexpr(std::is_arithmetic_v<Type>) {
|
|
|
node.conversion_helper = +[](void *bin, const void *value) {
|
|
|
return bin ? static_cast<double>(*static_cast<Type *>(bin) = static_cast<Type>(*static_cast<const double *>(value))) : static_cast<double>(*static_cast<const Type *>(value));
|
|
|
@@ -210,7 +192,10 @@ template<typename Type>
|
|
|
return bin ? static_cast<double>(*static_cast<Type *>(bin) = static_cast<Type>(static_cast<std::underlying_type_t<Type>>(*static_cast<const double *>(value)))) : static_cast<double>(*static_cast<const Type *>(value));
|
|
|
};
|
|
|
}
|
|
|
+}
|
|
|
|
|
|
+template<typename Type>
|
|
|
+void meta_from_void([[maybe_unused]] meta_type_node &node) {
|
|
|
if constexpr(!std::is_same_v<Type, void> && !std::is_function_v<Type>) {
|
|
|
node.from_void = +[](void *element, const void *as_const, const meta_ctx &ctx) {
|
|
|
// TODO it would be great if we had value and context construction support for meta_any
|
|
|
@@ -219,6 +204,34 @@ template<typename Type>
|
|
|
return elem;
|
|
|
};
|
|
|
}
|
|
|
+}
|
|
|
+
|
|
|
+template<typename Type>
|
|
|
+[[nodiscard]] meta_type_node resolve(const meta_context &context) noexcept {
|
|
|
+ static_assert(std::is_same_v<Type, std::remove_const_t<std::remove_reference_t<Type>>>, "Invalid type");
|
|
|
+
|
|
|
+ if(auto *elem = try_resolve(type_id<Type>(), context); elem) {
|
|
|
+ return *elem;
|
|
|
+ }
|
|
|
+
|
|
|
+ meta_type_node node{
|
|
|
+ &type_id<Type>(),
|
|
|
+ type_id<Type>().hash(),
|
|
|
+ (std::is_arithmetic_v<Type> ? meta_traits::is_arithmetic : meta_traits::is_none)
|
|
|
+ | (std::is_integral_v<Type> ? meta_traits::is_integral : meta_traits::is_none)
|
|
|
+ | (std::is_signed_v<Type> ? meta_traits::is_signed : meta_traits::is_none)
|
|
|
+ | (std::is_array_v<Type> ? meta_traits::is_array : meta_traits::is_none)
|
|
|
+ | (std::is_enum_v<Type> ? meta_traits::is_enum : meta_traits::is_none)
|
|
|
+ | (std::is_class_v<Type> ? meta_traits::is_class : meta_traits::is_none)
|
|
|
+ | (is_meta_pointer_like_v<Type> ? meta_traits::is_meta_pointer_like : meta_traits::is_none)
|
|
|
+ | (is_complete_v<meta_sequence_container_traits<Type>> ? meta_traits::is_meta_sequence_container : meta_traits::is_none)
|
|
|
+ | (is_complete_v<meta_associative_container_traits<Type>> ? meta_traits::is_meta_associative_container : meta_traits::is_none),
|
|
|
+ size_of_v<Type>,
|
|
|
+ &resolve<std::remove_cv_t<std::remove_pointer_t<Type>>>};
|
|
|
+
|
|
|
+ meta_default_constructor<Type>(node);
|
|
|
+ meta_conversion_helper<Type>(node);
|
|
|
+ meta_from_void<Type>(node);
|
|
|
|
|
|
if constexpr(is_complete_v<meta_template_traits<Type>>) {
|
|
|
node.templ = meta_template_node{
|