@@ -210,48 +210,114 @@ void ParallelTest() {
210210}
211211template <> void ParallelTest<0 >() {}
212212
213+ template <typename T, unsigned int N, typename EqPredicate>
214+ void check_constructed_range (const oneapi::tbb::blocked_nd_range<T, N>& range,
215+ const T (&begins)[N], const T (&ends)[N],
216+ const std::size_t (&grainsizes)[N],
217+ EqPredicate pred)
218+ {
219+ for (unsigned int dim_index = 0 ; dim_index < N; ++dim_index) {
220+ using dim_type = typename oneapi::tbb::blocked_nd_range<T, N>::dim_range_type;
221+ const dim_type& dim = range.dim (dim_index);
222+ CHECK_MESSAGE (pred (dim.begin (), begins[dim_index]), " Incorrect begin of the constructed range" );
223+ CHECK_MESSAGE (pred (dim.end (), ends[dim_index]), " Incorrect end of the constructed range" );
224+ CHECK_MESSAGE (dim.grainsize () == grainsizes[dim_index], " Incorrect grainsize of the constructed range" );
225+ }
226+ }
227+
228+ template <typename T, unsigned int N>
229+ void check_constructed_range (const oneapi::tbb::blocked_nd_range<T, N>& range,
230+ const T (&begins)[N], const T (&ends)[N],
231+ const std::size_t (&grainsizes)[N])
232+ {
233+ check_constructed_range (range, begins, ends, grainsizes, std::equal_to<T>{});
234+ }
235+
213236// ! Testing blocked_nd_range construction
214237// ! \brief \ref interface
215238TEST_CASE (" Construction" ) {
216- oneapi::tbb::blocked_nd_range< int , 1 >{ { 0 , 13 , 3 } } ;
217-
218- oneapi::tbb::blocked_nd_range< int , 1 >{ oneapi::tbb::blocked_range< int >{ 0 , 13 , 3 } } ;
239+ int begin1 = 0 ;
240+ int end1 = 13 ;
241+ std:: size_t grainsize1 = 3 ;
219242
220- oneapi::tbb::blocked_nd_range<int , 2 >(oneapi::tbb::blocked_range<int >(-8923 , 8884 , 13 ), oneapi::tbb::blocked_range<int >(-8923 , 5 , 13 ));
243+ int begin2 = -8923 ;
244+ int end2 = 8884 ;
245+ std::size_t grainsize2 = 13 ;
221246
222- oneapi::tbb::blocked_nd_range< int , 2 >({ - 8923 , 8884 , 13 }, { - 8923 , 8884 , 13 }) ;
247+ std:: size_t default_grainsize = 1 ;
223248
224- oneapi::tbb::blocked_range<int > r1 (0 , 13 );
225-
226- oneapi::tbb::blocked_range<int > r2 (-12 , 23 );
249+ {
250+ oneapi::tbb::blocked_nd_range<int , 1 > r{ {begin1, end1, grainsize1} };
251+ check_constructed_range (r, {begin1}, {end1}, {grainsize1});
252+ }
253+ {
254+ oneapi::tbb::blocked_nd_range<int , 1 > r{ {begin1, end1} };
255+ check_constructed_range (r, {begin1}, {end1}, {default_grainsize});
256+ }
257+ {
258+ oneapi::tbb::blocked_nd_range<int , 1 > r{oneapi::tbb::blocked_range<int >{begin1, end1, grainsize1}};
259+ check_constructed_range (r, {begin1}, {end1}, {grainsize1});
260+ }
261+ {
262+ oneapi::tbb::blocked_nd_range<int , 1 > r{oneapi::tbb::blocked_range<int >{begin1, end1}};
263+ check_constructed_range (r, {begin1}, {end1}, {default_grainsize});
264+ }
265+ {
266+ oneapi::tbb::blocked_nd_range<int , 2 > r{{begin1, end1, grainsize1}, {begin2, end2, grainsize2}};
267+ check_constructed_range (r, {begin1, begin2}, {end1, end2}, {grainsize1, grainsize2});
268+ }
269+ {
270+ oneapi::tbb::blocked_nd_range<int , 2 > r{{begin1, end1}, {begin2, end2, grainsize2}};
271+ check_constructed_range (r, {begin1, begin2}, {end1, end2}, {default_grainsize, grainsize2});
272+ }
273+ {
274+ oneapi::tbb::blocked_nd_range<int , 2 > r{oneapi::tbb::blocked_range<int >{begin1, end1, grainsize1},
275+ oneapi::tbb::blocked_range<int >{begin2, end2, grainsize2}};
276+ check_constructed_range (r, {begin1, begin2}, {end1, end2}, {grainsize1, grainsize2});
277+ }
278+ {
279+ oneapi::tbb::blocked_nd_range<int , 2 > r{oneapi::tbb::blocked_range<int >{begin1, end1},
280+ oneapi::tbb::blocked_range<int >{begin2, end2, grainsize2}};
281+ check_constructed_range (r, {begin1, begin2}, {end1, end2}, {default_grainsize, grainsize2});
282+ }
283+ {
284+ oneapi::tbb::blocked_nd_range<int , 2 > r{{begin1, end1, grainsize1},
285+ oneapi::tbb::blocked_range<int >{begin2, end2, grainsize2}};
286+ check_constructed_range (r, {begin1, begin2}, {end1, end2}, {grainsize1, grainsize2});
287+ }
227288
228- oneapi::tbb::blocked_nd_range< int , 2 >({ { - 8923 , 8884 , 13 }, r1}) ;
289+ int sizes[ 4 ] = { 174 , 39 , 2481 , 93 } ;
229290
230- oneapi::tbb::blocked_nd_range<int , 2 >({ r2, r1 });
291+ {
292+ oneapi::tbb::blocked_nd_range<int , 4 > r (sizes, grainsize1);
293+ check_constructed_range (r, {0 , 0 , 0 , 0 }, sizes,
294+ {grainsize1, grainsize1, grainsize1, grainsize1});
295+ }
296+ {
297+ oneapi::tbb::blocked_nd_range<int , 4 > r ({sizes[0 ], sizes[1 ], sizes[2 ], sizes[3 ]}, grainsize2);
298+ check_constructed_range (r, {0 , 0 , 0 , 0 }, sizes,
299+ {grainsize2, grainsize2, grainsize2, grainsize2});
300+ }
231301
232- oneapi::tbb::blocked_nd_range<int , 2 >(r1, r2);
302+ {
303+ AbstractValueType abstract_begins[4 ] = {MakeAbstractValue (-3 ), MakeAbstractValue (-53 ),
304+ MakeAbstractValue (-23 ), MakeAbstractValue (-13 )};
233305
234- int sizes[ ] = {174 , 39 , 2481 , 93 };
235- oneapi::tbb::blocked_nd_range< int , 4 > rNd_1 (sizes, /* grainsize */ 7 ) ;
306+ AbstractValueType abstract_ends[ 4 ] = {MakeAbstractValue ( 13 ), MakeAbstractValue ( 23 ),
307+ MakeAbstractValue ( 33 ), MakeAbstractValue ( 43 )} ;
236308
237- oneapi::tbb::blocked_nd_range< int , 4 > rNd_2 ({ 174 , 39 , 2481 , 93 }, /* grainsize */ 11 ) ;
309+ std:: size_t grainsizes[ 4 ] = { 8 , 2 , 1 , 7 } ;
238310
239- for (unsigned i = 0 ; i < rNd_1.dim_count (); ++i) {
240- oneapi::tbb::blocked_nd_range<int , 4 >::dim_range_type dim1 = rNd_1.dim (i);
241- oneapi::tbb::blocked_nd_range<int , 4 >::dim_range_type dim2 = rNd_2.dim (i);
242- REQUIRE (dim1.begin ()==0 );
243- REQUIRE (dim2.begin ()==0 );
244- unsigned int szi = sizes[i]; // to compare with unsigned integrals without warnings
245- REQUIRE (dim1.size ()==szi);
246- REQUIRE (dim2.size ()==szi);
247- REQUIRE (dim1.grainsize ()==7 );
248- REQUIRE (dim2.grainsize ()==11 );
311+ oneapi::tbb::blocked_nd_range<AbstractValueType, 4 > r{{abstract_begins[0 ], abstract_ends[0 ], grainsizes[0 ]},
312+ {abstract_begins[1 ], abstract_ends[1 ], grainsizes[1 ]},
313+ {abstract_begins[2 ], abstract_ends[2 ], grainsizes[2 ]},
314+ {abstract_begins[3 ], abstract_ends[3 ], grainsizes[3 ]}};
315+
316+ auto abstract_eq_pred = [](const AbstractValueType& left, const AbstractValueType& right) {
317+ return GetValueOf (left) == GetValueOf (right);
318+ };
319+ check_constructed_range (r, abstract_begins, abstract_ends, grainsizes, abstract_eq_pred);
249320 }
250-
251- oneapi::tbb::blocked_nd_range<AbstractValueType, 4 >({ MakeAbstractValue (-3 ), MakeAbstractValue (13 ), 8 },
252- { MakeAbstractValue (-53 ), MakeAbstractValue (23 ), 2 },
253- { MakeAbstractValue (-23 ), MakeAbstractValue (33 ), 1 },
254- { MakeAbstractValue (-13 ), MakeAbstractValue (43 ), 7 });
255321}
256322
257323static const std::size_t N = 4 ;
0 commit comments