18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2008 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 * 1. Redistributions of source code must retain the above copyright 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#ifndef CachedResourceHandle_h 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#define CachedResourceHandle_h 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "CachedResource.h" 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WebCore { 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project class CachedResourceHandleBase { 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project public: 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ~CachedResourceHandleBase() { if (m_resource) m_resource->unregisterHandle(this); } 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CachedResource* get() const { return m_resource; } 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool operator!() const { return !m_resource; } 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project // This conversion operator allows implicit conversion to bool but not to other integer types. 41231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block // Parenthesis is needed for winscw compiler to resolve class qualifier in this case. 42231d4e3152a9c27a73b6ac7badbe6be673aa3ddfSteve Block typedef CachedResource* (CachedResourceHandleBase::*UnspecifiedBoolType); 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project operator UnspecifiedBoolType() const { return m_resource ? &CachedResourceHandleBase::m_resource : 0; } 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project protected: 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CachedResourceHandleBase() : m_resource(0) {} 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CachedResourceHandleBase(CachedResource* res) { m_resource = res; if (m_resource) m_resource->registerHandle(this); } 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CachedResourceHandleBase(const CachedResourceHandleBase& o) : m_resource(o.m_resource) { if (m_resource) m_resource->registerHandle(this); } 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void setResource(CachedResource*); 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project private: 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CachedResourceHandleBase& operator=(const CachedResourceHandleBase&) { return *this; } 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project friend class CachedResource; 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CachedResource* m_resource; 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project }; 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project template <class R> class CachedResourceHandle : public CachedResourceHandleBase { 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project public: 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CachedResourceHandle() { } 63cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block CachedResourceHandle(R* res); 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CachedResourceHandle(const CachedResourceHandle<R>& o) : CachedResourceHandleBase(o) { } 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project R* get() const { return reinterpret_cast<R*>(CachedResourceHandleBase::get()); } 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project R* operator->() const { return get(); } 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CachedResourceHandle& operator=(R* res) { setResource(res); return *this; } 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project CachedResourceHandle& operator=(const CachedResourceHandle& o) { setResource(o.get()); return *this; } 718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool operator==(const CachedResourceHandleBase& o) const { return get() == o.get(); } 728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool operator!=(const CachedResourceHandleBase& o) const { return get() != o.get(); } 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project }; 74cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block 75d0825bca7fe65beaee391d30da42e937db621564Steve Block // Don't inline for winscw compiler to prevent the compiler aggressively resolving 76cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block // the base class of R* when CachedResourceHandler<T>(R*) is inlined. The bug is 77cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block // reported at: https://xdabug001.ext.nokia.com/bugzilla/show_bug.cgi?id=9812. 78cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block template <class R> 79cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#if !COMPILER(WINSCW) 80cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block inline 81cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block#endif 82cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block CachedResourceHandle<R>::CachedResourceHandle(R* res) : CachedResourceHandleBase(res) 83cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block { 84cac0f67c402d107cdb10971b95719e2ff9c7c76bSteve Block } 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project template <class R, class RR> bool operator==(const CachedResourceHandle<R>& h, const RR* res) 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return h.get() == res; 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project template <class R, class RR> bool operator==(const RR* res, const CachedResourceHandle<R>& h) 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return h.get() == res; 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project template <class R, class RR> bool operator!=(const CachedResourceHandle<R>& h, const RR* res) 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return h.get() != res; 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project template <class R, class RR> bool operator!=(const RR* res, const CachedResourceHandle<R>& h) 998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project { 1008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return h.get() != res; 1018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif 105