#include <map>
#include <memory>
#include <string>
+#include <tuple>
#include <folly/Memory.h>
#include <folly/portability/GTest.h>
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));
+}