to_weak_ptr
authorYedidya Feldblum <yfeldblum@fb.com>
Thu, 22 Dec 2016 04:29:00 +0000 (20:29 -0800)
committerFacebook Github Bot <facebook-github-bot@users.noreply.github.com>
Thu, 22 Dec 2016 04:32:50 +0000 (20:32 -0800)
Summary:
[Folly] `to_weak_ptr`.

Make a `weak_ptr` and return it from a `shared_ptr` without specifying the template type parameter and letting the compiler deduce it.

So you can write this:

    auto wptr = to_weak_ptr(getSomethingShared<T>());

Instead of this:

    auto wptr = weak_ptr<T>(getSomethingShared<T>());

Useful when `T` is long, such as:

    using T = foobar::FooBarAsyncClient;

Reviewed By: nbronson

Differential Revision: D4361276

fbshipit-source-id: 782a1d2d57b6e5823cb4018e445110098f1ce41f

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

index 442dd4f688445e554eecaa41fecdbcde6645effc..f5e92e7588ab6c9e50d5781f8f14d404b2054bf4 100644 (file)
@@ -108,13 +108,36 @@ struct static_function_deleter {
  *
  *  Useful when `T` is long, such as:
  *
- *      using T = foobar::cpp2::FooBarServiceAsyncClient;
+ *      using T = foobar::FooBarAsyncClient;
  */
 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));
 }
 
+/**
+ *  to_weak_ptr
+ *
+ *  Make a weak_ptr and return it from a shared_ptr without specifying the
+ *  template type parameter and letting the compiler deduce it.
+ *
+ *  So you can write this:
+ *
+ *      auto wptr = to_weak_ptr(getSomethingShared<T>());
+ *
+ *  Instead of this:
+ *
+ *      auto wptr = weak_ptr<T>(getSomethingShared<T>());
+ *
+ *  Useful when `T` is long, such as:
+ *
+ *      using T = foobar::FooBarAsyncClient;
+ */
+template <typename T>
+std::weak_ptr<T> to_weak_ptr(const std::shared_ptr<T>& ptr) {
+  return std::weak_ptr<T>(ptr);
+}
+
 using SysBufferDeleter = static_function_deleter<void, ::free>;
 using SysBufferUniquePtr = std::unique_ptr<void, SysBufferDeleter>;
 inline SysBufferUniquePtr allocate_sys_buffer(size_t size) {
index d7660476a085f2be7dbb0525c533b92c21bc6806..567ec4344256b67450050099d1ddf9fbce8c662d 100644 (file)
@@ -33,6 +33,13 @@ TEST(make_unique, compatible_with_std_make_unique) {
   make_unique<string>("hello, world");
 }
 
+TEST(to_weak_ptr, example) {
+  auto s = std::make_shared<int>(17);
+  EXPECT_EQ(1, s.use_count());
+  EXPECT_EQ(2, (to_weak_ptr(s).lock(), s.use_count())) << "lvalue";
+  EXPECT_EQ(3, (to_weak_ptr(decltype(s)(s)).lock(), s.use_count())) << "rvalue";
+}
+
 TEST(allocate_sys_buffer, compiles) {
   auto buf = allocate_sys_buffer(256);
   //  Freed at the end of the scope.