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