source: trunk/yao/share/antlr-2.7.7/lib/cpp/antlr/TokenRefCount.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_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:$
9 */
10
11# include <antlr/config.hpp>
12
13#ifdef ANTLR_CXX_SUPPORTS_NAMESPACE
14namespace antlr {
15#endif
16
17class Token;
18
19struct 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);
37private:
38        TokenRef( const TokenRef& );
39        TokenRef& operator=( const TokenRef& );
40};
41
42template<class T>
43        class ANTLR_API TokenRefCount
44{
45private:
46        TokenRef* ref;
47
48public:
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
92typedef TokenRefCount<Token> RefToken;
93
94#ifdef ANTLR_CXX_SUPPORTS_NAMESPACE
95}
96#endif
97
98#endif //INC_TokenRefCount_hpp__
Note: See TracBrowser for help on using the repository browser.