]>
git.saurik.com Git - apple/javascriptcore.git/blob - API/JSRetainPtr.h
2 * Copyright (C) 2005, 2006, 2007 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 Computer, 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/JSStringRef.h>
35 inline void JSRetain(JSStringRef string
) { JSStringRetain(string
); }
36 inline void JSRelease(JSStringRef string
) { JSStringRelease(string
); }
38 enum AdoptTag
{ Adopt
};
40 template <typename T
> class JSRetainPtr
{
42 JSRetainPtr() : m_ptr(0) {}
43 JSRetainPtr(T ptr
) : m_ptr(ptr
) { if (ptr
) JSRetain(ptr
); }
45 JSRetainPtr(AdoptTag
, T ptr
) : m_ptr(ptr
) { }
47 JSRetainPtr(const JSRetainPtr
& o
) : m_ptr(o
.m_ptr
) { if (T ptr
= m_ptr
) JSRetain(ptr
); }
49 ~JSRetainPtr() { if (T ptr
= m_ptr
) JSRelease(ptr
); }
51 template <typename U
> JSRetainPtr(const JSRetainPtr
<U
>& o
) : m_ptr(o
.get()) { if (T ptr
= m_ptr
) JSRetain(ptr
); }
53 T
get() const { return m_ptr
; }
55 T
releaseRef() { T tmp
= m_ptr
; m_ptr
= 0; return tmp
; }
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
<T
>::operator=(const JSRetainPtr
<T
>& o
)
90 template <typename T
> template <typename U
> inline JSRetainPtr
<T
>& JSRetainPtr
<T
>::operator=(const JSRetainPtr
<U
>& o
)
102 template <typename T
> inline JSRetainPtr
<T
>& JSRetainPtr
<T
>::operator=(T optr
)
113 template <typename T
> inline void JSRetainPtr
<T
>::adopt(T optr
)
121 template <typename T
> template <typename U
> inline JSRetainPtr
<T
>& JSRetainPtr
<T
>::operator=(U
* optr
)
132 template <class T
> inline void JSRetainPtr
<T
>::swap(JSRetainPtr
<T
>& o
)
134 std::swap(m_ptr
, o
.m_ptr
);
137 template <class T
> inline void swap(JSRetainPtr
<T
>& a
, JSRetainPtr
<T
>& b
)
142 template <typename T
, typename U
> inline bool operator==(const JSRetainPtr
<T
>& a
, const JSRetainPtr
<U
>& b
)
144 return a
.get() == b
.get();
147 template <typename T
, typename U
> inline bool operator==(const JSRetainPtr
<T
>& a
, U
* b
)
152 template <typename T
, typename U
> inline bool operator==(T
* a
, const JSRetainPtr
<U
>& b
)
157 template <typename T
, typename U
> inline bool operator!=(const JSRetainPtr
<T
>& a
, const JSRetainPtr
<U
>& b
)
159 return a
.get() != b
.get();
162 template <typename T
, typename U
> inline bool operator!=(const JSRetainPtr
<T
>& a
, U
* b
)
167 template <typename T
, typename U
> inline bool operator!=(T
* a
, const JSRetainPtr
<U
>& b
)
173 #endif // JSRetainPtr_h