Clamp and remap values from [lo, hi] to [0, 1] in-place.
Values outside [lo, hi] are clamped before remapping.
379{
380 if (lo == hi)
381 return;
382
383 const float inv = 1.0F / (hi - lo);
384 float*
out = data.data();
385 const size_t n = data.size();
386
387#ifdef MAYAFLUX_ARCH_X64
388 const __m256 v_lo = _mm256_set1_ps(lo);
389 const __m256 v_inv = _mm256_set1_ps(inv);
390 const __m256 v_zero = _mm256_setzero_ps();
391 const __m256 v_one = _mm256_set1_ps(1.0F);
392 size_t i = 0;
393 for (; i + 8 <= n; i += 8) {
394 __m256 v = _mm256_loadu_ps(
out + i);
395 v = _mm256_mul_ps(_mm256_sub_ps(v, v_lo), v_inv);
396 v = _mm256_min_ps(_mm256_max_ps(v, v_zero), v_one);
397 _mm256_storeu_ps(
out + i, v);
398 }
399 for (; i < n; ++i)
400 out[i] = std::clamp((
out[i] - lo) * inv, 0.0F, 1.0F);
401
402#elif defined(MAYAFLUX_ARCH_ARM64)
403 const float32x4_t v_lo = vdupq_n_f32(lo);
404 const float32x4_t v_inv = vdupq_n_f32(inv);
405 const float32x4_t v_zero = vdupq_n_f32(0.0F);
406 const float32x4_t v_one = vdupq_n_f32(1.0F);
407 size_t i = 0;
408 for (; i + 4 <= n; i += 4) {
409 float32x4_t v = vld1q_f32(
out + i);
410 v = vmulq_f32(vsubq_f32(v, v_lo), v_inv);
411 v = vminq_f32(vmaxq_f32(v, v_zero), v_one);
412 vst1q_f32(
out + i, v);
413 }
414 for (; i < n; ++i)
415 out[i] = std::clamp((
out[i] - lo) * inv, 0.0F, 1.0F);
416
417#else
418 std::transform(std::execution::par_unseq, data.begin(), data.end(), data.begin(),
419 [lo, inv](float v) { return std::clamp((v - lo) * inv, 0.0F, 1.0F); });
420#endif
421}
std::vector< float > * out