1 //---------------------------------------------------------------------------//
2 // Copyright (c) 2013 Kyle Lutz <kyle.r.lutz@gmail.com>
3 //
4 // Distributed under the Boost Software License, Version 1.0
5 // See accompanying file LICENSE_1_0.txt or copy at
6 // http://www.boost.org/LICENSE_1_0.txt
7 //
8 // See http://boostorg.github.com/compute for more information.
9 //---------------------------------------------------------------------------//
10 
11 #ifndef BOOST_COMPUTE_DETAIL_MPL_VECTOR_TO_TUPLE_HPP
12 #define BOOST_COMPUTE_DETAIL_MPL_VECTOR_TO_TUPLE_HPP
13 
14 #include <boost/mpl/copy.hpp>
15 #include <boost/mpl/vector.hpp>
16 #include <boost/tuple/tuple.hpp>
17 #include <boost/fusion/include/mpl.hpp>
18 #include <boost/fusion/adapted/boost_tuple.hpp>
19 #include <boost/preprocessor/repetition.hpp>
20 
21 #include <boost/compute/config.hpp>
22 
23 namespace boost {
24 namespace compute {
25 namespace detail {
26 
27 namespace mpl = boost::mpl;
28 
29 template<class Vector, size_t N>
30 struct mpl_vector_to_tuple_impl;
31 
32 #define BOOST_COMPUTE_PRINT_ELEM(z, n, unused)                                 \
33     typename mpl::at_c<Vector, n>::type
34 
35 #define BOOST_COMPUTE_VEC2TUP(z, n, unused)                                    \
36 template<class Vector>                                                         \
37 struct mpl_vector_to_tuple_impl<Vector, n>                                     \
38 {                                                                              \
39     typedef typename                                                           \
40         boost::tuple<                                                          \
41             BOOST_PP_ENUM(n, BOOST_COMPUTE_PRINT_ELEM, ~)                      \
42         > type;                                                                \
43 };
44 
45 BOOST_PP_REPEAT_FROM_TO(1, BOOST_COMPUTE_MAX_ARITY, BOOST_COMPUTE_VEC2TUP, ~)
46 
47 #undef BOOST_COMPUTE_VEC2TUP
48 #undef BOOST_COMPUTE_PRINT_ELEM
49 
50 // meta-function which converts a mpl::vector to a boost::tuple
51 template<class Vector>
52 struct mpl_vector_to_tuple
53 {
54     typedef typename
55         mpl_vector_to_tuple_impl<
56             Vector,
57             mpl::size<Vector>::value
58         >::type type;
59 };
60 
61 } // end detail namespace
62 } // end compute namespace
63 } // end boost namespace
64 
65 #endif // BOOST_COMPUTE_DETAIL_MPL_VECTOR_TO_TUPLE_HPP
66