| 42 | /// Space complexity: \Omega(distance(\p first1, \p last1) + distance(\p first2, \p last2)) |
| 43 | template<class InputIterator1, class InputIterator2> |
| 44 | inline bool is_permutation(InputIterator1 first1, |
| 45 | InputIterator1 last1, |
| 46 | InputIterator2 first2, |
| 47 | InputIterator2 last2, |
| 48 | command_queue &queue = system::default_queue()) |
| 49 | { |
| 50 | BOOST_STATIC_ASSERT(is_device_iterator<InputIterator1>::value); |
| 51 | BOOST_STATIC_ASSERT(is_device_iterator<InputIterator2>::value); |
| 52 | typedef typename std::iterator_traits<InputIterator1>::value_type value_type1; |
| 53 | typedef typename std::iterator_traits<InputIterator2>::value_type value_type2; |
| 54 | |
| 55 | size_t count1 = detail::iterator_range_size(first1, last1); |
| 56 | size_t count2 = detail::iterator_range_size(first2, last2); |
| 57 | |
| 58 | if(count1 != count2) return false; |
| 59 | |
| 60 | vector<value_type1> temp1(first1, last1, queue); |
| 61 | vector<value_type2> temp2(first2, last2, queue); |
| 62 | |
| 63 | sort(temp1.begin(), temp1.end(), queue); |
| 64 | sort(temp2.begin(), temp2.end(), queue); |
| 65 | |
| 66 | return equal(temp1.begin(), temp1.end(), |
| 67 | temp2.begin(), queue); |
| 68 | } |
| 69 | |
| 70 | } // end compute namespace |
| 71 | } // end boost namespace |