type_info: allow to construct type_info objects directly

This commit is contained in:
Michele Caini
2022-04-06 11:25:44 +02:00
parent b7dd26121a
commit 2d5e3402fa
2 changed files with 33 additions and 27 deletions

View File

@@ -139,25 +139,25 @@ struct type_name final {
};
/*! @brief Implementation specific information about a type. */
class type_info final {
template<typename Type>
friend const type_info &type_id() ENTT_NOEXCEPT;
template<typename Type>
constexpr type_info(std::in_place_type_t<Type>) ENTT_NOEXCEPT
: seq{type_index<std::remove_reference_t<std::remove_const_t<Type>>>::value()},
identifier{type_hash<std::remove_reference_t<std::remove_const_t<Type>>>::value()},
alias{type_name<std::remove_reference_t<std::remove_const_t<Type>>>::value()} {
ENTT_ASSERT(seq != 0u, "Invalid type index");
}
public:
struct type_info final {
/*! @brief Default constructor. */
constexpr type_info() ENTT_NOEXCEPT
: seq{},
identifier{},
alias{} {}
/**
* @brief Constructs a type info object for a given type.
* @tparam Type Type for which to construct a type info object.
*/
template<typename Type>
constexpr type_info(std::in_place_type_t<Type>) ENTT_NOEXCEPT
: seq{type_index<std::remove_cv_t<std::remove_reference_t<Type>>>::value()},
identifier{type_hash<std::remove_cv_t<std::remove_reference_t<Type>>>::value()},
alias{type_name<std::remove_cv_t<std::remove_reference_t<Type>>>::value()} {
ENTT_ASSERT(seq != 0u, "Invalid type index");
}
/**
* @brief Type index.
* @return Type index.

View File

@@ -48,21 +48,12 @@ TEST(TypeInfo, Functionalities) {
static_assert(std::is_copy_assignable_v<entt::type_info>);
static_assert(std::is_move_assignable_v<entt::type_info>);
const int value = 42;
entt::type_info info{std::in_place_type<int>};
entt::type_info other{std::in_place_type<void>};
ASSERT_EQ(entt::type_id(value), entt::type_id<int>());
ASSERT_EQ(entt::type_id(42), entt::type_id<int>());
ASSERT_EQ(entt::type_id<int>(), entt::type_id<int>());
ASSERT_EQ(entt::type_id<int &>(), entt::type_id<int &&>());
ASSERT_EQ(entt::type_id<int &>(), entt::type_id<int>());
ASSERT_NE(entt::type_id<int>(), entt::type_id<char>());
ASSERT_EQ(&entt::type_id<int>(), &entt::type_id<int>());
ASSERT_NE(&entt::type_id<int>(), &entt::type_id<void>());
auto info = entt::type_id<const int &>();
auto other = entt::type_id<void>();
ASSERT_EQ(info, entt::type_info{std::in_place_type<int &>});
ASSERT_EQ(info, entt::type_info{std::in_place_type<int &&>});
ASSERT_EQ(info, entt::type_info{std::in_place_type<const int &>});
ASSERT_NE(info, other);
ASSERT_TRUE(info == info);
@@ -119,3 +110,18 @@ TEST(TypeInfo, Order) {
ASSERT_GT(lhs, rhs);
ASSERT_GE(lhs, rhs);
}
TEST(TypeId, Functionalities) {
const int value = 42;
ASSERT_EQ(entt::type_id(value), entt::type_id<int>());
ASSERT_EQ(entt::type_id(42), entt::type_id<int>());
ASSERT_EQ(entt::type_id<int>(), entt::type_id<int>());
ASSERT_EQ(entt::type_id<int &>(), entt::type_id<int &&>());
ASSERT_EQ(entt::type_id<int &>(), entt::type_id<int>());
ASSERT_NE(entt::type_id<int>(), entt::type_id<char>());
ASSERT_EQ(&entt::type_id<int>(), &entt::type_id<int>());
ASSERT_NE(&entt::type_id<int>(), &entt::type_id<void>());
}