1 #ifndef INC_ASTRefCount_hpp__ 2 # define INC_ASTRefCount_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: //depot/code/org.antlr/release/antlr-2.7.7/lib/cpp/antlr/ASTRefCount.hpp#2 $ 9 */ 10 11 # include <antlr/config.hpp> 12 13 #ifdef ANTLR_CXX_SUPPORTS_NAMESPACE 14 namespace antlr { 15 #endif 16 17 class AST; 18 19 struct ANTLR_API ASTRef 20 { 21 AST* const ptr; 22 unsigned int count; 23 24 ASTRef(AST* p); 25 ~ASTRef(); incrementantlr::ASTRef26 ASTRef* increment() 27 { 28 ++count; 29 return this; 30 } decrementantlr::ASTRef31 bool decrement() 32 { 33 return (--count==0); 34 } 35 36 static ASTRef* getRef(const AST* p); 37 private: 38 ASTRef( const ASTRef& ); 39 ASTRef& operator=( const ASTRef& ); 40 }; 41 42 template<class T> 43 class ANTLR_API ASTRefCount 44 { 45 private: 46 ASTRef* ref; 47 48 public: ASTRefCount(const AST * p=0)49 ASTRefCount(const AST* p=0) 50 : ref(p ? ASTRef::getRef(p) : 0) 51 { 52 } ASTRefCount(const ASTRefCount<T> & other)53 ASTRefCount(const ASTRefCount<T>& other) 54 : ref(other.ref ? other.ref->increment() : 0) 55 { 56 } ~ASTRefCount()57 ~ASTRefCount() 58 { 59 if (ref && ref->decrement()) 60 delete ref; 61 } operator =(AST * other)62 ASTRefCount<T>& operator=(AST* other) 63 { 64 ASTRef* tmp = ASTRef::getRef(other); 65 66 if (ref && ref->decrement()) 67 delete ref; 68 69 ref=tmp; 70 71 return *this; 72 } operator =(const ASTRefCount<T> & other)73 ASTRefCount<T>& operator=(const ASTRefCount<T>& other) 74 { 75 if( other.ref != ref ) 76 { 77 ASTRef* 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 operator T*() const87 operator T* () const { return ref ? static_cast<T*>(ref->ptr) : 0; } operator ->() const88 T* operator->() const { return ref ? static_cast<T*>(ref->ptr) : 0; } get() const89 T* get() const { return ref ? static_cast<T*>(ref->ptr) : 0; } 90 }; 91 92 typedef ASTRefCount<AST> RefAST; 93 94 #ifdef ANTLR_CXX_SUPPORTS_NAMESPACE 95 } 96 #endif 97 98 #endif //INC_ASTRefCount_hpp__ 99