/*
 *  mach.h
 *	States Machines
 */

#include <iostream>
#include <vector>
#include <fstream>

//foreach macros
#define foreach_transition	for(vector<Transition*>::iterator it = m_transition.begin();it != m_transition.end();it++)
#define foreach_etat	for(vector<Etat*>::iterator it = m_etat.begin();it != m_etat.end();it++)

using namespace std;

//Classes Pre-declaration;
class Transition; 
class Etat;


class Transition {
public:
	Transition();
	Transition(char caractere, Etat * etat);
	void set(char caractere, Etat * etat);
	Etat * etat();
	char lettre();
protected:
	char m_lettre;
	Etat * p_etat;
};

class Etat {
public:
	Etat();
	Etat(bool initial, bool final);
	void setInitial(bool s);
	void setFinal(bool s);
	bool estInitial();
	bool estFinal();
	void creerTransition(char caractere, Etat * etat);
	void supprTransition(int n);
	vector<Etat*> * transition(char complettre);
	int ID();
	void setID(int n);
protected:
	vector<Transition*> m_transition;
	bool m_initial;
	bool m_final;
	int m_id;
};

class Automate {
public:
	Automate(); //
	Automate(string fname);
	void afficher();
	void completer();//
	void simuler();//
	void determiniser(); //
	void inverser(); //
	void minimiser(); //
protected:
	int m_alphabet;
	vector<Etat*> m_etat;
	bool m_poubelle;
};