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_TYPES_PAIR_HPP 12 #define BOOST_COMPUTE_TYPES_PAIR_HPP 13 14 #include <string> 15 #include <utility> 16 17 #include <boost/compute/functional/get.hpp> 18 #include <boost/compute/type_traits/type_definition.hpp> 19 #include <boost/compute/type_traits/type_name.hpp> 20 #include <boost/compute/detail/meta_kernel.hpp> 21 22 namespace boost { 23 namespace compute { 24 namespace detail { 25 26 // meta_kernel operator for std::pair literals 27 template<class T1, class T2> 28 inline meta_kernel& operator <<(meta_kernel & kernel,const std::pair<T1,T2> & x)29 operator<<(meta_kernel &kernel, const std::pair<T1, T2> &x) 30 { 31 kernel << "(" << type_name<std::pair<T1, T2> >() << ")" 32 << "{" << kernel.make_lit(x.first) << ", " 33 << kernel.make_lit(x.second) << "}"; 34 35 return kernel; 36 } 37 38 // inject_type() specialization for std::pair 39 template<class T1, class T2> 40 struct inject_type_impl<std::pair<T1, T2> > 41 { operator ()boost::compute::detail::inject_type_impl42 void operator()(meta_kernel &kernel) 43 { 44 typedef std::pair<T1, T2> pair_type; 45 46 kernel.inject_type<T1>(); 47 kernel.inject_type<T2>(); 48 49 kernel.add_type_declaration<pair_type>(type_definition<pair_type>()); 50 } 51 }; 52 53 // get<N>() result type specialization for std::pair<> 54 template<class T1, class T2> 55 struct get_result_type<0, std::pair<T1, T2> > 56 { 57 typedef T1 type; 58 }; 59 60 template<class T1, class T2> 61 struct get_result_type<1, std::pair<T1, T2> > 62 { 63 typedef T2 type; 64 }; 65 66 // get<N>() specialization for std::pair<> 67 template<size_t N, class Arg, class T1, class T2> operator <<(meta_kernel & kernel,const invoked_get<N,Arg,std::pair<T1,T2>> & expr)68 inline meta_kernel& operator<<(meta_kernel &kernel, 69 const invoked_get<N, Arg, std::pair<T1, T2> > &expr) 70 { 71 kernel.inject_type<std::pair<T1, T2> >(); 72 73 return kernel << expr.m_arg << (N == 0 ? ".first" : ".second"); 74 } 75 76 } // end detail namespace 77 78 namespace detail { 79 80 // type_name() specialization for std::pair 81 template<class T1, class T2> 82 struct type_name_trait<std::pair<T1, T2> > 83 { valueboost::compute::detail::type_name_trait84 static const char* value() 85 { 86 static std::string name = 87 std::string("_pair_") + 88 type_name<T1>() + "_" + type_name<T2>() + 89 "_t"; 90 91 return name.c_str(); 92 } 93 }; 94 95 // type_definition() specialization for std::pair 96 template<class T1, class T2> 97 struct type_definition_trait<std::pair<T1, T2> > 98 { valueboost::compute::detail::type_definition_trait99 static std::string value() 100 { 101 typedef std::pair<T1, T2> pair_type; 102 103 std::stringstream declaration; 104 declaration << "typedef struct {\n" 105 << " " << type_name<T1>() << " first;\n" 106 << " " << type_name<T2>() << " second;\n" 107 << "} " << type_name<pair_type>() << ";\n"; 108 109 return declaration.str(); 110 } 111 }; 112 113 } // end detail namespace 114 } // end compute namespace 115 } // end boost namespace 116 117 #endif // BOOST_COMPUTE_TYPES_PAIR_HPP 118