/*M/////////////////////////////////////////////////////////////////////////////////////// // // IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. // // By downloading, copying, installing or using the software you agree to this license. // If you do not agree to this license, do not download, install, // copy or use the software. // // // License Agreement // For Open Source Computer Vision Library // // Copyright (C) 2013, NVIDIA Corporation, all rights reserved. // Third party copyrights are property of their respective owners. // // Redistribution and use in source and binary forms, with or without modification, // are permitted provided that the following conditions are met: // // * Redistribution's of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // // * Redistribution's in binary form must reproduce the above copyright notice, // this list of conditions and the following disclaimer in the documentation // and/or other materials provided with the distribution. // // * The name of the copyright holders may not be used to endorse or promote products // derived from this software without specific prior written permission. // // This software is provided by the copyright holders and contributors "as is" and // any express or implied warranties, including, but not limited to, the implied // warranties of merchantability and fitness for a particular purpose are disclaimed. // In no event shall the copyright holders or contributors be liable for any direct, // indirect, incidental, special, exemplary, or consequential damages // (including, but not limited to, procurement of substitute goods or services; // loss of use, data, or profits; or business interruption) however caused // and on any theory of liability, whether in contract, strict liability, // or tort (including negligence or otherwise) arising in any way out of // the use of this software, even if advised of the possibility of such damage. // //M*/ #ifndef __OPENCV_CORE_PTR_INL_HPP__ #define __OPENCV_CORE_PTR_INL_HPP__ #include //! @cond IGNORED namespace cv { template void DefaultDeleter::operator () (Y* p) const { delete p; } namespace detail { struct PtrOwner { PtrOwner() : refCount(1) {} void incRef() { CV_XADD(&refCount, 1); } void decRef() { if (CV_XADD(&refCount, -1) == 1) deleteSelf(); } protected: /* This doesn't really need to be virtual, since PtrOwner is never deleted directly, but it doesn't hurt and it helps avoid warnings. */ virtual ~PtrOwner() {} virtual void deleteSelf() = 0; private: unsigned int refCount; // noncopyable PtrOwner(const PtrOwner&); PtrOwner& operator = (const PtrOwner&); }; template struct PtrOwnerImpl : PtrOwner { PtrOwnerImpl(Y* p, D d) : owned(p), deleter(d) {} void deleteSelf() { deleter(owned); delete this; } private: Y* owned; D deleter; }; } template Ptr::Ptr() : owner(NULL), stored(NULL) {} template template Ptr::Ptr(Y* p) : owner(p ? new detail::PtrOwnerImpl >(p, DefaultDeleter()) : NULL), stored(p) {} template template Ptr::Ptr(Y* p, D d) : owner(p ? new detail::PtrOwnerImpl(p, d) : NULL), stored(p) {} template Ptr::Ptr(const Ptr& o) : owner(o.owner), stored(o.stored) { if (owner) owner->incRef(); } template template Ptr::Ptr(const Ptr& o) : owner(o.owner), stored(o.stored) { if (owner) owner->incRef(); } template template Ptr::Ptr(const Ptr& o, T* p) : owner(o.owner), stored(p) { if (owner) owner->incRef(); } template Ptr::~Ptr() { release(); } template Ptr& Ptr::operator = (const Ptr& o) { Ptr(o).swap(*this); return *this; } template template Ptr& Ptr::operator = (const Ptr& o) { Ptr(o).swap(*this); return *this; } template void Ptr::release() { if (owner) owner->decRef(); owner = NULL; stored = NULL; } template template void Ptr::reset(Y* p) { Ptr(p).swap(*this); } template template void Ptr::reset(Y* p, D d) { Ptr(p, d).swap(*this); } template void Ptr::swap(Ptr& o) { std::swap(owner, o.owner); std::swap(stored, o.stored); } template T* Ptr::get() const { return stored; } template typename detail::RefOrVoid::type Ptr::operator * () const { return *stored; } template T* Ptr::operator -> () const { return stored; } template Ptr::operator T* () const { return stored; } template bool Ptr::empty() const { return !stored; } template template Ptr Ptr::staticCast() const { return Ptr(*this, static_cast(stored)); } template template Ptr Ptr::constCast() const { return Ptr(*this, const_cast(stored)); } template template Ptr Ptr::dynamicCast() const { return Ptr(*this, dynamic_cast(stored)); } #ifdef CV_CXX_MOVE_SEMANTICS template Ptr::Ptr(Ptr&& o) : owner(o.owner), stored(o.stored) { o.owner = NULL; o.stored = NULL; } template Ptr& Ptr::operator = (Ptr&& o) { release(); owner = o.owner; stored = o.stored; o.owner = NULL; o.stored = NULL; return *this; } #endif template void swap(Ptr& ptr1, Ptr& ptr2){ ptr1.swap(ptr2); } template bool operator == (const Ptr& ptr1, const Ptr& ptr2) { return ptr1.get() == ptr2.get(); } template bool operator != (const Ptr& ptr1, const Ptr& ptr2) { return ptr1.get() != ptr2.get(); } template Ptr makePtr() { return Ptr(new T()); } template Ptr makePtr(const A1& a1) { return Ptr(new T(a1)); } template Ptr makePtr(const A1& a1, const A2& a2) { return Ptr(new T(a1, a2)); } template Ptr makePtr(const A1& a1, const A2& a2, const A3& a3) { return Ptr(new T(a1, a2, a3)); } template Ptr makePtr(const A1& a1, const A2& a2, const A3& a3, const A4& a4) { return Ptr(new T(a1, a2, a3, a4)); } template Ptr makePtr(const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5) { return Ptr(new T(a1, a2, a3, a4, a5)); } template Ptr makePtr(const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6) { return Ptr(new T(a1, a2, a3, a4, a5, a6)); } template Ptr makePtr(const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6, const A7& a7) { return Ptr(new T(a1, a2, a3, a4, a5, a6, a7)); } template Ptr makePtr(const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6, const A7& a7, const A8& a8) { return Ptr(new T(a1, a2, a3, a4, a5, a6, a7, a8)); } template Ptr makePtr(const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9) { return Ptr(new T(a1, a2, a3, a4, a5, a6, a7, a8, a9)); } template Ptr makePtr(const A1& a1, const A2& a2, const A3& a3, const A4& a4, const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9, const A10& a10) { return Ptr(new T(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10)); } } // namespace cv //! @endcond #endif // __OPENCV_CORE_PTR_INL_HPP__