00001
#ifndef INC_RefCount_hpp__
00002
#define INC_RefCount_hpp__
00003
00004
00005
00006
00007
00008
00009
00010
#include <antlr/config.hpp>
00011
00012
#ifdef ANTLR_CXX_SUPPORTS_NAMESPACE
00013
namespace antlr {
00014
#endif
00015
00016
template<
class T>
00017 class ANTLR_API RefCount {
00018
private:
00019 struct Ref {
00020 T*
const ptr;
00021 unsigned int count;
00022
00023 Ref(T* p) : ptr(p), count(1) {}
00024 ~
Ref() {
delete ptr;}
00025 Ref* increment() {++count;
return this;}
00026 bool decrement() {
return (--count==0);}
00027
private:
00028
Ref(
const Ref&);
00029
Ref& operator=(
const Ref&);
00030 }* ref;
00031
00032
public:
00033 explicit RefCount(T* p = 0)
00034 : ref(p ? new Ref(p) : 0)
00035 {
00036 }
00037 RefCount(
const RefCount<T>& other)
00038 : ref(other.ref ? other.ref->increment() : 0)
00039 {
00040 }
00041 ~RefCount()
00042 {
00043
if (ref && ref->decrement())
00044
delete ref;
00045 }
00046 RefCount<T>& operator=(
const RefCount<T>& other)
00047 {
00048 Ref* tmp = other.
ref ? other.
ref->
increment() : 0;
00049
if (ref && ref->decrement())
00050
delete ref;
00051 ref = tmp;
00052
return *
this;
00053 }
00054
00055 operator T* ()
const
00056
{
00057
return ref ? ref->ptr : 0;
00058 }
00059
00060 T* operator->()
const
00061
{
00062
return ref ? ref->ptr : 0;
00063 }
00064
00065 T* get()
const
00066
{
00067
return ref ? ref->ptr : 0;
00068 }
00069
00070 template<
class newType> operator RefCount<newType>()
00071 {
00072
return RefCount<newType>(ref);
00073 }
00074 };
00075
00076
#ifdef ANTLR_CXX_SUPPORTS_NAMESPACE
00077
}
00078
#endif
00079
00080
#endif //INC_RefCount_hpp__