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