| | #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); |
| |
|