#include "c7p2.h"

template<class T>
Array<T>::Array(int size)
{
	buf = new T[size];
	len = size;
}

template<class T>
Array<T>::Array(const Array<T> &a)
{
	buf = new T[a.length()];
	len = a.length();
	for (int i=0; i<len; i++) {
		buf[i] = a[i];
	}
}

template<class T>
Array<T>::~Array()
{
	delete[] buf;
}

template<class T>
T& Array<T>::operator[](int index) const
{
	if (index < len) return buf[index];
	else return buf[len];
}

template<class T>
int Array<T>::length() const
{
	return len;
}

template<class T>
void Array<T>::operator=(const Array<T> &a)
{
	delete[] buf;
	buf = new T[a.length()];
	len = a.length();
	for (int i=0; i<len; i++) {
		buf[i] = a[i];
	}	
}

template<class T>
ostream& operator<<(ostream &o, const Array<T> &a)
{
	for (int i=0; i<a.length(); i++) {
		o << a[i];
		if (i < a.length()-1)
			o << " , ";
	}
	return o;
}

// ----------------------------------------------------------------

int main()
{
	Array<int> a(4);
	Array<double> *b = new Array<double>(3);

	a[0] = 1; a[1] = 2; a[2] = 3; a[3] = 4;
	(*b)[0] = 1.0; (*b)[1] = 2.0; (*b)[2] = 3.0;

	cout << a << endl;
	cout << *b << endl;

	delete b;

	return 0;
}

