|
#include <unittest/unittest.h> |
|
#include <thrust/detail/alignment.h> |
|
|
|
struct alignof_mock_0 |
|
{ |
|
char a; |
|
char b; |
|
}; |
|
|
|
struct alignof_mock_1 |
|
{ |
|
int n; |
|
char c; |
|
|
|
}; |
|
|
|
struct alignof_mock_2 |
|
{ |
|
int n; |
|
char c; |
|
|
|
}; |
|
|
|
struct alignof_mock_3 |
|
{ |
|
char c; |
|
|
|
int n; |
|
}; |
|
|
|
struct alignof_mock_4 |
|
{ |
|
char c0; |
|
|
|
int n; |
|
char c1; |
|
|
|
}; |
|
|
|
struct alignof_mock_5 |
|
{ |
|
char c0; |
|
char c1; |
|
|
|
int n; |
|
}; |
|
|
|
struct alignof_mock_6 |
|
{ |
|
int n; |
|
char c0; |
|
char c1; |
|
|
|
}; |
|
|
|
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 */) |
|
{ |
|
|
|
} |
|
|
|
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; |
|
|
|
|
|
a2 = thrust::detail::aligned_reinterpret_cast< |
|
thrust::detail::aligned_type<2>* |
|
>(a1); |
|
|
|
|
|
a1 = thrust::detail::aligned_reinterpret_cast< |
|
thrust::detail::aligned_type<1>* |
|
>(a2); |
|
} |
|
DECLARE_UNITTEST(test_aligned_reinterpret_cast); |
|
|
|
|