Spaces:
Runtime error
Runtime error
| #include <unittest/unittest.h> | |
| #include <thrust/detail/alignment.h> | |
| struct alignof_mock_0 | |
| { | |
| char a; | |
| char b; | |
| }; // size: 2 * sizeof(char), alignment: sizeof(char) | |
| struct alignof_mock_1 | |
| { | |
| int n; | |
| char c; | |
| // sizeof(int) - sizeof(char) bytes of padding | |
| }; // size: 2 * sizeof(int), alignment: sizeof(int) | |
| struct alignof_mock_2 | |
| { | |
| int n; | |
| char c; | |
| // sizeof(int) - sizeof(char) bytes of padding | |
| }; // size: 2 * sizeof(int), alignment: sizeof(int) | |
| struct alignof_mock_3 | |
| { | |
| char c; | |
| // sizeof(int) - sizeof(char) bytes of padding | |
| int n; | |
| }; // size: 2 * sizeof(int), alignment: sizeof(int) | |
| struct alignof_mock_4 | |
| { | |
| char c0; | |
| // sizeof(int) - sizeof(char) bytes of padding | |
| int n; | |
| char c1; | |
| // sizeof(int) - sizeof(char) bytes of padding | |
| }; // size: 3 * sizeof(int), alignment: sizeof(int) | |
| struct alignof_mock_5 | |
| { | |
| char c0; | |
| char c1; | |
| // sizeof(int) - 2 * sizeof(char) bytes of padding | |
| int n; | |
| }; // size: 2 * sizeof(int), alignment: sizeof(int) | |
| struct alignof_mock_6 | |
| { | |
| int n; | |
| char c0; | |
| char c1; | |
| // sizeof(int) - 2 * sizeof(char) bytes of padding | |
| }; // size: 2 * sizeof(int), alignment: sizeof(int) | |
| void test_alignof_mocks_sizes() | |
| { | |
| ASSERT_EQUAL(sizeof(alignof_mock_0), 2 * sizeof(char)); | |
| ASSERT_EQUAL(sizeof(alignof_mock_1), 2 * sizeof(int)); | |
| ASSERT_EQUAL(sizeof(alignof_mock_2), 2 * sizeof(int)); | |
| ASSERT_EQUAL(sizeof(alignof_mock_3), 2 * sizeof(int)); | |
| ASSERT_EQUAL(sizeof(alignof_mock_4), 3 * sizeof(int)); | |
| ASSERT_EQUAL(sizeof(alignof_mock_5), 2 * sizeof(int)); | |
| ASSERT_EQUAL(sizeof(alignof_mock_6), 2 * sizeof(int)); | |
| } | |
| DECLARE_UNITTEST(test_alignof_mocks_sizes); | |
| void test_alignof() | |
| { | |
| ASSERT_EQUAL(THRUST_ALIGNOF(bool) , sizeof(bool)); | |
| ASSERT_EQUAL(THRUST_ALIGNOF(signed char) , sizeof(signed char)); | |
| ASSERT_EQUAL(THRUST_ALIGNOF(unsigned char) , sizeof(unsigned char)); | |
| ASSERT_EQUAL(THRUST_ALIGNOF(char) , sizeof(char)); | |
| ASSERT_EQUAL(THRUST_ALIGNOF(short int) , sizeof(short int)); | |
| ASSERT_EQUAL(THRUST_ALIGNOF(unsigned short int) , sizeof(unsigned short int)); | |
| ASSERT_EQUAL(THRUST_ALIGNOF(int) , sizeof(int)); | |
| ASSERT_EQUAL(THRUST_ALIGNOF(unsigned int) , sizeof(unsigned int)); | |
| ASSERT_EQUAL(THRUST_ALIGNOF(long int) , sizeof(long int)); | |
| ASSERT_EQUAL(THRUST_ALIGNOF(unsigned long int) , sizeof(unsigned long int)); | |
| ASSERT_EQUAL(THRUST_ALIGNOF(long long int) , sizeof(long long int)); | |
| ASSERT_EQUAL(THRUST_ALIGNOF(unsigned long long int), sizeof(unsigned long long int)); | |
| ASSERT_EQUAL(THRUST_ALIGNOF(float) , sizeof(float)); | |
| ASSERT_EQUAL(THRUST_ALIGNOF(double) , sizeof(double)); | |
| ASSERT_EQUAL(THRUST_ALIGNOF(long double) , sizeof(long double)); | |
| ASSERT_EQUAL(THRUST_ALIGNOF(alignof_mock_0), sizeof(char)); | |
| ASSERT_EQUAL(THRUST_ALIGNOF(alignof_mock_1), sizeof(int)); | |
| ASSERT_EQUAL(THRUST_ALIGNOF(alignof_mock_2), sizeof(int)); | |
| ASSERT_EQUAL(THRUST_ALIGNOF(alignof_mock_3), sizeof(int)); | |
| ASSERT_EQUAL(THRUST_ALIGNOF(alignof_mock_4), sizeof(int)); | |
| ASSERT_EQUAL(THRUST_ALIGNOF(alignof_mock_5), sizeof(int)); | |
| ASSERT_EQUAL(THRUST_ALIGNOF(alignof_mock_6), sizeof(int)); | |
| } | |
| DECLARE_UNITTEST(test_alignof); | |
| void test_alignment_of() | |
| { | |
| ASSERT_EQUAL( | |
| thrust::detail::alignment_of<bool>::value | |
| , sizeof(bool) | |
| ); | |
| ASSERT_EQUAL( | |
| thrust::detail::alignment_of<signed char>::value | |
| , sizeof(signed char) | |
| ); | |
| ASSERT_EQUAL( | |
| thrust::detail::alignment_of<unsigned char>::value | |
| , sizeof(unsigned char) | |
| ); | |
| ASSERT_EQUAL( | |
| thrust::detail::alignment_of<char>::value | |
| , sizeof(char) | |
| ); | |
| ASSERT_EQUAL( | |
| thrust::detail::alignment_of<short int>::value | |
| , sizeof(short int) | |
| ); | |
| ASSERT_EQUAL( | |
| thrust::detail::alignment_of<unsigned short int>::value | |
| , sizeof(unsigned short int) | |
| ); | |
| ASSERT_EQUAL( | |
| thrust::detail::alignment_of<int>::value | |
| , sizeof(int) | |
| ); | |
| ASSERT_EQUAL( | |
| thrust::detail::alignment_of<unsigned int>::value | |
| , sizeof(unsigned int) | |
| ); | |
| ASSERT_EQUAL( | |
| thrust::detail::alignment_of<long int>::value | |
| , sizeof(long int) | |
| ); | |
| ASSERT_EQUAL( | |
| thrust::detail::alignment_of<unsigned long int>::value | |
| , sizeof(unsigned long int) | |
| ); | |
| ASSERT_EQUAL( | |
| thrust::detail::alignment_of<long long int>::value | |
| , sizeof(long long int) | |
| ); | |
| ASSERT_EQUAL( | |
| thrust::detail::alignment_of<unsigned long long int>::value | |
| , sizeof(unsigned long long int) | |
| ); | |
| ASSERT_EQUAL( | |
| thrust::detail::alignment_of<float>::value | |
| , sizeof(float) | |
| ); | |
| ASSERT_EQUAL( | |
| thrust::detail::alignment_of<double>::value | |
| , sizeof(double) | |
| ); | |
| ASSERT_EQUAL( | |
| thrust::detail::alignment_of<long double>::value | |
| , sizeof(long double) | |
| ); | |
| ASSERT_EQUAL( | |
| thrust::detail::alignment_of<alignof_mock_0>::value | |
| , sizeof(char) | |
| ); | |
| ASSERT_EQUAL( | |
| thrust::detail::alignment_of<alignof_mock_1>::value | |
| , sizeof(int) | |
| ); | |
| ASSERT_EQUAL( | |
| thrust::detail::alignment_of<alignof_mock_2>::value | |
| , sizeof(int) | |
| ); | |
| ASSERT_EQUAL( | |
| thrust::detail::alignment_of<alignof_mock_3>::value | |
| , sizeof(int) | |
| ); | |
| ASSERT_EQUAL( | |
| thrust::detail::alignment_of<alignof_mock_4>::value | |
| , sizeof(int) | |
| ); | |
| ASSERT_EQUAL( | |
| thrust::detail::alignment_of<alignof_mock_5>::value | |
| , sizeof(int) | |
| ); | |
| ASSERT_EQUAL( | |
| thrust::detail::alignment_of<alignof_mock_6>::value | |
| , sizeof(int) | |
| ); | |
| } | |
| DECLARE_UNITTEST(test_alignment_of); | |
| template <std::size_t Align> | |
| void test_aligned_type_instantiation() | |
| { | |
| typedef typename thrust::detail::aligned_type<Align>::type type; | |
| ASSERT_GEQUAL(sizeof(type), 1lu); | |
| ASSERT_EQUAL(THRUST_ALIGNOF(type), Align); | |
| ASSERT_EQUAL(thrust::detail::alignment_of<type>::value, Align); | |
| } | |
| void test_aligned_type() | |
| { | |
| test_aligned_type_instantiation<1>(); | |
| test_aligned_type_instantiation<2>(); | |
| test_aligned_type_instantiation<4>(); | |
| test_aligned_type_instantiation<8>(); | |
| test_aligned_type_instantiation<16>(); | |
| test_aligned_type_instantiation<32>(); | |
| test_aligned_type_instantiation<64>(); | |
| test_aligned_type_instantiation<128>(); | |
| } | |
| DECLARE_UNITTEST(test_aligned_type); | |
| template <std::size_t Len, std::size_t Align> | |
| void test_aligned_storage_instantiation(thrust::detail::true_type /* Align is valid */) | |
| { | |
| typedef typename thrust::detail::aligned_storage<Len, Align>::type type; | |
| ASSERT_GEQUAL(sizeof(type), Len); | |
| ASSERT_EQUAL(THRUST_ALIGNOF(type), Align); | |
| ASSERT_EQUAL(thrust::detail::alignment_of<type>::value, Align); | |
| } | |
| template <std::size_t Len, std::size_t Align> | |
| void test_aligned_storage_instantiation(thrust::detail::false_type /* Align is invalid */) | |
| { | |
| // no-op -- alignment is > max_align_t and MSVC complains loudly. | |
| } | |
| template <std::size_t Len, std::size_t Align> | |
| void test_aligned_storage_instantiation() | |
| { | |
| typedef thrust::detail::integral_constant< | |
| bool, Align <= THRUST_ALIGNOF(thrust::detail::max_align_t)> | |
| ValidAlign; | |
| test_aligned_storage_instantiation<Len, Align>(ValidAlign()); | |
| } | |
| template <std::size_t Len> | |
| void test_aligned_storage_size() | |
| { | |
| test_aligned_storage_instantiation<Len, 1>(); | |
| test_aligned_storage_instantiation<Len, 2>(); | |
| test_aligned_storage_instantiation<Len, 4>(); | |
| test_aligned_storage_instantiation<Len, 8>(); | |
| test_aligned_storage_instantiation<Len, 16>(); | |
| test_aligned_storage_instantiation<Len, 32>(); | |
| test_aligned_storage_instantiation<Len, 64>(); | |
| test_aligned_storage_instantiation<Len, 128>(); | |
| } | |
| void test_aligned_storage() | |
| { | |
| test_aligned_storage_size<1>(); | |
| test_aligned_storage_size<2>(); | |
| test_aligned_storage_size<4>(); | |
| test_aligned_storage_size<8>(); | |
| test_aligned_storage_size<16>(); | |
| test_aligned_storage_size<32>(); | |
| test_aligned_storage_size<64>(); | |
| test_aligned_storage_size<128>(); | |
| test_aligned_storage_size<256>(); | |
| test_aligned_storage_size<512>(); | |
| test_aligned_storage_size<1024>(); | |
| test_aligned_storage_size<2048>(); | |
| test_aligned_storage_size<4096>(); | |
| test_aligned_storage_size<8192>(); | |
| test_aligned_storage_size<16384>(); | |
| test_aligned_storage_size<3>(); | |
| test_aligned_storage_size<5>(); | |
| test_aligned_storage_size<7>(); | |
| test_aligned_storage_size<17>(); | |
| test_aligned_storage_size<42>(); | |
| test_aligned_storage_size<10000>(); | |
| } | |
| DECLARE_UNITTEST(test_aligned_storage); | |
| void test_max_align_t() | |
| { | |
| ASSERT_GEQUAL( | |
| THRUST_ALIGNOF(thrust::detail::max_align_t) | |
| , THRUST_ALIGNOF(bool) | |
| ); | |
| ASSERT_GEQUAL( | |
| THRUST_ALIGNOF(thrust::detail::max_align_t) | |
| , THRUST_ALIGNOF(signed char) | |
| ); | |
| ASSERT_GEQUAL( | |
| THRUST_ALIGNOF(thrust::detail::max_align_t) | |
| , THRUST_ALIGNOF(unsigned char) | |
| ); | |
| ASSERT_GEQUAL( | |
| THRUST_ALIGNOF(thrust::detail::max_align_t) | |
| , THRUST_ALIGNOF(char) | |
| ); | |
| ASSERT_GEQUAL( | |
| THRUST_ALIGNOF(thrust::detail::max_align_t) | |
| , THRUST_ALIGNOF(short int) | |
| ); | |
| ASSERT_GEQUAL( | |
| THRUST_ALIGNOF(thrust::detail::max_align_t) | |
| , THRUST_ALIGNOF(unsigned short int) | |
| ); | |
| ASSERT_GEQUAL( | |
| THRUST_ALIGNOF(thrust::detail::max_align_t) | |
| , THRUST_ALIGNOF(int) | |
| ); | |
| ASSERT_GEQUAL( | |
| THRUST_ALIGNOF(thrust::detail::max_align_t) | |
| , THRUST_ALIGNOF(unsigned int) | |
| ); | |
| ASSERT_GEQUAL( | |
| THRUST_ALIGNOF(thrust::detail::max_align_t) | |
| , THRUST_ALIGNOF(long int) | |
| ); | |
| ASSERT_GEQUAL( | |
| THRUST_ALIGNOF(thrust::detail::max_align_t) | |
| , THRUST_ALIGNOF(unsigned long int) | |
| ); | |
| ASSERT_GEQUAL( | |
| THRUST_ALIGNOF(thrust::detail::max_align_t) | |
| , THRUST_ALIGNOF(long long int) | |
| ); | |
| ASSERT_GEQUAL( | |
| THRUST_ALIGNOF(thrust::detail::max_align_t) | |
| , THRUST_ALIGNOF(unsigned long long int) | |
| ); | |
| ASSERT_GEQUAL( | |
| THRUST_ALIGNOF(thrust::detail::max_align_t) | |
| , THRUST_ALIGNOF(float) | |
| ); | |
| ASSERT_GEQUAL( | |
| THRUST_ALIGNOF(thrust::detail::max_align_t) | |
| , THRUST_ALIGNOF(double) | |
| ); | |
| ASSERT_GEQUAL( | |
| THRUST_ALIGNOF(thrust::detail::max_align_t) | |
| , THRUST_ALIGNOF(long double) | |
| ); | |
| } | |
| DECLARE_UNITTEST(test_max_align_t); | |
| void test_aligned_reinterpret_cast() | |
| { | |
| thrust::detail::aligned_type<1>* a1 = 0; | |
| thrust::detail::aligned_type<2>* a2 = 0; | |
| // Cast to type with stricter (larger) alignment requirement. | |
| a2 = thrust::detail::aligned_reinterpret_cast< | |
| thrust::detail::aligned_type<2>* | |
| >(a1); | |
| // Cast to type with less strict (smaller) alignment requirement. | |
| a1 = thrust::detail::aligned_reinterpret_cast< | |
| thrust::detail::aligned_type<1>* | |
| >(a2); | |
| } | |
| DECLARE_UNITTEST(test_aligned_reinterpret_cast); | |