Commit 4e745261 authored by Rajat Goel's avatar Rajat Goel Committed by Jordan DeLong

Syntactic sugar

Summary: This makes code easy to read for eyes used to unique/shared ptrs.

Test Plan: unit-tests

Reviewed By: delong.j@fb.com

FB internal diff: D575997
parent b9836f4a
...@@ -79,7 +79,7 @@ class ThreadLocal { ...@@ -79,7 +79,7 @@ class ThreadLocal {
T* get() const { T* get() const {
T* ptr = tlp_.get(); T* ptr = tlp_.get();
if (UNLIKELY(ptr == NULL)) { if (UNLIKELY(ptr == nullptr)) {
ptr = new T(); ptr = new T();
tlp_.reset(ptr); tlp_.reset(ptr);
} }
...@@ -94,7 +94,7 @@ class ThreadLocal { ...@@ -94,7 +94,7 @@ class ThreadLocal {
return *get(); return *get();
} }
void reset(T* newPtr = NULL) { void reset(T* newPtr = nullptr) {
tlp_.reset(newPtr); tlp_.reset(newPtr);
} }
...@@ -168,7 +168,7 @@ class ThreadLocalPtr { ...@@ -168,7 +168,7 @@ class ThreadLocalPtr {
return *get(); return *get();
} }
void reset(T* newPtr) { void reset(T* newPtr = nullptr) {
threadlocal_detail::ElementWrapper& w = threadlocal_detail::ElementWrapper& w =
threadlocal_detail::StaticMeta<Tag>::get(id_); threadlocal_detail::StaticMeta<Tag>::get(id_);
if (w.ptr != newPtr) { if (w.ptr != newPtr) {
...@@ -177,6 +177,10 @@ class ThreadLocalPtr { ...@@ -177,6 +177,10 @@ class ThreadLocalPtr {
} }
} }
explicit operator bool() const {
return get() != nullptr;
}
/** /**
* reset() with a custom deleter: * reset() with a custom deleter:
* deleter(T* ptr, TLPDestructionMode mode) * deleter(T* ptr, TLPDestructionMode mode)
...@@ -277,7 +281,7 @@ class ThreadLocalPtr { ...@@ -277,7 +281,7 @@ class ThreadLocalPtr {
lock_(other.lock_), lock_(other.lock_),
id_(other.id_) { id_(other.id_) {
other.id_ = 0; other.id_ = 0;
other.lock_ = NULL; other.lock_ = nullptr;
} }
Accessor& operator=(Accessor&& other) FOLLY_NOEXCEPT { Accessor& operator=(Accessor&& other) FOLLY_NOEXCEPT {
...@@ -288,7 +292,7 @@ class ThreadLocalPtr { ...@@ -288,7 +292,7 @@ class ThreadLocalPtr {
// which is impossible, which leaves only one possible scenario -- // which is impossible, which leaves only one possible scenario --
// *this is empty. Assert it. // *this is empty. Assert it.
assert(&meta_ == &other.meta_); assert(&meta_ == &other.meta_);
assert(lock_ == NULL); assert(lock_ == nullptr);
using std::swap; using std::swap;
swap(lock_, other.lock_); swap(lock_, other.lock_);
swap(id_, other.id_); swap(id_, other.id_);
...@@ -296,7 +300,7 @@ class ThreadLocalPtr { ...@@ -296,7 +300,7 @@ class ThreadLocalPtr {
Accessor() Accessor()
: meta_(threadlocal_detail::StaticMeta<Tag>::instance()), : meta_(threadlocal_detail::StaticMeta<Tag>::instance()),
lock_(NULL), lock_(nullptr),
id_(0) { id_(0) {
} }
...@@ -312,7 +316,7 @@ class ThreadLocalPtr { ...@@ -312,7 +316,7 @@ class ThreadLocalPtr {
if (lock_) { if (lock_) {
lock_->unlock(); lock_->unlock();
id_ = 0; id_ = 0;
lock_ = NULL; lock_ = nullptr;
} }
} }
}; };
......
...@@ -68,6 +68,16 @@ TEST(ThreadLocalPtr, CustomDeleter1) { ...@@ -68,6 +68,16 @@ TEST(ThreadLocalPtr, CustomDeleter1) {
EXPECT_EQ(10, Widget::totalVal_); EXPECT_EQ(10, Widget::totalVal_);
} }
TEST(ThreadLocalPtr, resetNull) {
ThreadLocalPtr<int> tl;
EXPECT_FALSE(tl);
tl.reset(new int(4));
EXPECT_TRUE(static_cast<bool>(tl));
EXPECT_EQ(*tl.get(), 4);
tl.reset();
EXPECT_FALSE(tl);
}
// Test deleting the ThreadLocalPtr object // Test deleting the ThreadLocalPtr object
TEST(ThreadLocalPtr, CustomDeleter2) { TEST(ThreadLocalPtr, CustomDeleter2) {
Widget::totalVal_ = 0; Widget::totalVal_ = 0;
......
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