diff -r 000000000000 -r 4f2f89ce4247 WebKit2/UIProcess/API/cpp/WKRetainPtr.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/WebKit2/UIProcess/API/cpp/WKRetainPtr.h Fri Sep 17 09:02:29 2010 +0300 @@ -0,0 +1,199 @@ +/* + * Copyright (C) 2010 Apple Inc. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions 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. + * + * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS 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 APPLE INC. OR ITS 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. + */ + +#ifndef WKRetainPtr_h +#define WKRetainPtr_h + +#include + +namespace WebKit { + +enum WKAdoptTag { AdoptWK }; + +template +class WKRetainPtr { +public: + typedef T PtrType; + + WKRetainPtr() + : m_ptr(0) + { + } + + WKRetainPtr(PtrType ptr) + : m_ptr(ptr) + { + if (ptr) + WKRetain(ptr); + } + + WKRetainPtr(WKAdoptTag, PtrType ptr) + : m_ptr(ptr) + { + } + + template + WKRetainPtr(const WKRetainPtr& o) + : m_ptr(o.get()) + { + if (PtrType ptr = m_ptr) + WKRetain(ptr); + } + + WKRetainPtr(const WKRetainPtr& o) + : m_ptr(o.m_ptr) + { + if (PtrType ptr = m_ptr) + WKRetain(ptr); + } + + ~WKRetainPtr() + { + if (PtrType ptr = m_ptr) + WKRelease(ptr); + } + + PtrType get() const { return m_ptr; } + PtrType releaseRef() { PtrType tmp = m_ptr; m_ptr = 0; return tmp; } + + PtrType operator->() const { return m_ptr; } + bool operator!() const { return !m_ptr; } + + // This conversion operator allows implicit conversion to bool but not to other integer types. + typedef PtrType WKRetainPtr::*UnspecifiedBoolType; + operator UnspecifiedBoolType() const { return m_ptr ? &WKRetainPtr::m_ptr : 0; } + + WKRetainPtr& operator=(const WKRetainPtr&); + template WKRetainPtr& operator=(const WKRetainPtr&); + WKRetainPtr& operator=(PtrType); + template WKRetainPtr& operator=(U*); + + void adopt(PtrType); + void swap(WKRetainPtr&); + +private: + PtrType m_ptr; +}; + +template inline WKRetainPtr& WKRetainPtr::operator=(const WKRetainPtr& o) +{ + PtrType optr = o.get(); + if (optr) + WKRetain(optr); + PtrType ptr = m_ptr; + m_ptr = optr; + if (ptr) + WKRelease(ptr); + return *this; +} + +template template inline WKRetainPtr& WKRetainPtr::operator=(const WKRetainPtr& o) +{ + PtrType optr = o.get(); + if (optr) + WKRetain(optr); + PtrType ptr = m_ptr; + m_ptr = optr; + if (ptr) + WKRelease(ptr); + return *this; +} + +template inline WKRetainPtr& WKRetainPtr::operator=(PtrType optr) +{ + if (optr) + WKRetain(optr); + PtrType ptr = m_ptr; + m_ptr = optr; + if (ptr) + WKRelease(ptr); + return *this; +} + +template inline void WKRetainPtr::adopt(PtrType optr) +{ + PtrType ptr = m_ptr; + m_ptr = optr; + if (ptr) + WKRelease(ptr); +} + +template template inline WKRetainPtr& WKRetainPtr::operator=(U* optr) +{ + if (optr) + WKRetain(optr); + PtrType ptr = m_ptr; + m_ptr = optr; + if (ptr) + WKRelease(ptr); + return *this; +} + +template inline void WKRetainPtr::swap(WKRetainPtr& o) +{ + std::swap(m_ptr, o.m_ptr); +} + +template inline void swap(WKRetainPtr& a, WKRetainPtr& b) +{ + a.swap(b); +} + +template inline bool operator==(const WKRetainPtr& a, const WKRetainPtr& b) +{ + return a.get() == b.get(); +} + +template inline bool operator==(const WKRetainPtr& a, U* b) +{ + return a.get() == b; +} + +template inline bool operator==(T* a, const WKRetainPtr& b) +{ + return a == b.get(); +} + +template inline bool operator!=(const WKRetainPtr& a, const WKRetainPtr& b) +{ + return a.get() != b.get(); +} + +template inline bool operator!=(const WKRetainPtr& a, U* b) +{ + return a.get() != b; +} + +template inline bool operator!=(T* a, const WKRetainPtr& b) +{ + return a != b.get(); +} + +} // namespace WebKit + +using WebKit::WKRetainPtr; +using WebKit::AdoptWK; + +#endif // WKRetainPtr_h