Browse Source

meta: meta_sequence_container::resize support to non default constructible types (close #1072)

Michele Caini 2 years ago
parent
commit
8848040203
2 changed files with 13 additions and 1 deletions
  1. 1 1
      src/entt/meta/container.hpp
  2. 12 0
      test/entt/meta/meta_container.cpp

+ 1 - 1
src/entt/meta/container.hpp

@@ -117,7 +117,7 @@ struct basic_meta_sequence_container_traits {
      * @return True in case of success, false otherwise.
      */
     [[nodiscard]] static bool resize([[maybe_unused]] void *container, [[maybe_unused]] const size_type sz) {
-        if constexpr(internal::dynamic_sequence_container_v<Type>) {
+        if constexpr(internal::dynamic_sequence_container_v<Type> && std::is_default_constructible_v<typename Type::value_type>) {
             static_cast<Type *>(container)->resize(sz);
             return true;
         } else {

+ 12 - 0
test/entt/meta/meta_container.cpp

@@ -15,6 +15,10 @@
 
 struct invalid {};
 
+struct non_default_constructible {
+    non_default_constructible() = delete;
+};
+
 TEST(MetaContainer, Invalid) {
     ASSERT_FALSE(entt::meta_any{42}.as_sequence_container());
     ASSERT_FALSE(entt::meta_any{42}.as_associative_container());
@@ -319,6 +323,14 @@ TEST(SequenceContainer, StdDeque) {
     ASSERT_EQ(view.size(), 0u);
 }
 
+TEST(SequenceContainer, NonDefaultConstructible) {
+    std::vector<non_default_constructible> vec{};
+    auto any = entt::forward_as_meta(vec);
+    auto view = any.as_sequence_container();
+
+    ASSERT_FALSE(view.resize(5u));
+}
+
 TEST(SequenceContainer, Constness) {
     std::vector<int> vec{};
     auto any = entt::forward_as_meta(std::as_const(vec));