refcnt.hh revision 1762
112653Sandreas.sandberg@arm.com/* 212653Sandreas.sandberg@arm.com * Copyright (c) 2002-2005 The Regents of The University of Michigan 312653Sandreas.sandberg@arm.com * All rights reserved. 412653Sandreas.sandberg@arm.com * 512653Sandreas.sandberg@arm.com * Redistribution and use in source and binary forms, with or without 612653Sandreas.sandberg@arm.com * modification, are permitted provided that the following conditions are 712653Sandreas.sandberg@arm.com * met: redistributions of source code must retain the above copyright 812653Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer; 912653Sandreas.sandberg@arm.com * redistributions in binary form must reproduce the above copyright 1012653Sandreas.sandberg@arm.com * notice, this list of conditions and the following disclaimer in the 1112653Sandreas.sandberg@arm.com * documentation and/or other materials provided with the distribution; 1212653Sandreas.sandberg@arm.com * neither the name of the copyright holders nor the names of its 1312653Sandreas.sandberg@arm.com * contributors may be used to endorse or promote products derived from 1412653Sandreas.sandberg@arm.com * this software without specific prior written permission. 1512653Sandreas.sandberg@arm.com * 1612653Sandreas.sandberg@arm.com * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1712653Sandreas.sandberg@arm.com * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 1812653Sandreas.sandberg@arm.com * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 1912653Sandreas.sandberg@arm.com * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2012653Sandreas.sandberg@arm.com * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2112653Sandreas.sandberg@arm.com * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2212653Sandreas.sandberg@arm.com * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2312653Sandreas.sandberg@arm.com * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2412653Sandreas.sandberg@arm.com * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2512653Sandreas.sandberg@arm.com * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2612653Sandreas.sandberg@arm.com * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2712653Sandreas.sandberg@arm.com */ 2812653Sandreas.sandberg@arm.com 2912653Sandreas.sandberg@arm.com#ifndef __REFCNT_HH__ 3012653Sandreas.sandberg@arm.com#define __REFCNT_HH__ 3112653Sandreas.sandberg@arm.com 3212653Sandreas.sandberg@arm.comclass RefCounted 3312653Sandreas.sandberg@arm.com{ 3412653Sandreas.sandberg@arm.com private: 3512653Sandreas.sandberg@arm.com int count; 3612653Sandreas.sandberg@arm.com 3712653Sandreas.sandberg@arm.com private: 3812653Sandreas.sandberg@arm.com RefCounted(const RefCounted &); 3912653Sandreas.sandberg@arm.com 4012653Sandreas.sandberg@arm.com public: 4112653Sandreas.sandberg@arm.com RefCounted() : count(0) {} 4212653Sandreas.sandberg@arm.com virtual ~RefCounted() {} 4312653Sandreas.sandberg@arm.com 4412653Sandreas.sandberg@arm.com void incref() { ++count; } 4512653Sandreas.sandberg@arm.com void decref() { if (--count <= 0) delete this; } 4612653Sandreas.sandberg@arm.com}; 4712653Sandreas.sandberg@arm.com 4812653Sandreas.sandberg@arm.comtemplate <class T> 4912653Sandreas.sandberg@arm.comclass RefCountingPtr 5012653Sandreas.sandberg@arm.com{ 5112653Sandreas.sandberg@arm.com protected: 5212653Sandreas.sandberg@arm.com T *data; 5312653Sandreas.sandberg@arm.com 5412653Sandreas.sandberg@arm.com void copy(T *d) 5512653Sandreas.sandberg@arm.com { 5612653Sandreas.sandberg@arm.com data = d; 5712653Sandreas.sandberg@arm.com if (data) 5812653Sandreas.sandberg@arm.com data->incref(); 5912653Sandreas.sandberg@arm.com } 6012653Sandreas.sandberg@arm.com void del() 6112653Sandreas.sandberg@arm.com { 6212653Sandreas.sandberg@arm.com if (data) 6312653Sandreas.sandberg@arm.com data->decref(); 6412653Sandreas.sandberg@arm.com } 6512653Sandreas.sandberg@arm.com void set(T *d) 6612653Sandreas.sandberg@arm.com { 6712653Sandreas.sandberg@arm.com if (data == d) 6812653Sandreas.sandberg@arm.com return; 6912653Sandreas.sandberg@arm.com 7012653Sandreas.sandberg@arm.com del(); 7112653Sandreas.sandberg@arm.com copy(d); 7212653Sandreas.sandberg@arm.com } 7312653Sandreas.sandberg@arm.com 7412653Sandreas.sandberg@arm.com 7512653Sandreas.sandberg@arm.com public: 7612653Sandreas.sandberg@arm.com RefCountingPtr() : data(NULL) {} 7712653Sandreas.sandberg@arm.com RefCountingPtr(T *data) { copy(data); } 7812653Sandreas.sandberg@arm.com RefCountingPtr(const RefCountingPtr &r) { copy(r.data); } 7912653Sandreas.sandberg@arm.com ~RefCountingPtr() { del(); } 8012653Sandreas.sandberg@arm.com 8112653Sandreas.sandberg@arm.com T *operator->() { return data; } 8212653Sandreas.sandberg@arm.com T &operator*() { return *data; } 8312653Sandreas.sandberg@arm.com T *get() { return data; } 8412653Sandreas.sandberg@arm.com 8512653Sandreas.sandberg@arm.com const T *operator->() const { return data; } 8612653Sandreas.sandberg@arm.com const T &operator*() const { return *data; } 8712653Sandreas.sandberg@arm.com const T *get() const { return data; } 8812653Sandreas.sandberg@arm.com 8912653Sandreas.sandberg@arm.com RefCountingPtr &operator=(T *p) { set(p); return *this; } 9012653Sandreas.sandberg@arm.com RefCountingPtr &operator=(const RefCountingPtr &r) 9112653Sandreas.sandberg@arm.com { return operator=(r.data); } 9212653Sandreas.sandberg@arm.com 93 bool operator!() const { return data == 0; } 94 operator bool() const { return data != 0; } 95}; 96 97template<class T> 98bool operator==(const RefCountingPtr<T> &l, const RefCountingPtr<T> &r) 99{ return l.get() == r.get(); } 100 101template<class T> 102bool operator==(const RefCountingPtr<T> &l, const T *r) 103{ return l.get() == r; } 104 105template<class T> 106bool operator==(const T &l, const RefCountingPtr<T> &r) 107{ return l == r.get(); } 108 109template<class T> 110bool operator!=(const RefCountingPtr<T> &l, const RefCountingPtr<T> &r) 111{ return l.get() != r.get(); } 112 113template<class T> 114bool operator!=(const RefCountingPtr<T> &l, const T *r) 115{ return l.get() != r; } 116 117template<class T> 118bool operator!=(const T &l, const RefCountingPtr<T> &r) 119{ return l != r.get(); } 120 121#endif // __REFCNT_HH__ 122