#include <windows.h>
#include "cmemory.h"
#include "csyntactic.h"

#ifndef __GRAPHCLASS
#define __GRAPHCLASS

#pragma warning(push)
#pragma warning( disable : 4200 ) //kvoli poliam nulovej velkosti, tj. []

struct GRAPH_VERTEX
{
	DWORD id;//identifikator vrchola
	DWORD value;//user defined value
	DWORD nArc;//pocet sipok z vrchola
	DWORD arcs[];//cisla vrcholov, do ktorych vedie hrana
};

#pragma warning(pop)

class CGraph
{
	private:
		DWORD nVertexs;//pocet vrcholov v grafe
		CMemory *vertexs;//dynamicke pole na GRAPH_VERTEX
		void Create(DWORD n);//vytvori prazdny graf s n vrcholmi

	public:
		CGraph(DWORD nVertexs);//vytvori graf s danym poctom vrcholov; priradi im ID rovne poradiu
		CGraph(const SYNTACTIC_TABLE_RULES* table);//vytvori graf z IDB atomov
		~CGraph();

		GRAPH_VERTEX *GetVertex(DWORD verIndex);//vrati vrchol v danom poradi
		DWORD GetVertexIndexByID(DWORD id);//vrati cislo vrchola podla jeho ID
		DWORD GetnVertexs();//vrati pocet vrcholov

		void AddArc(DWORD fromVerIndex,DWORD toVerIndex);//prida hranu z vrchola do vrchola
		void ClearAllValues();//nastavi vsetkym vrcholom hodnotu value na 0

		//topologicky utriedy vrcholy
		//prepise GRAPH_VERTEX.value!
		//ak loopStop=true, tak vrati NULL, ak graf obsahuje cyklus
		//	inak cykly ignoruje a pokracuje dalej
		//vysledkom je "pole" id vrcholov
		CMemory *TopologicalSort(DWORD rootID,bool loopStop);
		//vysledkom je
};


#endif