//  Copyright (c) 2001-2010 Hartmut Kaiser
// 
//  Distributed under 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_PP_IS_ITERATING)

#if !defined(BOOST_SPIRIT_QI_TEST_MANIP_ATTR_APR_23_2009_0605PM)
#define BOOST_SPIRIT_QI_TEST_MANIP_ATTR_APR_23_2009_0605PM

#include <cstring>
#include <string>
#include <iterator>
#include <iostream>
#include <typeinfo>

#include <boost/spirit/include/qi_parse.hpp>
#include <boost/spirit/include/qi_stream.hpp>
#include <boost/spirit/include/qi_match_attr.hpp>

#include <boost/preprocessor/cat.hpp>
#include <boost/preprocessor/iterate.hpp>
#include <boost/preprocessor/repetition/repeat.hpp>
#include <boost/preprocessor/repetition/enum_params.hpp>
#include <boost/preprocessor/repetition/enum_binary_params.hpp>

#define BOOST_PP_FILENAME_1 "qi/test_manip_attr.hpp"
#define BOOST_PP_ITERATION_LIMITS (1, SPIRIT_ARGUMENTS_LIMIT)
#include BOOST_PP_ITERATE()

#endif

///////////////////////////////////////////////////////////////////////////////
//
//  Preprocessor vertical repetition code
//
///////////////////////////////////////////////////////////////////////////////
#else // defined(BOOST_PP_IS_ITERATING)

#define N BOOST_PP_ITERATION()
#define DEFINE_ATTRIBUTE(z, n, _)                                             \
    BOOST_PP_CAT(A, n) BOOST_PP_CAT(attr, n) = BOOST_PP_CAT(A, n)();
#define COMPARE_ATTRIBUTE(z, n, _)                                            \
    BOOST_PP_CAT(attr, n) == BOOST_PP_CAT(val, n) &&

namespace spirit_test
{
    ///////////////////////////////////////////////////////////////////////////
    template <typename Char, typename Parser
      , BOOST_PP_ENUM_PARAMS(N, typename A)>
    inline bool test(Char const *in, Parser const& p
      , BOOST_PP_ENUM_BINARY_PARAMS(N, A, val))
    {
        namespace qi = boost::spirit::qi;

        std::basic_stringstream<Char> strm(in);
        BOOST_PP_REPEAT(N, DEFINE_ATTRIBUTE, _);
        strm >> qi::match(p, BOOST_PP_ENUM_PARAMS(N, attr));

        return strm.eof() && BOOST_PP_REPEAT(N, COMPARE_ATTRIBUTE, _) true;
    }

    ///////////////////////////////////////////////////////////////////////////
    template <typename Char, typename Parser, typename Skipper
      , BOOST_PP_ENUM_PARAMS(N, typename A)>
    inline bool test_skipped(Char const *in, Parser const& p
      , Skipper const& skipper, BOOST_PP_ENUM_BINARY_PARAMS(N, A, val))
    {
        namespace qi = boost::spirit::qi;

        std::basic_stringstream<Char> strm(in);
        BOOST_PP_REPEAT(N, DEFINE_ATTRIBUTE, _);
        strm >> qi::phrase_match(p, skipper, BOOST_PP_ENUM_PARAMS(N, attr));

        return strm.eof() && BOOST_PP_REPEAT(N, COMPARE_ATTRIBUTE, _) true;
    }

    ///////////////////////////////////////////////////////////////////////////
    template <typename Char, typename Parser, typename Skipper
      , BOOST_PP_ENUM_PARAMS(N, typename A)>
    inline bool test_postskipped(Char const *in, Parser const& p
      , Skipper const& skipper
      , BOOST_SCOPED_ENUM(boost::spirit::qi::skip_flag) post_skip
      , BOOST_PP_ENUM_BINARY_PARAMS(N, A, val))
    {
        namespace qi = boost::spirit::qi;

        std::basic_stringstream<Char> strm(in);
        BOOST_PP_REPEAT(N, DEFINE_ATTRIBUTE, _);
        strm >> qi::phrase_match(p, skipper, post_skip
          , BOOST_PP_ENUM_PARAMS(N, attr));

        return strm.eof() && BOOST_PP_REPEAT(N, COMPARE_ATTRIBUTE, _) true;
    }

}   // namespace spirit_test

#undef COMPARE_ATTRIBUTE
#undef DEFINE_ATTRIBUTE
#undef N

#endif 
