std::experi...e_expression(3)

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

πŸ’– std::experimental::where_expression πŸ’–

okay bestie, welcome to the manual page for std::experimental::where_expression, live from the C++ Standard Libary manual β€” yes, that exact spelling, she’s iconic β€” and the page slug is std::experi...e_expression(3) because truncation is her whole brand. Every technical deet is staying exactly where it was, just with way more sparkle. ✨


πŸ’– NAME πŸ’–

std::experimental::where_expression - std::experimental::where_expression

✨ Synopsis ✨

Defined in header <experimental/simd>

template< class M, class V >           (parallelism TS v2)
class where_expression;

Okay so the class template where_expression abstracts the notion of selected elements of a given lvalue of arithmetic or data-parallel type. The selected elements are the elements of the lvalue (of type V) for which the corresponding element of the mask (of type M) is true. Operators applied to objects of type where_expression<M, V> are applied only to selected elements. All other elements are left unchanged. No cap.

Use the where function to construct where_expression objects. That’s the move. 🫢

πŸ¦‹ Template parameters πŸ¦‹

  • M β€” the mask type
  • V β€” the value type M applies on

Valid combinations of (M, V) are literally:

  • (simd_mask<T, Abi>, simd<T, Abi>),
  • (simd_mask<T, Abi>, simd_mask<T, Abi>),
  • (bool, T).

πŸ’… Member functions πŸ’…

  • operator= β€” assigns to selected positions (public member function)
  • operator+= β€” compound operators (public member function)
  • operator-= β€” compound operators (public member function)
  • operator*= β€” compound operators (public member function)
  • operator/= β€” compound operators (public member function)
  • operator%= β€” compound operators (public member function)
  • operator&= β€” compound operators (public member function)
  • operator|= β€” compound operators (public member function)
  • operator^= β€” compound operators (public member function)
  • operator<<= β€” compound operators (public member function)
  • operator>>= β€” compound operators (public member function)
  • operator++ β€” increment and decrement operators (public member function)
  • operator-- β€” increment and decrement operators (public member function)
  • copy_from β€” loads from address to selected positions (public member function)

πŸŽ€ Example πŸŽ€

The page says // Run this code, so here’s the code, exactly:

// Run this code

#include <cstddef>
#include <experimental/simd>
#include <iostream>
namespace stdx = std::experimental;

void print(auto const& a)
{
    for (std::size_t i{}; i != std::size(a); ++i)
        std::cout << a[i] << ' ';
    std::cout << '\n';
}

template<class A>
stdx::simd<int, A> my_abs(stdx::simd<int, A> x)
{
    where(x < 0, x) = -x;
    return x;
}

int main()
{
    const stdx::native_simd<int> a([](int i) { return i - 2; });
    print(a);
    const auto b = my_abs(a);
    print(b);
}

🌈 Possible output 🌈

-2 -1 0 1
2 1 0 1

That’s the whole vibe: source http://cppreference.com, version/date 2024.06.10, and footer slug std::experi...e_expression(3). Stay selected, bestie β€” the mask said true for you πŸ’–βœ¨πŸŽ€

πŸ“¦ where this page comes from