E.V.E  0.1-beta

◆ operator[]() [3/3]

template<typename Type , typename Cardinal >
template<integral_scalar_value Index>
auto eve::wide< Type, Cardinal >::operator[] ( wide< Index, Cardinal > const &  idx) const
inlinenoexcept

Dynamic lookup via lane indexing.

Generate a new eve::wide which is an arbitrary shuffling of current eve::wide lanes. The values of idx must be integer between 0 and size()-1 or equal to eve::na_ to indicate the value at this lane must be replaced by zero.

Does not participate in overload resolution if idx is not an integral register.

Parameters
idxeve::wide of integral indexes
Returns
A eve::wide constructed as wide{ get(idx.get(0)), ..., get(idx.get(size()-1))}.

Example:

See it live on Compiler Explorer

#include <eve/wide.hpp>
#include <iostream>
int main()
{
// Generates the wide [1 2 4 ... 2^N-1]
eve::wide<int> r = [](auto i, auto) { return 1 << i; };
std::cout << r << "\n";
// A re-indexing wide
eve::wide<int> l = [](auto i, auto) { return i%2 ? i : i/2;};
std::cout << l << "\n";
std::cout << r[l] << "\n";
}
Wrapper for SIMD registers.
Definition: wide.hpp:65