Namespaces
Variants

std::experimental:: clamp

From cppreference.net
ヘッダーで定義 <experimental/simd>
template < class T, class Abi >

simd < T, Abi >

clamp ( const simd < T, Abi > & v, const simd < T, Abi > & lo, const simd < T, Abi > & hi ) ;
(parallelism TS v2)

目次

パラメータ

v - クランプする要素
lo, hi - v をクランプする境界値

戻り値

要素ごとの適用結果は std:: clamp ( v [ i ] , lo [ i ] , hi [ i ] ) であり、これはすべての i ∈ [ 0 , size ( ) ) に対して適用されます。

#include <cstddef>
#include <cstdint>
#include <experimental/simd>
#include <iomanip>
#include <iostream>
namespace stdx = std::experimental;
void println(auto rem, auto const v)
{
    std::cout << rem << ": ";
    for (std::size_t i = 0; i != v.size(); ++i)
        std::cout << std::setw(4) << v[i] << ' ';
    std::cout << '\n';
}
int main()
{
    stdx::fixed_size_simd<int, 8> a{[](int i) {
        static constexpr auto c = {-129, -128, -1, 0, 42, 127, 128, 255};
        return c.begin()[i];
    }};
    println("a", a);
    stdx::fixed_size_simd<int, 8> lo1{INT8_MIN};
    stdx::fixed_size_simd<int, 8> hi1{INT8_MAX};
    const auto b = stdx::clamp(a, lo1, hi1);
    println("b", b);
    stdx::fixed_size_simd<int, 8> lo2{0};
    stdx::fixed_size_simd<int, 8> hi2{UINT8_MAX};
    const auto c = stdx::clamp(a, lo2, hi2);
    println("c", c);
}

出力:

a: -129 -128   -1    0   42  127  128  255 
b: -128 -128   -1    0   42  127  127  127 
c:    0    0    0    0   42  127  128  255

関連項目

(C++17)
値を境界値のペアの間にクランプする
(関数テンプレート)