std::experimental::clamp(3)

πŸ“¦ version 2024.07.05, in nixpkgs unstable, opensuse-leap 16.0

πŸ’– NAME πŸ’–

std::experimental::clamp β€” std::experimental::clamp

Ok bestie, welcome to the std::experimental::clamp(3) page from the C++ Standard Libary β€” yes, that’s the manual’s spelling, not me 😭. This is the SIMD-flavored clamp, and it’s giving β€œkeep your lanes in line” energy πŸ’….

✨ Synopsis ✨

  • Defined in header <experimental/simd>
  • Tagged (parallelism TS v2) β€” experimental girlie behavior, handle with care 🧚
          template< class T, class Abi >

          simd<T, Abi>

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

πŸŽ€ Parameters πŸŽ€

  • v β€” the elements to clamp.
  • lo, hi β€” the boundaries to clamp v to.

πŸ¦‹ Return value πŸ¦‹

The return value is the result of element-wise application of std::clamp(v[i], lo[i], hi[i]) for all i ∈ [0, size()). Literally every lane gets the clamp treatment, no cap 🫢.

🌸 Example 🌸

       // Run this code

        #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);
        }

🌈 Output 🌈

        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

πŸ‘‘ See also πŸ‘‘

  • clamp β€” clamps a value between a pair of boundary values (C++17) (function template). That’s the function-template one, and she’s iconic, periodt πŸ’œ

Page tea β˜•: this came from http://cppreference.com, dated 2024.06.10, and it’s the std::experimental::clamp(3) page. Mwah πŸ’‹

πŸ“¦ where this page comes from