1+ #include " common.h"
2+
3+ struct select_tests {
4+ template <typename T>
5+ __host__ __device__ void operator ()(generator<T> gen) {
6+ T data[8 ] = {
7+ gen.next (),
8+ gen.next (),
9+ gen.next (),
10+ gen.next (),
11+ gen.next (),
12+ gen.next (),
13+ gen.next (),
14+ gen.next ()};
15+ kf::vec<T, 8 > x = {data[0 ], data[1 ], data[2 ], data[3 ], data[4 ], data[5 ], data[6 ], data[7 ]};
16+
17+ // Empty
18+ ASSERT_EQ (select (x), (kf::vec<int , 0 >()));
19+ ASSERT_EQ (select (x, kf::vec<int , 0 >()), (kf::vec<T, 0 >()));
20+
21+ // One element
22+ ASSERT_EQ (select (x, 0 ), kf::make_vec (data[0 ]));
23+ ASSERT_EQ (select (x, 5 ), kf::make_vec (data[5 ]));
24+ ASSERT_EQ (select (x, 7 ), kf::make_vec (data[4 ]));
25+
26+ // Two elements
27+ ASSERT_EQ (select (x, 0 , 1 ), kf::make_vec (data[0 ], data[1 ]));
28+ ASSERT_EQ (select (x, 5 , 0 ), kf::make_vec (data[5 ], data[0 ]));
29+ ASSERT_EQ (select (x, 6 , 7 ), kf::make_vec (data[6 ], data[7 ]));
30+
31+ // Two elements as array
32+ ASSERT_EQ (select (x, kf::make_vec (0 , 1 )), kf::make_vec (data[0 ], data[1 ]));
33+ ASSERT_EQ (select (x, kf::make_vec (5 , 0 )), kf::make_vec (data[5 ], data[0 ]));
34+ ASSERT_EQ (select (x, kf::make_vec (6 , 7 )), kf::make_vec (data[6 ], data[7 ]));
35+
36+ // Three elements
37+ ASSERT_EQ (select (x, kf::make_vec (0 , 1 ), 2 ), kf::make_vec (data[0 ], data[1 ], data[2 ]));
38+ ASSERT_EQ (select (x, kf::make_vec (5 , 0 , 7 )), kf::make_vec (data[5 ], data[0 ], data[7 ]));
39+ ASSERT_EQ (select (x, 6 , kf::make_vec (7 , 2 )), kf::make_vec (data[6 ], data[7 ], data[2 ]));
40+
41+ // Method of vector
42+ ASSERT_EQ (x.select (), (kf::vec<T, 0 >()));
43+ ASSERT_EQ (x.select (4 ), kf::make_vec (data[4 ]));
44+ ASSERT_EQ (x.select (4 , 2 ), kf::make_vec (data[4 ], data[2 ]));
45+ ASSERT_EQ (x.select (4 , 2 , 7 ), kf::make_vec (data[4 ], data[2 ], data[7 ]));
46+ }
47+ };
0 commit comments