#ifndef _AUTO_PTR_3__VECT_PTR_HPP_
#define _AUTO_PTR_3__VECT_PTR_HPP_

#include <stddef.h>

namespace auto_ptr_3 {

/*
** vect_ptr_t
*/

// Класс для автоматического уничтожения динамически
// созданных векторов объектов
template< class T >
class	vect_ptr_t {
	protected :
		T *	m_p;
		size_t	m_vsize;

	public :
		typedef T type_t;

		vect_ptr_t() :
			m_p( 0 ),
			m_vsize( 0 ) {
		}

		vect_ptr_t( T * ptr,
			size_t vsize ) :
			m_p( ptr ),
			m_vsize( vsize ) {
		}

		~vect_ptr_t() {
			if( m_p )
				delete[] m_p;
		}

		T *
		query() {
			return m_p;
		}

		const T *
		query() const {
			return m_p;
		}

		size_t
		size() const {
			return m_vsize;
		}

		void
		set( T * ptr,
			size_t vsize ) {
			m_p = ptr;
			m_vsize = vsize;
		}

		void
		clear() {
			m_p = 0;
			m_vsize = 0;
		}

		void
		destroy() {
			if( m_p ) {
				T * ptr = m_p;
				m_p = 0;
				m_vsize = 0;

				delete[] ptr;
			}
		}

		void
		swap( vect_ptr_t< T > & o ) {
			if( &o != this ) {
				T * ptr = m_p;
				size_t size = m_vsize;

				m_p = o.m_p;
				m_vsize = o.m_vsize;

				o.m_p = ptr;
				o.m_vsize = size;
			}
		}

		//
		// Расширения версии 3
		//

		T &
		operator[]( size_t index ) {
			return m_p[ index ];
		}

		const T &
		operator[]( size_t index ) const {
			return m_p[ index ];
		}

	private :
		vect_ptr_t( const vect_ptr_t< T > & o );
		vect_ptr_t< T > &
		operator=(
			const vect_ptr_t< T > & o );
};

} /* namespace auto_ptr_3 */

#endif
