1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179
|
#include <thrust/detail/alignment.h>
#include <unittest/unittest.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(alignof(bool), sizeof(bool));
ASSERT_EQUAL(alignof(signed char), sizeof(signed char));
ASSERT_EQUAL(alignof(unsigned char), sizeof(unsigned char));
ASSERT_EQUAL(alignof(char), sizeof(char));
ASSERT_EQUAL(alignof(short int), sizeof(short int));
ASSERT_EQUAL(alignof(unsigned short int), sizeof(unsigned short int));
ASSERT_EQUAL(alignof(int), sizeof(int));
ASSERT_EQUAL(alignof(unsigned int), sizeof(unsigned int));
ASSERT_EQUAL(alignof(long int), sizeof(long int));
ASSERT_EQUAL(alignof(unsigned long int), sizeof(unsigned long int));
ASSERT_EQUAL(alignof(long long int), sizeof(long long int));
ASSERT_EQUAL(alignof(unsigned long long int), sizeof(unsigned long long int));
ASSERT_EQUAL(alignof(float), sizeof(float));
ASSERT_EQUAL(alignof(double), sizeof(double));
ASSERT_EQUAL(alignof(long double), sizeof(long double));
ASSERT_EQUAL(alignof(alignof_mock_0), sizeof(char));
ASSERT_EQUAL(alignof(alignof_mock_1), sizeof(int));
ASSERT_EQUAL(alignof(alignof_mock_2), sizeof(int));
ASSERT_EQUAL(alignof(alignof_mock_3), sizeof(int));
ASSERT_EQUAL(alignof(alignof_mock_4), sizeof(int));
ASSERT_EQUAL(alignof(alignof_mock_5), sizeof(int));
ASSERT_EQUAL(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(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);
void test_max_align_t()
{
ASSERT_GEQUAL(alignof(thrust::detail::max_align_t), alignof(bool));
ASSERT_GEQUAL(alignof(thrust::detail::max_align_t), alignof(signed char));
ASSERT_GEQUAL(alignof(thrust::detail::max_align_t), alignof(unsigned char));
ASSERT_GEQUAL(alignof(thrust::detail::max_align_t), alignof(char));
ASSERT_GEQUAL(alignof(thrust::detail::max_align_t), alignof(short int));
ASSERT_GEQUAL(alignof(thrust::detail::max_align_t), alignof(unsigned short int));
ASSERT_GEQUAL(alignof(thrust::detail::max_align_t), alignof(int));
ASSERT_GEQUAL(alignof(thrust::detail::max_align_t), alignof(unsigned int));
ASSERT_GEQUAL(alignof(thrust::detail::max_align_t), alignof(long int));
ASSERT_GEQUAL(alignof(thrust::detail::max_align_t), alignof(unsigned long int));
ASSERT_GEQUAL(alignof(thrust::detail::max_align_t), alignof(long long int));
ASSERT_GEQUAL(alignof(thrust::detail::max_align_t), alignof(unsigned long long int));
ASSERT_GEQUAL(alignof(thrust::detail::max_align_t), alignof(float));
ASSERT_GEQUAL(alignof(thrust::detail::max_align_t), alignof(double));
ASSERT_GEQUAL(alignof(thrust::detail::max_align_t), 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);
|