]> code.bitgloo.com Git - clyne/entityx.git/commitdiff
Entity::replace<Component> method.
authorDavid Wicks <david@sosolimited.com>
Wed, 14 Jan 2015 17:52:27 +0000 (12:52 -0500)
committerDavid Wicks <david@sosolimited.com>
Wed, 14 Jan 2015 17:58:44 +0000 (12:58 -0500)
Avoid the client-side song and dance around assignment in cases where
a component of the same type may already be assigned to the entity.

entityx/Entity.h

index fa88726e4ce0b632d2effd93753d9b5633a4825a..85033c9558856b2534826e0683c302d1e9cf3d14 100644 (file)
@@ -135,6 +135,9 @@ public:
   template <typename C>
   ComponentHandle<C> assign_from_copy(const C &component);
 
+  template <typename C, typename ... Args>
+  ComponentHandle<C> replace(Args && ... args);
+
   template <typename C>
   void remove();
 
@@ -865,6 +868,19 @@ ComponentHandle<C> Entity::assign_from_copy(const C &component) {
   return manager_->assign<C>(id_, std::forward<const C &>(component));
 }
 
+template <typename C, typename ... Args>
+ComponentHandle<C> Entity::replace(Args && ... args) {
+  assert(valid());
+  auto handle = component<C>();
+  if (handle) {
+    *(handle.get()) = C(std::forward<Args>(args) ...);
+  }
+  else {
+    handle = manager_->assign<C>(id_, std::forward<Args>(args) ...);
+  }
+  return handle;
+}
+
 template <typename C>
 void Entity::remove() {
   assert(valid() && has_component<C>());