| 56 | |
| 57 | template<typename T> |
| 58 | Array<T> setUnion(const Array<T> &first, const Array<T> &second, |
| 59 | const bool is_unique) { |
| 60 | Array<T> unique_first = first; |
| 61 | Array<T> unique_second = second; |
| 62 | |
| 63 | if (!is_unique) { |
| 64 | unique_first = setUnique(first, false); |
| 65 | unique_second = setUnique(second, false); |
| 66 | } |
| 67 | |
| 68 | size_t out_size = unique_first.elements() + unique_second.elements(); |
| 69 | Array<T> out = createEmptyArray<T>(dim4(out_size, 1, 1, 1)); |
| 70 | |
| 71 | auto dpl_policy = ::oneapi::dpl::execution::make_device_policy(getQueue()); |
| 72 | |
| 73 | auto first_begin = ::oneapi::dpl::begin(*unique_first.get()); |
| 74 | auto first_end = first_begin + unique_first.elements(); |
| 75 | |
| 76 | auto second_begin = ::oneapi::dpl::begin(*unique_second.get()); |
| 77 | auto second_end = second_begin + unique_second.elements(); |
| 78 | |
| 79 | auto out_begin = ::oneapi::dpl::begin(*out.get()); |
| 80 | |
| 81 | auto out_end = std::set_union(dpl_policy, first_begin, first_end, |
| 82 | second_begin, second_end, out_begin); |
| 83 | out.resetDims(dim4(std::distance(out_begin, out_end), 1, 1, 1)); |
| 84 | return out; |
| 85 | } |
| 86 | |
| 87 | template<typename T> |
| 88 | Array<T> setIntersect(const Array<T> &first, const Array<T> &second, |