#include #include 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::value , sizeof(bool) ); ASSERT_EQUAL( thrust::detail::alignment_of::value , sizeof(signed char) ); ASSERT_EQUAL( thrust::detail::alignment_of::value , sizeof(unsigned char) ); ASSERT_EQUAL( thrust::detail::alignment_of::value , sizeof(char) ); ASSERT_EQUAL( thrust::detail::alignment_of::value , sizeof(short int) ); ASSERT_EQUAL( thrust::detail::alignment_of::value , sizeof(unsigned short int) ); ASSERT_EQUAL( thrust::detail::alignment_of::value , sizeof(int) ); ASSERT_EQUAL( thrust::detail::alignment_of::value , sizeof(unsigned int) ); ASSERT_EQUAL( thrust::detail::alignment_of::value , sizeof(long int) ); ASSERT_EQUAL( thrust::detail::alignment_of::value , sizeof(unsigned long int) ); ASSERT_EQUAL( thrust::detail::alignment_of::value , sizeof(long long int) ); ASSERT_EQUAL( thrust::detail::alignment_of::value , sizeof(unsigned long long int) ); ASSERT_EQUAL( thrust::detail::alignment_of::value , sizeof(float) ); ASSERT_EQUAL( thrust::detail::alignment_of::value , sizeof(double) ); ASSERT_EQUAL( thrust::detail::alignment_of::value , sizeof(long double) ); ASSERT_EQUAL( thrust::detail::alignment_of::value , sizeof(char) ); ASSERT_EQUAL( thrust::detail::alignment_of::value , sizeof(int) ); ASSERT_EQUAL( thrust::detail::alignment_of::value , sizeof(int) ); ASSERT_EQUAL( thrust::detail::alignment_of::value , sizeof(int) ); ASSERT_EQUAL( thrust::detail::alignment_of::value , sizeof(int) ); ASSERT_EQUAL( thrust::detail::alignment_of::value , sizeof(int) ); ASSERT_EQUAL( thrust::detail::alignment_of::value , sizeof(int) ); } DECLARE_UNITTEST(test_alignment_of); template void test_aligned_type_instantiation() { typedef typename thrust::detail::aligned_type::type type; ASSERT_GEQUAL(sizeof(type), 1lu); ASSERT_EQUAL(THRUST_ALIGNOF(type), Align); ASSERT_EQUAL(thrust::detail::alignment_of::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 void test_aligned_storage_instantiation(thrust::detail::true_type /* Align is valid */) { typedef typename thrust::detail::aligned_storage::type type; ASSERT_GEQUAL(sizeof(type), Len); ASSERT_EQUAL(THRUST_ALIGNOF(type), Align); ASSERT_EQUAL(thrust::detail::alignment_of::value, Align); } template void test_aligned_storage_instantiation(thrust::detail::false_type /* Align is invalid */) { // no-op -- alignment is > max_align_t and MSVC complains loudly. } template void test_aligned_storage_instantiation() { typedef thrust::detail::integral_constant< bool, Align <= THRUST_ALIGNOF(thrust::detail::max_align_t)> ValidAlign; test_aligned_storage_instantiation(ValidAlign()); } template void test_aligned_storage_size() { test_aligned_storage_instantiation(); test_aligned_storage_instantiation(); test_aligned_storage_instantiation(); test_aligned_storage_instantiation(); test_aligned_storage_instantiation(); test_aligned_storage_instantiation(); test_aligned_storage_instantiation(); test_aligned_storage_instantiation(); } 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);