2 * Copyright (C) 2005, 2006, 2007, 2010 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of Apple Inc. ("Apple") nor the names of
14 * its contributors may be used to endorse or promote products derived
15 * from this software without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 #include <JavaScriptCore/JSContextRef.h>
33 #include <JavaScriptCore/JSStringRef.h>
36 inline void JSRetain(JSStringRef string
) { JSStringRetain(string
); }
37 inline void JSRelease(JSStringRef string
) { JSStringRelease(string
); }
38 inline void JSRetain(JSGlobalContextRef context
) { JSGlobalContextRetain(context
); }
39 inline void JSRelease(JSGlobalContextRef context
) { JSGlobalContextRelease(context
); }
41 enum AdoptTag
{ Adopt
};
43 template<typename T
> class JSRetainPtr
{
45 JSRetainPtr() : m_ptr(0) { }
46 JSRetainPtr(T ptr
) : m_ptr(ptr
) { if (ptr
) JSRetain(ptr
); }
47 JSRetainPtr(AdoptTag
, T ptr
) : m_ptr(ptr
) { }
48 JSRetainPtr(const JSRetainPtr
&);
49 template<typename U
> JSRetainPtr(const JSRetainPtr
<U
>&);
52 T
get() const { return m_ptr
; }
57 T
operator->() const { return m_ptr
; }
59 bool operator!() const { return !m_ptr
; }
61 // This conversion operator allows implicit conversion to bool but not to other integer types.
62 typedef T
JSRetainPtr::*UnspecifiedBoolType
;
63 operator UnspecifiedBoolType() const { return m_ptr
? &JSRetainPtr::m_ptr
: 0; }
65 JSRetainPtr
& operator=(const JSRetainPtr
&);
66 template<typename U
> JSRetainPtr
& operator=(const JSRetainPtr
<U
>&);
67 JSRetainPtr
& operator=(T
);
68 template<typename U
> JSRetainPtr
& operator=(U
*);
72 void swap(JSRetainPtr
&);
78 template<typename T
> inline JSRetainPtr
<T
>::JSRetainPtr(const JSRetainPtr
& o
)
85 template<typename T
> template<typename U
> inline JSRetainPtr
<T
>::JSRetainPtr(const JSRetainPtr
<U
>& o
)
92 template<typename T
> inline JSRetainPtr
<T
>::~JSRetainPtr()
98 template<typename T
> inline void JSRetainPtr
<T
>::clear()
106 template<typename T
> inline T JSRetainPtr
<T
>::leakRef()
113 template<typename T
> inline JSRetainPtr
<T
>& JSRetainPtr
<T
>::operator=(const JSRetainPtr
<T
>& o
)
125 template<typename T
> template<typename U
> inline JSRetainPtr
<T
>& JSRetainPtr
<T
>::operator=(const JSRetainPtr
<U
>& o
)
137 template<typename T
> inline JSRetainPtr
<T
>& JSRetainPtr
<T
>::operator=(T optr
)
148 template<typename T
> inline void JSRetainPtr
<T
>::adopt(T optr
)
156 template<typename T
> template<typename U
> inline JSRetainPtr
<T
>& JSRetainPtr
<T
>::operator=(U
* optr
)
167 template<typename T
> inline void JSRetainPtr
<T
>::swap(JSRetainPtr
<T
>& o
)
169 std::swap(m_ptr
, o
.m_ptr
);
172 template<typename T
> inline void swap(JSRetainPtr
<T
>& a
, JSRetainPtr
<T
>& b
)
177 template<typename T
, typename U
> inline bool operator==(const JSRetainPtr
<T
>& a
, const JSRetainPtr
<U
>& b
)
179 return a
.get() == b
.get();
182 template<typename T
, typename U
> inline bool operator==(const JSRetainPtr
<T
>& a
, U
* b
)
187 template<typename T
, typename U
> inline bool operator==(T
* a
, const JSRetainPtr
<U
>& b
)
192 template<typename T
, typename U
> inline bool operator!=(const JSRetainPtr
<T
>& a
, const JSRetainPtr
<U
>& b
)
194 return a
.get() != b
.get();
197 template<typename T
, typename U
> inline bool operator!=(const JSRetainPtr
<T
>& a
, U
* b
)
202 template<typename T
, typename U
> inline bool operator!=(T
* a
, const JSRetainPtr
<U
>& b
)
208 #endif // JSRetainPtr_h