Clamp and remap values from [lo, hi] to [0, 1] in-place.
Values outside [lo, hi] are clamped before remapping.
399{
401 return;
402
403 const float inv = 1.0F / (
hi -
lo);
404 float* out = data.data();
405 const size_t n = data.size();
406
407#ifdef MAYAFLUX_ARCH_X64
408 const __m256 v_lo = _mm256_set1_ps(
lo);
409 const __m256 v_inv = _mm256_set1_ps(inv);
410 const __m256 v_zero = _mm256_setzero_ps();
411 const __m256 v_one = _mm256_set1_ps(1.0F);
412 size_t i = 0;
413 for (; i + 8 <= n; i += 8) {
414 __m256 v = _mm256_loadu_ps(out + i);
415 v = _mm256_mul_ps(_mm256_sub_ps(v, v_lo), v_inv);
416 v = _mm256_min_ps(_mm256_max_ps(v, v_zero), v_one);
417 _mm256_storeu_ps(out + i, v);
418 }
419 for (; i < n; ++i)
420 out[i] = std::clamp((out[i] -
lo) * inv, 0.0F, 1.0F);
421
422#elif defined(MAYAFLUX_ARCH_ARM64)
423 const float32x4_t v_lo = vdupq_n_f32(
lo);
424 const float32x4_t v_inv = vdupq_n_f32(inv);
425 const float32x4_t v_zero = vdupq_n_f32(0.0F);
426 const float32x4_t v_one = vdupq_n_f32(1.0F);
427 size_t i = 0;
428 for (; i + 4 <= n; i += 4) {
429 float32x4_t v = vld1q_f32(out + i);
430 v = vmulq_f32(vsubq_f32(v, v_lo), v_inv);
431 v = vminq_f32(vmaxq_f32(v, v_zero), v_one);
432 vst1q_f32(out + i, v);
433 }
434 for (; i < n; ++i)
435 out[i] = std::clamp((out[i] -
lo) * inv, 0.0F, 1.0F);
436
437#else
438 P::transform(P::par_unseq, data.begin(), data.end(), data.begin(),
439 [
lo, inv](
float v) { return std::clamp((v - lo) * inv, 0.0F, 1.0F); });
440#endif
441}