namespace std {
template<size_t Bytes, class Abi> class basic_simd_mask {
public:
using value_type = bool;
using abi_type = Abi;
static constexpr integral_constant<simd-size-type, simd-size-v<integer-from<Bytes>, Abi>>
size {};
constexpr basic_simd_mask() noexcept = default;
constexpr explicit basic_simd_mask(value_type) noexcept;
template<size_t UBytes, class UAbi>
constexpr explicit basic_simd_mask(const basic_simd_mask<UBytes, UAbi>&) noexcept;
template<class G> constexpr explicit basic_simd_mask(G&& gen) noexcept;
constexpr value_type operator[](simd-size-type) const;
constexpr basic_simd_mask operator!() const noexcept;
constexpr basic_simd<integer-from<Bytes>, Abi> operator+() const noexcept;
constexpr basic_simd<integer-from<Bytes>, Abi> operator-() const noexcept;
constexpr basic_simd<integer-from<Bytes>, Abi> operator~() const noexcept;
template<class U, class A>
constexpr explicit(sizeof(U) != Bytes) operator basic_simd<U, A>() const noexcept;
friend constexpr basic_simd_mask
operator&&(const basic_simd_mask&, const basic_simd_mask&) noexcept;
friend constexpr basic_simd_mask
operator||(const basic_simd_mask&, const basic_simd_mask&) noexcept;
friend constexpr basic_simd_mask
operator&(const basic_simd_mask&, const basic_simd_mask&) noexcept;
friend constexpr basic_simd_mask
operator|(const basic_simd_mask&, const basic_simd_mask&) noexcept;
friend constexpr basic_simd_mask
operator^(const basic_simd_mask&, const basic_simd_mask&) noexcept;
friend constexpr basic_simd_mask&
operator&=(basic_simd_mask&, const basic_simd_mask&) noexcept;
friend constexpr basic_simd_mask&
operator|=(basic_simd_mask&, const basic_simd_mask&) noexcept;
friend constexpr basic_simd_mask&
operator^=(basic_simd_mask&, const basic_simd_mask&) noexcept;
friend constexpr basic_simd_mask
operator==(const basic_simd_mask&, const basic_simd_mask&) noexcept;
friend constexpr basic_simd_mask
operator!=(const basic_simd_mask&, const basic_simd_mask&) noexcept;
friend constexpr basic_simd_mask
operator>=(const basic_simd_mask&, const basic_simd_mask&) noexcept;
friend constexpr basic_simd_mask
operator<=(const basic_simd_mask&, const basic_simd_mask&) noexcept;
friend constexpr basic_simd_mask
operator>(const basic_simd_mask&, const basic_simd_mask&) noexcept;
friend constexpr basic_simd_mask
operator<(const basic_simd_mask&, const basic_simd_mask&) noexcept;
friend constexpr basic_simd_mask simd-select-impl(
const basic_simd_mask&, const basic_simd_mask&, const basic_simd_mask&) noexcept;
friend constexpr basic_simd_mask simd-select-impl(
const basic_simd_mask&, same_as<bool> auto, same_as<bool> auto) noexcept;
template<class T0, class T1>
friend constexpr simd<see below, size()>
simd-select-impl(const basic_simd_mask&, const T0&, const T1&) noexcept;
};
}
Every specialization of
basic_simd_mask is a complete type
. The specialization of
basic_simd_mask<Bytes, Abi> is:
- disabled, if there is no vectorizable type T such that Bytes
is equal to sizeof(T),
- otherwise, enabled, if there exists a vectorizable type T and a
value N in the range [1, 64] such that Bytes is equal
to sizeof(T) and Abi is deduce-abi-t<T,
N>,
- otherwise, it is implementation-defined if such a specialization is enabled.
If
basic_simd_mask<Bytes, Abi> is disabled, the specialization has a
deleted default constructor, deleted destructor, deleted copy constructor, and
deleted copy assignment
. In addition only the
value_type and
abi_type members are
present
.If
basic_simd_mask<Bytes, Abi> is enabled,
basic_simd_mask<Bytes, Abi> is trivially copyable
.Recommended practice: Implementations should support explicit conversions between
specializations of
basic_simd_mask and appropriate
implementation-defined types
. [
Note 1:
Appropriate types are non-standard vector types which are available in the
implementation
. —
end note]