ViewVC Help
View File | Revision Log | Show Annotations | View Changeset | Root Listing
root/group/trunk/OOPSE-3.0/src/antlr/TokenRefCount.hpp
Revision: 2469
Committed: Fri Dec 2 15:38:03 2005 UTC (18 years, 7 months ago) by tim
File size: 1784 byte(s)
Log Message:
End of the Link --> List
Return of the Oject-Oriented
replace yacc/lex parser with antlr parser

File Contents

# User Rev Content
1 tim 2469 #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: TokenRefCount.hpp,v 1.1 2005-12-02 15:38:02 tim Exp $
9     */
10    
11     # include <antlr/config.hpp>
12    
13     #ifdef ANTLR_CXX_SUPPORTS_NAMESPACE
14     namespace antlr {
15     #endif
16    
17     class Token;
18    
19     struct 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);
37     private:
38     TokenRef( const TokenRef& );
39     TokenRef& operator=( const TokenRef& );
40     };
41    
42     template<class T>
43     class ANTLR_API TokenRefCount
44     {
45     private:
46     TokenRef* ref;
47    
48     public:
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    
92     typedef TokenRefCount<Token> RefToken;
93    
94     #ifdef ANTLR_CXX_SUPPORTS_NAMESPACE
95     }
96     #endif
97    
98     #endif //INC_TokenRefCount_hpp__