/* Voorbeeldcode behorende bij het college "Programmeertechnieken",
 * LIACS, Universiteit Leiden.
 */

#include <iostream>

#include <vector>

/* Hier is onze Coordinaat klasse weer, maar nu als templatized versie. */
template <typename T>
class Coordinaat
{
  private:
    T x, y;

  public:
    Coordinaat(void)
      : x(0), y(0)
    { }
    Coordinaat(const T x, const T y)
      : x(x), y(y)
    { }
    /* Copy constructor */
    Coordinaat(const Coordinaat &c)
      : x(c.x), y(c.y)
    { }

    inline T getX(void) const
    {
      return x;
    }

    inline T getY(void) const
    {
      return y;
    }

    Coordinaat &operator+=(const Coordinaat &b)
    {
      this->x += b.x;
      this->y += b.y;
      return *this;
    }

    /* In dit geval is het eenvoudiger de << operator overload als
     * non-member functie binnen de klasse te definieren.
     */
    friend std::ostream &operator<<(std::ostream &out, const Coordinaat &c)
    {
      return out << "(" << c.x << ", " << c.y << ")";
    }
};

template <typename T>
Coordinaat<T> operator+(const Coordinaat<T> &a, const Coordinaat<T> &b)
{
  Coordinaat<T> c(a);
  c += b;
  return c;
}


int main(void)
{
  Coordinaat<int> a(3, 5);
  Coordinaat<int> b(5, 7);

  Coordinaat<int> c = a + b;
  std::cout << a << std::endl;
  std::cout << b << std::endl;
  std::cout << c << std::endl << std::endl;

  Coordinaat<float> F(4.4520, 0.3);
  Coordinaat<float> G(1.4520, 0.9);
  F += G;
  std::cout << F << std::endl;

  /* We kunnen Coordinaat ook in een vector stoppen. */
  std::vector<Coordinaat<double> > coordinaten;
  coordinaten.push_back(Coordinaat<double>(3.234, 4.634));
  coordinaten.push_back(Coordinaat<double>(16.74, 1.245));
  coordinaten.push_back(Coordinaat<double>(1.234, 5.345));

  for (std::vector<Coordinaat<double> >::const_iterator it = coordinaten.begin();
       it != coordinaten.end(); ++it)
    std::cout << *it << " ";
  std::cout << std::endl;

  return 0;
}