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