aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--entityx/Entity.h9
-rw-r--r--entityx/Entity_test.cc18
2 files changed, 27 insertions, 0 deletions
diff --git a/entityx/Entity.h b/entityx/Entity.h
index 51ecb03..7f5a5cb 100644
--- a/entityx/Entity.h
+++ b/entityx/Entity.h
@@ -126,6 +126,9 @@ public:
ComponentHandle<C> assign(Args && ... args);
template <typename C>
+ ComponentHandle<C> assign_from_copy(const C &component);
+
+ template <typename C>
void remove();
template <typename C>
@@ -775,6 +778,12 @@ ComponentHandle<C> Entity::assign(Args && ... args) {
}
template <typename C>
+ComponentHandle<C> Entity::assign_from_copy(const C &component) {
+ assert(valid());
+ return manager_->assign<C>(id_, std::forward<const C &>(component));
+}
+
+template <typename C>
void Entity::remove() {
assert(valid() && has_component<C>());
manager_->remove<C>(id_);
diff --git a/entityx/Entity_test.cc b/entityx/Entity_test.cc
index 107f0a3..f57bb95 100644
--- a/entityx/Entity_test.cc
+++ b/entityx/Entity_test.cc
@@ -439,6 +439,24 @@ TEST_CASE_METHOD(EntityManagerFixture, "TestComponentHandleInvalidatedWhenEntity
REQUIRE(!position);
}
+struct CopyVerifier : Component<CopyVerifier> {
+ CopyVerifier() : copied(false) {}
+ CopyVerifier(const CopyVerifier &other) {
+ copied = other.copied + 1;
+ }
+
+ int copied;
+};
+
+TEST_CASE_METHOD(EntityManagerFixture, "TestComponentAssignmentFromCopy") {
+ Entity a = em.create();
+ CopyVerifier original;
+ CopyVerifier::Handle copy = a.assign_from_copy(original);
+ REQUIRE(copy);
+ REQUIRE(copy->copied == 1);
+ a.destroy();
+ REQUIRE(!copy);
+}
TEST_CASE_METHOD(EntityManagerFixture, "TestComponentHandleInvalidatedWhenComponentDestroyed") {
Entity a = em.create();