#ifndef DataRef_h
#define DataRef_h
#include <assert.h>
namespace WebCore {
template <typename T> class DataRef
{
public:
DataRef() : m_data(0) { }
DataRef(const DataRef<T>& d)
{
assert(d.m_data);
m_data = d.m_data;
m_data->ref();
}
~DataRef()
{
if (m_data)
m_data->deref();
}
const T* get() const { return m_data; }
T& operator*() const { return *m_data; }
const T* operator->() const { return m_data; }
T* access()
{
if (!m_data->hasOneRef()) {
m_data->deref();
m_data = new T(*m_data);
m_data->ref();
}
return m_data;
}
void init()
{
assert(!m_data);
m_data = new T;
m_data->ref();
}
DataRef<T>& operator=(const DataRef<T>& d)
{
assert(d.m_data);
d.m_data->ref();
if (m_data)
m_data->deref();
m_data = d.m_data;
return *this;
}
bool operator==(const DataRef<T>& o) const
{
assert(m_data);
assert(o.m_data);
return m_data == o.m_data || *m_data == *o.m_data;
}
bool operator!=(const DataRef<T>& o) const
{
assert(m_data);
assert(o.m_data);
return m_data != o.m_data && *m_data != *o.m_data;
}
private:
T* m_data;
};
}
#endif