#include #include #include #include #include THRUST_DISABLE_MSVC_POSSIBLE_LOSS_OF_DATA_WARNING_BEGIN ////////////////////// // Scalar Functions // ////////////////////// template 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 ForwardIterator lower_bound(my_system &system, ForwardIterator first, ForwardIterator /*last*/, const LessThanComparable &/*value*/) { system.validate_dispatch(); return first; } void TestScalarLowerBoundDispatchExplicit() { thrust::device_vector 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 ForwardIterator lower_bound(my_tag, ForwardIterator first, ForwardIterator /*last*/, const LessThanComparable &/*value*/) { *first = 13; return first; } void TestScalarLowerBoundDispatchImplicit() { thrust::device_vector vec(1); thrust::lower_bound(thrust::retag(vec.begin()), thrust::retag(vec.end()), 0); ASSERT_EQUAL(13, vec.front()); } DECLARE_UNITTEST(TestScalarLowerBoundDispatchImplicit); template 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 ForwardIterator upper_bound(my_system &system, ForwardIterator first, ForwardIterator /*last*/, const LessThanComparable &/*value*/) { system.validate_dispatch(); return first; } void TestScalarUpperBoundDispatchExplicit() { thrust::device_vector 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 ForwardIterator upper_bound(my_tag, ForwardIterator first, ForwardIterator /*last*/, const LessThanComparable &/*value*/) { *first = 13; return first; } void TestScalarUpperBoundDispatchImplicit() { thrust::device_vector vec(1); thrust::upper_bound(thrust::retag(vec.begin()), thrust::retag(vec.end()), 0); ASSERT_EQUAL(13, vec.front()); } DECLARE_UNITTEST(TestScalarUpperBoundDispatchImplicit); template 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 bool binary_search(my_system &system, ForwardIterator /*first*/, ForwardIterator /*last*/, const LessThanComparable &/*value*/) { system.validate_dispatch(); return false; } void TestScalarBinarySearchDispatchExplicit() { thrust::device_vector 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 bool binary_search(my_tag, ForwardIterator first, ForwardIterator /*last*/, const LessThanComparable &/*value*/) { *first = 13; return false; } void TestScalarBinarySearchDispatchImplicit() { thrust::device_vector vec(1); thrust::binary_search(thrust::retag(vec.begin()), thrust::retag(vec.end()), 0); ASSERT_EQUAL(13, vec.front()); } DECLARE_UNITTEST(TestScalarBinarySearchDispatchImplicit); template 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 thrust::pair equal_range(my_system &system, ForwardIterator first, ForwardIterator /*last*/, const LessThanComparable &/*value*/) { system.validate_dispatch(); return thrust::make_pair(first,first); } void TestScalarEqualRangeDispatchExplicit() { thrust::device_vector 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 thrust::pair equal_range(my_tag, ForwardIterator first, ForwardIterator /*last*/, const LessThanComparable &/*value*/) { *first = 13; return thrust::make_pair(first,first); } void TestScalarEqualRangeDispatchImplicit() { thrust::device_vector vec(1); thrust::equal_range(thrust::retag(vec.begin()), thrust::retag(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 begin(1); thrust::counting_iterator 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);