// Copyright © 2021-2022 Rouven Spreckels <rs@qu1x.dev>
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at https://mozilla.org/MPL/2.0/.
//! Lane-Associated Vector (LAV): [Portable SIMD] vector trait as GAT of SIMD lane trait.
//!
//! **NOTE**: This crate requires nightly Rust.
//!
//! # Features
//!
//! * SIMD lane trait [`Real`] abstracting over [`f32`] and [`f64`].
//! * SIMD vector trait [`SimdReal<Real, LANES>`] abstracting over [`Simd<f32, LANES>`] and
//! [`Simd<f64, LANES>`].
//! * Generic associated type (GAT) [`Real::Simd<LANES>`] as part of SIMD lane trait [`Real`]
//! implementing SIMD vector trait [`SimdReal<Self, LANES>`] for itself as lane type where the
//! GAT is generic over the number of SIMD vector `LANES`.
//! * Lanewise approximate equality test wrt to epsilon and [ULP] SIMD vectors.
//! * [`ApproxEq`] trait complementing [`PartialEq`].
//! * Safe [`FromUnchecked`] and [`IntoUnchecked`] complementing [`From`] and [`Into`] where the
//! behavior may be [unspecified] but will not result in undefined behavior if the caller breaks
//! any logical constraint.
//! * Non-reflexive [`PeelFrom`] and [`PeelInto`] traits complementing [`From`] and [`Into`]
//! without conflicting implementations.
//! * Safe [`WrapFromUnchecked`] and [`WrapIntoUnchecked`] complementing [`PeelFrom`] and
//! [`PeelInto`] where the behavior may be [unspecified] but will not result in undefined
//! behavior if the caller breaks any logical constraint.
//! * [`Assert`] structure asserting constant generic expression when bound by trait [`True`].
//! * [`no_std`] without loss of functionality by enabling the [`libm`] feature.
//!
//! This [`example`] uses SIMD generically over floating-point types while hiding it from the user.
//!
//! [Portable SIMD]: `core::simd`
//! [`Simd<f32, LANES>`]: `core::simd::Simd`
//! [`Simd<f64, LANES>`]: `core::simd::Simd`
//! [`Real::Simd<LANES>`]: `Real::Simd`
//! [`libm`]: https://docs.rs/libm
//! [`no_std`]: https://docs.rust-embedded.org/book/intro/no-std.html
//! [ULP]: https://en.wikipedia.org/wiki/Unit_in_the_last_place
//! [unspecified]: https://doc.rust-lang.org/reference/behavior-not-considered-unsafe.html
pub use *;
pub use *;
pub use *;
pub use *;
pub use *;
/// Selects lanes from two vectors by mask vector.
/// Tests for approximate equality.
/// Compile-time unchecked but safe [`From`].
///
/// **Note:** This trait must not fail.
///
/// # Unchecked
///
/// If the caller breaks any logical constraint, the behavior may be [unspecified] but will not
/// result in undefined behavior.
///
/// [unspecified]: https://doc.rust-lang.org/reference/behavior-not-considered-unsafe.html
///
/// # Generic Implementations
///
/// * [`FromUnchecked`]`<T> for U` implies (auto-implements) [`IntoUnchecked`]`<U> for T`.
/// * [`FromUnchecked`]`<T>` implies (auto-implements) [`FromUnchecked`]`<T> for T` (reflexive).
/// Compile-time unchecked but safe [`Into`].
///
/// **Note:** This trait must not fail.
///
/// # Unchecked
///
/// If the caller breaks any logical constraint, the behavior may be [unspecified] but will not
/// result in undefined behavior.
///
/// [unspecified]: https://doc.rust-lang.org/reference/behavior-not-considered-unsafe.html
///
/// # Generic Implementations
///
/// * Implied (auto-implemented) by [`FromUnchecked`]`<T> for U`.
/// [`From`] without reflexive `impl<T> `[`From`]`<T> for T`.
///
/// **Note:** This trait must not fail.
///
/// # Generic Implementations
///
/// * [`PeelFrom`]`<T> for U` implies (auto-implements) [`PeelInto`]`<U> for T`.
/// [`Into`] without reflexive `impl<U> `[`Into`]`<U> for U`.
///
/// **Note:** This trait must not fail.
///
/// # Generic Implementations
///
/// * Implied (auto-implemented) by [`PeelFrom`]`<T> for U`.
/// Compile-time unchecked but safe inverse of [`PeelFrom`].
///
/// **Note:** This trait must not fail.
///
/// # Unchecked
///
/// If the caller breaks any logical constraint, the behavior may be [unspecified] but will not
/// result in undefined behavior.
///
/// [unspecified]: https://doc.rust-lang.org/reference/behavior-not-considered-unsafe.html
///
/// # Generic Implementations
///
/// * [`WrapFromUnchecked`]`<T> for U` implies (auto-implements) [`WrapIntoUnchecked`]`<U> for T`.
/// Compile-time unchecked but safe inverse of [`PeelInto`].
///
/// **Note:** This trait must not fail.
///
/// # Unchecked
///
/// If the caller breaks any logical constraint, the behavior may be [unspecified] but will not
/// result in undefined behavior.
///
/// [unspecified]: https://doc.rust-lang.org/reference/behavior-not-considered-unsafe.html
///
/// # Generic Implementations
///
/// * Implied (auto-implemented) by [`WrapFromUnchecked`]`<T> for U`.
/// Asserts constant generic expression `E` when bound by [`True`].
/// Implemented for [`Assert`] with true expression.