1 #include <thrust/merge.h> 2 3 #include <thrust/sort.h> 4 #include <thrust/version.h> 5 6 template <class Policy, 7 typename Container1, 8 typename Container2 = Container1, 9 typename Container3 = Container1, 10 typename StrictWeakCompare = thrust::less<typename Container1::value_type> > 11 struct Merge 12 { 13 Container1 A; 14 Container2 B; 15 Container3 C; 16 StrictWeakCompare comp; 17 Policy policy; 18 19 template <typename Range1, typename Range2, typename Range3> 20 Merge(Policy p_, const Range1& X, const Range2& Y, const Range3& Z, StrictWeakCompare comp = StrictWeakCompare()) 21 : A(X.begin(), X.end()), 22 B(Y.begin(), Y.end()), 23 C(Z.begin(), Z.end()), 24 comp(comp), policy(p_) 25 { 26 thrust::stable_sort(policy, A.begin(), A.end(), comp); 27 thrust::stable_sort(policy, B.begin(), B.end(), comp); 28 } 29 operatorMerge30 void operator()(void) 31 { 32 thrust::merge(policy, A.begin(), A.end(), B.begin(), B.end(), C.begin(), comp); 33 } 34 }; 35 36 #if THRUST_VERSION >= 100700 37 38 template <class Policy, 39 typename Container1, 40 typename Container2 = Container1, 41 typename Container3 = Container1, 42 typename Container4 = Container1, 43 typename Container5 = Container1, 44 typename Container6 = Container1, 45 typename StrictWeakCompare = thrust::less<typename Container1::value_type> > 46 struct MergeByKey 47 { 48 Container1 keys1; 49 Container2 keys2; 50 Container3 values1; 51 Container4 values2; 52 Container5 out_keys; 53 Container6 out_values; 54 StrictWeakCompare comp; 55 Policy policy; 56 57 template <typename Range1, typename Range2, typename Range3, typename Range4, typename Range5, typename Range6> 58 MergeByKey(Policy p_, const Range1& keys1_, const Range2& keys2_, 59 const Range3& values1_, const Range4& values2_, 60 Range5 &out_keys_, Range6 &out_values_, 61 StrictWeakCompare comp_ = StrictWeakCompare()) 62 : keys1(keys1_.begin(), keys1_.end()), 63 keys2(keys2_.begin(), keys2_.end()), 64 values1(values1_.begin(), values1_.end()), 65 values2(values2_.begin(), values2_.end()), 66 out_keys(out_keys_.begin(), out_keys_.end()), 67 out_values(out_values_.begin(), out_values_.end()), 68 comp(comp_), policy(p_) 69 { 70 thrust::stable_sort(policy, keys1.begin(), keys1.end(), comp); 71 thrust::stable_sort(policy, keys2.begin(), keys2.end(), comp); 72 } 73 operatorMergeByKey74 void operator()(void) 75 { 76 thrust::merge_by_key(policy, keys1.begin(), keys1.end(), 77 keys2.begin(), keys2.end(), 78 values1.begin(), values2.begin(), 79 out_keys.begin(), 80 out_values.begin(), 81 comp); 82 } 83 }; 84 85 #endif // THRUST_VERSION 86 87