Explorar el Código

meta: split insert/erase for meta containers to simplify the cleanup/improvement

Michele Caini hace 2 años
padre
commit
7cd83ced17
Se han modificado 1 ficheros con 13 adiciones y 10 borrados
  1. 13 10
      src/entt/meta/container.hpp

+ 13 - 10
src/entt/meta/container.hpp

@@ -106,25 +106,28 @@ class basic_meta_sequence_container_traits {
 
             return true;
         case operation::insert:
-        case operation::erase:
             if constexpr(internal::dynamic_sequence_container<Type>::value) {
                 auto *const non_const = any_cast<typename Type::iterator>(&it->base());
                 typename Type::const_iterator underlying{non_const ? *non_const : any_cast<const typename Type::const_iterator &>(it->base())};
 
-                if(op == operation::insert) {
-                    // this abomination is necessary because only on macos value_type and const_reference are different types for std::vector<bool>
-                    if(auto &as_any = *static_cast<meta_any *>(const_cast<void *>(cvalue)); as_any.allow_cast<typename Type::const_reference>() || as_any.allow_cast<typename Type::value_type>()) {
-                        const auto *element = as_any.try_cast<std::remove_reference_t<typename Type::const_reference>>();
-                        it->rebind(static_cast<Type *>(value)->insert(underlying, element ? *element : as_any.cast<typename Type::value_type>()));
-                        return true;
-                    }
-                } else {
-                    it->rebind(static_cast<Type *>(value)->erase(underlying));
+                // this abomination is necessary because only on macos value_type and const_reference are different types for std::vector<bool>
+                if(auto &as_any = *static_cast<meta_any *>(const_cast<void *>(cvalue)); as_any.allow_cast<typename Type::const_reference>() || as_any.allow_cast<typename Type::value_type>()) {
+                    const auto *element = as_any.try_cast<std::remove_reference_t<typename Type::const_reference>>();
+                    it->rebind(static_cast<Type *>(value)->insert(underlying, element ? *element : as_any.cast<typename Type::value_type>()));
                     return true;
                 }
             }
 
             break;
+        case operation::erase:
+            if constexpr(internal::dynamic_sequence_container<Type>::value) {
+                auto *const non_const = any_cast<typename Type::iterator>(&it->base());
+                typename Type::const_iterator underlying{non_const ? *non_const : any_cast<const typename Type::const_iterator &>(it->base())};
+                it->rebind(static_cast<Type *>(value)->erase(underlying));
+                return true;
+            } else {
+                break;
+            }
         }
 
         return false;