Browse Source

any: class level new/delete support

Michele Caini 1 year ago
parent
commit
69f12a1110
2 changed files with 15 additions and 3 deletions
  1. 3 3
      src/entt/core/any.hpp
  2. 12 0
      test/entt/core/any.cpp

+ 3 - 3
src/entt/core/any.hpp

@@ -76,7 +76,7 @@ class basic_any {
         case operation::move:
             if constexpr(in_situ<Type>) {
                 if(value.mode == any_policy::owner) {
-                    return new(&static_cast<basic_any *>(const_cast<void *>(other))->storage) Type{std::move(*const_cast<Type *>(element))};
+                    return ::new(&static_cast<basic_any *>(const_cast<void *>(other))->storage) Type{std::move(*const_cast<Type *>(element))};
                 }
             }
 
@@ -128,9 +128,9 @@ class basic_any {
                 instance = (std::addressof(args), ...);
             } else if constexpr(in_situ<std::remove_cv_t<std::remove_reference_t<Type>>>) {
                 if constexpr(std::is_aggregate_v<std::remove_cv_t<std::remove_reference_t<Type>>> && (sizeof...(Args) != 0u || !std::is_default_constructible_v<std::remove_cv_t<std::remove_reference_t<Type>>>)) {
-                    new(&storage) std::remove_cv_t<std::remove_reference_t<Type>>{std::forward<Args>(args)...};
+                    ::new(&storage) std::remove_cv_t<std::remove_reference_t<Type>>{std::forward<Args>(args)...};
                 } else {
-                    new(&storage) std::remove_cv_t<std::remove_reference_t<Type>>(std::forward<Args>(args)...);
+                    ::new(&storage) std::remove_cv_t<std::remove_reference_t<Type>>(std::forward<Args>(args)...);
                 }
             } else {
                 if constexpr(std::is_aggregate_v<std::remove_cv_t<std::remove_reference_t<Type>>> && (sizeof...(Args) != 0u || !std::is_default_constructible_v<std::remove_cv_t<std::remove_reference_t<Type>>>)) {

+ 12 - 0
test/entt/core/any.cpp

@@ -12,6 +12,7 @@
 #include "../../common/aggregate.h"
 #include "../../common/config.h"
 #include "../../common/linter.hpp"
+#include "../../common/new_delete.h"
 #include "../../common/non_comparable.h"
 #include "../../common/non_movable.h"
 
@@ -1538,3 +1539,14 @@ TEST(Any, DeducedArrayType) {
     ASSERT_EQ(any.type(), entt::type_id<const char *>());
     ASSERT_EQ((std::strcmp("another array of char", entt::any_cast<const char *>(any))), 0);
 }
+
+TEST(Any, ClassLevelNewDelete) {
+    // yeah, that's for code coverage purposes only :)
+    entt::any any{std::in_place_type<test::new_delete>, *std::make_unique<test::new_delete>(test::new_delete{3})};
+
+    ASSERT_TRUE(any);
+    ASSERT_EQ(any.type(), entt::type_id<test::new_delete>());
+    ASSERT_EQ(entt::any_cast<const test::new_delete &>(any).value, 3);
+
+    // TODO
+}