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 {};