00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #ifndef _OASYS_TEMPREF_H_
00040 #define _OASYS_TEMPREF_H_
00041
00042 #include "../debug/DebugUtils.h"
00043
00044 namespace oasys {
00045
00057 template <typename _Type>
00058 class TempRef {
00059 public:
00063 TempRef(const char* what1, const char* what2 = "")
00064 : object_(NULL), what1_(what1), what2_(what2)
00065 {
00066 }
00067
00071 TempRef(_Type* object, const char* what1, const char* what2 = "")
00072 : object_(object), what1_(what1), what2_(what2)
00073 {
00074 }
00075
00079 TempRef(const TempRef& other)
00080 {
00081 object_ = other.object();
00082 other.release();
00083 }
00084
00088 ~TempRef() {
00089 if (object_ != NULL) {
00090 PANIC("TempRef %s %s destructor fired but object still exists!!",
00091 what1_, what2_);
00092 }
00093 }
00094
00098 TempRef& operator=(const TempRef<_Type>& other)
00099 {
00100 object_ = other.object();
00101 other.release();
00102 return *this;
00103 }
00104
00108 TempRef& operator=(_Type* object)
00109 {
00110 ASSERTF(object_ == NULL,
00111 "TempRef can only assign to null reference");
00112 object_ = object;
00113 return *this;
00114 }
00115
00119 _Type* object() const {
00120 return object_;
00121 }
00122
00126 _Type* operator->() const
00127 {
00128 return object_;
00129 }
00130
00134 _Type& operator*() const
00135 {
00136 return *object_;
00137 }
00138
00143 void release() const {
00144 object_ = NULL;
00145 }
00146
00150 bool operator==(_Type* o)
00151 {
00152 return (object_ == o);
00153 }
00154
00158 bool operator!=(_Type* o)
00159 {
00160 return (object_ != o);
00161 }
00162
00163 const char* what1() const { return what1_; }
00164 const char* what2() const { return what2_; }
00165
00166 private:
00170 mutable _Type* object_;
00171
00175 const char *what1_, *what2_;
00176 };
00177
00178 }
00179
00180 #endif