#ifndef _COMMON_SMARTPOINTER_HPP_ #define _COMMON_SMARTPOINTER_HPP_ #ifndef _COMMON_WINDOWS_HPP_ #include #endif class PointerDisposition { public: enum Disposition{Assume,Delete}; }; template class SmartPointer { public: // SmartPointer(void); SmartPointer(bool createNew=false); SmartPointer(T FAR *lpSmartPointer,PointerDisposition::Disposition disposition=PointerDisposition::Assume); SmartPointer(const SmartPointer &someSmartPointer); virtual ~SmartPointer(); T FAR *operator->(void); operator T FAR *(void); operator LPARAM(void); SmartPointer &operator=(const SmartPointer &someSmartPointer); SmartPointer &operator=(T FAR *lpSmartPointer); WORD operator==(const SmartPointer &someSmartPointer)const; void disposition(PointerDisposition::Disposition disposition); PointerDisposition::Disposition disposition(void)const; void destroy(void); bool isOkay(void)const; bool isNull(void)const; protected: T **ppt(void); private: T FAR *mlpSmartPointer; PointerDisposition::Disposition mDisposition; }; // template // inline // SmartPointer::SmartPointer(void) // : mlpSmartPointer(0), mDisposition(PointerDisposition::Assume) // { // } template inline SmartPointer::SmartPointer(bool createNew) : mlpSmartPointer(0), mDisposition(PointerDisposition::Assume) { if(createNew) { mlpSmartPointer = ::new T(); mDisposition = PointerDisposition::Delete; } } template inline SmartPointer::SmartPointer(T FAR *lpSmartPointer,PointerDisposition::Disposition disposition) : mlpSmartPointer(lpSmartPointer), mDisposition(disposition) { } template inline SmartPointer::SmartPointer(const SmartPointer &someSmartPointer) : mlpSmartPointer(0), mDisposition(PointerDisposition::Assume) { *this=someSmartPointer; } template inline SmartPointer::~SmartPointer() { destroy(); } template inline SmartPointer::operator T FAR *(void) { return mlpSmartPointer; } template inline T **SmartPointer::ppt(void) { return &mlpSmartPointer; } template inline SmartPointer::operator LPARAM(void) { return (LPARAM)mlpSmartPointer; } template inline T FAR *SmartPointer::operator->(void) { return mlpSmartPointer; } template inline SmartPointer &SmartPointer::operator=(const SmartPointer &someSmartPointer) { destroy(); mlpSmartPointer=someSmartPointer.mlpSmartPointer; mDisposition=PointerDisposition::Assume; return *this; } template inline SmartPointer &SmartPointer::operator=(T FAR *lpSmartPointer) { destroy(); mlpSmartPointer=lpSmartPointer; mDisposition=PointerDisposition::Assume; return *this; } template inline WORD SmartPointer::operator==(const SmartPointer &someSmartPointer)const { return *mlpSmartPointer==*someSmartPointer.mlpSmartPointer; } template inline void SmartPointer::destroy(void) { if(!mlpSmartPointer)return; if(PointerDisposition::Assume==mDisposition)mlpSmartPointer=0; else {::delete mlpSmartPointer;mlpSmartPointer=0;} } template inline void SmartPointer::disposition(PointerDisposition::Disposition disposition) { mDisposition=disposition; } template inline PointerDisposition::Disposition SmartPointer::disposition(void)const { return mDisposition; } template inline bool SmartPointer::isNull(void)const { return (mlpSmartPointer?FALSE:TRUE); } template inline bool SmartPointer::isOkay(void)const { return !isNull(); } #endif