// ==========================================================================
// $Id: point2d_template.cpp,v 1.2 2011/09/10 01:08:19 jlang Exp $
// CSI2372 example Code for lecture 9
// ==========================================================================
// (C)opyright:
//
//   Jochen Lang
//   SITE, University of Ottawa
//   800 King Edward Ave.
//   Ottawa, On., K1N 6N5
//   Canada. 
//   http://www.site.uottawa.ca
// 
// Creator: jlang (Jochen Lang)
// Email:   jlang@site.uottawa.ca
// ==========================================================================
// $Log: point2d_template.cpp,v $
// Revision 1.2  2011/09/10 01:08:19  jlang
// Updates F10
//
// Revision 1.1  2006/10/29 00:32:05  jlang
// Check in for lecture 9
//
//
// ==========================================================================
#include <iostream>

using std::cout;
using std::endl;

template <class T>
class Point2D{
  T d_components[2];
public:
  Point2D();
  Point2D( T* _components );
  Point2D<T> add( const Point2D<T>& _oPoint ) const;
  void print() const;
};
//-----------------------------------------------

template <class T>
Point2D<T>::Point2D() 
{}

template <class T>
Point2D<T>::Point2D( T* _components ) 
{
  for ( int i=0; i<2; i++ ) {
    d_components[i] = _components[i];
  }
}

template <class T>
Point2D<T> Point2D<T>::add( const Point2D<T>& _oPoint ) const 
{
  Point2D<T> res;
  for ( int i=0; i<2; i++ ) {
    res.d_components[i] = d_components[i] + _oPoint.d_components[i];
  }  
  return res;
}

template <class T>
void Point2D<T>::print() const
{
  cout << "( ";
  for ( int i=0; i<2; i++ ) {
    if (i!=0) cout  << ", ";
    cout << d_components[i];
  }  
  cout << " )" << endl;
}


int main() {
  int initA[] = {3,8};
  int initB[] = {-24,12};
  Point2D<int> intPt1(initA), intPt2(initB), intPt3;
  intPt3 = intPt1.add( intPt2 );
  intPt1.print();
  cout << " + ";
  intPt2.print();
  cout << " = ";
  intPt3.print();
  cout << endl; 

  double initC[] = {3.2,8.09};
  double initD[] = {-24.9,12.1};
  Point2D<double> dPt1(initC), dPt2(initD), dPt3;
  dPt3 = dPt1.add( dPt2 );
  dPt1.print();
  cout << " + ";
  dPt2.print();
  cout << " = ";
  dPt3.print();
  cout << endl;
}
