folly::Indestructible interface improvement
[folly.git] / folly / test / IndestructibleTest.cpp
index ad57b1faf375d9f40e7c89546d7507bb7f9f17b7..a48698379a20205f5025fe3bd7f5b96bda818e2f 100644 (file)
@@ -20,6 +20,7 @@
 #include <map>
 #include <memory>
 #include <string>
+#include <tuple>
 
 #include <folly/Memory.h>
 #include <folly/portability/GTest.h>
@@ -119,3 +120,38 @@ TEST_F(IndestructibleTest, disabled_default_ctor) {
   EXPECT_FALSE((std::is_constructible<Indestructible<Foo>, Magic>::value));
   EXPECT_TRUE((std::is_constructible<Indestructible<Foo>, int>::value));
 }
+
+TEST_F(IndestructibleTest, list_initialization) {
+  auto map = folly::Indestructible<std::map<int, int>>{{{1, 2}}};
+  EXPECT_EQ(map->at(1), 2);
+}
+
+namespace {
+class InitializerListConstructible {
+ public:
+  InitializerListConstructible(InitializerListConstructible&&) = default;
+  explicit InitializerListConstructible(std::initializer_list<int>) {}
+  InitializerListConstructible(std::initializer_list<double>, double) {}
+};
+} // namespace
+
+TEST_F(IndestructibleTest, initializer_list_in_place_initialization) {
+  using I = InitializerListConstructible;
+  std::ignore = Indestructible<I>{{1, 2, 3, 4}};
+  std::ignore = Indestructible<I>{{1.2}, 4.2};
+}
+
+namespace {
+class ExplicitlyMoveConstructible {
+ public:
+  ExplicitlyMoveConstructible() = default;
+  explicit ExplicitlyMoveConstructible(ExplicitlyMoveConstructible&&) = default;
+};
+} // namespace
+
+TEST_F(IndestructibleTest, list_initialization_explicit_implicit) {
+  using E = ExplicitlyMoveConstructible;
+  using I = std::map<int, int>;
+  EXPECT_TRUE((!std::is_convertible<E, Indestructible<E>>::value));
+  EXPECT_TRUE((std::is_convertible<I, Indestructible<I>>::value));
+}