#ifndef GRAPHARC_H
#define GRAPHARC_H

#include "GraphNode.h"

#include "MemoryManager/debugNew.h"

namespace ground{

	// forward declaration
	class GraphNode;

	/**
	 * classe gerant un arc entre 2 noeud d'un graph
	 *
	 * Un arc a 2 extremitée qui sont appelé first node et seconde node, mais il n'y a aucun liens de prioritée entre
	 * ces 2 noeuds.
	 */
	class GraphArc
	{
	public:
		/**
		 * destructeur par defaut.
		 */
		virtual ~GraphArc(void){};

		/**
		 * methode permettant de recuperer la premiere extremitée de l'arc.
		 * @return GraphNode : le noeud representant la premiere extremitée du graph
		 */
		virtual GraphNode & getFirtNode() = 0;
		/**
		 * methode permettant de recuperer la seconde extremitée de l'arc.
		 * @return GraphNode : le noeud representant la seconde extremitée du graph
		 */
		virtual GraphNode & getSecondNode() = 0;
		/**
		 * methode permettant de recuperer le cout de l'arc entre les 2 noeuds en connaissant
		 * celui d'ou on vient.
		 * @param origin : noeud du graph dont on vient dans l'analyse du graph. doit imperativement
		 * etre une des extremitée de l'arc.
		 * @return float : le cout de parcourt de l'arc.
		 */
		virtual float getCostFrom(GraphNode& origin) = 0;

		/**
		 * methode permettant de recuperer l'autre extremitée de l'arc si on connait une des extremitée.
		 *
		 * si le noeud passé en parametre n'est pas une des extremitée de l'arc, la methode retourne NULL
		 * @param extremity : l'extremitée de l'arc connu. on souhaite recuperer l'autre extremitée de l'arc.
		 * @return GraphNode* : l'autre extremitée de l'arc. NULL si le noeud passé en parametre n'est pas une
		 * extremitée de l'arc.
		 */
		virtual GraphNode* getOtherSide(GraphNode* extremity) = 0;
	};

};// namespace ground

#include "MemoryManager/debugNewOff.h"

#endif
