1+ #include " common.h"
2+
3+ struct basics_tests {
4+ template <typename T, size_t ... I, size_t N = sizeof ...(I)>
5+ __host__ __device__ void operator ()(generator<T> gen, std::index_sequence<I...>) {
6+ // default constructor
7+ {
8+ kf::vec<T, N> x;
9+ ASSERT (equals (x[I], T ()) && ...);
10+ }
11+
12+ // filled with one
13+ {
14+ kf::vec<T, N> x = {T ((gen.next (I), 1 ))...};
15+ ASSERT (equals (x[I], T (1 )) && ...);
16+ }
17+
18+ // filled with steps
19+ {
20+ kf::vec<T, N> x = {T (I)...};
21+ ASSERT (equals (x[I], T (I)) && ...);
22+ }
23+
24+ // broadcast constructor
25+ {
26+ T init = gen.next ();
27+ kf::vec<T, N> x {init};
28+ ASSERT (equals (x[I], init) && ...);
29+ }
30+
31+ // Getters
32+ T items[N] = {gen.next (I)...};
33+ kf::vec<T, N> a = {items[I]...};
34+
35+ ASSERT (equals (a[I], items[I]) && ...);
36+ ASSERT (equals (a.get (I), items[I]) && ...);
37+ ASSERT (equals (a.at (I), items[I]) && ...);
38+ ASSERT (equals (a (I), items[I]) && ...);
39+
40+ // Data, begin, end
41+ ASSERT (a.size () == N);
42+ ASSERT (&a[0 ] == a.data ());
43+ ASSERT (&a[0 ] == a.begin ());
44+ ASSERT (&a[0 ] + N == a.end ());
45+ ASSERT (&a[0 ] == a.cdata ());
46+ ASSERT (&a[0 ] == a.cbegin ());
47+ ASSERT (&a[0 ] + N == a.cend ());
48+
49+ // setters
50+ T new_items[N] = {gen.next (I)...};
51+ (a.set (I, new_items[I]), ...);
52+ ASSERT (equals (a[I], new_items[I]) && ...);
53+ }
54+ };
55+
56+ REGISTER_TEST_CASE (" basics" , basics_tests, int , float )
57+
58+ struct creation_tests {
59+ __host__ __device__ void operator ()(generator<int > gen) {
60+ using kernel_float::into_vector;
61+ using kernel_float::make_vec;
62+
63+ // into_vector on scalar
64+ {
65+ kf::vec<int , 1 > a = into_vector (int (5 ));
66+ ASSERT (a[0 ] == 5 );
67+ }
68+
69+ // into_vector on CUDA vector types
70+ {
71+ kf::vec<int , 1 > a = into_vector (make_int1 (5 ));
72+ kf::vec<int , 2 > b = into_vector (make_int2 (5 , 4 ));
73+ kf::vec<int , 3 > c = into_vector (make_int3 (5 , 4 , -1 ));
74+ kf::vec<int , 4 > d = into_vector (make_int4 (5 , 4 , -1 , 0 ));
75+
76+ ASSERT (a[0 ] == 5 );
77+ ASSERT (b[0 ] == 5 && b[1 ] == 4 );
78+ ASSERT (c[0 ] == 5 && c[1 ] == 4 && c[2 ] == -1 );
79+ ASSERT (d[0 ] == 5 && d[1 ] == 4 && d[2 ] == -1 && d[3 ] == 0 );
80+ }
81+
82+ // into_vector on C-style array
83+ {
84+ int items[3 ] = {1 , 2 , 3 };
85+ kf::vec<int , 3 > a = into_vector (items);
86+ ASSERT (a[0 ] == 1 && a[1 ] == 2 && a[2 ] == 3 );
87+ }
88+
89+ // into_vector on kf array
90+ {
91+ kf::vec<int , 3 > items = {1 , 2 , 3 };
92+ kf::vec<int , 3 > a = into_vector (items);
93+ ASSERT (a[0 ] == 1 && a[1 ] == 2 && a[2 ] == 3 );
94+ }
95+
96+ // make_vec
97+ {
98+ kf::vec<int , 3 > a = make_vec (true , short (2 ), int (3 ));
99+ ASSERT (a[0 ] == 1 && a[1 ] == 2 && a[2 ] == 3 );
100+ }
101+ }
102+
103+ __host__ __device__ void operator ()(generator<float > gen) {
104+ using kernel_float::into_vector;
105+ using kernel_float::make_vec;
106+
107+ // into_vector on scalar
108+ {
109+ kf::vec<float , 1 > a = into_vector (int (5 .0f ));
110+ ASSERT (a[0 ] == 5 .0f );
111+ }
112+
113+ // into_vector on CUDA vector types
114+ {
115+ kf::vec<float , 1 > a = into_vector (make_float1 (5 .0f ));
116+ kf::vec<float , 2 > b = into_vector (make_float2 (5 .0f , 4 .0f ));
117+ kf::vec<float , 3 > c = into_vector (make_float3 (5 .0f , 4 .0f , -1 .0f ));
118+ kf::vec<float , 4 > d = into_vector (make_float4 (5 .0f , 4 .0f , -1 .0f , 0 .0f ));
119+
120+ ASSERT (a[0 ] == 5 .0f );
121+ ASSERT (b[0 ] == 5 .0f && b[1 ] == 4 .0f );
122+ ASSERT (c[0 ] == 5 .0f && c[1 ] == 4 .0f && c[2 ] == -1 .0f );
123+ ASSERT (d[0 ] == 5 .0f && d[1 ] == 4 .0f && d[2 ] == -1 .0f && d[3 ] == 0 .0f );
124+ }
125+
126+ // into_vector on C-style array
127+ {
128+ float items[3 ] = {1 .0f , 2 .0f , 3 .0f };
129+ kf::vec<float , 3 > a = into_vector (items);
130+ ASSERT (a[0 ] == 1 .0f && a[1 ] == 2 .0f && a[2 ] == 3 .0f );
131+ }
132+
133+ // into_vector on kf array
134+ {
135+ kf::vec<float , 3 > items = {1 .0f , 2 .0f , 3 .0f };
136+ kf::vec<float , 3 > a = into_vector (items);
137+ ASSERT (a[0 ] == 1 .0f && a[1 ] == 2 .0f && a[2 ] == 3 .0f );
138+ }
139+
140+ // make_vec
141+ {
142+ kf::vec<float , 3 > a = make_vec (true , int (2 ), 3 .0f );
143+ ASSERT (a[0 ] == 1 .0f && a[1 ] == 2 .0f && a[2 ] == 3 .0f );
144+ }
145+ }
146+ };
147+
148+ REGISTER_TEST_CASE (" into_vec and make_vec" , creation_tests, int , float )
0 commit comments