| 38 | /// |
| 39 | template<class InputIterator1, class InputIterator2> |
| 40 | inline bool is_permutation(InputIterator1 first1, |
| 41 | InputIterator1 last1, |
| 42 | InputIterator2 first2, |
| 43 | InputIterator2 last2, |
| 44 | command_queue &queue = system::default_queue()) |
| 45 | { |
| 46 | typedef typename std::iterator_traits<InputIterator1>::value_type value_type1; |
| 47 | typedef typename std::iterator_traits<InputIterator2>::value_type value_type2; |
| 48 | |
| 49 | size_t count1 = detail::iterator_range_size(first1, last1); |
| 50 | size_t count2 = detail::iterator_range_size(first2, last2); |
| 51 | |
| 52 | if(count1 != count2) return false; |
| 53 | |
| 54 | vector<value_type1> temp1(first1, last1, queue); |
| 55 | vector<value_type2> temp2(first2, last2, queue); |
| 56 | |
| 57 | sort(temp1.begin(), temp1.end(), queue); |
| 58 | sort(temp2.begin(), temp2.end(), queue); |
| 59 | |
| 60 | return equal(temp1.begin(), temp1.end(), |
| 61 | temp2.begin(), queue); |
| 62 | } |
| 63 | |
| 64 | } // end compute namespace |
| 65 | } // end boost namespace |