1212using  namespace  sycl ; 
1313using  namespace  sycl ::intel; 
1414
15- template  <typename  T>
15+ template  <typename  T,  typename  Difference = T >
1616void  add_fetch_test (queue q, size_t  N) {
1717  T sum = 0 ;
1818  std::vector<T> output (N);
19-   std::fill (output.begin (), output.end (), 0 );
19+   std::fill (output.begin (), output.end (), T ( 0 ) );
2020  {
2121    buffer<T> sum_buf (&sum, 1 );
2222    buffer<T> output_buf (output.data (), output.size ());
@@ -27,29 +27,29 @@ void add_fetch_test(queue q, size_t N) {
2727      cgh.parallel_for (range<1 >(N), [=](item<1 > it) {
2828        int  gid = it.get_id (0 );
2929        auto  atm = atomic_ref<T, intel::memory_order::relaxed, intel::memory_scope::device, access::address_space::global_space>(sum[0 ]);
30-         out[gid] = atm.fetch_add (T (1 ));
30+         out[gid] = atm.fetch_add (Difference (1 ));
3131      });
3232    });
3333  }
3434
3535  //  All work-items increment by 1, so final value should be equal to N
36-   assert (sum == N );
36+   assert (sum == T (N) );
3737
3838  //  Fetch returns original value: will be in [0, N-1]
3939  auto  min_e = std::min_element (output.begin (), output.end ());
4040  auto  max_e = std::max_element (output.begin (), output.end ());
41-   assert (*min_e == 0  && *max_e == N - 1 );
41+   assert (*min_e == T ( 0 )  && *max_e == T ( N - 1 ) );
4242
4343  //  Intermediate values should be unique
4444  std::sort (output.begin (), output.end ());
4545  assert (std::unique (output.begin (), output.end ()) == output.end ());
4646}
4747
48- template  <typename  T>
48+ template  <typename  T,  typename  Difference = T >
4949void  add_plus_equal_test (queue q, size_t  N) {
5050  T sum = 0 ;
5151  std::vector<T> output (N);
52-   std::fill (output.begin (), output.end (), 0 );
52+   std::fill (output.begin (), output.end (), T ( 0 ) );
5353  {
5454    buffer<T> sum_buf (&sum, 1 );
5555    buffer<T> output_buf (output.data (), output.size ());
@@ -60,29 +60,29 @@ void add_plus_equal_test(queue q, size_t N) {
6060      cgh.parallel_for (range<1 >(N), [=](item<1 > it) {
6161        int  gid = it.get_id (0 );
6262        auto  atm = atomic_ref<T, intel::memory_order::relaxed, intel::memory_scope::device, access::address_space::global_space>(sum[0 ]);
63-         out[gid] = atm += T (1 );
63+         out[gid] = atm += Difference (1 );
6464      });
6565    });
6666  }
6767
6868  //  All work-items increment by 1, so final value should be equal to N
69-   assert (sum == N );
69+   assert (sum == T (N) );
7070
7171  //  += returns updated value: will be in [1, N]
7272  auto  min_e = std::min_element (output.begin (), output.end ());
7373  auto  max_e = std::max_element (output.begin (), output.end ());
74-   assert (*min_e == 1  && *max_e == N );
74+   assert (*min_e == T ( 1 )  && *max_e == T (N) );
7575
7676  //  Intermediate values should be unique
7777  std::sort (output.begin (), output.end ());
7878  assert (std::unique (output.begin (), output.end ()) == output.end ());
7979}
8080
81- template  <typename  T>
81+ template  <typename  T,  typename  Difference = T >
8282void  add_pre_inc_test (queue q, size_t  N) {
8383  T sum = 0 ;
8484  std::vector<T> output (N);
85-   std::fill (output.begin (), output.end (), 0 );
85+   std::fill (output.begin (), output.end (), T ( 0 ) );
8686  {
8787    buffer<T> sum_buf (&sum, 1 );
8888    buffer<T> output_buf (output.data (), output.size ());
@@ -99,23 +99,23 @@ void add_pre_inc_test(queue q, size_t N) {
9999  }
100100
101101  //  All work-items increment by 1, so final value should be equal to N
102-   assert (sum == N );
102+   assert (sum == T (N) );
103103
104104  //  Pre-increment returns updated value: will be in [1, N]
105105  auto  min_e = std::min_element (output.begin (), output.end ());
106106  auto  max_e = std::max_element (output.begin (), output.end ());
107-   assert (*min_e == 1  && *max_e == N );
107+   assert (*min_e == T ( 1 )  && *max_e == T (N) );
108108
109109  //  Intermediate values should be unique
110110  std::sort (output.begin (), output.end ());
111111  assert (std::unique (output.begin (), output.end ()) == output.end ());
112112}
113113
114- template  <typename  T>
114+ template  <typename  T,  typename  Difference = T >
115115void  add_post_inc_test (queue q, size_t  N) {
116116  T sum = 0 ;
117117  std::vector<T> output (N);
118-   std::fill (output.begin (), output.end (), 0 );
118+   std::fill (output.begin (), output.end (), T ( 0 ) );
119119  {
120120    buffer<T> sum_buf (&sum, 1 );
121121    buffer<T> output_buf (output.data (), output.size ());
@@ -132,24 +132,24 @@ void add_post_inc_test(queue q, size_t N) {
132132  }
133133
134134  //  All work-items increment by 1, so final value should be equal to N
135-   assert (sum == N );
135+   assert (sum == T (N) );
136136
137137  //  Post-increment returns original value: will be in [0, N-1]
138138  auto  min_e = std::min_element (output.begin (), output.end ());
139139  auto  max_e = std::max_element (output.begin (), output.end ());
140-   assert (*min_e == 0  && *max_e == N - 1 );
140+   assert (*min_e == T ( 0 )  && *max_e == T ( N - 1 ) );
141141
142142  //  Intermediate values should be unique
143143  std::sort (output.begin (), output.end ());
144144  assert (std::unique (output.begin (), output.end ()) == output.end ());
145145}
146146
147- template  <typename  T>
147+ template  <typename  T,  typename  Difference = T >
148148void  add_test (queue q, size_t  N) {
149-   add_fetch_test<T>(q, N);
150-   add_plus_equal_test<T>(q, N);
151-   add_pre_inc_test<T>(q, N);
152-   add_post_inc_test<T>(q, N);
149+   add_fetch_test<T, Difference >(q, N);
150+   add_plus_equal_test<T, Difference >(q, N);
151+   add_pre_inc_test<T, Difference >(q, N);
152+   add_post_inc_test<T, Difference >(q, N);
153153}
154154
155155//  Floating-point types do not support pre- or post-increment
@@ -173,8 +173,6 @@ int main() {
173173  }
174174
175175  constexpr  int  N = 32 ;
176- 
177-   //  TODO: Enable missing tests when supported
178176  add_test<int >(q, N);
179177  add_test<unsigned  int >(q, N);
180178  add_test<long >(q, N);
@@ -183,7 +181,7 @@ int main() {
183181  add_test<unsigned  long  long >(q, N);
184182  add_test<float >(q, N);
185183  add_test<double >(q, N);
186-   // add_test<char* >(q, N);
184+   add_test<char  *,  ptrdiff_t >(q, N);
187185
188186  std::cout << " Test passed."   << std::endl;
189187}
0 commit comments