T NumericArray<T>::DotProduct (const NumericArray<T>& source) const							// Dot porduct fucntion.	
{
    if (Size() != source.Size())		
	{	throw SizeMissmatchException();	}

    T sum = 0;
    for (int i = 0; i < (Size()); i++)
    {
        sum += source[i]* (*this)[i]  ;
    }
    return sum;
}
NumericArray<T> NumericArray<T>::operator + (const NumericArray<T>& source) const		
{	
	cout << "operator + (const NumericArray<T>& source) const is called \n " <<endl ;
	if (Size() != source.Size())		
	{	throw SizeMissmatchException();	}

    NumericArray<T> temp(Size());
    for (int i = 0; i < Size(); i++)
    {
        temp[i] = source[i] + (*this)[i];
    }
    return temp;
}
		NumericArray<T> NumericArray<T>::operator + (const NumericArray<T>& arr) const	
		{
			
			if (this->Size() == arr.Size())
			{
				NumericArray<T> temp(this->Size());
				for (int i = 0; i < this->Size(); i++)
				{
					temp.SetElement(i, (*this)[i] + arr[i]);
				}
			}
			else
			{
				throw DifferentSizeException(-1);
			}
		}
		double NumericArray<T>::DotProduct(const NumericArray<T>& arr) const 
		{
			double product = 0;
			if (this->Size() == arr.Size())
			{
				for (int i = 0; i < this->Size(); i++)
				{
					product += (*this)[i] * arr[i];
				}
			}
			else
			{
				// Throw different size exception
				throw DifferentSizeException(-1);
			}
			return product;
		}