//-------------------------------------------------
// Smart Pointer
//-------------------------------------------------
#ifndef _SMART_POINTER_H
#define _SMART_POINTER_H
extern std::list<short> ptrCounter;
template <class T>
class smartPtr
{
private:
T *ptr;
short *counter;
#ifdef _DEBUG
#define _DEBUG_FILE_NAME_LEN 32
#define _DEBUG_RECORD_LEN 32
typedef struct __debug_record {
char file[_DEBUG_FILE_NAME_LEN];
int line;
} debug_record;
public:
debug_record ptr_changed_rec[_DEBUG_RECORD_LEN];
int ptr_changed_time;
#endif //_DEBUG
public:
#ifdef _DEBUG
smartPtr(LPCSTR file = "Construction By Default",int line = __LINE__){
#else
smartPtr(){
#endif //_DEBUG
ptr = new T;
ptrCounter.push_back(1);
counter = &ptrCounter.back();
#ifdef _DEBUG
memset(ptr_changed_rec,0,sizeof(debug_record)*_DEBUG_RECORD_LEN);
strncpy(ptr_changed_rec[0].file,file,_DEBUG_FILE_NAME_LEN);
ptr_changed_rec[0].line = line;
ptr_changed_time = 1;
#endif //_DEBUG
}
#ifdef _DEBUG
smartPtr(const T *np,LPCSTR file = "Construction By Pointer",int line = __LINE__){
#else
smartPtr(const T *np){
#endif //_DEBUG
ptr = const_cast<T*> (np);
ptrCounter.push_back(1);
counter = &ptrCounter.back();
#ifdef _DEBUG
memset(ptr_changed_rec,0,sizeof(debug_record)*_DEBUG_RECORD_LEN);
strncpy(ptr_changed_rec[0].file,file,_DEBUG_FILE_NAME_LEN);
ptr_changed_rec[0].line = line;
ptr_changed_time = 1;
#endif //_DEBUG
}
smartPtr(const smartPtr<T> & np){
ptr = np.ptr;
counter = np.counter;
(*counter) ++;
#ifdef _DEBUG
LPCSTR file = "Construction By Copying";int line = __LINE__;
memset(ptr_changed_rec,0,sizeof(debug_record)*_DEBUG_RECORD_LEN);
strncpy(ptr_changed_rec[0].file,file,_DEBUG_FILE_NAME_LEN);
ptr_changed_rec[0].line = line;
ptr_changed_time = 1;
#endif //_DEBUG
}
void operator = (const smartPtr<T> & np){
if(counter != NULL){
(*counter) --;
if((*counter) <= 0)
delete ptr;
}
ptr = np.ptr;
counter = np.counter;
(*counter) ++;
#ifdef _DEBUG
LPCSTR file = "Value Assignment";int line = __LINE__;
strncpy(ptr_changed_rec[ptr_changed_time].file,file,_DEBUG_FILE_NAME_LEN);
ptr_changed_rec[ptr_changed_time].line = line;
ptr_changed_time ++;
#endif //_DEBUG
}
~smartPtr(){
(*counter) --;
if((*counter) <= 0)
delete ptr;
}
T *operator->(){
return ptr;
}
T *real(){
return ptr;
}
};
#endif //_SMART_POINTER_H
// Smart Pointer
//-------------------------------------------------
#ifndef _SMART_POINTER_H
#define _SMART_POINTER_H
extern std::list<short> ptrCounter;
template <class T>
class smartPtr
{
private:
T *ptr;
short *counter;
#ifdef _DEBUG
#define _DEBUG_FILE_NAME_LEN 32
#define _DEBUG_RECORD_LEN 32
typedef struct __debug_record {
char file[_DEBUG_FILE_NAME_LEN];
int line;
} debug_record;
public:
debug_record ptr_changed_rec[_DEBUG_RECORD_LEN];
int ptr_changed_time;
#endif //_DEBUG
public:
#ifdef _DEBUG
smartPtr(LPCSTR file = "Construction By Default",int line = __LINE__){
#else
smartPtr(){
#endif //_DEBUG
ptr = new T;
ptrCounter.push_back(1);
counter = &ptrCounter.back();
#ifdef _DEBUG
memset(ptr_changed_rec,0,sizeof(debug_record)*_DEBUG_RECORD_LEN);
strncpy(ptr_changed_rec[0].file,file,_DEBUG_FILE_NAME_LEN);
ptr_changed_rec[0].line = line;
ptr_changed_time = 1;
#endif //_DEBUG
}
#ifdef _DEBUG
smartPtr(const T *np,LPCSTR file = "Construction By Pointer",int line = __LINE__){
#else
smartPtr(const T *np){
#endif //_DEBUG
ptr = const_cast<T*> (np);
ptrCounter.push_back(1);
counter = &ptrCounter.back();
#ifdef _DEBUG
memset(ptr_changed_rec,0,sizeof(debug_record)*_DEBUG_RECORD_LEN);
strncpy(ptr_changed_rec[0].file,file,_DEBUG_FILE_NAME_LEN);
ptr_changed_rec[0].line = line;
ptr_changed_time = 1;
#endif //_DEBUG
}
smartPtr(const smartPtr<T> & np){
ptr = np.ptr;
counter = np.counter;
(*counter) ++;
#ifdef _DEBUG
LPCSTR file = "Construction By Copying";int line = __LINE__;
memset(ptr_changed_rec,0,sizeof(debug_record)*_DEBUG_RECORD_LEN);
strncpy(ptr_changed_rec[0].file,file,_DEBUG_FILE_NAME_LEN);
ptr_changed_rec[0].line = line;
ptr_changed_time = 1;
#endif //_DEBUG
}
void operator = (const smartPtr<T> & np){
if(counter != NULL){
(*counter) --;
if((*counter) <= 0)
delete ptr;
}
ptr = np.ptr;
counter = np.counter;
(*counter) ++;
#ifdef _DEBUG
LPCSTR file = "Value Assignment";int line = __LINE__;
strncpy(ptr_changed_rec[ptr_changed_time].file,file,_DEBUG_FILE_NAME_LEN);
ptr_changed_rec[ptr_changed_time].line = line;
ptr_changed_time ++;
#endif //_DEBUG
}
~smartPtr(){
(*counter) --;
if((*counter) <= 0)
delete ptr;
}
T *operator->(){
return ptr;
}
T *real(){
return ptr;
}
};
#endif //_SMART_POINTER_H