|
|
@@ -16,6 +16,12 @@ private:
|
|
|
std::shared_ptr<Type> ptr;
|
|
|
};
|
|
|
|
|
|
+struct self {
|
|
|
+ using element_type = int;
|
|
|
+ const self & operator*() const { return *this; }
|
|
|
+ int value{};
|
|
|
+};
|
|
|
+
|
|
|
template<typename Type>
|
|
|
struct adl_wrapped_shared_ptr: wrapped_shared_ptr<Type> {};
|
|
|
|
|
|
@@ -28,10 +34,8 @@ struct entt::is_meta_pointer_like<adl_wrapped_shared_ptr<Type>>: std::true_type
|
|
|
template<typename Type>
|
|
|
struct entt::is_meta_pointer_like<spec_wrapped_shared_ptr<Type>>: std::true_type {};
|
|
|
|
|
|
-template<typename Type>
|
|
|
-Type & dereference_meta_pointer_like(const adl_wrapped_shared_ptr<Type> &ptr) {
|
|
|
- return ptr.deref();
|
|
|
-}
|
|
|
+template<>
|
|
|
+struct entt::is_meta_pointer_like<self>: std::true_type {};
|
|
|
|
|
|
template<typename Type>
|
|
|
struct entt::adl_meta_pointer_like<spec_wrapped_shared_ptr<Type>> {
|
|
|
@@ -40,6 +44,11 @@ struct entt::adl_meta_pointer_like<spec_wrapped_shared_ptr<Type>> {
|
|
|
}
|
|
|
};
|
|
|
|
|
|
+template<typename Type>
|
|
|
+Type & dereference_meta_pointer_like(const adl_wrapped_shared_ptr<Type> &ptr) {
|
|
|
+ return ptr.deref();
|
|
|
+}
|
|
|
+
|
|
|
int test_function() { return 42; }
|
|
|
|
|
|
struct not_copyable_t {
|
|
|
@@ -287,3 +296,14 @@ TEST(MetaPointerLike, DereferencePointerToFunction) {
|
|
|
test(*entt::meta_any{&test_function});
|
|
|
test(**entt::meta_any{&test_function});
|
|
|
}
|
|
|
+
|
|
|
+TEST(MetaPointerLike, DereferenceSelfPointer) {
|
|
|
+ self obj{42};
|
|
|
+ entt::meta_any any{std::ref(obj)};
|
|
|
+ entt::meta_any deref = *any;
|
|
|
+
|
|
|
+ ASSERT_TRUE(deref);
|
|
|
+ ASSERT_TRUE(any.type().is_pointer_like());
|
|
|
+ ASSERT_FALSE(deref.try_cast<self>());
|
|
|
+ ASSERT_EQ(deref.cast<const self &>().value, obj.value);
|
|
|
+}
|