/************************************************************************
 ************************************************************************
    FAUST compiler
	Copyright (C) 2003-2004 GRAME, Centre National de Creation Musicale
    ---------------------------------------------------------------------
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 ************************************************************************
 ************************************************************************/



#ifndef _COMPILE_
#define _COMPILE_


#include "signals.hh"
#include "klass.hh"
#include "Text.hh"
#include "uitree.hh"
#include <string>
#include <list>
#include <stack>
#include <map>

#include "description.hh"

////////////////////////////////////////////////////////////////////////
/**
 * compileSignals : listOfSignal -> klass
 *
 * Compile a list of FAUST signals into a C++ class
 */
///////////////////////////////////////////////////////////////////////

#define kMaxHeight 1024


class Compiler
{
protected:
	Klass*			fClass;
	bool			fNeedToDeleteClass;
	Tree			fUIRoot;
	Description*	fDescription;

public:
	Compiler (const string& name, const string& super, int numInputs, int numOutputs, bool vec);
	Compiler (Klass* k);

	virtual ~Compiler();

	virtual void		compileMultiSignal  (Tree lsig) = 0;
	virtual void		compileSingleSignal (Tree lsig) = 0;

	Klass*				getClass() { return (Klass*)fClass; }

	void				setDescription(Description* descr)	{ fDescription= descr; }
	Description*		getDescription()					{ return fDescription; }

protected:
  virtual Tree 		prepare (Tree L0) = 0;
  virtual Tree 		prepare2 (Tree L0) = 0;

// gestion des includes et librairies
	void 		addIncludeFile (const string& str) 	{ fClass->addIncludeFile(str); 	}
	void 		addLibrary (const string& str) 		{ fClass->addLibrary(str); 		}

// gestion de la description arborescente de l'IU
	void 		addUIWidget(Tree path, Tree widget);
	void 		generateWidgetCode(Tree fulllabel, Tree varname, Tree sig);
	void 		generateUserInterfaceTree(Tree t);
	void 		generateUserInterfaceElements(Tree elements);
	Tree 		prepareUserInterfaceTree(Tree t);

	void        generateMacroInterfaceTree(const string& pathname, Tree t);
    void        generateMacroInterfaceElements(const string& pathname, Tree elements);
    void        generateWidgetMacro(const string& pathname, Tree fulllabel, Tree varname, Tree sig);


};
#define generateEquivRecGroup generateRecGroup


void compileSignals (const string& name, const string& super, int numInputs, int numOutputs, Tree lsig);

#endif
