/* * Copyright 2008-2012 NVIDIA Corporation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ // Portions of this code are derived from // // Manjunath Kudlur's Carbon library // // and // // Based on Boost.Phoenix v1.2 // Copyright (c) 2001-2002 Joel de Guzman #pragma once #include #include namespace thrust { namespace detail { namespace functional { // XXX we should just take a single EvalTuple template class composite; template class composite< Eval0, Eval1, thrust::null_type, thrust::null_type, thrust::null_type, thrust::null_type, thrust::null_type, thrust::null_type, thrust::null_type, thrust::null_type > { public: template struct result { typedef typename Eval0::template result< thrust::tuple< typename Eval1::template result::type > >::type type; }; __host__ __device__ composite(const Eval0 &e0, const Eval1 &e1) : m_eval0(e0), m_eval1(e1) {} template __host__ __device__ typename result::type eval(const Env &x) const { typename Eval1::template result::type result1 = m_eval1.eval(x); return m_eval0.eval(thrust::tie(result1)); } private: Eval0 m_eval0; Eval1 m_eval1; }; // end composite template class composite< Eval0, Eval1, Eval2, thrust::null_type, thrust::null_type, thrust::null_type, thrust::null_type, thrust::null_type, thrust::null_type, thrust::null_type > { public: template struct result { typedef typename Eval0::template result< thrust::tuple< typename Eval1::template result::type, typename Eval2::template result::type > >::type type; }; __host__ __device__ composite(const Eval0 &e0, const Eval1 &e1, const Eval2 &e2) : m_eval0(e0), m_eval1(e1), m_eval2(e2) {} template __host__ __device__ typename result::type eval(const Env &x) const { typename Eval1::template result::type result1 = m_eval1.eval(x); typename Eval2::template result::type result2 = m_eval2.eval(x); return m_eval0.eval(thrust::tie(result1,result2)); } private: Eval0 m_eval0; Eval1 m_eval1; Eval2 m_eval2; }; // end composite template __host__ __device__ actor > compose(const Eval0 &e0, const Eval1 &e1) { return actor >(composite(e0,e1)); } template __host__ __device__ actor > compose(const Eval0 &e0, const Eval1 &e1, const Eval2 &e2) { return actor >(composite(e0,e1,e2)); } } // end functional } // end detail } // end thrust