to_shared_ptr.
authorYedidya Feldblum <yfeldblum@fb.com>
Fri, 26 Jun 2015 06:11:30 +0000 (23:11 -0700)
committerSara Golemon <sgolemon@fb.com>
Fri, 26 Jun 2015 18:45:40 +0000 (11:45 -0700)
Summary: [Folly] to_shared_ptr.

So you can write this:

    auto sptr = to_shared_ptr(getSomethingUnique<T>());

Instead of this:

    auto sptr = shared_ptr<T>(getSomethingUnique<T>());

Useful when `T` is long, such as `T = foobar::cpp2::FooBarServiceAsyncClient`.

Reviewed By: @meyering

Differential Revision: D2193572

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

index b4d83e3cb2d65c570caed768e273048ea150b4c1..70bc451cb2221bad6ef984f4018613bdc4859135 100644 (file)
@@ -56,6 +56,29 @@ typename std::enable_if<
   std::extent<T>::value != 0, std::unique_ptr<T, Dp>>::type
 make_unique(Args&&...) = delete;
 
+/**
+ *  to_shared_ptr
+ *
+ *  Convert unique_ptr to shared_ptr without specifying the template type
+ *  parameter and letting the compiler deduce it.
+ *
+ *  So you can write this:
+ *
+ *      auto sptr = to_shared_ptr(getSomethingUnique<T>());
+ *
+ *  Instead of this:
+ *
+ *      auto sptr = shared_ptr<T>(getSomethingUnique<T>());
+ *
+ *  Useful when `T` is long, such as:
+ *
+ *      using T = foobar::cpp2::FooBarServiceAsyncClient;
+ */
+template <typename T>
+std::shared_ptr<T> to_shared_ptr(std::unique_ptr<T>&& ptr) {
+  return std::shared_ptr<T>(std::move(ptr));
+}
+
 /**
  * A SimpleAllocator must provide two methods:
  *
index 3dc2afc23b01d28ef641cb4e81d59f3de75707eb..c9a2b0ea6d95c3bd70717cd76852f729b25f5ce1 100644 (file)
 
 using namespace folly;
 
+TEST(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);
+}
+
 template <std::size_t> struct T {};
 template <std::size_t> struct S {};
 template <std::size_t> struct P {};