/*********************************************************************//**
*	\brief Sablona standardniho uzlu grafu.
*	Krome zakladniho uzlu, ktery nese nejakou hodnotu a pamatuje si stav,
*	je zde definovan uzel binarniho stromu a obecny grafovy uzel, ktery
*	obsahuje seznam sousedu formou ukazatelu.
*
*	\author Michal Jirous
*	\date 20.12.2008
*	\file node.h
**********************************************************************/

#ifndef __NODE_H__
#define __NODE_H__

#include <list>

/** @brief Mozne stavy uzlu. */
enum _node_states
{
	NODE_UNUSED = 0,	/*!< @brief Nepouzit. */
	NODE_OPEN,			/*!< @brief Otevreny. */
	NODE_CLOSED			/*!< @brief Zavreny. */
};



template <typename T>
/** @brief Sablona zakladniho uzlu. */
struct Node
{
	T value;	/*!< @brief Data, ktera uzel nese. */
	int state;	/*!< @brief Stav uzlu z vyctu _node_states. */
	Node() { state = NODE_UNUSED; }	/*!< @brief Konstruktor nastavi stav na NODE_UNUSED. */
};

template <typename T>
/** @brief Sablona uzlu binarniho stromu. */
struct BinaryTreeNode : public Node<T>
{
	BinaryTreeNode	*parent,	/*!< @brief Rodic uzlu. */
					*left,		/*!< @brief Levy potomek uzlu. */
					*right;		/*!< @brief Pravy potomek uzlu. */
	BinaryTreeNode() { parent = left = right = NULL; }	/*!< @brief Inicializace promennych. */
};




template <typename T>
/** @brief Sablona uzlu grafu. */
struct GraphNode : public Node<T>
{
	std::list< GraphNode<T>* > m_neightbours;	/*!< @brief Seznam sousednich uzlu. */

	/** @brief Funkce vlozi noveho souseda. 
	*	@param gn Sousedni uzel.
	*/
	void addNeightbour( GraphNode *gn )
	{ 
		if( gn )
			m_neightbours.push_back( gn );
	}
};


#endif
