1 #include <thrust/copy.h> 2 3 template <class Policy, 4 typename Container1, 5 typename Container2 = Container1> 6 struct Copy 7 { 8 Container1 A; 9 Container2 B; 10 Policy policy; 11 12 template <typename Range1, typename Range2> CopyCopy13 Copy(Policy policy, const Range1& X, const Range2& Y) 14 : A(X.begin(), X.end()), B(Y.begin(), Y.end()), policy(policy) 15 {} 16 operatorCopy17 void operator()(void) 18 { 19 thrust::copy(policy, A.begin(), A.end(), B.begin()); 20 } 21 }; 22 23 template <class Policy, 24 typename Container1, 25 typename Container2 = Container1> 26 struct CopyN 27 { 28 Container1 A; 29 Container2 B; 30 Policy policy; 31 32 template <typename Range1, typename Range2> CopyNCopyN33 CopyN(Policy policy, const Range1& X, const Range2& Y) 34 : A(X.begin(), X.end()), B(Y.begin(), Y.end()), policy(policy) 35 {} 36 operatorCopyN37 void operator()(void) 38 { 39 thrust::copy_n(policy, A.begin(), A.size(), B.begin()); 40 } 41 }; 42 43 template <class Policy, 44 typename Container1, 45 typename Container2 = Container1, 46 typename Container3 = Container1, 47 typename Predicate = thrust::identity<typename Container1::value_type> > 48 struct CopyIf 49 { 50 Container1 A; // values 51 Container2 B; // stencil 52 Container3 C; // output 53 Predicate pred; 54 Policy policy; 55 56 template <typename Range1, typename Range2, typename Range3> 57 CopyIf(Policy p_, const Range1& X, const Range2& Y, const Range3& Z, Predicate pred = Predicate()) 58 : A(X.begin(), X.end()), 59 B(Y.begin(), Y.end()), 60 C(Z.begin(), Z.end()), 61 pred(pred), policy(p_) 62 {} 63 operatorCopyIf64 void operator()(void) 65 { 66 thrust::copy_if(policy, A.begin(), A.end(), B.begin(), C.begin(), pred); 67 } 68 }; 69 70