1 #include <thrust/remove.h>
2 
3 template <class Policy,
4           typename Container,
5           typename T = typename Container::value_type>
6 struct Remove
7 {
8   Container A;
9   Container B; // copy of initial data
10   T value;
11   Policy policy;
12 
13   template <typename Range>
RemoveRemove14   Remove(Policy p_, const Range& X, T value)
15     : A(X.begin(), X.end()),
16       B(X.begin(), X.end()),
17       value(value),
18       policy(p_)
19   {}
20 
operatorRemove21   void operator()(void)
22   {
23     thrust::remove(policy, A.begin(), A.end(), value);
24   }
25 
resetRemove26   void reset(void)
27   {
28     // restore initial data
29     thrust::copy(policy, B.begin(), B.end(), A.begin());
30   }
31 };
32 
33 template <class Policy,
34           typename Container1,
35           typename Container2 = Container1,
36           typename T = typename Container1::value_type>
37 struct RemoveCopy
38 {
39   Container1 A;
40   Container2 B;
41   T value;
42   Policy policy;
43 
44   template <typename Range1, typename Range2>
RemoveCopyRemoveCopy45   RemoveCopy(Policy p_, const Range1& X, const Range2& Y, T value)
46     : A(X.begin(), X.end()),
47       B(Y.begin(), Y.end()),
48       value(value),
49       policy(p_)
50   {}
51 
operatorRemoveCopy52   void operator()(void)
53   {
54     thrust::remove_copy(policy, A.begin(), A.end(), B.begin(), value);
55   }
56 
resetRemoveCopy57   void reset(void)
58   {
59     // restore initial data
60     thrust::copy(policy, B.begin(), B.end(), A.begin());
61   }
62 };
63 
64 template <class Policy,
65           typename Container1,
66           typename Container2 = Container1,
67           typename Predicate = thrust::identity<typename Container2::value_type> >
68 struct RemoveIf
69 {
70   Container1 A, A_copy;
71   Container2 B;
72   Predicate pred;
73   Policy policy;
74 
75   template <typename Range1, typename Range2>
76   RemoveIf(Policy p_, const Range1& X, const Range2& Y, Predicate pred = Predicate())
77     : A(X.begin(), X.end()), A_copy(X.begin(), X.end()),
78       B(Y.begin(), Y.end()),
79       pred(pred),
80       policy(p_)
81   {}
82 
operatorRemoveIf83   void operator()(void)
84   {
85     thrust::remove_if(policy, A.begin(), A.end(), B.begin(), pred);
86   }
87 
resetRemoveIf88   void reset(void)
89   {
90     // restore initial data
91     thrust::copy(policy, A_copy.begin(), A_copy.end(), A.begin());
92   }
93 };
94 
95 
96 template <class Policy,
97           typename Container1,
98           typename Container2 = Container1,
99           typename Container3 = Container1,
100           typename Predicate = thrust::identity<typename Container2::value_type> >
101 struct RemoveCopyIf
102 {
103   Container1 A, A_copy;
104   Container2 B;
105   Container3 C;
106   Predicate pred;
107   Policy policy;
108 
109   template <typename Range1, typename Range2, typename Range3>
110   RemoveCopyIf(Policy p_, const Range1& X, const Range2& Y, const Range3& Z, Predicate pred = Predicate())
111     : A(X.begin(), X.end()), A_copy(X.begin(), X.end()),
112       B(Y.begin(), Y.end()),
113       C(Z.begin(), Z.end()),
114       pred(pred),
115       policy(p_)
116   {}
117 
operatorRemoveCopyIf118   void operator()(void)
119   {
120     thrust::remove_copy_if(policy, A.begin(), A.end(), B.begin(), C.begin(), pred);
121   }
122 
resetRemoveCopyIf123   void reset(void)
124   {
125     // restore initial data
126     thrust::copy(policy, A_copy.begin(), A_copy.end(), A.begin());
127   }
128 };
129 
130