18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/*
2f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick * Copyright (C) 2005, 2006, 2007, 2010 Apple Inc. All rights reserved.
38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without
58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions
68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met:
78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1.  Redistributions of source code must retain the above copyright
98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     notice, this list of conditions and the following disclaimer.
108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2.  Redistributions in binary form must reproduce the above copyright
118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     notice, this list of conditions and the following disclaimer in the
128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     documentation and/or other materials provided with the distribution.
138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     its contributors may be used to endorse or promote products derived
158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *     from this software without specific prior written permission.
168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project *
178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */
288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef JSRetainPtr_h
308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define JSRetainPtr_h
318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <JavaScriptCore/JSStringRef.h>
338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <algorithm>
348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline void JSRetain(JSStringRef string) { JSStringRetain(string); }
368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectinline void JSRelease(JSStringRef string) { JSStringRelease(string); }
378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectenum AdoptTag { Adopt };
398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
40f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merricktemplate<typename T> class JSRetainPtr {
418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic:
42f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    JSRetainPtr() : m_ptr(0) { }
438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JSRetainPtr(T ptr) : m_ptr(ptr) { if (ptr) JSRetain(ptr); }
448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JSRetainPtr(AdoptTag, T ptr) : m_ptr(ptr) { }
45f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    JSRetainPtr(const JSRetainPtr&);
46f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    template<typename U> JSRetainPtr(const JSRetainPtr<U>&);
47f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    ~JSRetainPtr();
488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    T get() const { return m_ptr; }
508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
51f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    void clear();
52f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    T leakRef();
53f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    T operator->() const { return m_ptr; }
558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    bool operator!() const { return !m_ptr; }
578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    // This conversion operator allows implicit conversion to bool but not to other integer types.
598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    typedef T JSRetainPtr::*UnspecifiedBoolType;
608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    operator UnspecifiedBoolType() const { return m_ptr ? &JSRetainPtr::m_ptr : 0; }
618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JSRetainPtr& operator=(const JSRetainPtr&);
63f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    template<typename U> JSRetainPtr& operator=(const JSRetainPtr<U>&);
648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    JSRetainPtr& operator=(T);
65f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    template<typename U> JSRetainPtr& operator=(U*);
668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void adopt(T);
688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    void swap(JSRetainPtr&);
708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
71f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    // FIXME: Remove releaseRef once we change all callers to call leakRef instead.
72f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    T releaseRef() { return leakRef(); }
73f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate:
758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    T m_ptr;
768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project};
778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
78f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merricktemplate<typename T> inline JSRetainPtr<T>::JSRetainPtr(const JSRetainPtr& o)
79f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    : m_ptr(o.m_ptr)
80f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{
81f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (m_ptr)
82f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        JSRetain(m_ptr);
83f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick}
84f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
85f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merricktemplate<typename T> template<typename U> inline JSRetainPtr<T>::JSRetainPtr(const JSRetainPtr<U>& o)
86f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    : m_ptr(o.get())
87f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{
88f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (m_ptr)
89f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        JSRetain(m_ptr);
90f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick}
91f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
92f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merricktemplate<typename T> inline JSRetainPtr<T>::~JSRetainPtr()
93f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{
94f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (m_ptr)
95f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        JSRelease(m_ptr);
96f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick}
97f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
98f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merricktemplate<typename T> inline void JSRetainPtr<T>::clear()
99f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{
100f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    if (T ptr = m_ptr) {
101f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        m_ptr = 0;
102f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick        JSRelease(ptr);
103f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    }
104f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick}
105f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
106f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merricktemplate<typename T> inline T JSRetainPtr<T>::leakRef()
107f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick{
108f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    T ptr = m_ptr;
109f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    m_ptr = 0;
110f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick    return ptr;
111f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick}
112f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merrick
113f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merricktemplate<typename T> inline JSRetainPtr<T>& JSRetainPtr<T>::operator=(const JSRetainPtr<T>& o)
1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    T optr = o.get();
1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (optr)
1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        JSRetain(optr);
1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    T ptr = m_ptr;
1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_ptr = optr;
1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (ptr)
1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        JSRelease(ptr);
1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return *this;
1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
125f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merricktemplate<typename T> template<typename U> inline JSRetainPtr<T>& JSRetainPtr<T>::operator=(const JSRetainPtr<U>& o)
1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    T optr = o.get();
1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (optr)
1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        JSRetain(optr);
1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    T ptr = m_ptr;
1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_ptr = optr;
1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (ptr)
1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        JSRelease(ptr);
1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return *this;
1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
137f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merricktemplate<typename T> inline JSRetainPtr<T>& JSRetainPtr<T>::operator=(T optr)
1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (optr)
1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        JSRetain(optr);
1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    T ptr = m_ptr;
1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_ptr = optr;
1438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (ptr)
1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        JSRelease(ptr);
1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return *this;
1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
148f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merricktemplate<typename T> inline void JSRetainPtr<T>::adopt(T optr)
1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    T ptr = m_ptr;
1518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_ptr = optr;
1528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (ptr)
1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        JSRelease(ptr);
1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
156f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merricktemplate<typename T> template<typename U> inline JSRetainPtr<T>& JSRetainPtr<T>::operator=(U* optr)
1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (optr)
1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        JSRetain(optr);
1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    T ptr = m_ptr;
1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    m_ptr = optr;
1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    if (ptr)
1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project        JSRelease(ptr);
1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return *this;
1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
167f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merricktemplate<typename T> inline void JSRetainPtr<T>::swap(JSRetainPtr<T>& o)
1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    std::swap(m_ptr, o.m_ptr);
1708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
172f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merricktemplate<typename T> inline void swap(JSRetainPtr<T>& a, JSRetainPtr<T>& b)
1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    a.swap(b);
1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
177f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merricktemplate<typename T, typename U> inline bool operator==(const JSRetainPtr<T>& a, const JSRetainPtr<U>& b)
1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return a.get() == b.get();
1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
182f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merricktemplate<typename T, typename U> inline bool operator==(const JSRetainPtr<T>& a, U* b)
1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return a.get() == b;
1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
187f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merricktemplate<typename T, typename U> inline bool operator==(T* a, const JSRetainPtr<U>& b)
1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return a == b.get();
1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
192f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merricktemplate<typename T, typename U> inline bool operator!=(const JSRetainPtr<T>& a, const JSRetainPtr<U>& b)
1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return a.get() != b.get();
1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
197f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merricktemplate<typename T, typename U> inline bool operator!=(const JSRetainPtr<T>& a, U* b)
1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return a.get() != b;
2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
202f486d19d62f1bc33246748b14b14a9dfa617b57fIain Merricktemplate<typename T, typename U> inline bool operator!=(T* a, const JSRetainPtr<U>& b)
2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{
2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project    return a != b.get();
2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}
2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project
2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // JSRetainPtr_h
209