summaryrefslogtreecommitdiffstats
path: root/lib/antlr/antlr/ASTRefCount.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/antlr/antlr/ASTRefCount.h')
-rw-r--r--lib/antlr/antlr/ASTRefCount.h98
1 files changed, 98 insertions, 0 deletions
diff --git a/lib/antlr/antlr/ASTRefCount.h b/lib/antlr/antlr/ASTRefCount.h
new file mode 100644
index 00000000..889ecc9d
--- /dev/null
+++ b/lib/antlr/antlr/ASTRefCount.h
@@ -0,0 +1,98 @@
+#ifndef INC_ASTRefCount_h__
+# define INC_ASTRefCount_h__
+
+/* ANTLR Translator Generator
+ * Project led by Terence Parr at http://www.jGuru.com
+ * Software rights: http://www.antlr.org/license.html
+ *
+ * $Id$
+ */
+
+# include <antlr/config.h>
+
+#ifdef ANTLR_CXX_SUPPORTS_NAMESPACE
+namespace antlr {
+#endif
+
+ class AST;
+
+struct ANTLR_API ASTRef
+{
+ AST* const ptr;
+ unsigned int count;
+
+ ASTRef(AST* p);
+ ~ASTRef();
+ ASTRef* increment()
+ {
+ ++count;
+ return this;
+ }
+ bool decrement()
+ {
+ return (--count==0);
+ }
+
+ static ASTRef* getRef(const AST* p);
+private:
+ ASTRef( const ASTRef& );
+ ASTRef& operator=( const ASTRef& );
+};
+
+template<class T>
+ class ANTLR_API ASTRefCount
+{
+private:
+ ASTRef* ref;
+
+public:
+ ASTRefCount(const AST* p=0)
+ : ref(p ? ASTRef::getRef(p) : 0)
+ {
+ }
+ ASTRefCount(const ASTRefCount<T>& other)
+ : ref(other.ref ? other.ref->increment() : 0)
+ {
+ }
+ ~ASTRefCount()
+ {
+ if (ref && ref->decrement())
+ delete ref;
+ }
+ ASTRefCount<T>& operator=(AST* other)
+ {
+ ASTRef* tmp = ASTRef::getRef(other);
+
+ if (ref && ref->decrement())
+ delete ref;
+
+ ref=tmp;
+
+ return *this;
+ }
+ ASTRefCount<T>& operator=(const ASTRefCount<T>& other)
+ {
+ if( other.ref != ref )
+ {
+ ASTRef* tmp = other.ref ? other.ref->increment() : 0;
+
+ if (ref && ref->decrement())
+ delete ref;
+
+ ref=tmp;
+ }
+ return *this;
+ }
+
+ operator T* () const { return ref ? static_cast<T*>(ref->ptr) : 0; }
+ T* operator->() const { return ref ? static_cast<T*>(ref->ptr) : 0; }
+ T* get() const { return ref ? static_cast<T*>(ref->ptr) : 0; }
+};
+
+typedef ASTRefCount<AST> RefAST;
+
+#ifdef ANTLR_CXX_SUPPORTS_NAMESPACE
+}
+#endif
+
+#endif //INC_ASTRefCount_h__