]> code.bitgloo.com Git - clyne/entityx.git/commitdiff
Convert EntityManager::unpack() to use boost::shared_ptr.
authorAlec Thomas <alec@swapoff.org>
Sun, 21 Oct 2012 01:05:51 +0000 (21:05 -0400)
committerAlec Thomas <alec@swapoff.org>
Sun, 21 Oct 2012 01:05:51 +0000 (21:05 -0400)
entityx/Entity.h
entityx/Entity_test.cc
entityx/System_test.cc

index 85ee2b748f1e23a38db67a75ee810c2ae2d5d08a..6c0ab551a41013b1195134af62b4aeea26b075cd 100644 (file)
@@ -379,13 +379,13 @@ class EntityManager : boost::noncopyable {
    *
    * Useful for fast bulk iterations.
    *
-   * Position *p;
-   * Direction *d;
+   * boost::shared_ptr<Position> p;
+   * boost::shared_ptr<Direction> d;
    * unpack<Position, Direction>(e, p, d);
    */
   template <typename A>
-  void unpack(Entity id, A *&a) {
-    a = component<A>(id).get();
+  void unpack(Entity id, boost::shared_ptr<A> &a) {
+    a = component<A>(id);
   }
 
   /**
@@ -395,12 +395,12 @@ class EntityManager : boost::noncopyable {
    *
    * Useful for fast bulk iterations.
    *
-   * Position *p;
-   * Direction *d;
+   * boost::shared_ptr<Position> p;
+   * boost::shared_ptr<Direction> d;
    * unpack<Position, Direction>(e, p, d);
    */
   template <typename A, typename B, typename ... Args>
-  void unpack(Entity id, A *&a, B *&b, Args *& ... args) {
+  void unpack(Entity id, boost::shared_ptr<A> &a, boost::shared_ptr<B> &b, Args & ... args) {
     unpack<A>(id, a);
     unpack<B, Args ...>(id, b, args ...);
   }
index 962d858f5f82be390dde26a5fd60c9df8470ba3b..33f3773cec2dede8042397dd66f98eb7be7de3ff 100644 (file)
@@ -155,7 +155,7 @@ TEST_F(EntityManagerTest, TestGetEntitiesWithComponentAndUnpacking) {
   Entity e = em.create();
   Entity f = em.create();
   Entity g = em.create();
-  std::vector<std::pair<boost::shared_ptr<Position>, boost::shared_ptr<Direction>>> position_directions;
+  std::vector<std::pair<shared_ptr<Position>, shared_ptr<Direction>>> position_directions;
   position_directions.push_back(std::make_pair(
           em.assign<Position>(e, 1.0f, 2.0f),
           em.assign<Direction>(e, 3.0f, 4.0f)));
@@ -183,23 +183,23 @@ TEST_F(EntityManagerTest, TestUnpack) {
   auto p = em.assign<Position>(e);
   auto d = em.assign<Direction>(e);
 
-  Position *up;
-  Direction *ud;
+  shared_ptr<Position> up;
+  shared_ptr<Direction> ud;
   em.unpack<Position, Direction>(e, up, ud);
-  ASSERT_EQ(p.get(), up);
-  ASSERT_EQ(d.get(), ud);
+  ASSERT_EQ(p, up);
+  ASSERT_EQ(d, ud);
 }
 
 TEST_F(EntityManagerTest, TestUnpackNullMissing) {
   Entity e = em.create();
   auto p = em.assign<Position>(e);
 
-  Position *up = reinterpret_cast<Position*>(0Xdeadbeef);
-  Direction *ud = reinterpret_cast<Direction*>(0Xdeadbeef);
-  ASSERT_EQ(reinterpret_cast<Direction*>(0xdeadbeef), ud);
+  struct NullDeleter {template<typename T> void operator()(T*) {} };
+  shared_ptr<Position> up(reinterpret_cast<Position*>(0Xdeadbeef), NullDeleter());
+  shared_ptr<Direction> ud(reinterpret_cast<Direction*>(0Xdeadbeef), NullDeleter());
   em.unpack<Position, Direction>(e, up, ud);
-  ASSERT_EQ(p.get(), up);
-  ASSERT_EQ(nullptr, ud);
+  ASSERT_EQ(p, up);
+  ASSERT_EQ(shared_ptr<Direction>(), ud);
 }
 
 TEST_F(EntityManagerTest, TestComponentIdsDiffer) {
index 43f5ea95a36a338110b5d10c186b3bc226c214a5..0c54dabb5d3275fd13d35b9b5fe22e34633e2422 100644 (file)
@@ -39,8 +39,8 @@ class MovementSystem : public System<MovementSystem> {
 
   void update(EntityManager &es, EventManager &events, double) override {
     EntityManager::View entities = es.entities_with_components<Position, Direction>();
-    Position *position;
-    Direction *direction;
+    shared_ptr<Position> position;
+    shared_ptr<Direction> direction;
     for (auto entity : entities) {
       es.unpack<Position, Direction>(entity, position, direction);
       position->x += direction->x;
@@ -102,8 +102,8 @@ TEST_F(SystemManagerTest, TestApplySystem) {
   world.sm().configure();
 
   world.sm().update<MovementSystem>(0.0);
-  Position *position;
-  Direction *direction;
+  shared_ptr<Position> position;
+  shared_ptr<Direction> direction;
   for (auto entity : world.entities) {
     world.em().unpack<Position, Direction>(entity, position, direction);
     if (position && direction) {