| 99 | |
| 100 | template<typename T> |
| 101 | Array<T> setIntersect(const Array<T> &first, const Array<T> &second, |
| 102 | const bool is_unique) { |
| 103 | try { |
| 104 | Array<T> unique_first = first; |
| 105 | Array<T> unique_second = second; |
| 106 | |
| 107 | if (!is_unique) { |
| 108 | unique_first = setUnique(first, false); |
| 109 | unique_second = setUnique(second, false); |
| 110 | } |
| 111 | |
| 112 | size_t out_size = |
| 113 | std::max(unique_first.elements(), unique_second.elements()); |
| 114 | Array<T> out = createEmptyArray<T>(dim4(out_size, 1, 1, 1)); |
| 115 | |
| 116 | compute::command_queue queue(getQueue()()); |
| 117 | |
| 118 | compute::buffer first_data((*unique_first.get())()); |
| 119 | compute::buffer second_data((*unique_second.get())()); |
| 120 | compute::buffer out_data((*out.get())()); |
| 121 | |
| 122 | compute::buffer_iterator<type_t<T>> first_begin(first_data, 0); |
| 123 | compute::buffer_iterator<type_t<T>> first_end(first_data, |
| 124 | unique_first.elements()); |
| 125 | compute::buffer_iterator<type_t<T>> second_begin(second_data, 0); |
| 126 | compute::buffer_iterator<type_t<T>> second_end( |
| 127 | second_data, unique_second.elements()); |
| 128 | compute::buffer_iterator<type_t<T>> out_begin(out_data, 0); |
| 129 | |
| 130 | compute::buffer_iterator<type_t<T>> out_end = compute::set_intersection( |
| 131 | first_begin, first_end, second_begin, second_end, out_begin, queue); |
| 132 | |
| 133 | out.resetDims(dim4(std::distance(out_begin, out_end), 1, 1, 1)); |
| 134 | return out; |
| 135 | } catch (const std::exception &ex) { AF_ERROR(ex.what(), AF_ERR_INTERNAL); } |
| 136 | } |
| 137 | |
| 138 | #define INSTANTIATE(T) \ |
| 139 | template Array<T> setUnique<T>(const Array<T> &in, const bool is_sorted); \ |