ANTLR Support Libraries 2.7.1+
ASTRefCount.hpp
Go to the documentation of this file.
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
14namespace antlr {
15#endif
16
17 class AST;
18
20{
21 AST* const ptr;
22 unsigned int count;
23
24 ASTRef(AST* p);
25 ~ASTRef();
27 {
28 ++count;
29 return this;
30 }
31 bool decrement()
32 {
33 return (--count==0);
34 }
35
36 static ASTRef* getRef(const AST* p);
37private:
38 ASTRef( const ASTRef& );
40};
41
42template<class T>
44{
45private:
47
48public:
49 ASTRefCount(const AST* p=0)
50 : ref(p ? ASTRef::getRef(p) : 0)
51 {
52 }
54 : ref(other.ref ? other.ref->increment() : 0)
55 {
56 }
58 {
59 if (ref && ref->decrement())
60 delete ref;
61 }
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 }
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
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
93
94#ifdef ANTLR_CXX_SUPPORTS_NAMESPACE
95}
96#endif
97
98#endif //INC_ASTRefCount_hpp__
ASTRefCount< AST > RefAST
Definition: ASTRefCount.hpp:92
Definition: ASTRefCount.hpp:44
ASTRefCount(const ASTRefCount< T > &other)
Definition: ASTRefCount.hpp:53
ASTRef * ref
Definition: ASTRefCount.hpp:46
~ASTRefCount()
Definition: ASTRefCount.hpp:57
ASTRefCount< T > & operator=(AST *other)
Definition: ASTRefCount.hpp:62
ASTRefCount< T > & operator=(const ASTRefCount< T > &other)
Definition: ASTRefCount.hpp:73
ASTRefCount(const AST *p=0)
Definition: ASTRefCount.hpp:49
T * operator->() const
Definition: ASTRefCount.hpp:88
T * get() const
Definition: ASTRefCount.hpp:89
Definition: AST.hpp:23
#define ANTLR_API
Definition: config.hpp:22
Definition: ANTLRException.hpp:15
Definition: ASTRefCount.hpp:20
AST *const ptr
Definition: ASTRefCount.hpp:21
bool decrement()
Definition: ASTRefCount.hpp:31
unsigned int count
Definition: ASTRefCount.hpp:22
ASTRef(const ASTRef &)
static ASTRef * getRef(const AST *p)
Definition: ASTRefCount.cpp:26
ASTRef * increment()
Definition: ASTRefCount.hpp:26
ASTRef & operator=(const ASTRef &)