registry: allow non-const types in const overloads of registry context variable getters (close #720)
This commit is contained in:
@@ -1633,9 +1633,9 @@ public:
|
||||
* registry, a null pointer otherwise.
|
||||
*/
|
||||
template<typename Type>
|
||||
[[nodiscard]] Type * try_ctx() const {
|
||||
[[nodiscard]] std::add_const_t<Type> * try_ctx() const {
|
||||
auto it = std::find_if(vars.cbegin(), vars.cend(), [type = type_id<Type>()](auto &&var) { return var.type() == type; });
|
||||
return it == vars.cend() ? nullptr : any_cast<Type>(&*it);
|
||||
return it == vars.cend() ? nullptr : any_cast<std::add_const_t<Type>>(&*it);
|
||||
}
|
||||
|
||||
/*! @copydoc try_ctx */
|
||||
@@ -1656,10 +1656,10 @@ public:
|
||||
* @return A valid reference to the object in the context of the registry.
|
||||
*/
|
||||
template<typename Type>
|
||||
[[nodiscard]] Type & ctx() const {
|
||||
[[nodiscard]] std::add_const_t<Type> & ctx() const {
|
||||
auto it = std::find_if(vars.cbegin(), vars.cend(), [type = type_id<Type>()](auto &&var) { return var.type() == type; });
|
||||
ENTT_ASSERT(it != vars.cend(), "Invalid instance");
|
||||
return any_cast<Type &>(*it);
|
||||
return any_cast<std::add_const_t<Type> &>(*it);
|
||||
}
|
||||
|
||||
/*! @copydoc ctx */
|
||||
|
||||
@@ -1751,20 +1751,32 @@ TEST(Registry, GetOrEmplace) {
|
||||
TEST(Registry, Constness) {
|
||||
entt::registry registry;
|
||||
|
||||
ASSERT_TRUE((std::is_same_v<decltype(registry.emplace<int>({})), int &>));
|
||||
ASSERT_TRUE((std::is_same_v<decltype(registry.emplace<empty_type>({})), void>));
|
||||
static_assert((std::is_same_v<decltype(registry.emplace<int>({})), int &>));
|
||||
static_assert((std::is_same_v<decltype(registry.emplace<empty_type>({})), void>));
|
||||
|
||||
ASSERT_TRUE((std::is_same_v<decltype(registry.get<int>({})), int &>));
|
||||
ASSERT_TRUE((std::is_same_v<decltype(registry.get<int, const char>({})), std::tuple<int &, const char &>>));
|
||||
static_assert((std::is_same_v<decltype(registry.get<int>({})), int &>));
|
||||
static_assert((std::is_same_v<decltype(registry.get<int, const char>({})), std::tuple<int &, const char &>>));
|
||||
|
||||
ASSERT_TRUE((std::is_same_v<decltype(registry.try_get<int>({})), int *>));
|
||||
ASSERT_TRUE((std::is_same_v<decltype(registry.try_get<int, const char>({})), std::tuple<int *, const char *>>));
|
||||
static_assert((std::is_same_v<decltype(registry.try_get<int>({})), int *>));
|
||||
static_assert((std::is_same_v<decltype(registry.try_get<int, const char>({})), std::tuple<int *, const char *>>));
|
||||
|
||||
ASSERT_TRUE((std::is_same_v<decltype(std::as_const(registry).get<int>({})), const int &>));
|
||||
ASSERT_TRUE((std::is_same_v<decltype(std::as_const(registry).get<int, const char>({})), std::tuple<const int &, const char &>>));
|
||||
static_assert((std::is_same_v<decltype(registry.ctx<int>()), int &>));
|
||||
static_assert((std::is_same_v<decltype(registry.ctx<const char>()), const char &>));
|
||||
|
||||
ASSERT_TRUE((std::is_same_v<decltype(std::as_const(registry).try_get<int>({})), const int *>));
|
||||
ASSERT_TRUE((std::is_same_v<decltype(std::as_const(registry).try_get<int, const char>({})), std::tuple<const int *, const char *>>));
|
||||
static_assert((std::is_same_v<decltype(registry.try_ctx<int>()), int *>));
|
||||
static_assert((std::is_same_v<decltype(registry.try_ctx<const char>()), const char *>));
|
||||
|
||||
static_assert((std::is_same_v<decltype(std::as_const(registry).get<int>({})), const int &>));
|
||||
static_assert((std::is_same_v<decltype(std::as_const(registry).get<int, const char>({})), std::tuple<const int &, const char &>>));
|
||||
|
||||
static_assert((std::is_same_v<decltype(std::as_const(registry).try_get<int>({})), const int *>));
|
||||
static_assert((std::is_same_v<decltype(std::as_const(registry).try_get<int, const char>({})), std::tuple<const int *, const char *>>));
|
||||
|
||||
static_assert((std::is_same_v<decltype(std::as_const(registry).ctx<int>()), const int &>));
|
||||
static_assert((std::is_same_v<decltype(std::as_const(registry).ctx<const char>()), const char &>));
|
||||
|
||||
static_assert((std::is_same_v<decltype(std::as_const(registry).try_ctx<int>()), const int *>));
|
||||
static_assert((std::is_same_v<decltype(std::as_const(registry).try_ctx<const char>()), const char *>));
|
||||
}
|
||||
|
||||
TEST(Registry, MoveOnlyComponent) {
|
||||
|
||||
Reference in New Issue
Block a user