Home | History | Annotate | Download | only in cache
      1 /*
      2  * Copyright (C) 2008 Apple Inc. All Rights Reserved.
      3  *
      4  * Redistribution and use in source and binary forms, with or without
      5  * modification, are permitted provided that the following conditions
      6  * are met:
      7  * 1. Redistributions of source code must retain the above copyright
      8  *    notice, this list of conditions and the following disclaimer.
      9  * 2. Redistributions in binary form must reproduce the above copyright
     10  *    notice, this list of conditions and the following disclaimer in the
     11  *    documentation and/or other materials provided with the distribution.
     12  *
     13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY
     14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
     16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE INC. OR
     17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
     18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
     19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
     20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
     21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
     22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
     23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
     24  */
     25 
     26 #ifndef ResourcePtr_h
     27 #define ResourcePtr_h
     28 
     29 #include "core/loader/cache/Resource.h"
     30 
     31 namespace WebCore {
     32 
     33 class ResourcePtrBase {
     34 public:
     35     ~ResourcePtrBase();
     36 
     37     Resource* get() const { return m_resource; }
     38     bool operator!() const { return !m_resource; }
     39 
     40     // This conversion operator allows implicit conversion to bool but not to other integer types.
     41     typedef Resource* ResourcePtrBase::*UnspecifiedBoolType;
     42     operator UnspecifiedBoolType() const { return m_resource ? &ResourcePtrBase::m_resource : 0; }
     43 
     44 protected:
     45     ResourcePtrBase() : m_resource(0) { }
     46     ResourcePtrBase(Resource*);
     47     ResourcePtrBase(const ResourcePtrBase&);
     48 
     49     void setResource(Resource*);
     50 
     51 private:
     52     ResourcePtrBase& operator=(const ResourcePtrBase&) { return *this; }
     53 
     54     friend class Resource;
     55 
     56     Resource* m_resource;
     57 };
     58 
     59 inline ResourcePtrBase::ResourcePtrBase(Resource* res)
     60     : m_resource(res)
     61 {
     62     if (m_resource)
     63         m_resource->registerHandle(this);
     64 }
     65 
     66 inline ResourcePtrBase::~ResourcePtrBase()
     67 {
     68     if (m_resource)
     69         m_resource->unregisterHandle(this);
     70 }
     71 
     72 inline ResourcePtrBase::ResourcePtrBase(const ResourcePtrBase& o)
     73     : m_resource(o.m_resource)
     74 {
     75     if (m_resource)
     76         m_resource->registerHandle(this);
     77 }
     78 
     79 template <class R> class ResourcePtr : public ResourcePtrBase {
     80 public:
     81     ResourcePtr() { }
     82     ResourcePtr(R* res) : ResourcePtrBase(res) { }
     83     ResourcePtr(const ResourcePtr<R>& o) : ResourcePtrBase(o) { }
     84     template<typename U> ResourcePtr(const ResourcePtr<U>& o) : ResourcePtrBase(o.get()) { }
     85 
     86     R* get() const { return reinterpret_cast<R*>(ResourcePtrBase::get()); }
     87     R* operator->() const { return get(); }
     88 
     89     ResourcePtr& operator=(R* res) { setResource(res); return *this; }
     90     ResourcePtr& operator=(const ResourcePtr& o) { setResource(o.get()); return *this; }
     91     template<typename U> ResourcePtr& operator=(const ResourcePtr<U>& o) { setResource(o.get()); return *this; }
     92 
     93     bool operator==(const ResourcePtrBase& o) const { return get() == o.get(); }
     94     bool operator!=(const ResourcePtrBase& o) const { return get() != o.get(); }
     95 };
     96 
     97 template <class R, class RR> bool operator==(const ResourcePtr<R>& h, const RR* res)
     98 {
     99     return h.get() == res;
    100 }
    101 template <class R, class RR> bool operator==(const RR* res, const ResourcePtr<R>& h)
    102 {
    103     return h.get() == res;
    104 }
    105 template <class R, class RR> bool operator!=(const ResourcePtr<R>& h, const RR* res)
    106 {
    107     return h.get() != res;
    108 }
    109 template <class R, class RR> bool operator!=(const RR* res, const ResourcePtr<R>& h)
    110 {
    111     return h.get() != res;
    112 }
    113 }
    114 
    115 #endif
    116