/*++
Copyright (c) 2006 Microsoft Corporation

Module Name:

    ast_pp.h

Abstract:

    Pretty printer

Author:

    Leonardo de Moura 2008-01-20.

Revision History:

--*/
#ifndef _AST_PP_H_
#define _AST_PP_H_

#include"ast.h"
#include"pp_params.h"

std::ostream & ast_pp(std::ostream & strm, ast * n, ast_manager & m, pp_params const & p, unsigned indent = 0, 
                      unsigned num_vars = 0, char const * const * names = 0);
std::ostream & ast_pp(std::ostream & strm, ast * n, ast_manager & m);

std::string & ast_pp(std::string & s, ast * n, ast_manager & m, pp_params const & p, unsigned indent = 0);
std::string ast_pp(ast * n, ast_manager & m, pp_params const & p, unsigned indent = 0);
std::string & ast_pp(std::string & s, ast * n, ast_manager & m);
std::string ast_pp(ast * n, ast_manager & m);

struct mk_pp {
    ast *             m_ast;
    ast_manager &     m_manager;
    pp_params const & m_params;
    unsigned          m_indent;
    unsigned          m_num_var_names;
    char const * const * m_var_names;
    mk_pp(ast * a, ast_manager & m, pp_params const & p, unsigned indent = 0, unsigned num_var_names = 0, char const * const * var_names = 0);
    mk_pp(ast * a, ast_manager & m, unsigned indent = 0, unsigned num_var_names = 0, char const * const * var_names = 0);
};

inline std::ostream& operator<<(std::ostream& out, const mk_pp & p) {
    return ast_pp(out, p.m_ast, p.m_manager, p.m_params, p.m_indent, p.m_num_var_names, p.m_var_names);
}

inline std::string& operator+=(std::string& out, const mk_pp & p) {
    return ast_pp(out, p.m_ast, p.m_manager, p.m_params, p.m_indent);
}

#endif