/* Interface for the GNU C++ pretty-printer.
   Copyright (C) 2003, 2004, 2005, 2007, 2009 Free Software Foundation, Inc.
   Contributed by Gabriel Dos Reis <gdr@integrable-solutions.net>

This file is part of GCC.

GCC 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 3, or (at your option) any later
version.

GCC 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 GCC; see the file COPYING3.  If not see
<http://www.gnu.org/licenses/>.  */

#ifndef GCC_CXX_PRETTY_PRINT_H
#define GCC_CXX_PRETTY_PRINT_H

#include "c-pretty-print.h"

#undef pp_c_base
#define pp_c_base(PP) (&(PP)->c_base)

typedef enum
{
  /* Ask for a qualified-id.  */
  pp_cxx_flag_default_argument = 1 << pp_c_flag_last_bit

} cxx_pretty_printer_flags;

typedef struct
{
  c_pretty_printer c_base;
  /* This is the enclosing scope of the entity being pretty-printed.  */
  tree enclosing_scope;
} cxx_pretty_printer;

#define pp_cxx_cv_qualifier_seq(PP, T)   \
   pp_c_type_qualifier_list (pp_c_base (PP), T)

#define pp_cxx_whitespace(PP)		pp_c_whitespace (pp_c_base (PP))
#define pp_cxx_left_paren(PP)		pp_c_left_paren (pp_c_base (PP))
#define pp_cxx_right_paren(PP)		pp_c_right_paren (pp_c_base (PP))
#define pp_cxx_left_brace(PP)		pp_c_left_brace (pp_c_base (PP))
#define pp_cxx_right_brace(PP)		pp_c_right_brace (pp_c_base (PP))
#define pp_cxx_left_bracket(PP)		pp_c_left_bracket (pp_c_base (PP))
#define pp_cxx_right_bracket(PP)	pp_c_right_bracket (pp_c_base (PP))
#define pp_cxx_dot(PP)			pp_c_dot (pp_c_base (PP))
#define pp_cxx_ampersand(PP)		pp_c_ampersand (pp_c_base (PP))
#define pp_cxx_star(PP)			pp_c_star (pp_c_base (PP))
#define pp_cxx_arrow(PP)		pp_c_arrow (pp_c_base (PP))
#define pp_cxx_semicolon(PP)		pp_c_semicolon (pp_c_base (PP))
#define pp_cxx_complement(PP)		pp_c_complement (pp_c_base (PP))

#define pp_cxx_ws_string(PP, I)		pp_c_ws_string (pp_c_base (PP), I)
#define pp_cxx_identifier(PP, I)	pp_c_identifier (pp_c_base (PP), I)
#define pp_cxx_tree_identifier(PP, T) \
  pp_c_tree_identifier (pp_c_base (PP), T)

void pp_cxx_pretty_printer_init (cxx_pretty_printer *);
void pp_cxx_begin_template_argument_list (cxx_pretty_printer *);
void pp_cxx_end_template_argument_list (cxx_pretty_printer *);
void pp_cxx_colon_colon (cxx_pretty_printer *);
void pp_cxx_separate_with (cxx_pretty_printer *, int);

void pp_cxx_declaration (cxx_pretty_printer *, tree);
void pp_cxx_canonical_template_parameter (cxx_pretty_printer *, tree);
void pp_cxx_trait_expression (cxx_pretty_printer *, tree);
void pp_cxx_va_arg_expression (cxx_pretty_printer *, tree);
void pp_cxx_offsetof_expression (cxx_pretty_printer *, tree);

#endif /* GCC_CXX_PRETTY_PRINT_H */
