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
14 namespace 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);
37 private:
38  ASTRef( const ASTRef& );
39  ASTRef& operator=( const ASTRef& );
40 };
41 
42 template<class T>
44 {
45 private:
47 
48 public:
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__
Definition: ANTLRException.hpp:15
Definition: AST.hpp:23
static ASTRef * getRef(const AST *p)
Definition: ASTRefCount.cpp:26
T * operator->() const
Definition: ASTRefCount.hpp:88
ASTRef * ref
Definition: ASTRefCount.hpp:46
~ASTRefCount()
Definition: ASTRefCount.hpp:57
ASTRefCount(const ASTRefCount< T > &other)
Definition: ASTRefCount.hpp:53
#define ANTLR_API
Definition: config.hpp:22
bool decrement()
Definition: ASTRefCount.hpp:31
ASTRefCount(const AST *p=0)
Definition: ASTRefCount.hpp:49
ASTRefCount< T > & operator=(AST *other)
Definition: ASTRefCount.hpp:62
AST *const ptr
Definition: ASTRefCount.hpp:21
Definition: ASTRefCount.hpp:19
Definition: ASTRefCount.hpp:43
unsigned int count
Definition: ASTRefCount.hpp:22
ASTRefCount< AST > RefAST
Definition: ASTRefCount.hpp:92
ASTRef * increment()
Definition: ASTRefCount.hpp:26
ASTRefCount< T > & operator=(const ASTRefCount< T > &other)
Definition: ASTRefCount.hpp:73