//===--------------------------- Refcount.h ------------------------------===// // // SPIR Tools // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===---------------------------------------------------------------------===// /* * Contributed by: Intel Corporation */ #ifndef __REF_COUNT_H__ #define __REF_COUNT_H__ #include namespace SPIR { template class RefCount{ public: RefCount(): m_refCount(0), m_ptr(0) { } RefCount(T* ptr): m_ptr(ptr) { m_refCount = new int(1); } RefCount(const RefCount& other) { cpy(other); } ~RefCount() { if (m_refCount) dispose(); } RefCount& operator=(const RefCount& other) { if(this == &other) return *this; if (m_refCount) dispose(); cpy(other); return *this; } void init(T* ptr) { assert(!m_ptr && "overrunning non NULL pointer"); assert(!m_refCount && "overrunning non NULL pointer"); m_refCount = new int(1); m_ptr = ptr; } bool isNull() const { return (!m_ptr); } // Pointer access const T& operator*() const{ sanity(); return *m_ptr; } T& operator*() { sanity(); return *m_ptr; } operator T*() { return m_ptr; } operator const T*() const{ return m_ptr; } T* operator->() { return m_ptr; } const T* operator->() const{ return m_ptr; } private: void sanity() const{ assert(m_ptr && "NULL pointer"); assert(m_refCount && "NULL ref counter"); assert(*m_refCount && "zero ref counter"); } void cpy(const RefCount& other) { m_refCount = other.m_refCount; m_ptr = other.m_ptr; if (m_refCount) ++*m_refCount; } void dispose() { sanity(); if (0 == --*m_refCount) { delete m_refCount; delete m_ptr; m_ptr = 0; m_refCount = 0; } } int* m_refCount; T* m_ptr; };// End RefCount } // End SPIR namespace #endif//__REF_COUNT_H__