//-------------------------------------------------
// Smart Pointer
//-------------------------------------------------
![](/Images/OutliningIndicators/None.gif)
#ifndef _SMART_POINTER_H
#define _SMART_POINTER_H
![](/Images/OutliningIndicators/None.gif)
extern std::list<short> ptrCounter;
![](/Images/OutliningIndicators/None.gif)
template <class T>
class smartPtr
![](/Images/OutliningIndicators/ExpandedBlockStart.gif) ![](/Images/OutliningIndicators/ContractedBlock.gif) {
private:
T *ptr;
short *counter;
#ifdef _DEBUG
#define _DEBUG_FILE_NAME_LEN 32
#define _DEBUG_RECORD_LEN 32
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) 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
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) smartPtr(LPCSTR file = "Construction By Default",int line = __LINE__) {
#else
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) 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
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) smartPtr(const T *np,LPCSTR file = "Construction By Pointer",int line = __LINE__) {
#else
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) 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
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) 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
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) void operator = (const smartPtr<T> & np) {
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) 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
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) ~smartPtr() {
(*counter) --;
if((*counter) <= 0)
delete ptr;
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) T *operator->() {
return ptr;
}
![](/Images/OutliningIndicators/ExpandedSubBlockStart.gif) T *real() {
return ptr;
}
};
![](/Images/OutliningIndicators/InBlock.gif)
#endif //_SMART_POINTER_H
|