meta_type::meta is no longer available

This commit is contained in:
Michele Caini
2019-10-03 14:47:36 +02:00
parent 65553e6c43
commit a013cfcd1e
2 changed files with 38 additions and 49 deletions

View File

@@ -504,7 +504,7 @@ public:
static internal::meta_dtor_node node{
type,
[](meta_handle handle) {
const auto valid = (handle.type() == internal::meta_info<Type>::resolve()->meta());
const auto valid = (handle.type() == internal::meta_info<Type>::resolve());
if(valid) {
std::invoke(Func, *meta_any{handle}.try_cast<Type>());
@@ -807,7 +807,7 @@ inline void unregister() ENTT_NOEXCEPT {
*/
template<typename Type>
inline meta_type resolve() ENTT_NOEXCEPT {
return internal::meta_info<Type>::resolve()->meta();
return internal::meta_info<Type>::resolve();
}
@@ -817,11 +817,9 @@ inline meta_type resolve() ENTT_NOEXCEPT {
* @return The meta type associated with the given identifier, if any.
*/
inline meta_type resolve(const ENTT_ID_TYPE identifier) ENTT_NOEXCEPT {
const auto *curr = internal::find_if([identifier](auto *node) {
return internal::find_if([identifier](auto *node) {
return node->identifier == identifier;
}, internal::meta_info<>::type);
return curr ? curr->meta() : meta_type{};
}
@@ -833,8 +831,8 @@ inline meta_type resolve(const ENTT_ID_TYPE identifier) ENTT_NOEXCEPT {
template<typename Op>
inline std::enable_if_t<std::is_invocable_v<Op, meta_type>, void>
resolve(Op op) ENTT_NOEXCEPT {
internal::iterate([op = std::move(op)](auto *node) {
op(node->meta());
internal::iterate([op = std::move(op)](auto *curr) {
op(meta_type{curr});
}, internal::meta_info<>::type);
}

View File

@@ -16,7 +16,7 @@ namespace entt {
class meta_any;
class meta_handle;
class meta_type;
struct meta_type;
/**
@@ -118,7 +118,6 @@ struct meta_type_node {
const size_type extent;
bool(* const compare)(const void *, const void *);
meta_type_node *(* const remove_pointer)() ENTT_NOEXCEPT;
meta_type(* const meta)() ENTT_NOEXCEPT;
meta_base_node *base{nullptr};
meta_conv_node *conv{nullptr};
meta_ctor_node *ctor{nullptr};
@@ -269,6 +268,14 @@ class meta_any {
using destroy_fn_type = void(void *);
using steal_fn_type = void *(storage_type &, void *, destroy_fn_type *);
template<typename Type>
static Type * release(Type *instance) {
auto * const node = internal::meta_info<Type>::resolve();
[[maybe_unused]] const bool destroyed = (!node->dtor || node->dtor->invoke(*instance));
ENTT_ASSERT(destroyed);
return instance;
}
template<typename Type, typename = std::void_t<>>
struct type_traits {
template<typename... Args>
@@ -279,11 +286,7 @@ class meta_any {
}
static void destroy(void *instance) {
auto * const node = internal::meta_info<Type>::resolve();
auto * const actual = static_cast<Type *>(instance);
[[maybe_unused]] const bool destroyed = node->meta().destroy(*actual);
ENTT_ASSERT(destroyed);
delete actual;
delete release<Type>(static_cast<Type *>(instance));
}
static void * copy(storage_type &storage, const void *other) {
@@ -307,11 +310,7 @@ class meta_any {
}
static void destroy(void *instance) {
auto * const node = internal::meta_info<Type>::resolve();
auto * const actual = static_cast<Type *>(instance);
[[maybe_unused]] const bool destroyed = node->meta().destroy(*actual);
ENTT_ASSERT(destroyed);
actual->~Type();
release<Type>(static_cast<Type *>(instance))->~Type();
}
static void * copy(storage_type &storage, const void *instance) {
@@ -1460,21 +1459,16 @@ inline bool operator!=(const meta_func &lhs, const meta_func &rhs) ENTT_NOEXCEPT
* A meta type is the starting point for accessing a reflected type, thus being
* able to work through it on real objects.
*/
class meta_type {
/*! @brief A meta node is allowed to create meta objects. */
template<typename...> friend struct internal::meta_node;
meta_type(const internal::meta_type_node *curr) ENTT_NOEXCEPT
: node{curr}
{}
public:
struct meta_type {
/*! @brief Unsigned integer type. */
using size_type = typename internal::meta_type_node::size_type;
/*! @brief Default constructor. */
meta_type() ENTT_NOEXCEPT
: node{nullptr}
/**
* @brief Constructs an instance from a given node.
* @param curr The underlying node with which to construct the instance.
*/
meta_type(const internal::meta_type_node *curr = nullptr) ENTT_NOEXCEPT
: node{curr}
{}
/**
@@ -1802,7 +1796,7 @@ public:
* @return True in case of success, false otherwise.
*/
bool destroy(meta_handle handle) const {
return (handle.type() == node->meta()) && (!node->dtor || node->dtor->invoke(handle));
return (handle.type() == node) && (!node->dtor || node->dtor->invoke(handle));
}
/**
@@ -1884,72 +1878,72 @@ inline meta_any::meta_any(meta_handle handle) ENTT_NOEXCEPT
inline meta_type meta_any::type() const ENTT_NOEXCEPT {
return node ? node->meta() : meta_type{};
return node;
}
inline meta_type meta_handle::type() const ENTT_NOEXCEPT {
return node ? node->meta() : meta_type{};
return node;
}
inline meta_type meta_base::parent() const ENTT_NOEXCEPT {
return node->parent->meta();
return node->parent;
}
inline meta_type meta_base::type() const ENTT_NOEXCEPT {
return node->type()->meta();
return node->type();
}
inline meta_type meta_conv::parent() const ENTT_NOEXCEPT {
return node->parent->meta();
return node->parent;
}
inline meta_type meta_conv::type() const ENTT_NOEXCEPT {
return node->type()->meta();
return node->type();
}
inline meta_type meta_ctor::parent() const ENTT_NOEXCEPT {
return node->parent->meta();
return node->parent;
}
inline meta_type meta_ctor::arg(size_type index) const ENTT_NOEXCEPT {
return index < size() ? node->arg(index)->meta() : meta_type{};
return index < size() ? node->arg(index) : nullptr;
}
inline meta_type meta_dtor::parent() const ENTT_NOEXCEPT {
return node->parent->meta();
return node->parent;
}
inline meta_type meta_data::parent() const ENTT_NOEXCEPT {
return node->parent->meta();
return node->parent;
}
inline meta_type meta_data::type() const ENTT_NOEXCEPT {
return node->type()->meta();
return node->type();
}
inline meta_type meta_func::parent() const ENTT_NOEXCEPT {
return node->parent->meta();
return node->parent;
}
inline meta_type meta_func::ret() const ENTT_NOEXCEPT {
return node->ret()->meta();
return node->ret();
}
inline meta_type meta_func::arg(size_type index) const ENTT_NOEXCEPT {
return index < size() ? node->arg(index)->meta() : meta_type{};
return index < size() ? node->arg(index) : nullptr;
}
@@ -1997,9 +1991,6 @@ inline meta_type_node * meta_node<Type>::resolve() ENTT_NOEXCEPT {
},
[]() ENTT_NOEXCEPT -> meta_type_node * {
return internal::meta_info<std::remove_pointer_t<Type>>::resolve();
},
[]() ENTT_NOEXCEPT -> meta_type {
return &node;
}
};