/* emacs edit mode for this file is -*- C++ -*- */

#include <factory/templates/ftmpl_array.h>

template <class T>
Array<T>::Array() : data(0), _min(0), _max(-1), _size(0)
{
}

template <class T>
Array<T>::Array( const Array<T> & a )
{
    if ( a._size > 0 ) {
	_min = a._min;
	_max = a._max;
	_size = a._size;
	data = new T[_size];
	for ( int i = 0; i < _size; i++ )
	    data[i] = a.data[i];
    }
    else {
	data = 0;
	_min = _size = 0;
	_max = -1;
    }
}

template <class T>
Array<T>::Array( int i )
{
    _min = 0;
    _max = i-1;
    _size = i;
    if ( i == 0 )
	data = 0;
    else
	data = new T[_size];
}

template <class T>
Array<T>::Array( int min, int max )
{
    if ( max < min ) {
	_min = _size = 0;
	_max = -1;
	data = 0;
    }
    else {
	_min = min;
	_max = max;
	_size = _max - _min + 1;
	data = new T[_size];
    }
}

template <class T>
Array<T>::~Array()
{
    delete [] data;
}

template <class T>
Array<T>& Array<T>::operator= ( const Array<T> & a )
{
    if ( this != &a ) {
	delete [] data;
	_min = a._min;
	_max = a._max;
	_size = a._size;
	if ( a._size > 0 ) {
	    _size = a._size;
	    data = new T[_size];
	    for ( int i = 0; i < _size; i++ )
		data[i] = a.data[i];
	}
	else {
	    data = 0;
	    _size = 0;
	}
    }
    return *this;
}

template <class T>
T& Array<T>::operator[] ( int i ) const
{
    ASSERT( i >= _min && i <= _max, "warning: array size mismatch." );
    return data[i-_min];
}

template <class T>
int Array<T>::size() const
{
    return _size;
}

template <class T>
int Array<T>::min() const
{
    return _min;
}

template <class T>
int Array<T>::max() const
{
    return _max;
}

/*
template <class T>
Array<T>& Array<T>::operator*= ( const T & t )
{
    for ( int i = 0; i < _size; i++ )
	data[i] *= t;
    return *this;
}

template <class T>
Array<T>& Array<T>::operator+= ( const T & t )
{
    for ( int i = 0; i < _size; i++ )
	data[i] += t;
    return *this;
}

template <class T>
Array<T>& Array<T>::operator+= ( const Array<T> & a )
{
    ASSERT ( _size == a._size, "warning: array size mismatch." );
    for ( int i = 0; i < _size; i++ )
	data[i] += a.data[i];
    return *this;
}
*/

#ifndef NOSTREAMIO
template <class T>
void Array<T>::print ( OSTREAM & os ) const
{
    if ( _size == 0 )
	os << "( )";
    else {
	os << "( " << data[0];
	for ( int i = 1; i < _size; i++ )
	    os << ", " << data[i];
	os << " )";
    }
}

template <class T>
OSTREAM& operator<< ( OSTREAM & os, const Array<T> & a )
{
    a.print( os );
    return os;
}
#endif /* NOSTREAMIO */
