| | #include <unittest/unittest.h> |
| | #include <thrust/device_vector.h> |
| | #include <thrust/device_reference.h> |
| |
|
| | void TestDeviceReferenceConstructorFromDeviceReference(void) |
| | { |
| | typedef int T; |
| |
|
| | thrust::device_vector<T> v(1,0); |
| | thrust::device_reference<T> ref = v[0]; |
| |
|
| | |
| | ASSERT_EQUAL(v[0], ref); |
| |
|
| | |
| | ASSERT_EQUAL(&v[0], &ref); |
| |
|
| | |
| | v[0] = 13; |
| | ASSERT_EQUAL(13, ref); |
| | ASSERT_EQUAL(v[0], ref); |
| |
|
| | |
| | ref = 7; |
| | ASSERT_EQUAL(7, v[0]); |
| | ASSERT_EQUAL(v[0], ref); |
| | } |
| | DECLARE_UNITTEST(TestDeviceReferenceConstructorFromDeviceReference); |
| |
|
| | void TestDeviceReferenceConstructorFromDevicePointer(void) |
| | { |
| | typedef int T; |
| |
|
| | thrust::device_vector<T> v(1,0); |
| | thrust::device_ptr<T> ptr = &v[0]; |
| | thrust::device_reference<T> ref(ptr); |
| |
|
| | |
| | ASSERT_EQUAL(*ptr, ref); |
| |
|
| | |
| | ASSERT_EQUAL(ptr, &ref); |
| |
|
| | |
| | *ptr = 13; |
| | ASSERT_EQUAL(13, ref); |
| | ASSERT_EQUAL(v[0], ref); |
| |
|
| | |
| | ref = 7; |
| | ASSERT_EQUAL(7, *ptr); |
| | ASSERT_EQUAL(v[0], ref); |
| | } |
| | DECLARE_UNITTEST(TestDeviceReferenceConstructorFromDevicePointer); |
| |
|
| | void TestDeviceReferenceAssignmentFromDeviceReference(void) |
| | { |
| | |
| | typedef int T0; |
| | thrust::device_vector<T0> v0(2,0); |
| | thrust::device_reference<T0> ref0 = v0[0]; |
| | thrust::device_reference<T0> ref1 = v0[1]; |
| |
|
| | ref0 = 13; |
| |
|
| | ref1 = ref0; |
| |
|
| | |
| | ASSERT_EQUAL(13, ref1); |
| | ASSERT_EQUAL(ref0, ref1); |
| |
|
| | |
| | typedef float T1; |
| | thrust::device_vector<T1> v1(1,0.0f); |
| | thrust::device_reference<T1> ref2 = v1[0]; |
| |
|
| | ref2 = ref1; |
| |
|
| | |
| | ASSERT_EQUAL(13.0f, ref2); |
| | ASSERT_EQUAL(ref0, ref2); |
| | ASSERT_EQUAL(ref1, ref2); |
| | } |
| | DECLARE_UNITTEST(TestDeviceReferenceAssignmentFromDeviceReference); |
| |
|
| | void TestDeviceReferenceManipulation(void) |
| | { |
| | typedef int T1; |
| |
|
| | thrust::device_vector<T1> v(1,0); |
| | thrust::device_ptr<T1> ptr = &v[0]; |
| | thrust::device_reference<T1> ref(ptr); |
| |
|
| | |
| | ref = 0; |
| |
|
| | |
| | ++ref; |
| | ASSERT_EQUAL(1, ref); |
| | ASSERT_EQUAL(1, *ptr); |
| | ASSERT_EQUAL(1, v[0]); |
| |
|
| | |
| | ref = 0; |
| |
|
| | |
| | T1 x1 = ref++; |
| | ASSERT_EQUAL(0, x1); |
| | ASSERT_EQUAL(1, ref); |
| | ASSERT_EQUAL(1, *ptr); |
| | ASSERT_EQUAL(1, v[0]); |
| |
|
| | |
| | ref = 0; |
| |
|
| | |
| | ref += 5; |
| | ASSERT_EQUAL(5, ref); |
| | ASSERT_EQUAL(5, *ptr); |
| | ASSERT_EQUAL(5, v[0]); |
| |
|
| | |
| | ref = 0; |
| |
|
| | |
| | --ref; |
| | ASSERT_EQUAL(-1, ref); |
| | ASSERT_EQUAL(-1, *ptr); |
| | ASSERT_EQUAL(-1, v[0]); |
| |
|
| | |
| | ref = 0; |
| |
|
| | |
| | ref -= 5; |
| | ASSERT_EQUAL(-5, ref); |
| | ASSERT_EQUAL(-5, *ptr); |
| | ASSERT_EQUAL(-5, v[0]); |
| |
|
| | |
| | ref = 1; |
| |
|
| | |
| | ref *= 5; |
| | ASSERT_EQUAL(5, ref); |
| | ASSERT_EQUAL(5, *ptr); |
| | ASSERT_EQUAL(5, v[0]); |
| |
|
| | |
| | ref = 5; |
| |
|
| | |
| | ref /= 5; |
| | ASSERT_EQUAL(1, ref); |
| | ASSERT_EQUAL(1, *ptr); |
| | ASSERT_EQUAL(1, v[0]); |
| |
|
| | |
| | ref = 5; |
| |
|
| | |
| | ref %= 5; |
| | ASSERT_EQUAL(0, ref); |
| | ASSERT_EQUAL(0, *ptr); |
| | ASSERT_EQUAL(0, v[0]); |
| |
|
| | |
| | ref = 1; |
| |
|
| | |
| | ref <<= 1; |
| | ASSERT_EQUAL(2, ref); |
| | ASSERT_EQUAL(2, *ptr); |
| | ASSERT_EQUAL(2, v[0]); |
| |
|
| | |
| | ref = 2; |
| |
|
| | |
| | ref >>= 1; |
| | ASSERT_EQUAL(1, ref); |
| | ASSERT_EQUAL(1, *ptr); |
| | ASSERT_EQUAL(1, v[0]); |
| |
|
| | |
| | ref = 0; |
| |
|
| | |
| | ref |= 1; |
| | ASSERT_EQUAL(1, ref); |
| | ASSERT_EQUAL(1, *ptr); |
| | ASSERT_EQUAL(1, v[0]); |
| | |
| | // reset |
| | ref = 1; |
| | |
| | // test XOR-assignment |
| | ref ^= 1; |
| | ASSERT_EQUAL(0, ref); |
| | ASSERT_EQUAL(0, *ptr); |
| | ASSERT_EQUAL(0, v[0]); |
| | |
| | // test equality of const references |
| | thrust::device_reference<const T1> ref1 = v[0]; |
| | ASSERT_EQUAL(true, ref1 == ref); |
| | } |
| | DECLARE_UNITTEST(TestDeviceReferenceManipulation); |
| | |
| | void TestDeviceReferenceSwap(void) |
| | { |
| | typedef int T; |
| | |
| | thrust::device_vector<T> v(2); |
| | thrust::device_reference<T> ref1 = v.front(); |
| | thrust::device_reference<T> ref2 = v.back(); |
| | |
| | ref1 = 7; |
| | ref2 = 13; |
| | |
| | // test thrust::swap() |
| | thrust::swap(ref1, ref2); |
| | ASSERT_EQUAL(13, ref1); |
| | ASSERT_EQUAL(7, ref2); |
| | |
| | // test .swap() |
| | ref1.swap(ref2); |
| | ASSERT_EQUAL(7, ref1); |
| | ASSERT_EQUAL(13, ref2); |
| | } |
| | DECLARE_UNITTEST(TestDeviceReferenceSwap); |
| | |
| | |