Branch data Line data Source code
1 : : //-------------------------------------------------------------------------
2 : : // Filename : TDUPtr.hpp
3 : : //
4 : : // Purpose : Smart pointer that becomes NULL when pointed-to object
5 : : // is destroted.
6 : : //
7 : : // Special Notes : Uses ToolData mechanism. Pointed-to object must be
8 : : // a ToolDataUser
9 : : //
10 : : // Creator : Jason Kraftcheck
11 : : //
12 : : // Creation Date : 03/12/03
13 : : //-------------------------------------------------------------------------
14 : :
15 : : /* Example Usage:
16 : :
17 : : TDUPtr<Battleship> my_ptr = new Battleship;
18 : :
19 : : // ...
20 : : // do some stuff
21 : : // ...
22 : :
23 : : if ( my_ptr == NULL )
24 : : PRINT_INFO("You sunk my Battleship!\n");
25 : : else
26 : : PRINT_INFO("Location: %d, %d\n", my_ptr->x(), my_ptr->y() );
27 : : */
28 : :
29 : :
30 : : #ifndef TDU_PTR_HPP
31 : : #define TDU_PTR_HPP
32 : :
33 : : #include "ToolData.hpp"
34 : : #include "CubitMessage.hpp"
35 : : #include "CGMUtilConfigure.h"
36 : :
37 : : // Base class for TDUPtr - used because TDUPtr is a template,
38 : : // so a common base type for all the template types is required.
39 : : class TDUPtrListNode
40 : : {
41 : : public:
42 : :
43 [ # # ]: 0 : virtual ~TDUPtrListNode(){}
44 : :
45 : 0 : inline TDUPtrListNode() : nextInTD(0) {}
46 : :
47 : : private:
48 : :
49 : : friend class TDPtr;
50 : :
51 : : virtual void nullify() = 0;
52 : : TDUPtrListNode* nextInTD;
53 : : };
54 : :
55 : : // The actuall pointer class -- this is the one you
56 : : // should be using.
57 : : template <class T> class TDUPtr : public TDUPtrListNode
58 : : {
59 : : public:
60 : :
61 : : inline TDUPtr() : ptrTo(0) {}
62 : :
63 : 0 : inline TDUPtr( T* ptr ) : ptrTo(0)
64 [ # # ][ # # ]: 0 : { change_ptr(ptr); }
65 : :
66 : 0 : inline TDUPtr( const TDUPtr<T>& copy ) : TDUPtrListNode(), ptrTo(0)
67 [ # # ][ # # ]: 0 : { change_ptr(copy.ptrTo); }
68 : :
69 : 0 : inline virtual ~TDUPtr()
70 [ # # ][ # # ]: 0 : { change_ptr(0); }
[ # # ][ # # ]
71 : :
72 : : inline T& operator*() const { return *ptrTo; }
73 : : inline T* operator->() const { return ptrTo; }
74 : 0 : inline operator bool() const { return ptrTo != 0; }
75 : :
76 : 0 : inline TDUPtr<T>& operator=( const TDUPtr<T>& copy )
77 : 0 : { change_ptr(copy.ptrTo); return *this; }
78 : :
79 : : inline TDUPtr<T>& operator=( T* ptr )
80 : : { change_ptr(ptr); return *this; }
81 : :
82 : : inline bool operator==( const TDUPtr<T>& other ) const
83 : : { return ptrTo == other.ptrTo; }
84 : : inline bool operator!=( const TDUPtr<T>& other ) const
85 : : { return ptrTo != other.ptrTo; }
86 : : inline bool operator==( const T* ptr ) const
87 : : { return ptrTo == ptr; }
88 : : inline bool operator!=( const T* ptr ) const
89 : : { return ptrTo != ptr; }
90 : :
91 : : inline void change_ptr( T* ptr );
92 : :
93 : 0 : inline T* ptr() const
94 : 0 : { return ptrTo; }
95 : :
96 : : private:
97 : :
98 : 0 : virtual void nullify()
99 : 0 : { ptrTo = 0; }
100 : :
101 : : T* ptrTo;
102 : :
103 : : };
104 : :
105 : : // The ToolData used to associate pointer objects with TDU.
106 : : class CUBIT_UTIL_EXPORT TDPtr : public ToolData
107 : : {
108 : : public:
109 : : static void add_to_TD( TDUPtrListNode* add, ToolDataUser* to );
110 : : static void remove_from_TD( TDUPtrListNode* remove, ToolDataUser* from );
111 : :
112 : : virtual ~TDPtr();
113 : :
114 : : private:
115 : :
116 : 0 : inline TDPtr() : listHead(0) { }
117 : :
118 : 0 : static int is_ptr( const ToolData* td )
119 [ # # ][ # # ]: 0 : { return dynamic_cast<const TDPtr*>(td) != 0; }
120 : :
121 : : TDUPtrListNode* listHead;
122 : : };
123 : :
124 : 0 : template <class T> inline void TDUPtr<T>::change_ptr( T* ptr )
125 : : {
126 [ # # ][ # # ]: 0 : if( ptr != ptrTo )
127 : : {
128 [ # # ][ # # ]: 0 : TDPtr::remove_from_TD(this, ptrTo);
129 : 0 : ptrTo = ptr;
130 [ # # ][ # # ]: 0 : TDPtr::add_to_TD(this, ptrTo);
131 : : }
132 : 0 : }
133 : :
134 : :
135 : : #endif
136 : :
|