#ifndef CXX_CODEGEN_HH
#define CXX_CODEGEN_HH

#include "visitor.hh"

#include <iostream>

namespace codegen {
    class CXXCodeGen : public ast::Visitor{
    protected:
	std::ostream &_hh_os;
	std::ostream &_cc_os;
	const char *_method_name;

    public:
	CXXCodeGen(std::ostream &hh_os, std::ostream &cc_os,
		   const char *method_name = "fill_table")
	    : _hh_os(hh_os), _cc_os(cc_os), _method_name(method_name)
	{}
	~CXXCodeGen() {}

	void print_parameters (std::ostream &os);
	void print_globals    (std::ostream &os);
	void print_locals     (std::ostream &os);

	void emit_matrix_index (ast::Update &update);
	void emit_matrix_index (ast::MatrixExpr &matrix_expr);


	virtual void visit (ast::BinRelLT    &lt);
	virtual void visit (ast::BinRelLTE   &lte);
	virtual void visit (ast::BinRelGT    &gt);
	virtual void visit (ast::BinRelGTE   &gte);
	virtual void visit (ast::BinRelEQ    &eq);
	virtual void visit (ast::BinRelNEQ   &neq);

	virtual void visit (ast::RExpr       &rexpr);
	
	virtual void visit (ast::Range       &range);
	virtual void visit (ast::Values      &values);
	virtual void visit (ast::SimpleFun   &simple_fun);
	
	virtual void visit (ast::IDExpr      &id_expr);
	virtual void visit (ast::IntegerExpr &integer_expr);
	virtual void visit (ast::MatrixExpr  &matrix_expr);
	virtual void visit (ast::FunCallExpr &fun_call_expr);
	virtual void visit (ast::BinOpExpr   &binop_expr);
	virtual void visit (ast::NEGExpr     &neg_expr);
	
	virtual void visit (ast::RelBExpr    &bexpr);
	virtual void visit (ast::ANDBExpr    &bexpr);
	virtual void visit (ast::ORBExpr     &bexpr);
	virtual void visit (ast::NOTBExpr    &bexpr);
	virtual void visit (ast::TrueExpr    &bexpr);
	
	virtual void visit (ast::Update      &update);
	virtual void visit (ast::DProg       &dprog);
    };

    void cxx_emit_code (ast::DProg *dprog, const char *output_name);
};

#endif // CXX_CODEGEN_HH


syntax highlighted by Code2HTML, v. 0.9.1