Chris@16: /////////////////////////////////////////////////////////////////////////////// Chris@16: /// \file traits.hpp Chris@16: /// Definitions of proto::function, proto::nary_expr and proto::result_of::child_c Chris@16: // Chris@16: // Copyright 2008 Eric Niebler. Distributed under the Boost Chris@16: // Software License, Version 1.0. (See accompanying file Chris@16: // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@16: namespace result_of Chris@16: { Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct child_c Chris@16: { Chris@16: Chris@16: BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); Chris@16: Chris@16: Chris@16: typedef typename Expr::proto_child0 value_type; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: typedef typename detail::expr_traits::value_type type; Chris@16: }; Chris@16: template Chris@16: struct child_c Chris@16: { Chris@16: Chris@16: BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); Chris@16: Chris@16: Chris@16: typedef typename Expr::proto_child0 value_type; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: typedef typename detail::expr_traits::reference type; Chris@16: Chris@16: Chris@16: BOOST_FORCEINLINE Chris@16: static type call(Expr &e) Chris@16: { Chris@16: return e.proto_base().child0; Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct child_c Chris@16: { Chris@16: Chris@16: BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); Chris@16: Chris@16: Chris@16: typedef typename Expr::proto_child0 value_type; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: typedef typename detail::expr_traits::const_reference type; Chris@16: Chris@16: Chris@16: BOOST_FORCEINLINE Chris@16: static type call(Expr const &e) Chris@16: { Chris@16: return e.proto_base().child0; Chris@16: } Chris@16: }; Chris@16: } Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct function Chris@16: < Chris@16: A0 Chris@16: , void , void , void , void , void , void , void , void , void Chris@16: > Chris@16: : proto::transform< Chris@16: function< Chris@16: A0 Chris@16: , void , void , void , void , void , void , void , void , void Chris@16: > Chris@16: , int Chris@16: > Chris@16: { Chris@16: typedef proto::expr, 1> type; Chris@16: typedef proto::basic_expr, 1> proto_grammar; Chris@16: template Chris@16: struct impl Chris@16: : detail::pass_through_impl Chris@16: {}; Chris@16: Chris@16: typedef proto::tag::function proto_tag; Chris@16: typedef A0 proto_child0; Chris@16: typedef detail::if_vararg proto_child1; typedef detail::if_vararg proto_child2; typedef detail::if_vararg proto_child3; typedef detail::if_vararg proto_child4; typedef detail::if_vararg proto_child5; typedef detail::if_vararg proto_child6; typedef detail::if_vararg proto_child7; typedef detail::if_vararg proto_child8; typedef detail::if_vararg proto_child9; Chris@16: }; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct nary_expr Chris@16: < Chris@16: Tag Chris@16: , A0 Chris@16: , void , void , void , void , void , void , void , void , void Chris@16: > Chris@16: : proto::transform< Chris@16: nary_expr< Chris@16: Tag Chris@16: , A0 Chris@16: , void , void , void , void , void , void , void , void , void Chris@16: > Chris@16: , int Chris@16: > Chris@16: { Chris@16: typedef proto::expr, 1> type; Chris@16: typedef proto::basic_expr, 1> proto_grammar; Chris@16: template Chris@16: struct impl Chris@16: : detail::pass_through_impl Chris@16: {}; Chris@16: Chris@16: typedef Tag proto_tag; Chris@16: typedef A0 proto_child0; Chris@16: typedef detail::if_vararg proto_child1; typedef detail::if_vararg proto_child2; typedef detail::if_vararg proto_child3; typedef detail::if_vararg proto_child4; typedef detail::if_vararg proto_child5; typedef detail::if_vararg proto_child6; typedef detail::if_vararg proto_child7; typedef detail::if_vararg proto_child8; typedef detail::if_vararg proto_child9; Chris@16: }; Chris@16: namespace detail Chris@16: { Chris@16: template< Chris@16: template class T Chris@16: , typename A0 Chris@16: > Chris@16: struct is_callable_ BOOST_PROTO_TEMPLATE_ARITY_PARAM(1)> Chris@16: : is_same Chris@16: {}; Chris@16: } Chris@16: namespace result_of Chris@16: { Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct child_c Chris@16: { Chris@16: Chris@16: BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); Chris@16: Chris@16: Chris@16: typedef typename Expr::proto_child1 value_type; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: typedef typename detail::expr_traits::value_type type; Chris@16: }; Chris@16: template Chris@16: struct child_c Chris@16: { Chris@16: Chris@16: BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); Chris@16: Chris@16: Chris@16: typedef typename Expr::proto_child1 value_type; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: typedef typename detail::expr_traits::reference type; Chris@16: Chris@16: Chris@16: BOOST_FORCEINLINE Chris@16: static type call(Expr &e) Chris@16: { Chris@16: return e.proto_base().child1; Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct child_c Chris@16: { Chris@16: Chris@16: BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); Chris@16: Chris@16: Chris@16: typedef typename Expr::proto_child1 value_type; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: typedef typename detail::expr_traits::const_reference type; Chris@16: Chris@16: Chris@16: BOOST_FORCEINLINE Chris@16: static type call(Expr const &e) Chris@16: { Chris@16: return e.proto_base().child1; Chris@16: } Chris@16: }; Chris@16: } Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct function Chris@16: < Chris@16: A0 , A1 Chris@16: , void , void , void , void , void , void , void , void Chris@16: > Chris@16: : proto::transform< Chris@16: function< Chris@16: A0 , A1 Chris@16: , void , void , void , void , void , void , void , void Chris@16: > Chris@16: , int Chris@16: > Chris@16: { Chris@16: typedef proto::expr, 2> type; Chris@16: typedef proto::basic_expr, 2> proto_grammar; Chris@16: template Chris@16: struct impl Chris@16: : detail::pass_through_impl Chris@16: {}; Chris@16: Chris@16: typedef proto::tag::function proto_tag; Chris@16: typedef A0 proto_child0; typedef A1 proto_child1; Chris@16: typedef detail::if_vararg proto_child2; typedef detail::if_vararg proto_child3; typedef detail::if_vararg proto_child4; typedef detail::if_vararg proto_child5; typedef detail::if_vararg proto_child6; typedef detail::if_vararg proto_child7; typedef detail::if_vararg proto_child8; typedef detail::if_vararg proto_child9; Chris@16: }; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct nary_expr Chris@16: < Chris@16: Tag Chris@16: , A0 , A1 Chris@16: , void , void , void , void , void , void , void , void Chris@16: > Chris@16: : proto::transform< Chris@16: nary_expr< Chris@16: Tag Chris@16: , A0 , A1 Chris@16: , void , void , void , void , void , void , void , void Chris@16: > Chris@16: , int Chris@16: > Chris@16: { Chris@16: typedef proto::expr, 2> type; Chris@16: typedef proto::basic_expr, 2> proto_grammar; Chris@16: template Chris@16: struct impl Chris@16: : detail::pass_through_impl Chris@16: {}; Chris@16: Chris@16: typedef Tag proto_tag; Chris@16: typedef A0 proto_child0; typedef A1 proto_child1; Chris@16: typedef detail::if_vararg proto_child2; typedef detail::if_vararg proto_child3; typedef detail::if_vararg proto_child4; typedef detail::if_vararg proto_child5; typedef detail::if_vararg proto_child6; typedef detail::if_vararg proto_child7; typedef detail::if_vararg proto_child8; typedef detail::if_vararg proto_child9; Chris@16: }; Chris@16: namespace detail Chris@16: { Chris@16: template< Chris@16: template class T Chris@16: , typename A0 , typename A1 Chris@16: > Chris@16: struct is_callable_ BOOST_PROTO_TEMPLATE_ARITY_PARAM(2)> Chris@16: : is_same Chris@16: {}; Chris@16: } Chris@16: namespace result_of Chris@16: { Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct child_c Chris@16: { Chris@16: Chris@16: BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); Chris@16: Chris@16: Chris@16: typedef typename Expr::proto_child2 value_type; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: typedef typename detail::expr_traits::value_type type; Chris@16: }; Chris@16: template Chris@16: struct child_c Chris@16: { Chris@16: Chris@16: BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); Chris@16: Chris@16: Chris@16: typedef typename Expr::proto_child2 value_type; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: typedef typename detail::expr_traits::reference type; Chris@16: Chris@16: Chris@16: BOOST_FORCEINLINE Chris@16: static type call(Expr &e) Chris@16: { Chris@16: return e.proto_base().child2; Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct child_c Chris@16: { Chris@16: Chris@16: BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); Chris@16: Chris@16: Chris@16: typedef typename Expr::proto_child2 value_type; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: typedef typename detail::expr_traits::const_reference type; Chris@16: Chris@16: Chris@16: BOOST_FORCEINLINE Chris@16: static type call(Expr const &e) Chris@16: { Chris@16: return e.proto_base().child2; Chris@16: } Chris@16: }; Chris@16: } Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct function Chris@16: < Chris@16: A0 , A1 , A2 Chris@16: , void , void , void , void , void , void , void Chris@16: > Chris@16: : proto::transform< Chris@16: function< Chris@16: A0 , A1 , A2 Chris@16: , void , void , void , void , void , void , void Chris@16: > Chris@16: , int Chris@16: > Chris@16: { Chris@16: typedef proto::expr, 3> type; Chris@16: typedef proto::basic_expr, 3> proto_grammar; Chris@16: template Chris@16: struct impl Chris@16: : detail::pass_through_impl Chris@16: {}; Chris@16: Chris@16: typedef proto::tag::function proto_tag; Chris@16: typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; Chris@16: typedef detail::if_vararg proto_child3; typedef detail::if_vararg proto_child4; typedef detail::if_vararg proto_child5; typedef detail::if_vararg proto_child6; typedef detail::if_vararg proto_child7; typedef detail::if_vararg proto_child8; typedef detail::if_vararg proto_child9; Chris@16: }; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct nary_expr Chris@16: < Chris@16: Tag Chris@16: , A0 , A1 , A2 Chris@16: , void , void , void , void , void , void , void Chris@16: > Chris@16: : proto::transform< Chris@16: nary_expr< Chris@16: Tag Chris@16: , A0 , A1 , A2 Chris@16: , void , void , void , void , void , void , void Chris@16: > Chris@16: , int Chris@16: > Chris@16: { Chris@16: typedef proto::expr, 3> type; Chris@16: typedef proto::basic_expr, 3> proto_grammar; Chris@16: template Chris@16: struct impl Chris@16: : detail::pass_through_impl Chris@16: {}; Chris@16: Chris@16: typedef Tag proto_tag; Chris@16: typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; Chris@16: typedef detail::if_vararg proto_child3; typedef detail::if_vararg proto_child4; typedef detail::if_vararg proto_child5; typedef detail::if_vararg proto_child6; typedef detail::if_vararg proto_child7; typedef detail::if_vararg proto_child8; typedef detail::if_vararg proto_child9; Chris@16: }; Chris@16: namespace detail Chris@16: { Chris@16: template< Chris@16: template class T Chris@16: , typename A0 , typename A1 , typename A2 Chris@16: > Chris@16: struct is_callable_ BOOST_PROTO_TEMPLATE_ARITY_PARAM(3)> Chris@16: : is_same Chris@16: {}; Chris@16: } Chris@16: namespace result_of Chris@16: { Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct child_c Chris@16: { Chris@16: Chris@16: BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); Chris@16: Chris@16: Chris@16: typedef typename Expr::proto_child3 value_type; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: typedef typename detail::expr_traits::value_type type; Chris@16: }; Chris@16: template Chris@16: struct child_c Chris@16: { Chris@16: Chris@16: BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); Chris@16: Chris@16: Chris@16: typedef typename Expr::proto_child3 value_type; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: typedef typename detail::expr_traits::reference type; Chris@16: Chris@16: Chris@16: BOOST_FORCEINLINE Chris@16: static type call(Expr &e) Chris@16: { Chris@16: return e.proto_base().child3; Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct child_c Chris@16: { Chris@16: Chris@16: BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); Chris@16: Chris@16: Chris@16: typedef typename Expr::proto_child3 value_type; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: typedef typename detail::expr_traits::const_reference type; Chris@16: Chris@16: Chris@16: BOOST_FORCEINLINE Chris@16: static type call(Expr const &e) Chris@16: { Chris@16: return e.proto_base().child3; Chris@16: } Chris@16: }; Chris@16: } Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct function Chris@16: < Chris@16: A0 , A1 , A2 , A3 Chris@16: , void , void , void , void , void , void Chris@16: > Chris@16: : proto::transform< Chris@16: function< Chris@16: A0 , A1 , A2 , A3 Chris@16: , void , void , void , void , void , void Chris@16: > Chris@16: , int Chris@16: > Chris@16: { Chris@16: typedef proto::expr, 4> type; Chris@16: typedef proto::basic_expr, 4> proto_grammar; Chris@16: template Chris@16: struct impl Chris@16: : detail::pass_through_impl Chris@16: {}; Chris@16: Chris@16: typedef proto::tag::function proto_tag; Chris@16: typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef A3 proto_child3; Chris@16: typedef detail::if_vararg proto_child4; typedef detail::if_vararg proto_child5; typedef detail::if_vararg proto_child6; typedef detail::if_vararg proto_child7; typedef detail::if_vararg proto_child8; typedef detail::if_vararg proto_child9; Chris@16: }; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct nary_expr Chris@16: < Chris@16: Tag Chris@16: , A0 , A1 , A2 , A3 Chris@16: , void , void , void , void , void , void Chris@16: > Chris@16: : proto::transform< Chris@16: nary_expr< Chris@16: Tag Chris@16: , A0 , A1 , A2 , A3 Chris@16: , void , void , void , void , void , void Chris@16: > Chris@16: , int Chris@16: > Chris@16: { Chris@16: typedef proto::expr, 4> type; Chris@16: typedef proto::basic_expr, 4> proto_grammar; Chris@16: template Chris@16: struct impl Chris@16: : detail::pass_through_impl Chris@16: {}; Chris@16: Chris@16: typedef Tag proto_tag; Chris@16: typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef A3 proto_child3; Chris@16: typedef detail::if_vararg proto_child4; typedef detail::if_vararg proto_child5; typedef detail::if_vararg proto_child6; typedef detail::if_vararg proto_child7; typedef detail::if_vararg proto_child8; typedef detail::if_vararg proto_child9; Chris@16: }; Chris@16: namespace detail Chris@16: { Chris@16: template< Chris@16: template class T Chris@16: , typename A0 , typename A1 , typename A2 , typename A3 Chris@16: > Chris@16: struct is_callable_ BOOST_PROTO_TEMPLATE_ARITY_PARAM(4)> Chris@16: : is_same Chris@16: {}; Chris@16: } Chris@16: namespace result_of Chris@16: { Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct child_c Chris@16: { Chris@16: Chris@16: BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); Chris@16: Chris@16: Chris@16: typedef typename Expr::proto_child4 value_type; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: typedef typename detail::expr_traits::value_type type; Chris@16: }; Chris@16: template Chris@16: struct child_c Chris@16: { Chris@16: Chris@16: BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); Chris@16: Chris@16: Chris@16: typedef typename Expr::proto_child4 value_type; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: typedef typename detail::expr_traits::reference type; Chris@16: Chris@16: Chris@16: BOOST_FORCEINLINE Chris@16: static type call(Expr &e) Chris@16: { Chris@16: return e.proto_base().child4; Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct child_c Chris@16: { Chris@16: Chris@16: BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); Chris@16: Chris@16: Chris@16: typedef typename Expr::proto_child4 value_type; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: typedef typename detail::expr_traits::const_reference type; Chris@16: Chris@16: Chris@16: BOOST_FORCEINLINE Chris@16: static type call(Expr const &e) Chris@16: { Chris@16: return e.proto_base().child4; Chris@16: } Chris@16: }; Chris@16: } Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct function Chris@16: < Chris@16: A0 , A1 , A2 , A3 , A4 Chris@16: , void , void , void , void , void Chris@16: > Chris@16: : proto::transform< Chris@16: function< Chris@16: A0 , A1 , A2 , A3 , A4 Chris@16: , void , void , void , void , void Chris@16: > Chris@16: , int Chris@16: > Chris@16: { Chris@16: typedef proto::expr, 5> type; Chris@16: typedef proto::basic_expr, 5> proto_grammar; Chris@16: template Chris@16: struct impl Chris@16: : detail::pass_through_impl Chris@16: {}; Chris@16: Chris@16: typedef proto::tag::function proto_tag; Chris@16: typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef A3 proto_child3; typedef A4 proto_child4; Chris@16: typedef detail::if_vararg proto_child5; typedef detail::if_vararg proto_child6; typedef detail::if_vararg proto_child7; typedef detail::if_vararg proto_child8; typedef detail::if_vararg proto_child9; Chris@16: }; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct nary_expr Chris@16: < Chris@16: Tag Chris@16: , A0 , A1 , A2 , A3 , A4 Chris@16: , void , void , void , void , void Chris@16: > Chris@16: : proto::transform< Chris@16: nary_expr< Chris@16: Tag Chris@16: , A0 , A1 , A2 , A3 , A4 Chris@16: , void , void , void , void , void Chris@16: > Chris@16: , int Chris@16: > Chris@16: { Chris@16: typedef proto::expr, 5> type; Chris@16: typedef proto::basic_expr, 5> proto_grammar; Chris@16: template Chris@16: struct impl Chris@16: : detail::pass_through_impl Chris@16: {}; Chris@16: Chris@16: typedef Tag proto_tag; Chris@16: typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef A3 proto_child3; typedef A4 proto_child4; Chris@16: typedef detail::if_vararg proto_child5; typedef detail::if_vararg proto_child6; typedef detail::if_vararg proto_child7; typedef detail::if_vararg proto_child8; typedef detail::if_vararg proto_child9; Chris@16: }; Chris@16: namespace detail Chris@16: { Chris@16: template< Chris@16: template class T Chris@16: , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 Chris@16: > Chris@16: struct is_callable_ BOOST_PROTO_TEMPLATE_ARITY_PARAM(5)> Chris@16: : is_same Chris@16: {}; Chris@16: } Chris@16: namespace result_of Chris@16: { Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct child_c Chris@16: { Chris@16: Chris@16: BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); Chris@16: Chris@16: Chris@16: typedef typename Expr::proto_child5 value_type; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: typedef typename detail::expr_traits::value_type type; Chris@16: }; Chris@16: template Chris@16: struct child_c Chris@16: { Chris@16: Chris@16: BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); Chris@16: Chris@16: Chris@16: typedef typename Expr::proto_child5 value_type; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: typedef typename detail::expr_traits::reference type; Chris@16: Chris@16: Chris@16: BOOST_FORCEINLINE Chris@16: static type call(Expr &e) Chris@16: { Chris@16: return e.proto_base().child5; Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct child_c Chris@16: { Chris@16: Chris@16: BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); Chris@16: Chris@16: Chris@16: typedef typename Expr::proto_child5 value_type; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: typedef typename detail::expr_traits::const_reference type; Chris@16: Chris@16: Chris@16: BOOST_FORCEINLINE Chris@16: static type call(Expr const &e) Chris@16: { Chris@16: return e.proto_base().child5; Chris@16: } Chris@16: }; Chris@16: } Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct function Chris@16: < Chris@16: A0 , A1 , A2 , A3 , A4 , A5 Chris@16: , void , void , void , void Chris@16: > Chris@16: : proto::transform< Chris@16: function< Chris@16: A0 , A1 , A2 , A3 , A4 , A5 Chris@16: , void , void , void , void Chris@16: > Chris@16: , int Chris@16: > Chris@16: { Chris@16: typedef proto::expr, 6> type; Chris@16: typedef proto::basic_expr, 6> proto_grammar; Chris@16: template Chris@16: struct impl Chris@16: : detail::pass_through_impl Chris@16: {}; Chris@16: Chris@16: typedef proto::tag::function proto_tag; Chris@16: typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef A3 proto_child3; typedef A4 proto_child4; typedef A5 proto_child5; Chris@16: typedef detail::if_vararg proto_child6; typedef detail::if_vararg proto_child7; typedef detail::if_vararg proto_child8; typedef detail::if_vararg proto_child9; Chris@16: }; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct nary_expr Chris@16: < Chris@16: Tag Chris@16: , A0 , A1 , A2 , A3 , A4 , A5 Chris@16: , void , void , void , void Chris@16: > Chris@16: : proto::transform< Chris@16: nary_expr< Chris@16: Tag Chris@16: , A0 , A1 , A2 , A3 , A4 , A5 Chris@16: , void , void , void , void Chris@16: > Chris@16: , int Chris@16: > Chris@16: { Chris@16: typedef proto::expr, 6> type; Chris@16: typedef proto::basic_expr, 6> proto_grammar; Chris@16: template Chris@16: struct impl Chris@16: : detail::pass_through_impl Chris@16: {}; Chris@16: Chris@16: typedef Tag proto_tag; Chris@16: typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef A3 proto_child3; typedef A4 proto_child4; typedef A5 proto_child5; Chris@16: typedef detail::if_vararg proto_child6; typedef detail::if_vararg proto_child7; typedef detail::if_vararg proto_child8; typedef detail::if_vararg proto_child9; Chris@16: }; Chris@16: namespace detail Chris@16: { Chris@16: template< Chris@16: template class T Chris@16: , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 Chris@16: > Chris@16: struct is_callable_ BOOST_PROTO_TEMPLATE_ARITY_PARAM(6)> Chris@16: : is_same Chris@16: {}; Chris@16: } Chris@16: namespace result_of Chris@16: { Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct child_c Chris@16: { Chris@16: Chris@16: BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); Chris@16: Chris@16: Chris@16: typedef typename Expr::proto_child6 value_type; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: typedef typename detail::expr_traits::value_type type; Chris@16: }; Chris@16: template Chris@16: struct child_c Chris@16: { Chris@16: Chris@16: BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); Chris@16: Chris@16: Chris@16: typedef typename Expr::proto_child6 value_type; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: typedef typename detail::expr_traits::reference type; Chris@16: Chris@16: Chris@16: BOOST_FORCEINLINE Chris@16: static type call(Expr &e) Chris@16: { Chris@16: return e.proto_base().child6; Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct child_c Chris@16: { Chris@16: Chris@16: BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); Chris@16: Chris@16: Chris@16: typedef typename Expr::proto_child6 value_type; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: typedef typename detail::expr_traits::const_reference type; Chris@16: Chris@16: Chris@16: BOOST_FORCEINLINE Chris@16: static type call(Expr const &e) Chris@16: { Chris@16: return e.proto_base().child6; Chris@16: } Chris@16: }; Chris@16: } Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct function Chris@16: < Chris@16: A0 , A1 , A2 , A3 , A4 , A5 , A6 Chris@16: , void , void , void Chris@16: > Chris@16: : proto::transform< Chris@16: function< Chris@16: A0 , A1 , A2 , A3 , A4 , A5 , A6 Chris@16: , void , void , void Chris@16: > Chris@16: , int Chris@16: > Chris@16: { Chris@16: typedef proto::expr, 7> type; Chris@16: typedef proto::basic_expr, 7> proto_grammar; Chris@16: template Chris@16: struct impl Chris@16: : detail::pass_through_impl Chris@16: {}; Chris@16: Chris@16: typedef proto::tag::function proto_tag; Chris@16: typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef A3 proto_child3; typedef A4 proto_child4; typedef A5 proto_child5; typedef A6 proto_child6; Chris@16: typedef detail::if_vararg proto_child7; typedef detail::if_vararg proto_child8; typedef detail::if_vararg proto_child9; Chris@16: }; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct nary_expr Chris@16: < Chris@16: Tag Chris@16: , A0 , A1 , A2 , A3 , A4 , A5 , A6 Chris@16: , void , void , void Chris@16: > Chris@16: : proto::transform< Chris@16: nary_expr< Chris@16: Tag Chris@16: , A0 , A1 , A2 , A3 , A4 , A5 , A6 Chris@16: , void , void , void Chris@16: > Chris@16: , int Chris@16: > Chris@16: { Chris@16: typedef proto::expr, 7> type; Chris@16: typedef proto::basic_expr, 7> proto_grammar; Chris@16: template Chris@16: struct impl Chris@16: : detail::pass_through_impl Chris@16: {}; Chris@16: Chris@16: typedef Tag proto_tag; Chris@16: typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef A3 proto_child3; typedef A4 proto_child4; typedef A5 proto_child5; typedef A6 proto_child6; Chris@16: typedef detail::if_vararg proto_child7; typedef detail::if_vararg proto_child8; typedef detail::if_vararg proto_child9; Chris@16: }; Chris@16: namespace detail Chris@16: { Chris@16: template< Chris@16: template class T Chris@16: , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 Chris@16: > Chris@16: struct is_callable_ BOOST_PROTO_TEMPLATE_ARITY_PARAM(7)> Chris@16: : is_same Chris@16: {}; Chris@16: } Chris@16: namespace result_of Chris@16: { Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct child_c Chris@16: { Chris@16: Chris@16: BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); Chris@16: Chris@16: Chris@16: typedef typename Expr::proto_child7 value_type; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: typedef typename detail::expr_traits::value_type type; Chris@16: }; Chris@16: template Chris@16: struct child_c Chris@16: { Chris@16: Chris@16: BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); Chris@16: Chris@16: Chris@16: typedef typename Expr::proto_child7 value_type; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: typedef typename detail::expr_traits::reference type; Chris@16: Chris@16: Chris@16: BOOST_FORCEINLINE Chris@16: static type call(Expr &e) Chris@16: { Chris@16: return e.proto_base().child7; Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct child_c Chris@16: { Chris@16: Chris@16: BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); Chris@16: Chris@16: Chris@16: typedef typename Expr::proto_child7 value_type; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: typedef typename detail::expr_traits::const_reference type; Chris@16: Chris@16: Chris@16: BOOST_FORCEINLINE Chris@16: static type call(Expr const &e) Chris@16: { Chris@16: return e.proto_base().child7; Chris@16: } Chris@16: }; Chris@16: } Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct function Chris@16: < Chris@16: A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 Chris@16: , void , void Chris@16: > Chris@16: : proto::transform< Chris@16: function< Chris@16: A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 Chris@16: , void , void Chris@16: > Chris@16: , int Chris@16: > Chris@16: { Chris@16: typedef proto::expr, 8> type; Chris@16: typedef proto::basic_expr, 8> proto_grammar; Chris@16: template Chris@16: struct impl Chris@16: : detail::pass_through_impl Chris@16: {}; Chris@16: Chris@16: typedef proto::tag::function proto_tag; Chris@16: typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef A3 proto_child3; typedef A4 proto_child4; typedef A5 proto_child5; typedef A6 proto_child6; typedef A7 proto_child7; Chris@16: typedef detail::if_vararg proto_child8; typedef detail::if_vararg proto_child9; Chris@16: }; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct nary_expr Chris@16: < Chris@16: Tag Chris@16: , A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 Chris@16: , void , void Chris@16: > Chris@16: : proto::transform< Chris@16: nary_expr< Chris@16: Tag Chris@16: , A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 Chris@16: , void , void Chris@16: > Chris@16: , int Chris@16: > Chris@16: { Chris@16: typedef proto::expr, 8> type; Chris@16: typedef proto::basic_expr, 8> proto_grammar; Chris@16: template Chris@16: struct impl Chris@16: : detail::pass_through_impl Chris@16: {}; Chris@16: Chris@16: typedef Tag proto_tag; Chris@16: typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef A3 proto_child3; typedef A4 proto_child4; typedef A5 proto_child5; typedef A6 proto_child6; typedef A7 proto_child7; Chris@16: typedef detail::if_vararg proto_child8; typedef detail::if_vararg proto_child9; Chris@16: }; Chris@16: namespace detail Chris@16: { Chris@16: template< Chris@16: template class T Chris@16: , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 Chris@16: > Chris@16: struct is_callable_ BOOST_PROTO_TEMPLATE_ARITY_PARAM(8)> Chris@16: : is_same Chris@16: {}; Chris@16: } Chris@16: namespace result_of Chris@16: { Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct child_c Chris@16: { Chris@16: Chris@16: BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); Chris@16: Chris@16: Chris@16: typedef typename Expr::proto_child8 value_type; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: typedef typename detail::expr_traits::value_type type; Chris@16: }; Chris@16: template Chris@16: struct child_c Chris@16: { Chris@16: Chris@16: BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); Chris@16: Chris@16: Chris@16: typedef typename Expr::proto_child8 value_type; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: typedef typename detail::expr_traits::reference type; Chris@16: Chris@16: Chris@16: BOOST_FORCEINLINE Chris@16: static type call(Expr &e) Chris@16: { Chris@16: return e.proto_base().child8; Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct child_c Chris@16: { Chris@16: Chris@16: BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); Chris@16: Chris@16: Chris@16: typedef typename Expr::proto_child8 value_type; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: typedef typename detail::expr_traits::const_reference type; Chris@16: Chris@16: Chris@16: BOOST_FORCEINLINE Chris@16: static type call(Expr const &e) Chris@16: { Chris@16: return e.proto_base().child8; Chris@16: } Chris@16: }; Chris@16: } Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct function Chris@16: < Chris@16: A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 Chris@16: , void Chris@16: > Chris@16: : proto::transform< Chris@16: function< Chris@16: A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 Chris@16: , void Chris@16: > Chris@16: , int Chris@16: > Chris@16: { Chris@16: typedef proto::expr, 9> type; Chris@16: typedef proto::basic_expr, 9> proto_grammar; Chris@16: template Chris@16: struct impl Chris@16: : detail::pass_through_impl Chris@16: {}; Chris@16: Chris@16: typedef proto::tag::function proto_tag; Chris@16: typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef A3 proto_child3; typedef A4 proto_child4; typedef A5 proto_child5; typedef A6 proto_child6; typedef A7 proto_child7; typedef A8 proto_child8; Chris@16: typedef detail::if_vararg proto_child9; Chris@16: }; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct nary_expr Chris@16: < Chris@16: Tag Chris@16: , A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 Chris@16: , void Chris@16: > Chris@16: : proto::transform< Chris@16: nary_expr< Chris@16: Tag Chris@16: , A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 Chris@16: , void Chris@16: > Chris@16: , int Chris@16: > Chris@16: { Chris@16: typedef proto::expr, 9> type; Chris@16: typedef proto::basic_expr, 9> proto_grammar; Chris@16: template Chris@16: struct impl Chris@16: : detail::pass_through_impl Chris@16: {}; Chris@16: Chris@16: typedef Tag proto_tag; Chris@16: typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef A3 proto_child3; typedef A4 proto_child4; typedef A5 proto_child5; typedef A6 proto_child6; typedef A7 proto_child7; typedef A8 proto_child8; Chris@16: typedef detail::if_vararg proto_child9; Chris@16: }; Chris@16: namespace detail Chris@16: { Chris@16: template< Chris@16: template class T Chris@16: , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 Chris@16: > Chris@16: struct is_callable_ BOOST_PROTO_TEMPLATE_ARITY_PARAM(9)> Chris@16: : is_same Chris@16: {}; Chris@16: } Chris@16: namespace result_of Chris@16: { Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct child_c Chris@16: { Chris@16: Chris@16: BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); Chris@16: Chris@16: Chris@16: typedef typename Expr::proto_child9 value_type; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: typedef typename detail::expr_traits::value_type type; Chris@16: }; Chris@16: template Chris@16: struct child_c Chris@16: { Chris@16: Chris@16: BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); Chris@16: Chris@16: Chris@16: typedef typename Expr::proto_child9 value_type; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: typedef typename detail::expr_traits::reference type; Chris@16: Chris@16: Chris@16: BOOST_FORCEINLINE Chris@16: static type call(Expr &e) Chris@16: { Chris@16: return e.proto_base().child9; Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct child_c Chris@16: { Chris@16: Chris@16: BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); Chris@16: Chris@16: Chris@16: typedef typename Expr::proto_child9 value_type; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: typedef typename detail::expr_traits::const_reference type; Chris@16: Chris@16: Chris@16: BOOST_FORCEINLINE Chris@16: static type call(Expr const &e) Chris@16: { Chris@16: return e.proto_base().child9; Chris@16: } Chris@16: }; Chris@16: } Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct function Chris@16: : proto::transform< Chris@16: function< Chris@16: A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9 Chris@16: Chris@16: > Chris@16: , int Chris@16: > Chris@16: { Chris@16: typedef proto::expr, 10> type; Chris@16: typedef proto::basic_expr, 10> proto_grammar; Chris@16: template Chris@16: struct impl Chris@16: : detail::pass_through_impl Chris@16: {}; Chris@16: Chris@16: typedef proto::tag::function proto_tag; Chris@16: typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef A3 proto_child3; typedef A4 proto_child4; typedef A5 proto_child5; typedef A6 proto_child6; typedef A7 proto_child7; typedef A8 proto_child8; typedef A9 proto_child9; Chris@16: Chris@16: }; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct nary_expr Chris@16: : proto::transform< Chris@16: nary_expr< Chris@16: Tag Chris@16: , A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9 Chris@16: Chris@16: > Chris@16: , int Chris@16: > Chris@16: { Chris@16: typedef proto::expr, 10> type; Chris@16: typedef proto::basic_expr, 10> proto_grammar; Chris@16: template Chris@16: struct impl Chris@16: : detail::pass_through_impl Chris@16: {}; Chris@16: Chris@16: typedef Tag proto_tag; Chris@16: typedef A0 proto_child0; typedef A1 proto_child1; typedef A2 proto_child2; typedef A3 proto_child3; typedef A4 proto_child4; typedef A5 proto_child5; typedef A6 proto_child6; typedef A7 proto_child7; typedef A8 proto_child8; typedef A9 proto_child9; Chris@16: Chris@16: }; Chris@16: namespace detail Chris@16: { Chris@16: template< Chris@16: template class T Chris@16: , typename A0 , typename A1 , typename A2 , typename A3 , typename A4 , typename A5 , typename A6 , typename A7 , typename A8 , typename A9 Chris@16: > Chris@16: struct is_callable_ BOOST_PROTO_TEMPLATE_ARITY_PARAM(10)> Chris@16: : is_same Chris@16: {}; Chris@16: } Chris@16: namespace result_of Chris@16: { Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: template Chris@16: struct child_c Chris@16: { Chris@16: Chris@16: BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); Chris@16: Chris@16: Chris@16: typedef typename Expr::proto_child10 value_type; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: typedef typename detail::expr_traits::value_type type; Chris@16: }; Chris@16: template Chris@16: struct child_c Chris@16: { Chris@16: Chris@16: BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); Chris@16: Chris@16: Chris@16: typedef typename Expr::proto_child10 value_type; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: typedef typename detail::expr_traits::reference type; Chris@16: Chris@16: Chris@16: BOOST_FORCEINLINE Chris@16: static type call(Expr &e) Chris@16: { Chris@16: return e.proto_base().child10; Chris@16: } Chris@16: }; Chris@16: template Chris@16: struct child_c Chris@16: { Chris@16: Chris@16: BOOST_STATIC_ASSERT(0 != Expr::proto_arity_c); Chris@16: Chris@16: Chris@16: typedef typename Expr::proto_child10 value_type; Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: Chris@16: typedef typename detail::expr_traits::const_reference type; Chris@16: Chris@16: Chris@16: BOOST_FORCEINLINE Chris@16: static type call(Expr const &e) Chris@16: { Chris@16: return e.proto_base().child10; Chris@16: } Chris@16: }; Chris@16: }