From: Yedidya Feldblum <yfeldblum@fb.com>
Date: Mon, 14 Sep 2015 17:21:23 +0000 (-0700)
Subject: Support unique_ptr instances with custom deleters in to_shared_ptr
X-Git-Tag: deprecate-dynamic-initializer~413
X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=0fe785ba8cc9aa178e6c96b389fe585a023b43e6;p=folly.git

Support unique_ptr instances with custom deleters in to_shared_ptr

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
---

diff --git a/folly/Memory.h b/folly/Memory.h
index cf32e743..b58edf20 100644
--- a/folly/Memory.h
+++ b/folly/Memory.h
@@ -99,8 +99,8 @@ struct static_function_deleter {
  *
  *      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));
 }
 
diff --git a/folly/test/MemoryTest.cpp b/folly/test/MemoryTest.cpp
index 03c53ee7..a62cd11e 100644
--- a/folly/test/MemoryTest.cpp
+++ b/folly/test/MemoryTest.cpp
@@ -54,13 +54,26 @@ TEST(static_function_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);
 }
 
+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 {};