/*
 * Instituto Superior de Engenharia do Porto
 *
 * Estruturas de Informação
 *
 * 2000/2001
 *
 * (C) Paulo Sousa
 *
 * ------------------------------------------
 *
 * Trabalho nº 1
 *
 *	classe auxiliar para vectores
 *
 */


#ifndef __CVECTOR_INC__
#define __CVECTOR_INC__


template <class T>
class CVector
{
	T* m_vec;
	int m_nTam;

	void destroi();
	void copia(const CVector<T>& o);

public:
	CVector(int nTam = 0);
	~CVector();

	//type-casting para poder ser usado como array normal
	//é definido para simplicidade, mas tem o problema de retornar o ponteiro
	//para o atributo interno da classe!!!
	operator T*();
	operator const T*();

	//operador de atribuição
	CVector<T>& operator=(const CVector<T>& o);
};




//----------------------------------------------------------
//
//				I M P L E M E N T A Ç Ã O
//
//----------------------------------------------------------


template <class T>
CVector<T>::CVector(int nTam /* = 0 */)
{
	if (nTam > 0)
		m_vec = new T[nTam];
	else
		m_vec = NULL;
	m_nTam = nTam;
}

template <class T>
CVector<T>::~CVector()
{
	destroi();
}

template <class T>
void CVector<T>::destroi()
{
	if (m_vec != NULL)
	{
		delete [] m_vec;
		m_nTam = 0;
	}
}

template <class T>
CVector<T>::operator T*()
{
	if (m_vec == NULL)
		throw Erro(PONTEIRO_NULO);

	return m_vec;
}

template <class T>
CVector<T>::operator const T*()
{
	if (m_vec == NULL)
		throw Erro(PONTEIRO_NULO);

	return m_vec;
}

template <class T>
CVector<T>& CVector<T>::operator=(const CVector<T>& o)
{
	destroi();
	copia(o);
	return *this;
}

template <class T>
void CVector<T>::copia(const CVector<T>& o)
{
	if (o.m_nTam > 0)
	{
		m_nTam = o.m_nTam;
		m_vec = new T[m_nTam];
		memcpy(m_vec, o.m_vec, m_nTam*sizeof(T));
	}
}

#endif

