/////////////////////////////////////////////////////////////////////////////// /// \file make_gcc_workaround.hpp /// Special workaround code to make the make\<\> transform work on certain /// versions of gcc. // // Copyright 2008 Eric Niebler. 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) template struct make()> : transform()> > { template struct impl : transform_impl { typedef proto::expr result_type; BOOST_FORCEINLINE result_type operator ()( typename impl::expr_param e , typename impl::state_param s , typename impl::data_param d ) const { return proto::expr::make( ); } }; }; template struct make()> : transform()> > { template struct impl : transform_impl { typedef proto::basic_expr result_type; BOOST_FORCEINLINE result_type operator ()( typename impl::expr_param e , typename impl::state_param s , typename impl::data_param d ) const { return proto::basic_expr::make( ); } }; }; template struct make(A0)> : transform(A0)> > { template struct impl : transform_impl { typedef proto::expr result_type; BOOST_FORCEINLINE result_type operator ()( typename impl::expr_param e , typename impl::state_param s , typename impl::data_param d ) const { return proto::expr::make( detail::as_lvalue( typename when<_, A0>::template impl()(e, s, d) ) ); } }; }; template struct make(A0)> : transform(A0)> > { template struct impl : transform_impl { typedef proto::basic_expr result_type; BOOST_FORCEINLINE result_type operator ()( typename impl::expr_param e , typename impl::state_param s , typename impl::data_param d ) const { return proto::basic_expr::make( detail::as_lvalue( typename when<_, A0>::template impl()(e, s, d) ) ); } }; }; template struct make(A0 , A1)> : transform(A0 , A1)> > { template struct impl : transform_impl { typedef proto::expr result_type; BOOST_FORCEINLINE result_type operator ()( typename impl::expr_param e , typename impl::state_param s , typename impl::data_param d ) const { return proto::expr::make( detail::as_lvalue( typename when<_, A0>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl()(e, s, d) ) ); } }; }; template struct make(A0 , A1)> : transform(A0 , A1)> > { template struct impl : transform_impl { typedef proto::basic_expr result_type; BOOST_FORCEINLINE result_type operator ()( typename impl::expr_param e , typename impl::state_param s , typename impl::data_param d ) const { return proto::basic_expr::make( detail::as_lvalue( typename when<_, A0>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl()(e, s, d) ) ); } }; }; template struct make(A0 , A1 , A2)> : transform(A0 , A1 , A2)> > { template struct impl : transform_impl { typedef proto::expr result_type; BOOST_FORCEINLINE result_type operator ()( typename impl::expr_param e , typename impl::state_param s , typename impl::data_param d ) const { return proto::expr::make( detail::as_lvalue( typename when<_, A0>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl()(e, s, d) ) ); } }; }; template struct make(A0 , A1 , A2)> : transform(A0 , A1 , A2)> > { template struct impl : transform_impl { typedef proto::basic_expr result_type; BOOST_FORCEINLINE result_type operator ()( typename impl::expr_param e , typename impl::state_param s , typename impl::data_param d ) const { return proto::basic_expr::make( detail::as_lvalue( typename when<_, A0>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl()(e, s, d) ) ); } }; }; template struct make(A0 , A1 , A2 , A3)> : transform(A0 , A1 , A2 , A3)> > { template struct impl : transform_impl { typedef proto::expr result_type; BOOST_FORCEINLINE result_type operator ()( typename impl::expr_param e , typename impl::state_param s , typename impl::data_param d ) const { return proto::expr::make( detail::as_lvalue( typename when<_, A0>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl()(e, s, d) ) ); } }; }; template struct make(A0 , A1 , A2 , A3)> : transform(A0 , A1 , A2 , A3)> > { template struct impl : transform_impl { typedef proto::basic_expr result_type; BOOST_FORCEINLINE result_type operator ()( typename impl::expr_param e , typename impl::state_param s , typename impl::data_param d ) const { return proto::basic_expr::make( detail::as_lvalue( typename when<_, A0>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl()(e, s, d) ) ); } }; }; template struct make(A0 , A1 , A2 , A3 , A4)> : transform(A0 , A1 , A2 , A3 , A4)> > { template struct impl : transform_impl { typedef proto::expr result_type; BOOST_FORCEINLINE result_type operator ()( typename impl::expr_param e , typename impl::state_param s , typename impl::data_param d ) const { return proto::expr::make( detail::as_lvalue( typename when<_, A0>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl()(e, s, d) ) ); } }; }; template struct make(A0 , A1 , A2 , A3 , A4)> : transform(A0 , A1 , A2 , A3 , A4)> > { template struct impl : transform_impl { typedef proto::basic_expr result_type; BOOST_FORCEINLINE result_type operator ()( typename impl::expr_param e , typename impl::state_param s , typename impl::data_param d ) const { return proto::basic_expr::make( detail::as_lvalue( typename when<_, A0>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl()(e, s, d) ) ); } }; }; template struct make(A0 , A1 , A2 , A3 , A4 , A5)> : transform(A0 , A1 , A2 , A3 , A4 , A5)> > { template struct impl : transform_impl { typedef proto::expr result_type; BOOST_FORCEINLINE result_type operator ()( typename impl::expr_param e , typename impl::state_param s , typename impl::data_param d ) const { return proto::expr::make( detail::as_lvalue( typename when<_, A0>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A5>::template impl()(e, s, d) ) ); } }; }; template struct make(A0 , A1 , A2 , A3 , A4 , A5)> : transform(A0 , A1 , A2 , A3 , A4 , A5)> > { template struct impl : transform_impl { typedef proto::basic_expr result_type; BOOST_FORCEINLINE result_type operator ()( typename impl::expr_param e , typename impl::state_param s , typename impl::data_param d ) const { return proto::basic_expr::make( detail::as_lvalue( typename when<_, A0>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A5>::template impl()(e, s, d) ) ); } }; }; template struct make(A0 , A1 , A2 , A3 , A4 , A5 , A6)> : transform(A0 , A1 , A2 , A3 , A4 , A5 , A6)> > { template struct impl : transform_impl { typedef proto::expr result_type; BOOST_FORCEINLINE result_type operator ()( typename impl::expr_param e , typename impl::state_param s , typename impl::data_param d ) const { return proto::expr::make( detail::as_lvalue( typename when<_, A0>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A5>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A6>::template impl()(e, s, d) ) ); } }; }; template struct make(A0 , A1 , A2 , A3 , A4 , A5 , A6)> : transform(A0 , A1 , A2 , A3 , A4 , A5 , A6)> > { template struct impl : transform_impl { typedef proto::basic_expr result_type; BOOST_FORCEINLINE result_type operator ()( typename impl::expr_param e , typename impl::state_param s , typename impl::data_param d ) const { return proto::basic_expr::make( detail::as_lvalue( typename when<_, A0>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A5>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A6>::template impl()(e, s, d) ) ); } }; }; template struct make(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7)> : transform(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7)> > { template struct impl : transform_impl { typedef proto::expr result_type; BOOST_FORCEINLINE result_type operator ()( typename impl::expr_param e , typename impl::state_param s , typename impl::data_param d ) const { return proto::expr::make( detail::as_lvalue( typename when<_, A0>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A5>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A6>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A7>::template impl()(e, s, d) ) ); } }; }; template struct make(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7)> : transform(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7)> > { template struct impl : transform_impl { typedef proto::basic_expr result_type; BOOST_FORCEINLINE result_type operator ()( typename impl::expr_param e , typename impl::state_param s , typename impl::data_param d ) const { return proto::basic_expr::make( detail::as_lvalue( typename when<_, A0>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A5>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A6>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A7>::template impl()(e, s, d) ) ); } }; }; template struct make(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8)> : transform(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8)> > { template struct impl : transform_impl { typedef proto::expr result_type; BOOST_FORCEINLINE result_type operator ()( typename impl::expr_param e , typename impl::state_param s , typename impl::data_param d ) const { return proto::expr::make( detail::as_lvalue( typename when<_, A0>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A5>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A6>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A7>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A8>::template impl()(e, s, d) ) ); } }; }; template struct make(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8)> : transform(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8)> > { template struct impl : transform_impl { typedef proto::basic_expr result_type; BOOST_FORCEINLINE result_type operator ()( typename impl::expr_param e , typename impl::state_param s , typename impl::data_param d ) const { return proto::basic_expr::make( detail::as_lvalue( typename when<_, A0>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A5>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A6>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A7>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A8>::template impl()(e, s, d) ) ); } }; }; template struct make(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9)> : transform(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9)> > { template struct impl : transform_impl { typedef proto::expr result_type; BOOST_FORCEINLINE result_type operator ()( typename impl::expr_param e , typename impl::state_param s , typename impl::data_param d ) const { return proto::expr::make( detail::as_lvalue( typename when<_, A0>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A5>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A6>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A7>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A8>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A9>::template impl()(e, s, d) ) ); } }; }; template struct make(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9)> : transform(A0 , A1 , A2 , A3 , A4 , A5 , A6 , A7 , A8 , A9)> > { template struct impl : transform_impl { typedef proto::basic_expr result_type; BOOST_FORCEINLINE result_type operator ()( typename impl::expr_param e , typename impl::state_param s , typename impl::data_param d ) const { return proto::basic_expr::make( detail::as_lvalue( typename when<_, A0>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A1>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A2>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A3>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A4>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A5>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A6>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A7>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A8>::template impl()(e, s, d) ) , detail::as_lvalue( typename when<_, A9>::template impl()(e, s, d) ) ); } }; };