| #include <unittest/unittest.h> |
| #include <thrust/binary_search.h> |
| #include <thrust/iterator/retag.h> |
|
|
| #include <thrust/sequence.h> |
| #include <thrust/sort.h> |
|
|
| THRUST_DISABLE_MSVC_POSSIBLE_LOSS_OF_DATA_WARNING_BEGIN |
|
|
| |
| |
| |
|
|
| template <class Vector> |
| void TestScalarLowerBoundSimple(void) |
| { |
| Vector vec(5); |
|
|
| vec[0] = 0; |
| vec[1] = 2; |
| vec[2] = 5; |
| vec[3] = 7; |
| vec[4] = 8; |
|
|
| ASSERT_EQUAL(thrust::lower_bound(vec.begin(), vec.end(), 0) - vec.begin(), 0); |
| ASSERT_EQUAL(thrust::lower_bound(vec.begin(), vec.end(), 1) - vec.begin(), 1); |
| ASSERT_EQUAL(thrust::lower_bound(vec.begin(), vec.end(), 2) - vec.begin(), 1); |
| ASSERT_EQUAL(thrust::lower_bound(vec.begin(), vec.end(), 3) - vec.begin(), 2); |
| ASSERT_EQUAL(thrust::lower_bound(vec.begin(), vec.end(), 4) - vec.begin(), 2); |
| ASSERT_EQUAL(thrust::lower_bound(vec.begin(), vec.end(), 5) - vec.begin(), 2); |
| ASSERT_EQUAL(thrust::lower_bound(vec.begin(), vec.end(), 6) - vec.begin(), 3); |
| ASSERT_EQUAL(thrust::lower_bound(vec.begin(), vec.end(), 7) - vec.begin(), 3); |
| ASSERT_EQUAL(thrust::lower_bound(vec.begin(), vec.end(), 8) - vec.begin(), 4); |
| ASSERT_EQUAL(thrust::lower_bound(vec.begin(), vec.end(), 9) - vec.begin(), 5); |
| } |
| DECLARE_VECTOR_UNITTEST(TestScalarLowerBoundSimple); |
|
|
|
|
| template<typename ForwardIterator, typename LessThanComparable> |
| ForwardIterator lower_bound(my_system &system, ForwardIterator first, ForwardIterator , const LessThanComparable &) |
| { |
| system.validate_dispatch(); |
| return first; |
| } |
|
|
| void TestScalarLowerBoundDispatchExplicit() |
| { |
| thrust::device_vector<int> vec(1); |
|
|
| my_system sys(0); |
| thrust::lower_bound(sys, |
| vec.begin(), |
| vec.end(), |
| 0); |
|
|
| ASSERT_EQUAL(true, sys.is_valid()); |
| } |
| DECLARE_UNITTEST(TestScalarLowerBoundDispatchExplicit); |
|
|
|
|
| template<typename ForwardIterator, typename LessThanComparable> |
| ForwardIterator lower_bound(my_tag, ForwardIterator first, ForwardIterator , const LessThanComparable &) |
| { |
| *first = 13; |
| return first; |
| } |
|
|
|
|
| void TestScalarLowerBoundDispatchImplicit() |
| { |
| thrust::device_vector<int> vec(1); |
|
|
| thrust::lower_bound(thrust::retag<my_tag>(vec.begin()), |
| thrust::retag<my_tag>(vec.end()), |
| 0); |
|
|
| ASSERT_EQUAL(13, vec.front()); |
| } |
| DECLARE_UNITTEST(TestScalarLowerBoundDispatchImplicit); |
|
|
|
|
| template <class Vector> |
| void TestScalarUpperBoundSimple(void) |
| { |
| Vector vec(5); |
|
|
| vec[0] = 0; |
| vec[1] = 2; |
| vec[2] = 5; |
| vec[3] = 7; |
| vec[4] = 8; |
|
|
| ASSERT_EQUAL(thrust::upper_bound(vec.begin(), vec.end(), 0) - vec.begin(), 1); |
| ASSERT_EQUAL(thrust::upper_bound(vec.begin(), vec.end(), 1) - vec.begin(), 1); |
| ASSERT_EQUAL(thrust::upper_bound(vec.begin(), vec.end(), 2) - vec.begin(), 2); |
| ASSERT_EQUAL(thrust::upper_bound(vec.begin(), vec.end(), 3) - vec.begin(), 2); |
| ASSERT_EQUAL(thrust::upper_bound(vec.begin(), vec.end(), 4) - vec.begin(), 2); |
| ASSERT_EQUAL(thrust::upper_bound(vec.begin(), vec.end(), 5) - vec.begin(), 3); |
| ASSERT_EQUAL(thrust::upper_bound(vec.begin(), vec.end(), 6) - vec.begin(), 3); |
| ASSERT_EQUAL(thrust::upper_bound(vec.begin(), vec.end(), 7) - vec.begin(), 4); |
| ASSERT_EQUAL(thrust::upper_bound(vec.begin(), vec.end(), 8) - vec.begin(), 5); |
| ASSERT_EQUAL(thrust::upper_bound(vec.begin(), vec.end(), 9) - vec.begin(), 5); |
| } |
| DECLARE_VECTOR_UNITTEST(TestScalarUpperBoundSimple); |
|
|
|
|
| template<typename ForwardIterator, typename LessThanComparable> |
| ForwardIterator upper_bound(my_system &system, ForwardIterator first, ForwardIterator , const LessThanComparable &) |
| { |
| system.validate_dispatch(); |
| return first; |
| } |
|
|
| void TestScalarUpperBoundDispatchExplicit() |
| { |
| thrust::device_vector<int> vec(1); |
|
|
| my_system sys(0); |
| thrust::upper_bound(sys, |
| vec.begin(), |
| vec.end(), |
| 0); |
|
|
| ASSERT_EQUAL(true, sys.is_valid()); |
| } |
| DECLARE_UNITTEST(TestScalarUpperBoundDispatchExplicit); |
|
|
|
|
| template<typename ForwardIterator, typename LessThanComparable> |
| ForwardIterator upper_bound(my_tag, ForwardIterator first, ForwardIterator , const LessThanComparable &) |
| { |
| *first = 13; |
| return first; |
| } |
|
|
| void TestScalarUpperBoundDispatchImplicit() |
| { |
| thrust::device_vector<int> vec(1); |
|
|
| thrust::upper_bound(thrust::retag<my_tag>(vec.begin()), |
| thrust::retag<my_tag>(vec.end()), |
| 0); |
|
|
| ASSERT_EQUAL(13, vec.front()); |
| } |
| DECLARE_UNITTEST(TestScalarUpperBoundDispatchImplicit); |
|
|
|
|
| template <class Vector> |
| void TestScalarBinarySearchSimple(void) |
| { |
| Vector vec(5); |
|
|
| vec[0] = 0; |
| vec[1] = 2; |
| vec[2] = 5; |
| vec[3] = 7; |
| vec[4] = 8; |
|
|
| ASSERT_EQUAL(thrust::binary_search(vec.begin(), vec.end(), 0), true); |
| ASSERT_EQUAL(thrust::binary_search(vec.begin(), vec.end(), 1), false); |
| ASSERT_EQUAL(thrust::binary_search(vec.begin(), vec.end(), 2), true); |
| ASSERT_EQUAL(thrust::binary_search(vec.begin(), vec.end(), 3), false); |
| ASSERT_EQUAL(thrust::binary_search(vec.begin(), vec.end(), 4), false); |
| ASSERT_EQUAL(thrust::binary_search(vec.begin(), vec.end(), 5), true); |
| ASSERT_EQUAL(thrust::binary_search(vec.begin(), vec.end(), 6), false); |
| ASSERT_EQUAL(thrust::binary_search(vec.begin(), vec.end(), 7), true); |
| ASSERT_EQUAL(thrust::binary_search(vec.begin(), vec.end(), 8), true); |
| ASSERT_EQUAL(thrust::binary_search(vec.begin(), vec.end(), 9), false); |
| } |
| DECLARE_VECTOR_UNITTEST(TestScalarBinarySearchSimple); |
|
|
|
|
| template<typename ForwardIterator, typename LessThanComparable> |
| bool binary_search(my_system &system, ForwardIterator , ForwardIterator , const LessThanComparable &) |
| { |
| system.validate_dispatch(); |
| return false; |
| } |
|
|
| void TestScalarBinarySearchDispatchExplicit() |
| { |
| thrust::device_vector<int> vec(1); |
|
|
| my_system sys(0); |
| thrust::binary_search(sys, |
| vec.begin(), |
| vec.end(), |
| 0); |
|
|
| ASSERT_EQUAL(true, sys.is_valid()); |
| } |
| DECLARE_UNITTEST(TestScalarBinarySearchDispatchExplicit); |
|
|
|
|
| template<typename ForwardIterator, typename LessThanComparable> |
| bool binary_search(my_tag, ForwardIterator first, ForwardIterator , const LessThanComparable &) |
| { |
| *first = 13; |
| return false; |
| } |
|
|
| void TestScalarBinarySearchDispatchImplicit() |
| { |
| thrust::device_vector<int> vec(1); |
|
|
| thrust::binary_search(thrust::retag<my_tag>(vec.begin()), |
| thrust::retag<my_tag>(vec.end()), |
| 0); |
|
|
| ASSERT_EQUAL(13, vec.front()); |
| } |
| DECLARE_UNITTEST(TestScalarBinarySearchDispatchImplicit); |
|
|
|
|
| template <class Vector> |
| void TestScalarEqualRangeSimple(void) |
| { |
| Vector vec(5); |
|
|
| vec[0] = 0; |
| vec[1] = 2; |
| vec[2] = 5; |
| vec[3] = 7; |
| vec[4] = 8; |
|
|
| ASSERT_EQUAL(thrust::equal_range(vec.begin(), vec.end(), 0).first - vec.begin(), 0); |
| ASSERT_EQUAL(thrust::equal_range(vec.begin(), vec.end(), 1).first - vec.begin(), 1); |
| ASSERT_EQUAL(thrust::equal_range(vec.begin(), vec.end(), 2).first - vec.begin(), 1); |
| ASSERT_EQUAL(thrust::equal_range(vec.begin(), vec.end(), 3).first - vec.begin(), 2); |
| ASSERT_EQUAL(thrust::equal_range(vec.begin(), vec.end(), 4).first - vec.begin(), 2); |
| ASSERT_EQUAL(thrust::equal_range(vec.begin(), vec.end(), 5).first - vec.begin(), 2); |
| ASSERT_EQUAL(thrust::equal_range(vec.begin(), vec.end(), 6).first - vec.begin(), 3); |
| ASSERT_EQUAL(thrust::equal_range(vec.begin(), vec.end(), 7).first - vec.begin(), 3); |
| ASSERT_EQUAL(thrust::equal_range(vec.begin(), vec.end(), 8).first - vec.begin(), 4); |
| ASSERT_EQUAL(thrust::equal_range(vec.begin(), vec.end(), 9).first - vec.begin(), 5); |
| |
| ASSERT_EQUAL(thrust::equal_range(vec.begin(), vec.end(), 0).second - vec.begin(), 1); |
| ASSERT_EQUAL(thrust::equal_range(vec.begin(), vec.end(), 1).second - vec.begin(), 1); |
| ASSERT_EQUAL(thrust::equal_range(vec.begin(), vec.end(), 2).second - vec.begin(), 2); |
| ASSERT_EQUAL(thrust::equal_range(vec.begin(), vec.end(), 3).second - vec.begin(), 2); |
| ASSERT_EQUAL(thrust::equal_range(vec.begin(), vec.end(), 4).second - vec.begin(), 2); |
| ASSERT_EQUAL(thrust::equal_range(vec.begin(), vec.end(), 5).second - vec.begin(), 3); |
| ASSERT_EQUAL(thrust::equal_range(vec.begin(), vec.end(), 6).second - vec.begin(), 3); |
| ASSERT_EQUAL(thrust::equal_range(vec.begin(), vec.end(), 7).second - vec.begin(), 4); |
| ASSERT_EQUAL(thrust::equal_range(vec.begin(), vec.end(), 8).second - vec.begin(), 5); |
| ASSERT_EQUAL(thrust::equal_range(vec.begin(), vec.end(), 9).second - vec.begin(), 5); |
| } |
| DECLARE_VECTOR_UNITTEST(TestScalarEqualRangeSimple); |
|
|
|
|
| template<typename ForwardIterator, typename LessThanComparable> |
| thrust::pair<ForwardIterator,ForwardIterator> equal_range(my_system &system, ForwardIterator first, ForwardIterator , const LessThanComparable &) |
| { |
| system.validate_dispatch(); |
| return thrust::make_pair(first,first); |
| } |
|
|
| void TestScalarEqualRangeDispatchExplicit() |
| { |
| thrust::device_vector<int> vec(1); |
|
|
| my_system sys(0); |
| thrust::equal_range(sys, |
| vec.begin(), |
| vec.end(), |
| 0); |
|
|
| ASSERT_EQUAL(true, sys.is_valid()); |
| } |
| DECLARE_UNITTEST(TestScalarEqualRangeDispatchExplicit); |
|
|
|
|
| template<typename ForwardIterator, typename LessThanComparable> |
| thrust::pair<ForwardIterator,ForwardIterator> equal_range(my_tag, ForwardIterator first, ForwardIterator , const LessThanComparable &) |
| { |
| *first = 13; |
| return thrust::make_pair(first,first); |
| } |
|
|
| void TestScalarEqualRangeDispatchImplicit() |
| { |
| thrust::device_vector<int> vec(1); |
|
|
| thrust::equal_range(thrust::retag<my_tag>(vec.begin()), |
| thrust::retag<my_tag>(vec.end()), |
| 0); |
|
|
| ASSERT_EQUAL(13, vec.front()); |
| } |
| DECLARE_UNITTEST(TestScalarEqualRangeDispatchImplicit); |
|
|
| THRUST_DISABLE_MSVC_POSSIBLE_LOSS_OF_DATA_WARNING_END |
|
|
| void TestBoundsWithBigIndexesHelper(int magnitude) |
| { |
| thrust::counting_iterator<long long> begin(1); |
| thrust::counting_iterator<long long> end = begin + (1ll << magnitude); |
| ASSERT_EQUAL(thrust::distance(begin, end), 1ll << magnitude); |
|
|
| thrust::detail::intmax_t distance_low_value = thrust::distance( |
| begin, |
| thrust::lower_bound( |
| thrust::device, |
| begin, |
| end, |
| 17)); |
|
|
| thrust::detail::intmax_t distance_high_value = thrust::distance( |
| begin, |
| thrust::lower_bound( |
| thrust::device, |
| begin, |
| end, |
| (1ll << magnitude) - 17)); |
|
|
| ASSERT_EQUAL(distance_low_value, 16); |
| ASSERT_EQUAL(distance_high_value, (1ll << magnitude) - 18); |
|
|
| distance_low_value = thrust::distance( |
| begin, |
| thrust::upper_bound( |
| thrust::device, |
| begin, |
| end, |
| 17)); |
|
|
| distance_high_value = thrust::distance( |
| begin, |
| thrust::upper_bound( |
| thrust::device, |
| begin, |
| end, |
| (1ll << magnitude) - 17)); |
|
|
| ASSERT_EQUAL(distance_low_value, 17); |
| ASSERT_EQUAL(distance_high_value, (1ll << magnitude) - 17); |
| } |
|
|
| void TestBoundsWithBigIndexes() |
| { |
| TestBoundsWithBigIndexesHelper(30); |
| TestBoundsWithBigIndexesHelper(31); |
| TestBoundsWithBigIndexesHelper(32); |
| TestBoundsWithBigIndexesHelper(33); |
| } |
| DECLARE_UNITTEST(TestBoundsWithBigIndexes); |
|
|