//  Objectif : Définition d'un segment caractérisé par ses deux extrémités.

#ifndef SegmentPointeur__H
#define SegmentPointeur__H

#include "Point.h"


class SegmentPointeur {
public:		// Constructeurs

    SegmentPointeur(Point &p1, Point &p2);
	// Initialiser le segment à partir de ses deux extrémités p1 et p2
	//
	//@ ensures e1() == p1;		// e1 initialisé
	//@ ensures e2() == p2;		// e2 initialisé
	//@ ensures &e1() == &p1;	// e1 est en fait p1
	//@ ensures &e2() == &p2;	// e1 est en fait p2

public:		// Requêtes

    const Point & e1() const;
	// une extrémité du segment

    const Point & e2() const;
	// l'autre extrémité du segment

    double longueur() const;
	// longueur du segment

    SegmentPointeur *copie() const;
	// Copie du segment.
	//
	//@ ensures *\result == *this;	// égalité logique
	//@ ensures \result != this;	// mais pas physique (nouveau SegmentPointeur !)

public:		// Commandes

    void translater(double dx, double dy);
	    // Translater le segment de dx et dy suivant l'axe des X et l'axe
	    // des Y

    void afficher(std::ostream &out = std::cout) const;
	    // Afficher sur le flot de sortie out.

public:		// Gestion des ressources de l'objet

    ~SegmentPointeur();

    SegmentPointeur(const SegmentPointeur & autre);
	// Constructeur de copie

    SegmentPointeur & operator = (const SegmentPointeur & autre);
	// Opérateur d'affectation


private:		// Caractéristiques de classes

    Point *_e1, *_e2;	// les deux extrémités du segment

};

inline std::ostream & operator << (std::ostream & out, const SegmentPointeur &s)
{
    s.afficher(out);
    return out;
}

#endif
