25 void check_divisor_throw(u64_3 val, u64_3 divisor) {
26 bool cmp_x = val.x() % divisor.x() == 0;
27 bool cmp_y = val.y() % divisor.y() == 0;
28 bool cmp_z = val.z() % divisor.z() == 0;
32 "the divisor does not divide the value on component x\n"
34 + std::to_string(val.x()) +
", " + std::to_string(val.y()) +
", "
35 + std::to_string(val.z()) +
")\n" +
" divisor = (" + std::to_string(divisor.x())
36 +
", " + std::to_string(divisor.y()) +
", " + std::to_string(divisor.z()) +
")\n");
41 "the divisor does not divide the value on component y\n"
43 + std::to_string(val.x()) +
", " + std::to_string(val.y()) +
", "
44 + std::to_string(val.z()) +
")\n" +
" divisor = (" + std::to_string(divisor.x())
45 +
", " + std::to_string(divisor.y()) +
", " + std::to_string(divisor.z()) +
")\n");
50 "the divisor does not divide the value on component z\n"
52 + std::to_string(val.x()) +
", " + std::to_string(val.y()) +
", "
53 + std::to_string(val.z()) +
")\n" +
" divisor = (" + std::to_string(divisor.x())
54 +
", " + std::to_string(divisor.y()) +
", " + std::to_string(divisor.z()) +
")\n");
58 template<
class Ta,
class Tb>
59 void check_divisor_throw(Ta val, Tb divisor) {
60 check_divisor_throw(val.template convert<u64>(), divisor.template convert<u64>());
63 template<
class Tsource,
class Tdest>
64 void CoordRangeTransform<Tsource, Tdest>::print_transform()
const {
65 if (mode == multiply) {
67 "CoordRangeTransform",
"multiply:", fact, source_coord_min, dest_coord_min);
70 "CoordRangeTransform",
"divide :", fact, source_coord_min, dest_coord_min);
79 CoordRangeTransform<u64_3, f32_3>::CoordRangeTransform(
80 CoordRange<u64_3> source_range, CoordRange<f32_3> dest_range)
81 : source_coord_min(source_range.lower), dest_coord_min(dest_range.lower) {
83 source_range.check_throw_ranges();
84 dest_range.check_throw_ranges();
88 u64_3 source_delt = source_range.delt();
89 f32_3 dest_delt = dest_range.delt();
91 f32_3 source_sz_conv = source_delt.convert<
f32>();
93 fact = dest_delt / source_sz_conv;
97 CoordRangeTransform<u64_3, f64_3>::CoordRangeTransform(
98 CoordRange<u64_3> source_range, CoordRange<f64_3> dest_range)
99 : source_coord_min(source_range.lower), dest_coord_min(dest_range.lower) {
101 source_range.check_throw_ranges();
102 dest_range.check_throw_ranges();
106 u64_3 source_delt = source_range.delt();
107 f64_3 dest_delt = dest_range.delt();
109 f64_3 source_sz_conv = source_delt.convert<
f64>();
111 fact = dest_delt / source_sz_conv;
115 CoordRangeTransform<u32_3, f32_3>::CoordRangeTransform(
116 CoordRange<u32_3> source_range, CoordRange<f32_3> dest_range)
117 : source_coord_min(source_range.lower), dest_coord_min(dest_range.lower) {
119 source_range.check_throw_ranges();
120 dest_range.check_throw_ranges();
124 u32_3 source_delt = source_range.delt();
125 f32_3 dest_delt = dest_range.delt();
127 f32_3 source_sz_conv = source_delt.convert<
f32>();
129 fact = dest_delt / source_sz_conv;
133 CoordRangeTransform<u32_3, f64_3>::CoordRangeTransform(
134 CoordRange<u32_3> source_range, CoordRange<f64_3> dest_range)
135 : source_coord_min(source_range.lower), dest_coord_min(dest_range.lower) {
137 source_range.check_throw_ranges();
138 dest_range.check_throw_ranges();
142 u32_3 source_delt = source_range.delt();
143 f64_3 dest_delt = dest_range.delt();
145 f64_3 source_sz_conv = source_delt.convert<
f64>();
147 fact = dest_delt / source_sz_conv;
151 CoordRangeTransform<u16_3, f32_3>::CoordRangeTransform(
152 CoordRange<u16_3> source_range, CoordRange<f32_3> dest_range)
153 : source_coord_min(source_range.lower), dest_coord_min(dest_range.lower) {
155 source_range.check_throw_ranges();
156 dest_range.check_throw_ranges();
160 u16_3 source_delt = source_range.delt();
161 f32_3 dest_delt = dest_range.delt();
163 f32_3 source_sz_conv = source_delt.convert<
f32>();
165 fact = dest_delt / source_sz_conv;
169 CoordRangeTransform<u16_3, f64_3>::CoordRangeTransform(
170 CoordRange<u16_3> source_range, CoordRange<f64_3> dest_range)
171 : source_coord_min(source_range.lower), dest_coord_min(dest_range.lower) {
173 source_range.check_throw_ranges();
174 dest_range.check_throw_ranges();
178 u16_3 source_delt = source_range.delt();
179 f64_3 dest_delt = dest_range.delt();
181 f64_3 source_sz_conv = source_delt.convert<
f64>();
183 fact = dest_delt / source_sz_conv;
187 CoordRangeTransform<u64_3, u64_3>::CoordRangeTransform(
188 CoordRange<u64_3> source_range, CoordRange<u64_3> dest_range)
189 : source_coord_min(source_range.lower), dest_coord_min(dest_range.lower) {
191 source_range.check_throw_ranges();
192 dest_range.check_throw_ranges();
194 u64_3 source_delt = source_range.delt();
195 u64_3 dest_delt = dest_range.delt();
197 bool cmp_x = dest_delt.x() >= source_delt.x();
198 bool cmp_y = dest_delt.y() >= source_delt.y();
199 bool cmp_z = dest_delt.z() >= source_delt.z();
201 if ((cmp_x == cmp_y) && (cmp_z == cmp_y)) {
203 bool obj_greater_than_patch = cmp_x;
205 if (obj_greater_than_patch) {
206 check_divisor_throw(dest_delt, source_delt);
208 fact = dest_delt / source_delt;
210 check_divisor_throw(source_delt, dest_delt);
212 fact = source_delt / dest_delt;
217 "the range comparison are not the same");
222 CoordRangeTransform<i64_3, u64_3>::CoordRangeTransform(
223 CoordRange<i64_3> source_range, CoordRange<u64_3> dest_range)
224 : source_coord_min(source_range.lower), dest_coord_min(dest_range.lower) {
226 source_range.check_throw_ranges();
227 dest_range.check_throw_ranges();
229 u64_3 source_delt = source_range.delt().convert<
u64>();
230 u64_3 dest_delt = dest_range.delt();
232 bool cmp_x = dest_delt.x() >= source_delt.x();
233 bool cmp_y = dest_delt.y() >= source_delt.y();
234 bool cmp_z = dest_delt.z() >= source_delt.z();
236 if ((cmp_x == cmp_y) && (cmp_z == cmp_y)) {
238 bool obj_greater_than_patch = cmp_x;
240 if (obj_greater_than_patch) {
241 check_divisor_throw(dest_delt, source_delt);
243 fact = dest_delt / source_delt;
245 check_divisor_throw(source_delt, dest_delt);
247 fact = source_delt / dest_delt;
252 "the range comparison are not the same");
257 CoordRangeTransform<u64_3, i64_3>::CoordRangeTransform(
258 CoordRange<u64_3> source_range, CoordRange<i64_3> dest_range)
259 : source_coord_min(source_range.lower), dest_coord_min(dest_range.lower) {
261 source_range.check_throw_ranges();
262 dest_range.check_throw_ranges();
264 i64_3 source_delt = source_range.delt().convert<
i64>();
265 i64_3 dest_delt = dest_range.delt();
267 bool cmp_x = dest_delt.x() >= source_delt.x();
268 bool cmp_y = dest_delt.y() >= source_delt.y();
269 bool cmp_z = dest_delt.z() >= source_delt.z();
271 if ((cmp_x == cmp_y) && (cmp_z == cmp_y)) {
273 bool obj_greater_than_patch = cmp_x;
275 if (obj_greater_than_patch) {
276 check_divisor_throw(dest_delt, source_delt);
278 fact = dest_delt / source_delt;
280 check_divisor_throw(source_delt, dest_delt);
282 fact = source_delt / dest_delt;
287 "the range comparison are not the same");
292 CoordRangeTransform<u64_3, u32_3>::CoordRangeTransform(
293 CoordRange<u64_3> source_range, CoordRange<u32_3> dest_range)
294 : source_coord_min(source_range.lower), dest_coord_min(dest_range.lower) {
296 source_range.check_throw_ranges();
297 dest_range.check_throw_ranges();
299 u64_3 source_delt = source_range.delt();
300 u32_3 dest_delt = dest_range.delt();
302 bool cmp_x = dest_delt.x() >= source_delt.x();
303 bool cmp_y = dest_delt.y() >= source_delt.y();
304 bool cmp_z = dest_delt.z() >= source_delt.z();
306 if ((cmp_x == cmp_y) && (cmp_z == cmp_y)) {
308 bool obj_greater_than_patch = cmp_x;
310 if (obj_greater_than_patch) {
311 check_divisor_throw(dest_delt, source_delt);
313 fact = (dest_delt.convert<
u64>() / source_delt).convert<
u32>();
315 check_divisor_throw(source_delt, dest_delt);
317 fact = (source_delt / dest_delt.convert<
u64>()).convert<
u32>();
322 "the range comparison are not the same");
327 CoordRangeTransform<u64_3, i32_3>::CoordRangeTransform(
328 CoordRange<u64_3> source_range, CoordRange<i32_3> dest_range)
329 : source_coord_min(source_range.lower), dest_coord_min(dest_range.lower) {
331 source_range.check_throw_ranges();
332 dest_range.check_throw_ranges();
334 u64_3 source_delt = source_range.delt();
335 i32_3 dest_delt = dest_range.delt();
337 bool cmp_x = dest_delt.x() >= source_delt.x();
338 bool cmp_y = dest_delt.y() >= source_delt.y();
339 bool cmp_z = dest_delt.z() >= source_delt.z();
341 if ((cmp_x == cmp_y) && (cmp_z == cmp_y)) {
343 bool obj_greater_than_patch = cmp_x;
345 if (obj_greater_than_patch) {
346 check_divisor_throw(dest_delt, source_delt);
348 fact = (dest_delt.convert<
u64>() / source_delt).convert<
i32>();
350 check_divisor_throw(source_delt, dest_delt);
352 fact = (source_delt / dest_delt.convert<
u64>()).convert<
i32>();
357 "the range comparison are not the same");
362 CoordRangeTransform<u32_3, u16_3>::CoordRangeTransform(
363 CoordRange<u32_3> source_range, CoordRange<u16_3> dest_range)
364 : source_coord_min(source_range.lower), dest_coord_min(dest_range.lower) {
366 source_range.check_throw_ranges();
367 dest_range.check_throw_ranges();
369 u32_3 source_delt = source_range.delt();
370 u16_3 dest_delt = dest_range.delt();
372 bool cmp_x = dest_delt.x() >= source_delt.x();
373 bool cmp_y = dest_delt.y() >= source_delt.y();
374 bool cmp_z = dest_delt.z() >= source_delt.z();
376 if ((cmp_x == cmp_y) && (cmp_z == cmp_y)) {
378 bool obj_greater_than_patch = cmp_x;
380 if (obj_greater_than_patch) {
381 check_divisor_throw(dest_delt, source_delt);
383 fact = (dest_delt.convert<
u32>() / source_delt).convert<
u16>();
385 check_divisor_throw(source_delt, dest_delt);
387 fact = (source_delt / dest_delt.convert<
u32>()).convert<
u16>();
392 "the range comparison are not the same");
397 CoordRangeTransform<u32_3, u64_3>::CoordRangeTransform(
398 CoordRange<u32_3> source_range, CoordRange<u64_3> dest_range)
399 : source_coord_min(source_range.lower), dest_coord_min(dest_range.lower) {
401 source_range.check_throw_ranges();
402 dest_range.check_throw_ranges();
404 u32_3 source_delt = source_range.delt();
405 u64_3 dest_delt = dest_range.delt();
407 bool cmp_x = dest_delt.x() >= source_delt.x();
408 bool cmp_y = dest_delt.y() >= source_delt.y();
409 bool cmp_z = dest_delt.z() >= source_delt.z();
411 if ((cmp_x == cmp_y) && (cmp_z == cmp_y)) {
413 bool obj_greater_than_patch = cmp_x;
415 if (obj_greater_than_patch) {
416 check_divisor_throw(dest_delt, source_delt);
418 fact = (dest_delt / source_delt.convert<
u64>());
420 check_divisor_throw(source_delt, dest_delt);
422 fact = (source_delt.convert<
u64>() / dest_delt);
427 "the range comparison are not the same");
432 CoordRangeTransform<u32_3, i64_3>::CoordRangeTransform(
433 CoordRange<u32_3> source_range, CoordRange<i64_3> dest_range)
434 : source_coord_min(source_range.lower), dest_coord_min(dest_range.lower) {
436 source_range.check_throw_ranges();
437 dest_range.check_throw_ranges();
439 u32_3 source_delt = source_range.delt();
440 i64_3 dest_delt = dest_range.delt();
442 bool cmp_x = dest_delt.x() >= source_delt.x();
443 bool cmp_y = dest_delt.y() >= source_delt.y();
444 bool cmp_z = dest_delt.z() >= source_delt.z();
446 if ((cmp_x == cmp_y) && (cmp_z == cmp_y)) {
448 bool obj_greater_than_patch = cmp_x;
450 if (obj_greater_than_patch) {
451 check_divisor_throw(dest_delt, source_delt);
453 fact = (dest_delt / source_delt.convert<
i64>());
455 check_divisor_throw(source_delt, dest_delt);
457 fact = (source_delt.convert<
i64>() / dest_delt);
462 "the range comparison are not the same");
467 CoordRangeTransform<u32_3, i32_3>::CoordRangeTransform(
468 CoordRange<u32_3> source_range, CoordRange<i32_3> dest_range)
469 : source_coord_min(source_range.lower), dest_coord_min(dest_range.lower) {
471 source_range.check_throw_ranges();
472 dest_range.check_throw_ranges();
474 u32_3 source_delt = source_range.delt();
475 i32_3 dest_delt = dest_range.delt();
477 bool cmp_x = dest_delt.x() >= source_delt.x();
478 bool cmp_y = dest_delt.y() >= source_delt.y();
479 bool cmp_z = dest_delt.z() >= source_delt.z();
481 if ((cmp_x == cmp_y) && (cmp_z == cmp_y)) {
483 bool obj_greater_than_patch = cmp_x;
485 if (obj_greater_than_patch) {
486 check_divisor_throw(dest_delt, source_delt);
488 fact = (dest_delt / source_delt.convert<
i32>());
490 check_divisor_throw(source_delt, dest_delt);
492 fact = (source_delt.convert<
i32>() / dest_delt);
497 "the range comparison are not the same");
502 CoordRangeTransform<u16_3, u64_3>::CoordRangeTransform(
503 CoordRange<u16_3> source_range, CoordRange<u64_3> dest_range)
504 : source_coord_min(source_range.lower), dest_coord_min(dest_range.lower) {
506 source_range.check_throw_ranges();
507 dest_range.check_throw_ranges();
509 u16_3 source_delt = source_range.delt();
510 u64_3 dest_delt = dest_range.delt();
512 bool cmp_x = dest_delt.x() >= source_delt.x();
513 bool cmp_y = dest_delt.y() >= source_delt.y();
514 bool cmp_z = dest_delt.z() >= source_delt.z();
516 if ((cmp_x == cmp_y) && (cmp_z == cmp_y)) {
518 bool obj_greater_than_patch = cmp_x;
520 if (obj_greater_than_patch) {
521 check_divisor_throw(dest_delt, source_delt);
523 fact = (dest_delt / source_delt.convert<
u64>());
525 check_divisor_throw(source_delt, dest_delt);
527 fact = (source_delt.convert<
u64>() / dest_delt);
532 "the range comparison are not the same");
537 CoordRangeTransform<u16_3, u32_3>::CoordRangeTransform(
538 CoordRange<u16_3> source_range, CoordRange<u32_3> dest_range)
539 : source_coord_min(source_range.lower), dest_coord_min(dest_range.lower) {
541 source_range.check_throw_ranges();
542 dest_range.check_throw_ranges();
544 u16_3 source_delt = source_range.delt();
545 u32_3 dest_delt = dest_range.delt();
547 bool cmp_x = dest_delt.x() >= source_delt.x();
548 bool cmp_y = dest_delt.y() >= source_delt.y();
549 bool cmp_z = dest_delt.z() >= source_delt.z();
551 if ((cmp_x == cmp_y) && (cmp_z == cmp_y)) {
553 bool obj_greater_than_patch = cmp_x;
555 if (obj_greater_than_patch) {
556 check_divisor_throw(dest_delt, source_delt);
558 fact = (dest_delt / source_delt.convert<
u32>());
560 check_divisor_throw(source_delt, dest_delt);
562 fact = (source_delt.convert<
u32>() / dest_delt);
567 "the range comparison are not the same");
572 CoordRangeTransform<u16_3, i32_3>::CoordRangeTransform(
573 CoordRange<u16_3> source_range, CoordRange<i32_3> dest_range)
574 : source_coord_min(source_range.lower), dest_coord_min(dest_range.lower) {
576 source_range.check_throw_ranges();
577 dest_range.check_throw_ranges();
579 u16_3 source_delt = source_range.delt();
580 i32_3 dest_delt = dest_range.delt();
582 bool cmp_x = dest_delt.x() >= source_delt.x();
583 bool cmp_y = dest_delt.y() >= source_delt.y();
584 bool cmp_z = dest_delt.z() >= source_delt.z();
586 if ((cmp_x == cmp_y) && (cmp_z == cmp_y)) {
588 bool obj_greater_than_patch = cmp_x;
590 if (obj_greater_than_patch) {
591 check_divisor_throw(dest_delt, source_delt);
593 fact = (dest_delt / source_delt.convert<
i32>());
595 check_divisor_throw(source_delt, dest_delt);
597 fact = (source_delt.convert<
i32>() / dest_delt);
602 "the range comparison are not the same");
607 CoordRangeTransform<u16_3, i64_3>::CoordRangeTransform(
608 CoordRange<u16_3> source_range, CoordRange<i64_3> dest_range)
609 : source_coord_min(source_range.lower), dest_coord_min(dest_range.lower) {
611 source_range.check_throw_ranges();
612 dest_range.check_throw_ranges();
614 u16_3 source_delt = source_range.delt();
615 i64_3 dest_delt = dest_range.delt();
617 bool cmp_x = dest_delt.x() >= source_delt.x();
618 bool cmp_y = dest_delt.y() >= source_delt.y();
619 bool cmp_z = dest_delt.z() >= source_delt.z();
621 if ((cmp_x == cmp_y) && (cmp_z == cmp_y)) {
623 bool obj_greater_than_patch = cmp_x;
625 if (obj_greater_than_patch) {
626 check_divisor_throw(dest_delt, source_delt);
628 fact = (dest_delt / source_delt.convert<
i64>());
630 check_divisor_throw(source_delt, dest_delt);
632 fact = (source_delt.convert<
i64>() / dest_delt);
637 "the range comparison are not the same");
642 CoordRangeTransform<u64_3, u16_3>::CoordRangeTransform(
643 CoordRange<u64_3> source_range, CoordRange<u16_3> dest_range)
644 : source_coord_min(source_range.lower), dest_coord_min(dest_range.lower) {
647 "this coordinate conversion mode is not implemented");
651 CoordRangeTransform<u32_3, u32_3>::CoordRangeTransform(
652 CoordRange<u32_3> source_range, CoordRange<u32_3> dest_range)
653 : source_coord_min(source_range.lower), dest_coord_min(dest_range.lower) {
656 "this coordinate conversion mode is not implemented");
659 template class CoordRangeTransform<u64_3, f32_3>;
660 template class CoordRangeTransform<u64_3, f64_3>;
661 template class CoordRangeTransform<u64_3, u64_3>;
662 template class CoordRangeTransform<u64_3, u32_3>;
663 template class CoordRangeTransform<u64_3, i64_3>;
664 template class CoordRangeTransform<u64_3, i32_3>;
665 template class CoordRangeTransform<u64_3, u16_3>;
667 template class CoordRangeTransform<u32_3, f32_3>;
668 template class CoordRangeTransform<u32_3, f64_3>;
669 template class CoordRangeTransform<u32_3, u64_3>;
670 template class CoordRangeTransform<u32_3, u32_3>;
671 template class CoordRangeTransform<u32_3, i64_3>;
672 template class CoordRangeTransform<u32_3, i32_3>;
673 template class CoordRangeTransform<u32_3, u16_3>;
675 template class CoordRangeTransform<u16_3, f32_3>;
676 template class CoordRangeTransform<u16_3, f64_3>;
677 template class CoordRangeTransform<u16_3, u64_3>;
678 template class CoordRangeTransform<u16_3, u32_3>;
679 template class CoordRangeTransform<u16_3, i64_3>;
680 template class CoordRangeTransform<u16_3, i32_3>;
681 template class CoordRangeTransform<u16_3, u16_3>;
double f64
Alias for double.
float f32
Alias for float.
std::uint32_t u32
32 bit unsigned integer
std::uint64_t u64
64 bit unsigned integer
std::uint16_t u16
16 bit unsigned integer
std::int64_t i64
64 bit integer
std::int32_t i32
32 bit integer
This header file contains utility functions related to exception handling in the code.
Define the fmt formatters for sycl::vec.
void throw_with_loc(std::string message, SourceLocation loc=SourceLocation{})
Throw an exception and append the source location to it.
namespace for math utility