#ifndef STABLE_H_
#define STABLE_H_
#include <iostream>
#include "nodes.h"
using namespace std;

#define S_NOT 0
#define S_AND 1
#define S_OR 2
#define S_NAND 3
#define S_NOR 4
#define S_XOR 5
#define S_XNOR 6
#define S_ASSIGN 7

//polozka v tabulce symbolu
class Symbol
{
	public:
	string name;		//název proměnné
	unsigned int value; //hodnota proměnné
	bool valid;			//platnost hodnoty proměnné
	Symbol * next;		//ukazatel na další symbol
	
	Symbol(string s);
};

//tabulka symbolu
class STable
{
	Symbol * first, *last, *act;
	//ukazatele na začátek, konec a aktuální symbol v seznamu
	
	public:
	unsigned int count;  //počet vložených položek
	
	STable();
	
	//unsigned int getValue (string s);
	
	//nastavi promennou Valid u vsech prvku na false
	void refresh();
	
	bool empty();
	
	//vrati ukazatel na prvek dle parametru
	Symbol * getPtr (string s);
	
	//nastavi hodnotu daneho prvku
	void setValue (string s, unsigned int val);
	
	//prida symbol
	void add (string s);
	
	//true pokud hledany symbol existuje
	bool exists (string s);
	
	//vypise tabulku - nazev a ohodnoceni
	void print(ostream * output);
	
	//vypise hodnoty tabulky
	void printvals(ostream * output);
	
	//vypise nazvy promennych tabulky
	void printnames(ostream * output);
	
	//vypise nazvy promennych tabulky oddelene carkou
	void printnamescomma(ostream * output);
	
	//najde prvek se danym poradovym cislem
	Symbol * find (int i);
	
	//vraci postupne ukazatele na prvky tabulky
	Symbol * get();
	
	~STable();
}; 


//element seznamu jednotlivcych vyrazu
class Element
{
	public:
	Node * root; //ukazatel na strom výrazu
	STable * symbTable; //ukazatel na tabulku symbolů
	string name; //název výstupní proměnné
	unsigned int terms; //počet termů výrazu
	Element * next; //ukazatel na další element
	
	Element(Node * ptr, STable * tab, string str);
	~Element();
};

//trida se vsemi stromy vyrazu
class TreeArray
{
	Element * first,*last; //ukazatele na začátek a konec seznamu
	
	public:
	unsigned int terms; //počet termů
	int invars;			//počet vstupních proměnných
	int outvars;		//počet výstupních proměnných
	bool namedi;		//informace o pojmenování vstupů
	bool namedo;		//informace o pojmenování výstupů
	
	STable * symbNames; //ukazatel na společnou tabulku symbolů
	
	TreeArray();
	
	//prida element
	void add (Node * root, STable * table, string s);
	
	//smaze element
	void remove (int num);
	
	//najde element
	Element * find (int num);
	
	~TreeArray();
	
};


//globalni promenne
extern STable * symbTable;
extern ostream * g_output;
extern TreeArray * treeArray;
extern string l_name;
extern Element * elem;
extern Node *root;
extern Symbol *symb;
extern clock_t gt1, gt2;
extern bool measure;
extern bool absorbtion;
extern bool autoprint;
extern string command_str;
//extern unsigned int terms;
extern unsigned int added_formulas;


#endif /*STABLE_H_*/
