/* ________________________________________________
 * template metagénérer pour les objets geometrique
 * par Martin Robinson
 * c'est metaobjet vont modifier les objets points
 * et rectangle pour leur donnée une fonction <<
 * cela permetra d'afficher avec cout << point..
 * ________________________________________________
 * preprocesseur
 */


#pragma once
#ifndef _STDGEO
#define _STDGEO
#include <iostream>
using namespace std;

#include "point.hpp"
#include "rectangle.hpp"

/*________________________________________________
 *classe de base pour la surcharge
 */

template <typename PARENT>
class stdGeometry : public PARENT{
public:
    stdGeometry() : PARENT() {}
};

/*________________________________________________
 * classe specialisé pour l'objet point
 */

template <>
class stdGeometry <point>:public point{
public:
    stdGeometry() : point() {}
    stdGeometry(int a,int b) : point(a,b) {}
    friend ostream & operator<<(ostream & out, const stdGeometry<point>& p);

};
typedef stdGeometry<point> stdPoint;

//etant metaclasse, il ne peut être compiler qu'en initialisant une instance de la metaclasse
//donc la meta-methode doit être déclarer dans le .hpp
ostream & operator<<(ostream & out, const stdPoint& p)
{
    out << "(" << p.getX() << "," << p.getY() << ")";
    return out;
}

/*_________________________________________________
 * classe specialisé pour l'objet rectangle
 */

template <>
class stdGeometry <rectangle>:public rectangle{
public:
    stdGeometry() : rectangle() {}
    stdGeometry(int x1,int y1, int x2, int y2) : rectangle(x1,y1,x2,y2) {}
    friend ostream & operator<<(ostream & out, const stdGeometry<rectangle>& rect);

};
typedef stdGeometry<rectangle> stdRectangle;

//etant metaclasse, il ne peut être compiler qu'en initialisant une instance de la metaclasse
//donc la meta-methode doit être déclarer dans le .hpp
ostream & operator<<(ostream & out, const stdRectangle& rect)
{
    out << "(" << rect.getX1() 
        << "," << rect.getY1() 
        << ") (" << rect.getX2() 
        << "," << rect.getY2() << ")\n";
    for (int i=0;i<rect.heigth();i++)
    {
        for (int j=0;j<rect.width();j++)
            if (i==0 || i==rect.heigth()-1 || j==0 || j==rect.width()-1)
                cout << "#";
            else
                cout << " ";
        cout << endl;
    }
    return out;
}

#endif