1 #if !defined(BOOST_PROTO_DONT_USE_PREPROCESSED_FILES)
2 
3     #include <boost/proto/detail/preprocessed/matches_.hpp>
4 
5 #elif !defined(BOOST_PP_IS_ITERATING)
6 
7     #define BOOST_PROTO_MATCHES_N_FUN(Z, N, DATA)                                                   \
8         matches_<                                                                                   \
9             typename detail::expr_traits<typename Args1::BOOST_PP_CAT(child, N)>::value_type::proto_derived_expr \
10           , typename detail::expr_traits<typename Args1::BOOST_PP_CAT(child, N)>::value_type::proto_grammar \
11           , typename Args2::BOOST_PP_CAT(child, N)::proto_grammar                                   \
12         >
13 
14     #define BOOST_PROTO_DEFINE_MATCHES(Z, N, DATA)                                                  \
15         matches_<                                                                                   \
16             Expr                                                                                    \
17           , BasicExpr                                                                               \
18           , typename BOOST_PP_CAT(G, N)::proto_grammar                                              \
19         >
20 
21     #if defined(__WAVE__) && defined(BOOST_PROTO_CREATE_PREPROCESSED_FILES)
22         #pragma wave option(preserve: 2, line: 0, output: "preprocessed/matches_.hpp")
23     #endif
24 
25     ///////////////////////////////////////////////////////////////////////////////
26     /// \file matches_.hpp
27     /// Definitions of matches_ specializations
28     //
29     //  Copyright 2008 Eric Niebler. Distributed under the Boost
30     //  Software License, Version 1.0. (See accompanying file
31     //  LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
32 
33     #if defined(__WAVE__) && defined(BOOST_PROTO_CREATE_PREPROCESSED_FILES)
34         #pragma wave option(preserve: 1)
35     #endif
36 
37     #define BOOST_PP_ITERATION_PARAMS_1                                                             \
38         (3, (2, BOOST_PP_MAX(BOOST_PROTO_MAX_ARITY, BOOST_PROTO_MAX_LOGICAL_ARITY), <boost/proto/detail/matches_.hpp>))
39     #include BOOST_PP_ITERATE()
40 
41     #if defined(__WAVE__) && defined(BOOST_PROTO_CREATE_PREPROCESSED_FILES)
42         #pragma wave option(output: null)
43     #endif
44 
45     #undef BOOST_PROTO_DEFINE_MATCHES
46     #undef BOOST_PROTO_MATCHES_N_FUN
47 
48 #else // BOOST_PP_IS_ITERATING
49 
50     #define N BOOST_PP_ITERATION()
51 
52     #if N <= BOOST_PROTO_MAX_LOGICAL_ARITY
53 
54         // handle proto::or_
55         template<typename Expr, typename BasicExpr BOOST_PP_ENUM_TRAILING_PARAMS(N, typename G)>
56         struct matches_<Expr, BasicExpr, proto::or_<BOOST_PP_ENUM_PARAMS(N, G)> >
57           : BOOST_PP_CAT(or_, N)<
58                 matches_<Expr, BasicExpr, typename G0::proto_grammar>::value,
59                 Expr, BasicExpr BOOST_PP_ENUM_TRAILING_PARAMS(N, G)
60             >
61         {};
62 
63         // handle proto::and_
64         template<typename Expr, typename BasicExpr, BOOST_PP_ENUM_PARAMS(N, typename G)>
65         struct matches_<Expr, BasicExpr, proto::and_<BOOST_PP_ENUM_PARAMS(N, G)> >
66           : detail::BOOST_PP_CAT(and_, N)<
67                 BOOST_PROTO_DEFINE_MATCHES(~, 0, ~)::value,
68                 BOOST_PP_ENUM_SHIFTED(N, BOOST_PROTO_DEFINE_MATCHES, ~)
69             >
70         {};
71 
72     #endif
73 
74     #if N <= BOOST_PROTO_MAX_ARITY
75 
76         template<typename Expr, typename Tag, typename Args1, typename Args2>
77         struct matches_< Expr, proto::basic_expr<Tag, Args1, N>, proto::basic_expr<Tag, Args2, N> >
78           : BOOST_PP_CAT(and_, N)<
79                 BOOST_PROTO_MATCHES_N_FUN(~, 0, ~)::value,
80                 BOOST_PP_ENUM_SHIFTED(N, BOOST_PROTO_MATCHES_N_FUN, ~)
81             >
82         {};
83 
84         template<typename Expr, typename Tag, typename Args1, typename Args2>
85         struct matches_< Expr, proto::basic_expr<Tag, Args1, N>, proto::basic_expr<proto::_, Args2, N> >
86           : BOOST_PP_CAT(and_, N)<
87                 BOOST_PROTO_MATCHES_N_FUN(~, 0, ~)::value,
88                 BOOST_PP_ENUM_SHIFTED(N, BOOST_PROTO_MATCHES_N_FUN, ~)
89             >
90         {};
91 
92     #endif
93 
94     #undef N
95 
96 #endif
97