#ifndef SHARED_H
#define SHARED_H
namespace WebCore {
template<class T> class Shared {
public:
Shared() : m_refCount(0) { }
void ref() { ++m_refCount; }
void deref() { if (--m_refCount <= 0) delete static_cast<T*>(this); }
bool hasOneRef() { return m_refCount == 1; }
int refCount() const { return m_refCount; }
private:
int m_refCount;
Shared(const Shared&);
Shared& operator=(const Shared&);
};
template<class T> class TreeShared {
public:
TreeShared() : m_refCount(0), m_parent(0) { }
TreeShared(T* parent) : m_refCount(0), m_parent(parent) { }
virtual ~TreeShared() { }
virtual void removedLastRef() { delete static_cast<T*>(this); }
void ref() { ++m_refCount; }
void deref() { if (--m_refCount <= 0 && !m_parent) removedLastRef(); }
bool hasOneRef() { return m_refCount == 1; }
int refCount() const { return m_refCount; }
void setParent(T* parent) { m_parent = parent; }
T* parent() const { return m_parent; }
private:
int m_refCount;
T* m_parent;
TreeShared(const TreeShared&);
TreeShared& operator=(const TreeShared&);
};
}
#endif