simba::simd

Trait SimdBool

Source
pub trait SimdBool:
    Copy
    + BitAnd<Self, Output = Self>
    + BitOr<Self, Output = Self>
    + BitXor<Self, Output = Self>
    + Not<Output = Self> {
    // Required methods
    fn bitmask(self) -> u64;
    fn and(self) -> bool;
    fn or(self) -> bool;
    fn xor(self) -> bool;
    fn all(self) -> bool;
    fn any(self) -> bool;
    fn none(self) -> bool;
    fn if_else<Res: SimdValue<SimdBool = Self>>(
        self,
        if_value: impl FnOnce() -> Res,
        else_value: impl FnOnce() -> Res,
    ) -> Res;
    fn if_else2<Res: SimdValue<SimdBool = Self>>(
        self,
        if_value: impl FnOnce() -> Res,
        else_if: (impl FnOnce() -> Self, impl FnOnce() -> Res),
        else_value: impl FnOnce() -> Res,
    ) -> Res;
    fn if_else3<Res: SimdValue<SimdBool = Self>>(
        self,
        if_value: impl FnOnce() -> Res,
        else_if: (impl FnOnce() -> Self, impl FnOnce() -> Res),
        else_else_if: (impl FnOnce() -> Self, impl FnOnce() -> Res),
        else_value: impl FnOnce() -> Res,
    ) -> Res;
}
Expand description

Lane-wise generalization of bool for SIMD booleans.

This trait implemented by bool as well as SIMD boolean types like portable_simd::mask32x4. It is designed to abstract the behavior of booleans so it can work with multi-lane boolean values in an AoSoA setting.

Required Methods§

Source

fn bitmask(self) -> u64

A bit mask representing the boolean state of each lanes of self.

The i-th bit of the result is 1 iff. the i-th lane of self is true.

Source

fn and(self) -> bool

Lane-wise bitwise and of the vector elements.

Source

fn or(self) -> bool

Lane-wise bitwise or of the vector elements.

Source

fn xor(self) -> bool

Lane-wise bitwise xor of the vector elements.

Source

fn all(self) -> bool

Are all vector lanes true?

Source

fn any(self) -> bool

Is any vector lane true?

Source

fn none(self) -> bool

Are all vector lanes false?

Source

fn if_else<Res: SimdValue<SimdBool = Self>>( self, if_value: impl FnOnce() -> Res, else_value: impl FnOnce() -> Res, ) -> Res

Merges the value of if_value() and else_value() depending on the lanes of self.

  • For each lane of self containing 1, the result will contain the corresponding lane of if_value().
  • For each lane of self containing 0, the result will contain the corresponding lane of else_value().

The implementor of this trait is free to choose on what cases if_value and else_value are actually called.

Source

fn if_else2<Res: SimdValue<SimdBool = Self>>( self, if_value: impl FnOnce() -> Res, else_if: (impl FnOnce() -> Self, impl FnOnce() -> Res), else_value: impl FnOnce() -> Res, ) -> Res

Merges the value of if_value() and else_if.1() and else_value() depending on the lanes of self and else_if.0().

  • For each lane of self containing 1, the result will contain the corresponding lane of if_value().
  • For each lane of self containing 0 but with a corresponding lane of else_if.0() containing 1, the result will contain the corresponding lane of else_if.1().
  • For each lane of self containing 0 but with a corresponding lane of else_if.0() containing 0, the result will contain the corresponding lane of else_value().

The implementor of this trait is free to choose on what cases any of those closures are implemented.

Source

fn if_else3<Res: SimdValue<SimdBool = Self>>( self, if_value: impl FnOnce() -> Res, else_if: (impl FnOnce() -> Self, impl FnOnce() -> Res), else_else_if: (impl FnOnce() -> Self, impl FnOnce() -> Res), else_value: impl FnOnce() -> Res, ) -> Res

Merges the value of if_value() and else_if.1() and else_else_if.1() and else_value() depending on the lanes of self and else_if.0() and else_else_if.0().

  • For each lane of self containing 1, the result will contain the corresponding lane of if_value().
  • For each lane of self containing 0 but with a corresponding lane of else_if.0() containing 1, the result will contain the corresponding lane of else_if.1().
  • For each lane of self containing 0 and else_if.0() containing 0 and else_else_if.0() containing 1, the result will contain the corresponding lane of else_else_if.1().
  • Other lanes will contain the corresponding lane of else_value().

The implementor of this trait is free to choose on what cases any of those closures are implemented.

Dyn Compatibility§

This trait is not dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.

Implementations on Foreign Types§

Source§

impl SimdBool for bool

Source§

fn bitmask(self) -> u64

Source§

fn and(self) -> bool

Source§

fn or(self) -> bool

Source§

fn xor(self) -> bool

Source§

fn all(self) -> bool

Source§

fn any(self) -> bool

Source§

fn none(self) -> bool

Source§

fn if_else<Res: SimdValue<SimdBool = Self>>( self, if_value: impl FnOnce() -> Res, else_value: impl FnOnce() -> Res, ) -> Res

Source§

fn if_else2<Res: SimdValue<SimdBool = Self>>( self, if_value: impl FnOnce() -> Res, else_if: (impl FnOnce() -> Self, impl FnOnce() -> Res), else_value: impl FnOnce() -> Res, ) -> Res

Source§

fn if_else3<Res: SimdValue<SimdBool = Self>>( self, if_value: impl FnOnce() -> Res, else_if: (impl FnOnce() -> Self, impl FnOnce() -> Res), else_else_if: (impl FnOnce() -> Self, impl FnOnce() -> Res), else_value: impl FnOnce() -> Res, ) -> Res

Implementors§