From f65ec82158625f6144751c803d2601b02c53b431 Mon Sep 17 00:00:00 2001 From: Alec Thomas Date: Mon, 7 Jul 2014 12:53:19 +1000 Subject: Merge @jarrettchisholm's change plus add some tests. Thanks! Fixes #37 and #39. --- entityx/Entity.h | 9 +++++++++ entityx/Entity_test.cc | 18 ++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/entityx/Entity.h b/entityx/Entity.h index 51ecb03..7f5a5cb 100644 --- a/entityx/Entity.h +++ b/entityx/Entity.h @@ -125,6 +125,9 @@ public: template ComponentHandle assign(Args && ... args); + template + ComponentHandle assign_from_copy(const C &component); + template void remove(); @@ -774,6 +777,12 @@ ComponentHandle Entity::assign(Args && ... args) { return manager_->assign(id_, std::forward(args) ...); } +template +ComponentHandle Entity::assign_from_copy(const C &component) { + assert(valid()); + return manager_->assign(id_, std::forward(component)); +} + template void Entity::remove() { assert(valid() && has_component()); 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() : 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(); -- cgit v1.2.3