//////////////////////////////////////////////////////////////////////////////// /** \file \brief \ru Автоматический указатель. \en Smart pointer. \~ */ //////////////////////////////////////////////////////////////////////////////// #ifndef __TEMPL_POINTER_H #define __TEMPL_POINTER_H #include //////////////////////////////////////////////////////////////////////////////// // // A pair of smart pointer template classes. Provides basic conversion // operator to T*, as well as dereferencing (*), and 0-checking (!). // These classes assume that they alone are responsible for deleting the // object or array unless Relinquish() is called. // //////////////////////////////////////////////////////////////////////////////// //------------------------------------------------------------------------------ /** \brief \ru Базовый класс автоматического указателя. \en Base class of smart pointer. \~ \details \ru Базовый класс автоматического указателя. \n \en Base class of smart pointer. \n \~ \ingroup Base_Tools_SmartPointers */ // --- template class TPointerBase { public: T & operator * () const { return *P; } operator T* () const { return P; } int operator ! () const { return (P == nullptr);} T * Relinquish() {T * p = P; P = nullptr; return p;} T * Get() { return P; } const T * Get() const { return P; } protected: TPointerBase( T * pointer ) : P(pointer) {} TPointerBase() : P( nullptr ) {} protected: T * P; private: void * operator new( size_t ); // prohibit use of new void operator delete( void * p ) { ((TPointerBase*)p)->P = nullptr; } // СМВ К15 MVS 2012 private: TPointerBase( const TPointerBase & other ); public: TPointerBase( TPointerBase && _Right ): P( _Right.P ) { _Right.P = nullptr; } TPointerBase & operator = ( TPointerBase && _Right ) { if ( this != &_Right ) { P = _Right.P; _Right.P = nullptr; } return *this; } }; //------------------------------------------------------------------------------ /** \brief \ru Автоматический указатель на объект. \en A smart pointer to an object. \~ \details \ru Автоматический указатель на объект. Обеспечивает доступ через оператор "->". \n \en A smart pointer to an object. Provides an access by the operator "->". \n \~ \ingroup Base_Tools_SmartPointers */ // --- template class TPointer : public TPointerBase { public: TPointer() : TPointerBase() {} TPointer( T * pointer ) : TPointerBase( pointer ) {} ~TPointer() { delete TPointerBase::P; } public: TPointer & operator = ( T * src ) { if ( src != TPointerBase::P ) { delete TPointerBase::P; TPointerBase::P = src; } return *this; } T * operator ->() { return TPointerBase::P; } // Could throw exception if P==nullptr const T * operator ->() const { return TPointerBase::P; } // Could throw exception if P==nullptr // СМВ К15 MVS 2012 #ifndef __MOBILE_VERSION__ private: #endif // __MOBILE_VERSION__ TPointer( const TPointer & other ); public: TPointer( TPointer && _Right ) : TPointerBase( std::move(_Right) ) { } TPointer & operator = ( TPointer && _Right ) { if ( this != &_Right ) { delete TPointerBase::P; TPointerBase::P = _Right.P; _Right.P = nullptr; } return *this; } }; //------------------------------------------------------------------------------ /** \brief \ru Автоматический указатель на объект. \en A smart pointer to an object. \~ \details \ru Автоматический указатель на объект. Обеспечивает доступ через оператор "->". Есть флаг владения объектом. \n \en A smart pointer to an object. Provides an access by the operator "->". There is a flag of ownership of object. \n \~ \ingroup Base_Tools_SmartPointers */ // --- template class TOwnPointer : public TPointerBase { bool own; // own = false - no delete public: TOwnPointer() : TPointerBase(), own(true) {} TOwnPointer( T * pointer ) : TPointerBase(pointer), own(true) {} ~TOwnPointer() { if ( own ) delete TPointerBase::P; } public: TOwnPointer & operator = ( T * src ) { if ( src != TPointerBase::P ) { if ( own ) delete TPointerBase::P; TPointerBase::P = src; } return *this; } T * operator ->() { return TPointerBase::P; } // Could throw exception if P==nullptr bool GetOwn() const { return own; } void SetOwn( bool val ) { own = val; } // СМВ К15 MVS 2012 private: TOwnPointer( const TOwnPointer & other ); TOwnPointer & operator = ( const TOwnPointer & _Right ); public: TOwnPointer( TOwnPointer && _Right ) : TPointerBase( std::move(_Right) ) , own ( std::move(_Right.own) ) { } TOwnPointer & operator = ( TOwnPointer && _Right ) { if ( this != &_Right ) { if ( own ) delete TPointerBase::P; TPointerBase::P = _Right.P; own = _Right.own; _Right.P = nullptr; } return *this; } }; //------------------------------------------------------------------------------ /** \brief \ru Автоматический указатель на массив объектов. \en A smart pointer to an array of objects. \~ \details \ru Автоматический указатель на массив объектов. Обеспечивает доступ к элементам массива по индексу. Удаляет массив через delete[]. \n \en A smart pointer to an array of objects. Provides an access to elements of array by index. Deletes an array by the operator delete[]. \n \~ \ingroup Base_Tools_SmartPointers */ // --- template class TAPointer : public TPointerBase { public: TAPointer() : TPointerBase() {} TAPointer( T* array ) : TPointerBase( array ) {} ~TAPointer() { delete[] TPointerBase::P; } public: TAPointer & operator = ( T * src ) { if ( src != TPointerBase::P ) { delete[] TPointerBase::P; TPointerBase::P = src; } return *this; } T & operator []( size_t i ) { return TPointerBase::P[i]; } // Could throw exception if P==nullptr // СМВ К15 MVS 2012 //private: // g++4.7 KUbuntu TAPointer( const TAPointer & other ); public: TAPointer(TAPointer && _Right) : TPointerBase( std::move(_Right) ) { } TAPointer & operator = (TAPointer && _Right) { if (this != &_Right) { delete[] TPointerBase::P; TPointerBase::P = _Right.P; _Right.P = nullptr; } return *this; } }; //------------------------------------------------------------------------------ // Obsolete, should use TAPointer for char[]'s //--- //------------------------------------------------------------------------------ /** \brief \ru Автоматический указатель на массив символов. \en A smart pointer to an array of symbols. \~ \details \ru Автоматический указатель на массив символов. \n \en A smart pointer to an array of symbols. \n \~ \warning \ru Устаревший класс, пользуйтесь TAPointer \en This class is out-of-date, use TAPointer \~ \ingroup Base_Tools_SmartPointers */ // --- template <> class TPointer : public TPointerBase { public: TPointer() : TPointerBase() {} TPointer( char pointer[] ) : TPointerBase( pointer ) {} ~TPointer() { delete[] P; } public: char * operator = ( char src[] ) { delete[] P; return P = src; } char * operator = ( const TPointer & src ) { if ( &src != this ) { delete[] P; return P = src.P; } return nullptr; } char & operator []( size_t i ) { return P[i]; } public: TPointer( TPointer && _Right ) : TPointerBase( std::move(_Right) ) { } TPointer & operator = ( TPointer && _Right ) { if ( this != &_Right ) { delete[] P; P = _Right.P; _Right.P = nullptr; } return *this; } }; #endif // __TEMPL_POINTER_H