/*=============================================================================
    Copyright (c) 2006 Tobias Schwinger
    http://spirit.sourceforge.net/

    Use, modification and distribution is subject to the Boost Software
    License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at
    http://www.boost.org/LICENSE_1_0.txt)
=============================================================================*/
#if !defined(BOOST_SPIRIT_TREE_COMMON_FWD_HPP)
#define BOOST_SPIRIT_TREE_COMMON_FWD_HPP

#include <boost/spirit/core/nil.hpp>

namespace boost { namespace spirit {

    template <typename T>
    struct tree_node;

    template <typename IteratorT = char const*, typename ValueT = nil_t>
    struct node_iter_data;

    template <typename ValueT = nil_t>
    class node_iter_data_factory;

    template <typename ValueT = nil_t>
    class node_val_data_factory;

    template <typename ValueT = nil_t>
    class node_all_val_data_factory;

    template <
        typename IteratorT,
        typename NodeFactoryT = node_val_data_factory<nil_t>,
        typename T = nil_t
    >
    class tree_match;

    struct tree_policy;

    template <
        typename MatchPolicyT,
        typename IteratorT,
        typename NodeFactoryT,
        typename TreePolicyT, 
        typename T = nil_t
    >
    struct common_tree_match_policy;

    template <typename MatchPolicyT, typename NodeFactoryT>
    struct common_tree_tree_policy;

    template <typename T>
    struct no_tree_gen_node_parser;

    template <typename T>
    struct leaf_node_parser;

    template <typename T, typename NodeParserT>
    struct node_parser;

    struct discard_node_op;
    struct reduced_node_op;
    struct infix_node_op;
    struct discard_first_node_op;
    struct discard_last_node_op;
    struct inner_node_op;

    template <typename T, typename ActionParserT>
    struct action_directive_parser;

    struct access_match_action
    {
        template <typename ParserT, typename ActionT>
        struct action;
    };

    struct access_node_action
    {
        template <typename ParserT, typename ActionT>
        struct action;
    };

    template <
        typename IteratorT = char const *,
        typename NodeFactoryT = node_val_data_factory<nil_t>,
        typename T = nil_t
    >
    struct tree_parse_info;

}} // namespace boost::spirit

#endif
