Browse Source

now works also with VS2017 and GCC6

Michele Caini 8 years ago
parent
commit
8bd5605c2a
1 changed files with 13 additions and 27 deletions
  1. 13 27
      src/entt/entity/view.hpp

+ 13 - 27
src/entt/entity/view.hpp

@@ -429,28 +429,6 @@ class View final {
     using pattern_type = std::tuple<pool_type<Component> &...>;
     using pattern_type = std::tuple<pool_type<Component> &...>;
     using traits_type = entt_traits<Entity>;
     using traits_type = entt_traits<Entity>;
 
 
-    template<typename...>
-    struct ComponentList {};
-
-    template<typename, typename, typename = ComponentList<>, typename = void>
-    struct SplitComponentListBy;
-
-    template<typename Comp, typename Next, typename... Other, typename... Types>
-    struct SplitComponentListBy<Comp, ComponentList<Next, Other...>, ComponentList<Types...>, std::enable_if_t<std::is_same<Comp, Next>::value>> {
-        using pre_type = ComponentList<Types...>;
-        using post_type = ComponentList<Other...>;
-    };
-
-    template<typename Comp, typename Next, typename... Other, typename... Types>
-    struct SplitComponentListBy<Comp, ComponentList<Next, Other...>, ComponentList<Types...>, std::enable_if_t<!std::is_same<Comp, Next>::value>>
-            : SplitComponentListBy<Comp, ComponentList<Other...>, ComponentList<Types..., Next>> {};
-
-    template<typename Comp>
-    using PreList = typename SplitComponentListBy<Comp, ComponentList<Component...>>::pre_type;
-
-    template<typename Comp>
-    using PostList = typename SplitComponentListBy<Comp, ComponentList<Component...>>::post_type;
-
     class Iterator {
     class Iterator {
         using size_type = typename view_type::size_type;
         using size_type = typename view_type::size_type;
 
 
@@ -526,8 +504,16 @@ class View final {
         reset();
         reset();
     }
     }
 
 
-    template<typename Comp, typename... Pre, typename... Post, typename Func>
-    void each(Func func, ComponentList<Pre...>, ComponentList<Post...>) const {
+    template<typename Comp, typename Other, typename It>
+    inline std::enable_if_t<std::is_same<Comp, Other>::value, const Other &>
+    get(It &it, Entity) const { return *(it++); }
+
+    template<typename Comp, typename Other, typename It>
+    inline std::enable_if_t<!std::is_same<Comp, Other>::value, const Other &>
+    get(const It &, Entity entity) const { return std::get<pool_type<Other> &>(pools).get(entity); }
+
+    template<typename Comp, typename Func>
+    void each(Func func) const {
         const auto extent = std::min({ std::get<pool_type<Component> &>(pools).extent()... });
         const auto extent = std::min({ std::get<pool_type<Component> &>(pools).extent()... });
         auto &pool = std::get<pool_type<Comp> &>(pools);
         auto &pool = std::get<pool_type<Comp> &>(pools);
 
 
@@ -540,8 +526,8 @@ class View final {
                 for(; pos && unchecked[pos-1]->fast(entity); --pos);
                 for(; pos && unchecked[pos-1]->fast(entity); --pos);
 
 
                 if(!pos) {
                 if(!pos) {
-                    // avoided indirections due to the sparse set for the pivot
-                    func(entity, std::get<pool_type<Pre> &>(pools).get(entity)..., *(raw)++, std::get<pool_type<Post> &>(pools).get(entity)...);
+                    // avoided indirections due to the sparse set for the pivot (this-> required because of GCC 6)
+                    func(entity, this->get<Comp, Component>(raw, entity)...);
                 }
                 }
             }
             }
         });
         });
@@ -779,7 +765,7 @@ public:
     inline void each(Func func) const {
     inline void each(Func func) const {
         constexpr auto indexes = ident<Component...>;
         constexpr auto indexes = ident<Component...>;
         using accumulator_type = int[];
         using accumulator_type = int[];
-        accumulator_type accumulator = { (indexes.template get<Component>() == idx ? (each<Component>(std::move(func), PreList<Component>{}, PostList<Component>{}), 0) : 0)... };
+        accumulator_type accumulator = { (indexes.template get<Component>() == idx ? (each<Component>(std::move(func)), 0) : 0)... };
         (void)accumulator;
         (void)accumulator;
     }
     }