Commit ed6a4850 authored by Yedidya Feldblum's avatar Yedidya Feldblum Committed by Facebook Github Bot

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<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
parent df148cba
......@@ -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) {
......
......@@ -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.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment