#ifndef UAutoPtr_h_
#define UAutoPtr_h_
#include <stdlib.h>
template <class T, class U>
class UAutoPtr {
public:
struct UAutoPtrRef {
T* mPtr;
};
explicit UAutoPtr (
T* inPointer = 0):
mPointer (inPointer) {
}
UAutoPtr (
UAutoPtr& inOriginal):
mPointer (inOriginal.Release ()) {
}
UAutoPtr& operator = (
UAutoPtr& inOriginal) {
Reset (inOriginal.Release ());
return *this;
}
~UAutoPtr () {
if (mPointer != NULL) {
U::Delete (mPointer);
}
}
T& operator* () const {
return *Get ();
}
T* operator -> () const {
return Get ();
}
T* Get () const {
return mPointer;
}
T* Release () {
T* result = Get ();
mPointer = NULL;
return result;
}
void Reset (
T* inNewPointer) {
if (inNewPointer != Get ()) {
if (mPointer != NULL)
U::Delete (mPointer);
mPointer = inNewPointer;
}
}
UAutoPtr (
UAutoPtrRef inOriginal):
mPointer (inOriginal.mPtr) {}
UAutoPtr& operator = (
UAutoPtrRef inOriginal) {
Reset (inOriginal.mPtr);
return *this;
}
operator UAutoPtrRef () {
UAutoPtrRef ref;
ref.mPtr = Release ();
return ref;
}
private:
T* mPointer;
};
template <class U>
class UAutoPtr <void, U> {
public:
struct UAutoPtrRef {
void* mPtr;
};
explicit UAutoPtr (
void* inPointer = 0):
mPointer (inPointer) {
}
UAutoPtr (
UAutoPtr& inOriginal):
mPointer (inOriginal.Release ()) {
}
UAutoPtr& operator = (
UAutoPtr& inOriginal) {
Reset (inOriginal.Release ());
return *this;
}
~UAutoPtr () {
if (mPointer != NULL) {
U::Delete (mPointer);
}
}
void* operator -> () const {
return Get ();
}
void* Get () const {
return mPointer;
}
void* Release () {
void* result = Get ();
mPointer = NULL;
return result;
}
void Reset (
void* inNewPointer) {
if (inNewPointer != Get ()) {
if (mPointer != NULL)
U::Delete (mPointer);
mPointer = inNewPointer;
}
}
UAutoPtr (
UAutoPtrRef inOriginal):
mPointer (inOriginal.mPtr) {}
UAutoPtr& operator = (
UAutoPtrRef inOriginal) {
Reset (inOriginal.mPtr);
return *this;
}
operator UAutoPtrRef () {
UAutoPtrRef ref;
ref.mPtr = Release ();
return ref;
}
private:
void* mPointer;
};
#endif