From ed6a485097887a967c6ed9c21a83a0bed231a008 Mon Sep 17 00:00:00 2001 From: Yedidya Feldblum Date: Wed, 21 Dec 2016 20:29:00 -0800 Subject: [PATCH] to_weak_ptr 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()); Instead of this: auto wptr = weak_ptr(getSomethingShared()); Useful when `T` is long, such as: using T = foobar::FooBarAsyncClient; Reviewed By: nbronson Differential Revision: D4361276 fbshipit-source-id: 782a1d2d57b6e5823cb4018e445110098f1ce41f --- folly/Memory.h | 25 ++++++++++++++++++++++++- folly/test/MemoryTest.cpp | 7 +++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/folly/Memory.h b/folly/Memory.h index 442dd4f6..f5e92e75 100644 --- a/folly/Memory.h +++ b/folly/Memory.h @@ -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 std::shared_ptr to_shared_ptr(std::unique_ptr&& ptr) { return std::shared_ptr(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()); + * + * Instead of this: + * + * auto wptr = weak_ptr(getSomethingShared()); + * + * Useful when `T` is long, such as: + * + * using T = foobar::FooBarAsyncClient; + */ +template +std::weak_ptr to_weak_ptr(const std::shared_ptr& ptr) { + return std::weak_ptr(ptr); +} + using SysBufferDeleter = static_function_deleter; using SysBufferUniquePtr = std::unique_ptr; inline SysBufferUniquePtr allocate_sys_buffer(size_t size) { diff --git a/folly/test/MemoryTest.cpp b/folly/test/MemoryTest.cpp index d7660476..567ec434 100644 --- a/folly/test/MemoryTest.cpp +++ b/folly/test/MemoryTest.cpp @@ -33,6 +33,13 @@ TEST(make_unique, compatible_with_std_make_unique) { make_unique("hello, world"); } +TEST(to_weak_ptr, example) { + auto s = std::make_shared(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. -- 2.34.1