1#ifndef INC_TokenRefCount_hpp__ 2# define INC_TokenRefCount_hpp__ 3 4/* ANTLR Translator Generator 5 * Project led by Terence Parr at http://www.jGuru.com 6 * Software rights: http://www.antlr.org/license.html 7 * 8 * $Id:$ 9 */ 10 11# include <antlr/config.hpp> 12 13#ifdef ANTLR_CXX_SUPPORTS_NAMESPACE 14namespace antlr { 15#endif 16 17class Token; 18 19struct ANTLR_API TokenRef 20{ 21 Token* const ptr; 22 unsigned int count; 23 24 TokenRef(Token* p); 25 ~TokenRef(); 26 TokenRef* increment() 27 { 28 ++count; 29 return this; 30 } 31 bool decrement() 32 { 33 return (--count==0); 34 } 35 36 static TokenRef* getRef(const Token* p); 37private: 38 TokenRef( const TokenRef& ); 39 TokenRef& operator=( const TokenRef& ); 40}; 41 42template<class T> 43 class ANTLR_API TokenRefCount 44{ 45private: 46 TokenRef* ref; 47 48public: 49 TokenRefCount(const Token* p=0) 50 : ref(p ? TokenRef::getRef(p) : 0) 51 { 52 } 53 TokenRefCount(const TokenRefCount<T>& other) 54 : ref(other.ref ? other.ref->increment() : 0) 55 { 56 } 57 ~TokenRefCount() 58 { 59 if (ref && ref->decrement()) 60 delete ref; 61 } 62 TokenRefCount<T>& operator=(Token* other) 63 { 64 TokenRef* tmp = TokenRef::getRef(other); 65 66 if (ref && ref->decrement()) 67 delete ref; 68 69 ref=tmp; 70 71 return *this; 72 } 73 TokenRefCount<T>& operator=(const TokenRefCount<T>& other) 74 { 75 if( other.ref != ref ) 76 { 77 TokenRef* tmp = other.ref ? other.ref->increment() : 0; 78 79 if (ref && ref->decrement()) 80 delete ref; 81 82 ref=tmp; 83 } 84 return *this; 85 } 86 87 operator T* () const { return ref ? static_cast<T*>(ref->ptr) : 0; } 88 T* operator->() const { return ref ? static_cast<T*>(ref->ptr) : 0; } 89 T* get() const { return ref ? static_cast<T*>(ref->ptr) : 0; } 90}; 91 92typedef TokenRefCount<Token> RefToken; 93 94#ifdef ANTLR_CXX_SUPPORTS_NAMESPACE 95} 96#endif 97 98#endif //INC_TokenRefCount_hpp__ 99