|
@@ -9,7 +9,7 @@ struct Defined: entt::type_list<
|
|
|
void(int),
|
|
void(int),
|
|
|
int() const,
|
|
int() const,
|
|
|
void(),
|
|
void(),
|
|
|
- int(int)
|
|
|
|
|
|
|
+ int(int) const
|
|
|
> {
|
|
> {
|
|
|
template<typename Base>
|
|
template<typename Base>
|
|
|
struct type: Base {
|
|
struct type: Base {
|
|
@@ -17,13 +17,13 @@ struct Defined: entt::type_list<
|
|
|
void set(int v) { entt::poly_call<1>(*this, v); }
|
|
void set(int v) { entt::poly_call<1>(*this, v); }
|
|
|
int get() const { return entt::poly_call<2>(*this); }
|
|
int get() const { return entt::poly_call<2>(*this); }
|
|
|
void decr() { entt::poly_call<3>(*this); }
|
|
void decr() { entt::poly_call<3>(*this); }
|
|
|
- int mul(int v) { return entt::poly_call<4>(*this, v); }
|
|
|
|
|
|
|
+ int mul(int v) const { return entt::poly_call<4>(*this, v); }
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
template<typename Type>
|
|
template<typename Type>
|
|
|
struct members {
|
|
struct members {
|
|
|
static void decr(Type &self) { self.decrement(); }
|
|
static void decr(Type &self) { self.decrement(); }
|
|
|
- static double mul(Type &self, double v) { return self.multiply(v); }
|
|
|
|
|
|
|
+ static double mul(const Type &self, double v) { return self.multiply(v); }
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
template<typename Type>
|
|
template<typename Type>
|
|
@@ -41,7 +41,7 @@ struct impl {
|
|
|
void set(int v) { value = v; }
|
|
void set(int v) { value = v; }
|
|
|
int get() const { return value; }
|
|
int get() const { return value; }
|
|
|
void decrement() { --value; }
|
|
void decrement() { --value; }
|
|
|
- double multiply(double v) { return v * value; }
|
|
|
|
|
|
|
+ double multiply(double v) const { return v * value; }
|
|
|
int value{};
|
|
int value{};
|
|
|
};
|
|
};
|
|
|
|
|
|
|
@@ -129,7 +129,7 @@ TEST(PolyDefined, Owned) {
|
|
|
ASSERT_EQ(poly->mul(3), 3);
|
|
ASSERT_EQ(poly->mul(3), 3);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-TEST(PolyDefined, Alias) {
|
|
|
|
|
|
|
+TEST(PolyDefined, Reference) {
|
|
|
impl instance{};
|
|
impl instance{};
|
|
|
entt::poly<Defined> poly{std::ref(instance)};
|
|
entt::poly<Defined> poly{std::ref(instance)};
|
|
|
|
|
|
|
@@ -152,3 +152,58 @@ TEST(PolyDefined, Alias) {
|
|
|
ASSERT_EQ(poly->get(), 1);
|
|
ASSERT_EQ(poly->get(), 1);
|
|
|
ASSERT_EQ(poly->mul(3), 3);
|
|
ASSERT_EQ(poly->mul(3), 3);
|
|
|
}
|
|
}
|
|
|
|
|
+
|
|
|
|
|
+TEST(PolyDefined, ConstReference) {
|
|
|
|
|
+ impl instance{};
|
|
|
|
|
+ entt::poly<Defined> poly{std::cref(instance)};
|
|
|
|
|
+
|
|
|
|
|
+ ASSERT_TRUE(poly);
|
|
|
|
|
+ ASSERT_EQ(poly.data(), nullptr);
|
|
|
|
|
+ ASSERT_NE(std::as_const(poly).data(), nullptr);
|
|
|
|
|
+ ASSERT_EQ(instance.value, 0);
|
|
|
|
|
+ ASSERT_EQ(poly->get(), 0);
|
|
|
|
|
+
|
|
|
|
|
+ ASSERT_DEATH(poly->set(1), ".*");
|
|
|
|
|
+ ASSERT_DEATH(poly->incr(), ".*");
|
|
|
|
|
+
|
|
|
|
|
+ ASSERT_EQ(instance.value, 0);
|
|
|
|
|
+ ASSERT_EQ(poly->get(), 0);
|
|
|
|
|
+ ASSERT_EQ(poly->mul(3), 0);
|
|
|
|
|
+
|
|
|
|
|
+ ASSERT_DEATH(poly->decr(), ".*");
|
|
|
|
|
+
|
|
|
|
|
+ ASSERT_EQ(instance.value, 0);
|
|
|
|
|
+ ASSERT_EQ(poly->get(), 0);
|
|
|
|
|
+ ASSERT_EQ(poly->mul(3), 0);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+TEST(PolyDefined, AsRef) {
|
|
|
|
|
+ entt::poly<Defined> poly{impl{}};
|
|
|
|
|
+ auto ref = as_ref(poly);
|
|
|
|
|
+ auto cref = as_ref(std::as_const(poly));
|
|
|
|
|
+
|
|
|
|
|
+ ASSERT_NE(poly.data(), nullptr);
|
|
|
|
|
+ ASSERT_NE(ref.data(), nullptr);
|
|
|
|
|
+ ASSERT_EQ(cref.data(), nullptr);
|
|
|
|
|
+ ASSERT_NE(std::as_const(cref).data(), nullptr);
|
|
|
|
|
+
|
|
|
|
|
+ std::swap(ref, cref);
|
|
|
|
|
+
|
|
|
|
|
+ ASSERT_EQ(ref.data(), nullptr);
|
|
|
|
|
+ ASSERT_NE(std::as_const(ref).data(), nullptr);
|
|
|
|
|
+ ASSERT_NE(cref.data(), nullptr);
|
|
|
|
|
+
|
|
|
|
|
+ ref = as_ref(ref);
|
|
|
|
|
+ cref = as_ref(std::as_const(cref));
|
|
|
|
|
+
|
|
|
|
|
+ ASSERT_EQ(ref.data(), nullptr);
|
|
|
|
|
+ ASSERT_NE(std::as_const(ref).data(), nullptr);
|
|
|
|
|
+ ASSERT_EQ(cref.data(), nullptr);
|
|
|
|
|
+ ASSERT_NE(std::as_const(cref).data(), nullptr);
|
|
|
|
|
+
|
|
|
|
|
+ ref = impl{};
|
|
|
|
|
+ cref = impl{};
|
|
|
|
|
+
|
|
|
|
|
+ ASSERT_NE(ref.data(), nullptr);
|
|
|
|
|
+ ASSERT_NE(cref.data(), nullptr);
|
|
|
|
|
+}
|