Spaces:
Runtime error
Runtime error
THRUST_DISABLE_MSVC_POSSIBLE_LOSS_OF_DATA_WARNING_BEGIN | |
////////////////////// | |
// Scalar Functions // | |
////////////////////// | |
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 /*last*/, const LessThanComparable &/*value*/) | |
{ | |
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 /*last*/, const LessThanComparable &/*value*/) | |
{ | |
*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 /*last*/, const LessThanComparable &/*value*/) | |
{ | |
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 /*last*/, const LessThanComparable &/*value*/) | |
{ | |
*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 /*first*/, ForwardIterator /*last*/, const LessThanComparable &/*value*/) | |
{ | |
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 /*last*/, const LessThanComparable &/*value*/) | |
{ | |
*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 /*last*/, const LessThanComparable &/*value*/) | |
{ | |
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 /*last*/, const LessThanComparable &/*value*/) | |
{ | |
*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); | |