]> git.seodisparate.com - EntityComponentMetaSystem/commitdiff
Merge branch 'master' into cxx17
authorStephen Seo <seo.disparate@gmail.com>
Wed, 6 Nov 2019 07:35:39 +0000 (16:35 +0900)
committerStephen Seo <seo.disparate@gmail.com>
Wed, 6 Nov 2019 07:37:46 +0000 (16:37 +0900)
1  2 
src/EC/Bitset.hpp
src/EC/Manager.hpp

Simple merge
index c6dc5ec2b23af1b524fc1b941639fe54154d8117,46e7b72bb13e40446da7bfffefee7de9a60c0a06..9b02286366c8f847b06cfae87119a7a936cb8e62
@@@ -66,7 -68,7 +67,7 @@@ namespace E
          template <typename... Types>
          struct Storage
          {
-             using type = std::tuple<std::vector<Types>...>;
 -            using type = std::tuple<std::deque<Types>..., std::deque<char> >;
++            using type = std::tuple<std::deque<Types>...>;
          };
          using ComponentsStorage =
              typename EC::Meta::Morph<ComponentsList, Storage<> >::type;
          template <typename Component>
          Component* getEntityData(const std::size_t& index)
          {
 -            constexpr auto componentIndex = EC::Meta::IndexOf<
 -                Component, Components>::value;
 -            if(componentIndex < Components::size)
 +            if constexpr (EC::Meta::Contains<Component, Components>::value)
              {
-                 return &std::get<std::vector<Component> >(componentsStorage)
 -                // Cast required due to compiler thinking that an invalid
 -                // Component is needed even though the enclosing if statement
 -                // prevents this from ever happening.
 -                return (Component*) &std::get<componentIndex>(
 -                    componentsStorage).at(index);
++                return &std::get<std::deque<Component> >(componentsStorage)
 +                    .at(index);
              }
              else
              {
          template <typename Component>
          const Component* getEntityData(const std::size_t& index) const
          {
 -            constexpr auto componentIndex = EC::Meta::IndexOf<
 -                Component, Components>::value;
 -            if(componentIndex < Components::size)
 +            if constexpr (EC::Meta::Contains<Component, Components>::value)
              {
-                 return &std::get<std::vector<Component> >(componentsStorage)
 -                // Cast required due to compiler thinking that an invalid
 -                // Component is needed even though the enclosing if statement
 -                // prevents this from ever happening.
 -                return (Component*) &std::get<componentIndex>(
 -                    componentsStorage).at(index);
++                return &std::get<std::deque<Component> >(componentsStorage)
 +                    .at(index);
              }
              else
              {
              {
                  return;
              }
 +            else
 +            {
 +                if(!isAlive(entityID))
 +                {
 +                    return;
 +                }
 +                Component component(std::forward<Args>(args)...);
  
 -            Component component(std::forward<Args>(args)...);
 -
 -            std::get<BitsetType>(
 -                entities[entityID]
 -            ).template getComponentBit<Component>() = true;
 -
 -            constexpr auto index =
 -                EC::Meta::IndexOf<Component, Components>::value;
 +                std::get<BitsetType>(
 +                    entities[entityID]
 +                ).template getComponentBit<Component>() = true;
  
-                 std::get<std::vector<Component> >(componentsStorage)[entityID]
 -            // Cast required due to compiler thinking that deque<char> at
 -            // index = Components::size is being used, even if the previous
 -            // if statement will prevent this from ever happening.
 -            (*((std::deque<Component>*)(&std::get<index>(
 -                componentsStorage
 -            ))))[entityID] = std::move(component);
++                std::get<std::deque<Component> >(componentsStorage)[entityID]
 +                    = std::move(component);
 +            }
          }
  
          /*!
              {
                  return;
              }
 -
 -            std::get<BitsetType>(
 -                entities[entityID]
 -            ).template getTagBit<Tag>() = false;
 +            else
 +            {
 +                if(!isAlive(entityID))
 +                {
 +                    return;
 +                }
 +                std::get<BitsetType>(
 +                    entities[entityID]
 +                ).template getTagBit<Tag>() = false;
 +            }
          }
  
+         /*!
+             \brief Resets the Manager, removing all entities.
+             Some data may persist but will be overwritten when new entities
+             are added. Thus, do not depend on data to persist after a call to
+             reset().
+         */
+         void reset()
+         {
+             clearForMatchingFunctions();
+             currentSize = 0;
+             currentCapacity = 0;
+             deletedSet.clear();
+             resize(EC_INIT_ENTITIES_SIZE);
+         }
      private:
          template <typename... Types>
          struct ForMatchingSignatureHelper