00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00027
00029 #ifndef __AUTOREF_H__
00030 #define __AUTOREF_H__
00031
00032 namespace H3D {
00040
00041 template < class NodeType >
00042 class AutoRef {
00043 public:
00045 typedef NodeType element_type;
00046
00048 explicit AutoRef (NodeType* n = 0) throw() :
00049 node_ptr( n ) {
00050 ref( node_ptr );
00051 }
00052
00054 AutoRef(const AutoRef<NodeType>&ar) throw () :
00055 node_ptr( NULL ){
00056 reset( ar.get() );
00057 }
00058
00060 template <class Y>
00061 AutoRef(const AutoRef<Y>&ar) throw() :
00062 node_ptr( NULL ){
00063 reset( ar.get() );
00064 }
00065
00067 AutoRef<NodeType>& operator=(const AutoRef<NodeType>&ar) throw() {
00068 reset( ar.node_ptr );
00069 return *this;
00070 }
00071
00073 template <class Y>
00074 AutoRef<NodeType>& operator= (const AutoRef<Y>& ar) throw() {
00075 reset( ar.node_ptr );
00076 return *this;
00077 }
00078 virtual ~AutoRef() throw() {
00079 unref( node_ptr );
00080 }
00081
00083 NodeType& operator* () const throw() {
00084 return *node_ptr;
00085 }
00086
00088 NodeType* operator-> () const throw() {
00089 return node_ptr;
00090 }
00091
00093 NodeType* get () const throw() {
00094 return node_ptr;
00095 }
00096
00100 void reset(NodeType* p = 0) throw() {
00101 if( p != node_ptr ) {
00102 if ( node_ptr ) unref( node_ptr );
00103 node_ptr = p;
00104 if ( node_ptr ) ref( node_ptr );
00105 }
00106 }
00107
00108 protected:
00115 inline virtual void ref( NodeType *n ) {
00116 if( n )
00117 n->ref();
00118 }
00119
00126 inline virtual void unref( NodeType *n ) {
00127 if( n )
00128 n->unref();
00129 }
00130
00131 NodeType *node_ptr;
00132
00133 };
00134 }
00135
00136 #endif