type_info: it's now copyable and moveable as it ought be

This commit is contained in:
Michele Caini
2020-09-18 10:15:57 +02:00
parent 3cd32c74a1
commit aa5fdac522
2 changed files with 77 additions and 10 deletions

View File

@@ -133,19 +133,64 @@ class type_info final {
template<typename>
friend type_info type_id() ENTT_NOEXCEPT;
type_info(seq_fn *seq_func, hash_fn *hash_func, name_fn *name_func)
: seq{seq_func},
hash{hash_func},
name{name_func}
type_info(seq_fn *seq_ptr, hash_fn *hash_ptr, name_fn *name_ptr)
: seq_func{seq_ptr},
hash_func{hash_ptr},
name_func{name_ptr}
{}
public:
/*! @brief Type sequential identifier. */
seq_fn * const seq;
/*! @brief Type hash. */
hash_fn * const hash;
/*! @brief Type name. */
name_fn * const name;
/*! Default constructor. */
type_info()
: type_info{nullptr, nullptr, nullptr}
{}
/*! Default copy constructor. */
type_info(const type_info &) = default;
/*! Default move constructor. */
type_info(type_info &&) = default;
/*! Default copy assignment operator. */
type_info & operator=(const type_info &) = default;
/*! Default move assignment operator. */
type_info & operator=(type_info &&) = default;
/**
* @brief Checks if a type info object is properly initialized.
* @return True if the object is properly initialized, false otherwise.
*/
[[nodiscard]] explicit operator bool() const ENTT_NOEXCEPT {
return !(seq_func == nullptr);
}
/**
* @brief Type sequential identifier.
* @return Type sequential identifier.
*/
[[nodiscard]] id_type seq() const ENTT_NOEXCEPT {
return seq_func();
}
/**
* @brief Type hash.
* @return Type hash.
*/
[[nodiscard]] id_type hash() const ENTT_NOEXCEPT {
return hash_func();
}
/**
* @brief Type name.
* @return Type name.
*/
[[nodiscard]] std::string_view name() const ENTT_NOEXCEPT {
return name_func();
}
private:
seq_fn *seq_func;
hash_fn *hash_func;
name_fn *name_func;
};

View File

@@ -32,9 +32,13 @@ TEST(TypeName, Functionalities) {
TEST(TypeInfo, Functionalities) {
auto info = entt::type_id<int>();
auto other = entt::type_id(42);
entt::type_info empty{};
static_assert(std::is_default_constructible_v<decltype(info)>);
static_assert(std::is_copy_constructible_v<decltype(info)>);
static_assert(std::is_move_constructible_v<decltype(info)>);
static_assert(std::is_copy_assignable_v<decltype(info)>);
static_assert(std::is_move_assignable_v<decltype(info)>);
ASSERT_EQ(info.seq(), other.seq());
ASSERT_EQ(info.hash(), other.hash());
@@ -43,4 +47,22 @@ TEST(TypeInfo, Functionalities) {
ASSERT_EQ(info.seq(), entt::type_seq<int>::value());
ASSERT_EQ(info.hash(), entt::type_hash<int>::value());
ASSERT_EQ(info.name(), entt::type_name<int>::value());
ASSERT_FALSE(empty);
ASSERT_TRUE(info);
ASSERT_TRUE(other);
empty = info;
ASSERT_TRUE(empty);
ASSERT_EQ(empty.hash(), info.hash());
empty = {};
ASSERT_FALSE(empty);
empty = std::move(other);
ASSERT_TRUE(empty);
ASSERT_EQ(empty.hash(), other.hash());
}