1 /* 2 * Copyright (C) 2005 Tommi Maekitalo 3 * 4 * This library is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU Lesser General Public 6 * License as published by the Free Software Foundation; either 7 * version 2.1 of the License, or (at your option) any later version. 8 * 9 * As a special exception, you may use this file as part of a free 10 * software library without restriction. Specifically, if other files 11 * instantiate templates or use macros or inline functions from this 12 * file, or you compile this file and link it with other files to 13 * produce an executable, this file does not by itself cause the 14 * resulting executable to be covered by the GNU General Public 15 * License. This exception does not however invalidate any other 16 * reasons why the executable file might be covered by the GNU Library 17 * General Public License. 18 * 19 * This library is distributed in the hope that it will be useful, 20 * but WITHOUT ANY WARRANTY; without even the implied warranty of 21 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 22 * Lesser General Public License for more details. 23 * 24 * You should have received a copy of the GNU Lesser General Public 25 * License along with this library; if not, write to the Free Software 26 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA 27 */ 28 29 #ifndef CXXTOOLS_REFCOUNTED_H 30 #define CXXTOOLS_REFCOUNTED_H 31 32 #include <cxxtools/noncopyable.h> 33 #include <cxxtools/atomicity.h> 34 35 namespace cxxtools 36 { 37 class SimpleRefCounted : private NonCopyable 38 { 39 unsigned rc; 40 41 public: SimpleRefCounted()42 SimpleRefCounted() 43 : rc(0) 44 { } 45 SimpleRefCounted(unsigned refs_)46 explicit SimpleRefCounted(unsigned refs_) 47 : rc(refs_) 48 { } 49 ~SimpleRefCounted()50 virtual ~SimpleRefCounted() { } 51 addRef()52 virtual unsigned addRef() { return ++rc; } release()53 virtual unsigned release() { return --rc; } refs()54 unsigned refs() const { return rc; } 55 }; 56 57 class AtomicRefCounted : private NonCopyable 58 { 59 mutable volatile atomic_t rc; 60 61 public: AtomicRefCounted()62 AtomicRefCounted() 63 : rc(0) 64 { } 65 AtomicRefCounted(unsigned refs_)66 explicit AtomicRefCounted(unsigned refs_) 67 : rc(refs_) 68 { } 69 ~AtomicRefCounted()70 virtual ~AtomicRefCounted() { } 71 addRef()72 virtual atomic_t addRef() { return atomicIncrement(rc); } release()73 virtual atomic_t release() { atomic_t ret = atomicDecrement(rc); return ret; } refs()74 atomic_t refs() const { return rc; } 75 }; 76 77 typedef SimpleRefCounted RefCounted; 78 } 79 80 #endif // CXXTOOLS_REFCOUNTED_H 81 82