This is an automated email from the ASF dual-hosted git repository. jpeach pushed a commit to branch master in repository https://git-dual.apache.org/repos/asf/trafficserver.git
commit 523feded25bc46486f70e11203fe3b6c3a391103 Author: James Peach <[email protected]> AuthorDate: Sat May 7 14:13:22 2016 -0700 TS-4425: Hide Ptr internals. Make the raw pointer member in Ptr<T> private and remove the implicit raw pointer conversion. This improves type safety and forces callers to declare when they circumvent the refcounting. --- lib/ts/Ptr.h | 12 +++++++++++- lib/ts/test_Ptr.cc | 13 +++++++++++++ 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/lib/ts/Ptr.h b/lib/ts/Ptr.h index 3391608..8645fbf 100644 --- a/lib/ts/Ptr.h +++ b/lib/ts/Ptr.h @@ -100,6 +100,13 @@ private: //////////////////////////////////////////////////////////////////////// template <class T> class Ptr { + // https://en.wikibooks.org/wiki/More_C%2B%2B_Idioms/Safe_bool. + typedef void (Ptr::*bool_type)() const; + void + this_type_does_not_support_comparisons() const + { + } + public: explicit Ptr(T *p = 0); Ptr(const Ptr<T> &); @@ -109,9 +116,9 @@ public: Ptr<T> &operator=(const Ptr<T> &); Ptr<T> &operator=(T *); - operator T *() const { return (m_ptr); } T *operator->() const { return (m_ptr); } T &operator*() const { return (*m_ptr); } + operator bool_type() const { return m_ptr ? &Ptr::this_type_does_not_support_comparisons : 0; } int operator==(const T *p) { @@ -170,7 +177,10 @@ public: m_ptr = ptr; } +private: T *m_ptr; + + friend class CoreUtils; }; template <typename T> diff --git a/lib/ts/test_Ptr.cc b/lib/ts/test_Ptr.cc index 3f7f826..9029416 100644 --- a/lib/ts/test_Ptr.cc +++ b/lib/ts/test_Ptr.cc @@ -85,6 +85,19 @@ REGRESSION_TEST(Ptr_refcount)(RegressionTest *t, int /* atype ATS_UNUSED */, int box.check(alive == 0, "refcounts dropped"); } +REGRESSION_TEST(Ptr_bool)(RegressionTest *t, int /* atype ATS_UNUSED */, int *pstatus) +{ + TestBox box(t, pstatus); + box = REGRESSION_TEST_PASSED; + unsigned alive = 0; + + Ptr<PtrObject> none; + Ptr<PtrObject> some = make_ptr(new PtrObject(&alive)); + + box.check(!none, "Empty Ptr<T> is false"); + box.check(some, "Non-empty Ptr<T> is true"); +} + int main(int /* argc ATS_UNUSED */, char ** /* argv ATS_UNUSED */) { -- To stop receiving notification emails like this one, please contact "[email protected]" <[email protected]>.
