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