// Copyright (C) 2016 The Qt Company Ltd. // SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only #ifndef PASSREFPTR_H #define PASSREFPTR_H template class RefPtr; template class PassRefPtr { public: PassRefPtr() : m_ptr(0) {} PassRefPtr(T* ptr) : m_ptr(ptr) { if (m_ptr) m_ptr->ref(); } PassRefPtr(const PassRefPtr& other) : m_ptr(other.leakRef()) { } PassRefPtr(const RefPtr& other) : m_ptr(other.get()) { if (m_ptr) m_ptr->ref(); } ~PassRefPtr() { if (m_ptr) m_ptr->deref(); } T* operator->() const { return m_ptr; } T* leakRef() const { T* result = m_ptr; m_ptr = 0; return result; } private: PassRefPtr& operator=(const PassRefPtr& t); protected: mutable T* m_ptr; }; template class Ref : public PassRefPtr { using PassRefPtr::PassRefPtr; template friend Ref adoptRef(PtrType*); }; template Ref adoptRef(T* ptr) { Ref result; result.m_ptr = ptr; return result; } #endif // PASSREFPTR_H