Created
March 2, 2019 19:58
-
-
Save bolry/3599ffe3cad735d06b29045a05c43132 to your computer and use it in GitHub Desktop.
Singel Threaded Ptr from Andrei Alexandrescu talk at CppCon 2014
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
template<typename T> | |
class SingleThreadedPtr { | |
T *m_p; | |
mutable unsigned *m_c; | |
public: | |
SingleThreadedPtr(); | |
explicit SingleThreadedPtr(T *a_p); | |
SingleThreadedPtr(SingleThreadedPtr const &a_rhs); | |
SingleThreadedPtr(SingleThreadedPtr &&a_rhs); | |
~SingleThreadedPtr(); | |
}; | |
template<typename T> | |
SingleThreadedPtr<T>::SingleThreadedPtr() : SingleThreadedPtr(nullptr) {} | |
template<typename T> | |
SingleThreadedPtr<T>::SingleThreadedPtr(T *a_p) : m_p(a_p), m_c(nullptr) {} | |
template<typename T> | |
SingleThreadedPtr<T>::SingleThreadedPtr(SingleThreadedPtr const &rhs) : m_p(rhs.m_p), m_c(rhs.m_c) { | |
if (m_p == nullptr) return; | |
if (m_c == nullptr) { | |
m_c = rhs.m_c = new unsigned(2); | |
} else { | |
++*m_c; | |
} | |
} | |
#if 1 | |
template<typename T> | |
SingleThreadedPtr<T>::SingleThreadedPtr(SingleThreadedPtr &&rhs) : m_p(rhs.m_p), m_c(rhs.m_c) { | |
rhs.m_p = nullptr; | |
// rhs.m_c = nullptr; // UNNEEDED | |
} | |
template<typename T> | |
SingleThreadedPtr<T>::~SingleThreadedPtr() { | |
if (m_p == nullptr) return; | |
if (m_c == nullptr) { | |
soSueMe: | |
delete m_p; | |
} else if (--*m_c == 0u) { | |
delete m_c; | |
goto soSueMe; | |
} | |
} | |
#else | |
template<typename T> | |
SingleThreadedPtr<T>::SingleThreadedPtr(SingleThreadedPtr &&rhs) : m_p(rhs.m_p), m_c(rhs.m_c) { | |
rhs.m_p = nullptr; | |
rhs.m_c = nullptr; | |
} | |
template<typename T> | |
SingleThreadedPtr<T>::~SingleThreadedPtr() { | |
if (m_c == nullptr) { | |
soSueMe: delete m_p; | |
} else if (--*m_c == 0u) { | |
delete m_c; | |
goto soSueMe; | |
} | |
} | |
#endif | |
#if 0 | |
// Skip last decrement | |
template<typename T> | |
SingleThreadedPtr<T>::~SingleThreadedPtr() { | |
if (m_p == nullptr) return; | |
if (m_c == nullptr) { | |
soSueMe: delete m_p; | |
} else if (*m_c == 1u) { | |
delete m_c; | |
goto soSueMe; | |
} else { | |
--*m_c; | |
} | |
} | |
#endif |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment