#include #include #include #include template void stable_sort(my_system &system, RandomAccessIterator, RandomAccessIterator) { system.validate_dispatch(); } void TestStableSortDispatchExplicit() { thrust::device_vector vec(1); my_system sys(0); thrust::stable_sort(sys, vec.begin(), vec.begin()); ASSERT_EQUAL(true, sys.is_valid()); } DECLARE_UNITTEST(TestStableSortDispatchExplicit); template void stable_sort(my_tag, RandomAccessIterator first, RandomAccessIterator) { *first = 13; } void TestStableSortDispatchImplicit() { thrust::device_vector vec(1); thrust::stable_sort(thrust::retag(vec.begin()), thrust::retag(vec.begin())); ASSERT_EQUAL(13, vec.front()); } DECLARE_UNITTEST(TestStableSortDispatchImplicit); template struct less_div_10 { __host__ __device__ bool operator()(const T &lhs, const T &rhs) const {return ((int) lhs) / 10 < ((int) rhs) / 10;} }; template void InitializeSimpleStableKeySortTest(Vector& unsorted_keys, Vector& sorted_keys) { unsorted_keys.resize(9); unsorted_keys[0] = 25; unsorted_keys[1] = 14; unsorted_keys[2] = 35; unsorted_keys[3] = 16; unsorted_keys[4] = 26; unsorted_keys[5] = 34; unsorted_keys[6] = 36; unsorted_keys[7] = 24; unsorted_keys[8] = 15; sorted_keys.resize(9); sorted_keys[0] = 14; sorted_keys[1] = 16; sorted_keys[2] = 15; sorted_keys[3] = 25; sorted_keys[4] = 26; sorted_keys[5] = 24; sorted_keys[6] = 35; sorted_keys[7] = 34; sorted_keys[8] = 36; } template void TestStableSortSimple(void) { typedef typename Vector::value_type T; Vector unsorted_keys; Vector sorted_keys; InitializeSimpleStableKeySortTest(unsorted_keys, sorted_keys); thrust::stable_sort(unsorted_keys.begin(), unsorted_keys.end(), less_div_10()); ASSERT_EQUAL(unsorted_keys, sorted_keys); } DECLARE_INTEGRAL_VECTOR_UNITTEST(TestStableSortSimple); template struct TestStableSort { void operator()(const size_t n) { thrust::host_vector h_data = unittest::random_integers(n); thrust::device_vector d_data = h_data; thrust::stable_sort(h_data.begin(), h_data.end(), less_div_10()); thrust::stable_sort(d_data.begin(), d_data.end(), less_div_10()); ASSERT_EQUAL(h_data, d_data); } }; VariableUnitTest TestStableSortInstance; template struct TestStableSortSemantics { void operator()(const size_t n) { thrust::host_vector h_data = unittest::random_integers(n); thrust::device_vector d_data = h_data; thrust::stable_sort(h_data.begin(), h_data.end(), less_div_10()); thrust::stable_sort(d_data.begin(), d_data.end(), less_div_10()); ASSERT_EQUAL(h_data, d_data); } }; VariableUnitTest > TestStableSortSemanticsInstance; template struct comp_mod3 { T * table; comp_mod3(T * table) : table(table) {} __host__ __device__ bool operator()(T a, T b) { return table[(int) a] < table[(int) b]; } }; template void TestStableSortWithIndirection(void) { // add numbers modulo 3 with external lookup table typedef typename Vector::value_type T; Vector data(7); data[0] = 1; data[1] = 3; data[2] = 5; data[3] = 3; data[4] = 0; data[5] = 2; data[6] = 1; Vector table(6); table[0] = 0; table[1] = 1; table[2] = 2; table[3] = 0; table[4] = 1; table[5] = 2; thrust::stable_sort(data.begin(), data.end(), comp_mod3(thrust::raw_pointer_cast(&table[0]))); ASSERT_EQUAL(data[0], T(3)); ASSERT_EQUAL(data[1], T(3)); ASSERT_EQUAL(data[2], T(0)); ASSERT_EQUAL(data[3], T(1)); ASSERT_EQUAL(data[4], T(1)); ASSERT_EQUAL(data[5], T(5)); ASSERT_EQUAL(data[6], T(2)); } DECLARE_INTEGRAL_VECTOR_UNITTEST(TestStableSortWithIndirection);