//---------------------------------------------------------------------------// // Copyright (c) 2013 Kyle Lutz // // 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 // // See http://boostorg.github.com/compute for more information. //---------------------------------------------------------------------------// #ifndef BOOST_COMPUTE_LAMBDA_PLACEHOLDERS_HPP #define BOOST_COMPUTE_LAMBDA_PLACEHOLDERS_HPP #include #include #include namespace boost { namespace compute { namespace lambda { namespace mpl = boost::mpl; namespace proto = boost::proto; // lambda placeholders expression >::type> const _1; expression >::type> const _2; expression >::type> const _3; namespace detail { BOOST_MPL_HAS_XXX_TRAIT_DEF(result_type) template struct terminal_type_impl; template struct terminal_type_impl { typedef typename T::result_type type; }; template struct terminal_type_impl { typedef T type; }; template struct terminal_type { typedef typename terminal_type_impl::value>::type type; }; } // end detail namespace // result_of placeholders template struct result_of >::type>, Args, proto::tag::terminal> { typedef typename boost::tuples::element<0, Args>::type arg_type; typedef typename detail::terminal_type::type type; }; template struct result_of >::type>, Args, proto::tag::terminal> { typedef typename boost::tuples::element<1, Args>::type arg_type; typedef typename detail::terminal_type::type type; }; template struct result_of >::type>, Args, proto::tag::terminal> { typedef typename boost::tuples::element<2, Args>::type arg_type; typedef typename detail::terminal_type::type type; }; } // end lambda namespace // lift lambda placeholders up to the boost::compute namespace using lambda::_1; using lambda::_2; using lambda::_3; } // end compute namespace } // end boost namespace #endif // BOOST_COMPUTE_LAMBDA_PLACEHOLDERS_HPP