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__