Support unique_ptr instances with custom deleters in to_shared_ptr
authorYedidya Feldblum <yfeldblum@fb.com>
Mon, 14 Sep 2015 17:21:23 +0000 (10:21 -0700)
committerfacebook-github-bot-4 <folly-bot@fb.com>
Mon, 14 Sep 2015 18:20:20 +0000 (11:20 -0700)
Summary: [Folly] Support `unique_ptr` instances with custom deleters in `to_shared_ptr`.

We now support `unique_ptr<T, D>` rather than just `unique_ptr<T>`.

Reviewed By: @lbrandy

Differential Revision: D2438217

folly/Memory.h
folly/test/MemoryTest.cpp

index cf32e7438daa951dda6310012b9510c088359acd..b58edf20a03aee7c1c4fe591dacc2b950250ad93 100644 (file)
@@ -99,8 +99,8 @@ struct static_function_deleter {
  *
  *      using T = foobar::cpp2::FooBarServiceAsyncClient;
  */
  *
  *      using T = foobar::cpp2::FooBarServiceAsyncClient;
  */
-template <typename T>
-std::shared_ptr<T> to_shared_ptr(std::unique_ptr<T>&& ptr) {
+template <typename T, typename D>
+std::shared_ptr<T> to_shared_ptr(std::unique_ptr<T, D>&& ptr) {
   return std::shared_ptr<T>(std::move(ptr));
 }
 
   return std::shared_ptr<T>(std::move(ptr));
 }
 
index 03c53ee7508474af90e2a910b3b6b7ec0cd980af..a62cd11ed4a9772edccf297d945c2bffbd9423cc 100644 (file)
@@ -54,13 +54,26 @@ TEST(static_function_deleter, nullptr) {
   std::unique_ptr<disposable, disposable_deleter>(nullptr);
 }
 
   std::unique_ptr<disposable, disposable_deleter>(nullptr);
 }
 
-TEST(shared_ptr, example) {
+TEST(to_shared_ptr, example) {
   auto uptr = make_unique<std::string>("hello");
   auto sptr = to_shared_ptr(std::move(uptr));
   EXPECT_EQ(nullptr, uptr);
   EXPECT_EQ("hello", *sptr);
 }
 
   auto uptr = make_unique<std::string>("hello");
   auto sptr = to_shared_ptr(std::move(uptr));
   EXPECT_EQ(nullptr, uptr);
   EXPECT_EQ("hello", *sptr);
 }
 
+TEST(to_shared_ptr, example_with_dtor) {
+  bool disposed = false;
+  using disposable_deleter =
+    static_function_deleter<disposable, &disposable::dispose>;
+  auto uptr =
+    make_unique<disposable, disposable_deleter>([&] { disposed = true; });
+  EXPECT_FALSE(disposed);
+  auto sptr = to_shared_ptr(std::move(uptr));
+  EXPECT_FALSE(disposed);
+  sptr = nullptr;
+  EXPECT_TRUE(disposed);
+}
+
 template <std::size_t> struct T {};
 template <std::size_t> struct S {};
 template <std::size_t> struct P {};
 template <std::size_t> struct T {};
 template <std::size_t> struct S {};
 template <std::size_t> struct P {};