source: trunk/yao/share/antlr-2.7.7/lib/cpp/antlr/ASTRefCount.hpp @ 1

Last change on this file since 1 was 1, checked in by lnalod, 15 years ago

Initial import of YAO sources

File size: 1.7 KB
Line 
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
19struct ANTLR_API ASTRef
20{
21        AST* const ptr;
22        unsigned int count;
23
24        ASTRef(AST* p);
25        ~ASTRef();
26        ASTRef* increment()
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& );
39        ASTRef& operator=( const ASTRef& );
40};
41
42template<class T>
43        class ANTLR_API ASTRefCount
44{
45private:
46        ASTRef* ref;
47
48public:
49        ASTRefCount(const AST* p=0)
50        : ref(p ? ASTRef::getRef(p) : 0)
51        {
52        }
53        ASTRefCount(const ASTRefCount<T>& other)
54        : ref(other.ref ? other.ref->increment() : 0)
55        {
56        }
57        ~ASTRefCount()
58        {
59                if (ref && ref->decrement())
60                        delete ref;
61        }
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        }
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
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 ASTRefCount<AST> RefAST;
93
94#ifdef ANTLR_CXX_SUPPORTS_NAMESPACE
95}
96#endif
97
98#endif //INC_ASTRefCount_hpp__
Note: See TracBrowser for help on using the repository browser.