Skip to content

Instantly share code, notes, and snippets.

@bolry
Created March 2, 2019 19:58
Show Gist options
  • Save bolry/3599ffe3cad735d06b29045a05c43132 to your computer and use it in GitHub Desktop.
Save bolry/3599ffe3cad735d06b29045a05c43132 to your computer and use it in GitHub Desktop.
Singel Threaded Ptr from Andrei Alexandrescu talk at CppCon 2014
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