|
| template<index_t N = 8, simdifiable VA, simdifiable VS, simdifiable VAo, simdifiable VSo> |
| index_t | compress_masks (VA &&Ain, VS &&Sin, VAo &&Aout, VSo &&Sout) |
| template<index_t N = 8, simdifiable VS> |
| index_t | compress_masks_count (VS &&Sin) |
| template<index_t N = 8, simdifiable VA, simdifiable VS, simdifiable VAo> |
| index_t | compress_masks_sqrt (VA &&Ain, VS &&Sin, VAo &&Aout) |
| template<index_t N = 8, simdifiable VA, simdifiable VS, simdifiable VAo, simdifiable VSo> |
| index_t | compress_masks_sqrt (VA &&Ain, VS &&Sin, VAo &&Aout, VSo &&Sout) |
|
| template<simdifiable VA, simdifiable VB, simdifiable VD, simdifiable Vd, detail::gemm_diag::track_zeros_opt... Opts> |
| void | gemm_diag (VA &&A, VB &&B, VD &&D, Vd &&d, Opts... opts) |
| | D = A diag(d) B.
|
| template<simdifiable VA, simdifiable VB, simdifiable VC, simdifiable VD, simdifiable Vd, detail::gemm_diag::track_zeros_opt... Opts> |
| void | gemm_diag_add (VA &&A, VB &&B, VC &&C, VD &&D, Vd &&d, Opts... opts) |
| | D = C + A diag(d) B.
|
| template<simdifiable VA, simdifiable VB, simdifiable VD, simdifiable Vd, detail::gemm_diag::track_zeros_opt... Opts> |
| void | gemm_diag_add (VA &&A, VB &&B, VD &&D, Vd &&d, Opts... opts) |
| | D += A diag(d) B.
|
| template<MatrixStructure SC, simdifiable VA, simdifiable VC, simdifiable VD, simdifiable Vd, detail::gemm_diag::track_zeros_opt... Opts> |
| void | syrk_diag_add (VA &&A, Structured< VC, SC > C, Structured< VD, SC > D, Vd &&d, Opts... opts) |
| | D = C + A diag(d) Aᵀ with C, D symmetric.
|
| template<MatrixStructure SC, simdifiable VA, simdifiable VD, simdifiable Vd, detail::gemm_diag::track_zeros_opt... Opts> |
| void | syrk_diag_add (VA &&A, Structured< VD, SC > D, Vd &&d, Opts... opts) |
| | D += A diag(d) Aᵀ with D symmetric.
|
|
| template<simdifiable VA, simdifiable VB, simdifiable VD, shift_opt... Opts> |
| void | gemm (VA &&A, VB &&B, VD &&D, TilingOptions packing={}, Opts... opts) |
| | D = A B.
|
| template<simdifiable VA, simdifiable VB, simdifiable VD, shift_opt... Opts> |
| void | gemm_neg (VA &&A, VB &&B, VD &&D, TilingOptions packing={}, Opts... opts) |
| | D = -A B.
|
| template<simdifiable VA, simdifiable VB, simdifiable VC, simdifiable VD, shift_opt... Opts> |
| void | gemm_add (VA &&A, VB &&B, VC &&C, VD &&D, TilingOptions packing={}, Opts... opts) |
| | D = C + A B.
|
| template<simdifiable VA, simdifiable VB, simdifiable VD, shift_opt... Opts> |
| void | gemm_add (VA &&A, VB &&B, VD &&D, TilingOptions packing={}, Opts... opts) |
| | D += A B.
|
| template<simdifiable VA, simdifiable VB, simdifiable VC, simdifiable VD, shift_opt... Opts> |
| void | gemm_sub (VA &&A, VB &&B, VC &&C, VD &&D, TilingOptions packing={}, Opts... opts) |
| | D = C - A B.
|
| template<simdifiable VA, simdifiable VB, simdifiable VD, shift_opt... Opts> |
| void | gemm_sub (VA &&A, VB &&B, VD &&D, TilingOptions packing={}, Opts... opts) |
| | D -= A B.
|
|
| template<MatrixStructure SA, MatrixStructure SD, simdifiable VA, simdifiable VD, shift_opt... Opts> |
| void | syrk (Structured< VA, SA > A, Structured< VD, SD > D, Opts... opts) |
| | D = A Aᵀ with D symmetric.
|
| template<MatrixStructure SD, class TA, simdifiable VD, shift_opt... Opts> |
| void | syrk (TA &&A, Structured< VD, SD > D, Opts... opts) |
| | D = A Aᵀ with D symmetric.
|
| template<MatrixStructure SD, simdifiable VD, shift_opt... Opts> |
| void | syrk (Structured< VD, SD > D, Opts... opts) |
| | D = D Dᵀ with D triangular on input and symmetric on output.
|
| template<MatrixStructure SA, MatrixStructure SD, simdifiable VA, simdifiable VD, shift_opt... Opts> |
| void | syrk_neg (Structured< VA, SA > A, Structured< VD, SD > D, Opts... opts) |
| | D = -A Aᵀ with D symmetric.
|
| template<MatrixStructure SD, class TA, simdifiable VD, shift_opt... Opts> |
| void | syrk_neg (TA &&A, Structured< VD, SD > D, Opts... opts) |
| | D = A Aᵀ with D symmetric.
|
| template<MatrixStructure SD, simdifiable VD, shift_opt... Opts> |
| void | syrk_neg (Structured< VD, SD > D, Opts... opts) |
| | D = -D Dᵀ with D triangular on input and symmetric on output.
|
| template<MatrixStructure SD, simdifiable VA, simdifiable VC, simdifiable VD, shift_opt... Opts> |
| void | syrk_add (VA &&A, Structured< VC, SD > C, Structured< VD, SD > D, Opts... opts) |
| | D = C + A Aᵀ with C, D symmetric.
|
| template<MatrixStructure SD, simdifiable VA, simdifiable VD, shift_opt... Opts> |
| void | syrk_add (VA &&A, Structured< VD, SD > D, Opts... opts) |
| | D += A Aᵀ with D symmetric.
|
| template<MatrixStructure SD, simdifiable VA, simdifiable VC, simdifiable VD, shift_opt... Opts> |
| void | syrk_sub (VA &&A, Structured< VC, SD > C, Structured< VD, SD > D, Opts... opts) |
| | D = C - A Aᵀ with C, D symmetric.
|
| template<MatrixStructure SD, simdifiable VA, simdifiable VD, shift_opt... Opts> |
| void | syrk_sub (VA &&A, Structured< VD, SD > D, Opts... opts) |
| | D -= A Aᵀ with D symmetric.
|
|
| template<MatrixStructure SA, MatrixStructure SB, MatrixStructure SD, simdifiable VA, simdifiable VB, simdifiable VD, shift_opt... Opts> |
| void | trmm (Structured< VA, SA > A, Structured< VB, SB > B, Structured< VD, SD > D, Opts... opts) |
| | D = A B with A and/or B triangular.
|
| template<class TA, class TB, class TD, shift_opt... Opts> |
| void | trmm (TA &&A, TB &&B, TD &&D, Opts... opts) |
| | D = A B with A and/or B triangular.
|
| template<MatrixStructure SA, simdifiable VA, simdifiable VD, shift_opt... Opts> |
| void | trmm (Structured< VA, SA > A, VD &&D, Opts... opts) |
| | D = A D with A triangular.
|
| template<MatrixStructure SB, simdifiable VB, simdifiable VD, shift_opt... Opts> |
| void | trmm (VD &&D, Structured< VB, SB > B, Opts... opts) |
| | D = D B with B triangular.
|
| template<MatrixStructure SA, MatrixStructure SB, MatrixStructure SD, simdifiable VA, simdifiable VB, simdifiable VD, shift_opt... Opts> |
| void | trmm_neg (Structured< VA, SA > A, Structured< VB, SB > B, Structured< VD, SD > D, Opts... opts) |
| | D = -A B with A and/or B triangular.
|
| template<class TA, class TB, class TD, shift_opt... Opts> |
| void | trmm_neg (TA &&A, TB &&B, TD &&D, Opts... opts) |
| | D = -A B with A and/or B triangular.
|
| template<MatrixStructure SA, MatrixStructure SB, MatrixStructure SD, simdifiable VA, simdifiable VB, simdifiable VC, simdifiable VD, shift_opt... Opts> |
| void | trmm_add (Structured< VA, SA > A, Structured< VB, SB > B, Structured< VC, SD > C, Structured< VD, SD > D, Opts... opts) |
| | D = C + A B with A and/or B triangular.
|
| template<class TA, class TB, class TC, class TD, shift_opt... Opts> |
| void | trmm_add (TA &&A, TB &&B, TC &&C, TD &&D, Opts... opts) |
| | D = C + A B with A and/or B triangular.
|
| template<MatrixStructure SA, MatrixStructure SB, MatrixStructure SD, simdifiable VA, simdifiable VB, simdifiable VC, simdifiable VD, shift_opt... Opts> |
| void | trmm_sub (Structured< VA, SA > A, Structured< VB, SB > B, Structured< VC, SD > C, Structured< VD, SD > D, Opts... opts) |
| | D = C - A B with A and/or B triangular.
|
| template<class TA, class TB, class TC, class TD, shift_opt... Opts> |
| void | trmm_sub (TA &&A, TB &&B, TC &&C, TD &&D, Opts... opts) |
| | D = C - A B with A and/or B triangular.
|
|
| template<simdifiable VA, simdifiable VB, simdifiable VD, shift_opt... Opts> |
| void | gemv (VA &&A, VB &&B, VD &&D, Opts... opts) |
| | d = A b
|
| template<simdifiable VA, simdifiable VB, simdifiable VD, shift_opt... Opts> |
| void | gemv_neg (VA &&A, VB &&B, VD &&D, Opts... opts) |
| | d = -A b
|
| template<simdifiable VA, simdifiable VB, simdifiable VC, simdifiable VD, shift_opt... Opts> |
| void | gemv_add (VA &&A, VB &&B, VC &&C, VD &&D, Opts... opts) |
| | d = c + A b
|
| template<simdifiable VA, simdifiable VB, simdifiable VD, shift_opt... Opts> |
| void | gemv_add (VA &&A, VB &&B, VD &&D, Opts... opts) |
| | d = d + A b
|
| template<simdifiable VA, simdifiable VB, simdifiable VC, simdifiable VD, shift_opt... Opts> |
| void | gemv_sub (VA &&A, VB &&B, VC &&C, VD &&D, Opts... opts) |
| | d = c - A b
|
| template<simdifiable VA, simdifiable VB, simdifiable VD, shift_opt... Opts> |
| void | gemv_sub (VA &&A, VB &&B, VD &&D, Opts... opts) |
| | d = d - A b
|
|
| template<MatrixStructure SL, simdifiable VL, simdifiable VA, simdifiable Vd> |
| void | hyhound_diag (Structured< VL, SL > L, VA &&A, Vd &&d) |
| | Update Cholesky factor L using low-rank term A diag(d) Aᵀ.
|
| template<MatrixStructure SL, simdifiable VL, simdifiable VA, simdifiable Vd, simdifiable VW> |
| void | hyhound_diag (Structured< VL, SL > L, VA &&A, Vd &&d, VW &&W) |
| | Update Cholesky factor L using low-rank term A diag(d) Aᵀ, with full Householder representation.
|
| template<MatrixStructure SL, simdifiable VL> |
| auto | hyhound_size_W (Structured< VL, SL > L) |
| | Get the size of the storage for the matrix W returned by hyhound_diag(Structured<VL,SL>, VA&&, Vd&&, VW&&).
|
| template<simdifiable VL, simdifiable VA, simdifiable VD, simdifiable VB, simdifiable Vd, simdifiable VW> |
| void | hyhound_diag_apply (VL &&L, VA &&A, VD &&D, VB &&B, Vd &&d, VW &&W, index_t kA_in_offset=0) |
| | Apply Householder transformation generated by hyhound_diag, computing (L̃, D) = (L, A) Q̆.
|
| template<simdifiable VL, simdifiable VA, simdifiable VB, simdifiable Vd, simdifiable VW> |
| void | hyhound_diag_apply (VL &&L, VA &&A, VB &&B, Vd &&d, VW &&W) |
| | Apply Householder transformation generated by hyhound_diag, computing (L̃, Ã) = (L, A) Q̆.
|
| template<MatrixStructure SL, simdifiable VL, simdifiable VA, simdifiable Vd> |
| void | hyhound_sign (Structured< VL, SL > L, VA &&A, Vd &&d) |
| | Update Cholesky factor L using low-rank term A diag(copysign(1, d)) Aᵀ, where d contains only ±0 values.
|
| template<MatrixStructure SL, simdifiable VL1, simdifiable VA1, simdifiable VL2, simdifiable VA2, simdifiable Vd> |
| void | hyhound_diag_2 (Structured< VL1, SL > L1, VA1 &&A1, VL2 &&L2, VA2 &&A2, Vd &&d) |
| | Update Cholesky factor L using low-rank term A diag(d) Aᵀ, where L and A are stored as two separate block rows.
|
| template<MatrixStructure SL, simdifiable VL11, simdifiable VA1, simdifiable VL21, simdifiable VA2, simdifiable VA2o, simdifiable VU, simdifiable VA3, simdifiable VA3o, simdifiable Vd> |
| void | hyhound_diag_cyclic (Structured< VL11, SL > L11, VA1 &&A1, VL21 &&L21, VA2 &&A22, VA2o &&A2_out, VU &&L31, VA3 &&A31, VA3o &&A3_out, Vd &&d) |
| | Update structured Cholesky factor L using structured low-rank term A diag(d) Aᵀ,.
|
| template<MatrixStructure SL, simdifiable VL11, simdifiable VA1, simdifiable VL21, simdifiable VA2, simdifiable VA2o, simdifiable VLu1, simdifiable VAuo, simdifiable Vd> |
| void | hyhound_diag_riccati (Structured< VL11, SL > L11, VA1 &&A1, VL21 &&L21, VA2 &&A2, VA2o &&A2_out, VLu1 &&Lu1, VAuo &&Au_out, Vd &&d, bool shift_A_out=false) |
| | Update structured Cholesky factor L using structured low-rank term A diag(d) Aᵀ,.
|
|
| template<MatrixStructure SC, simdifiable VA, simdifiable VC, simdifiable VD> |
| void | syrk_add_potrf (VA &&A, Structured< VC, SC > C, Structured< VD, SC > D, simdified_value_t< VA > regularization=0) |
| | D = chol(C + AAᵀ) with C symmetric, D triangular.
|
| template<MatrixStructure SC, simdifiable VA, simdifiable VD> |
| void | syrk_add_potrf (VA &&A, Structured< VD, SC > D) |
| | D = chol(D + AAᵀ) with D symmetric/triangular.
|
| template<MatrixStructure SC, simdifiable VA, simdifiable VC, simdifiable VD> |
| void | syrk_sub_potrf (VA &&A, Structured< VC, SC > C, Structured< VD, SC > D, simdified_value_t< VA > regularization=0) |
| | D = chol(C - AAᵀ) with C symmetric, D triangular.
|
| template<MatrixStructure SC, simdifiable VA, simdifiable VD> |
| void | syrk_sub_potrf (VA &&A, Structured< VD, SC > D, simdified_value_t< VA > regularization=0) |
| | D = chol(D - AAᵀ) with D symmetric/triangular.
|
| template<MatrixStructure SC, simdifiable VA, simdifiable VC, simdifiable VD, simdifiable Vd> |
| void | syrk_diag_add_potrf (VA &&A, Structured< VC, SC > C, Structured< VD, SC > D, Vd &&d, simdified_value_t< VA > regularization=0) |
| | D = chol(C + A diag(d) Aᵀ) with C symmetric, D triangular.
|
| template<MatrixStructure SC, simdifiable VA, simdifiable VD, simdifiable Vd> |
| void | syrk_diag_add_potrf (VA &&A, Structured< VD, SC > D, Vd &&d) |
| | D = chol(D + A diag(d) Aᵀ) with D symmetric/triangular.
|
| template<MatrixStructure SC, simdifiable VC, simdifiable VD> |
| void | potrf (Structured< VC, SC > C, Structured< VD, SC > D, simdified_value_t< VC > regularization=0) |
| | D = chol(C) with C symmetric, D triangular.
|
| template<MatrixStructure SD, simdifiable VD> |
| void | potrf (Structured< VD, SD > D, simdified_value_t< VD > regularization=0) |
| | D = chol(D) with D symmetric/triangular.
|
|
| template<MatrixStructure SA, simdifiable VA, simdifiable VB, simdifiable VD> |
| void | symv (Structured< VA, SA > A, VB &&B, VD &&D) |
| | d = A b where A is symmetric
|
| template<MatrixStructure SA, simdifiable VA, simdifiable VB, simdifiable VD> |
| void | symv_neg (Structured< VA, SA > A, VB &&B, VD &&D) |
| | d = -A b where A is symmetric
|
| template<MatrixStructure SA, simdifiable VA, simdifiable VB, simdifiable VC, simdifiable VD> |
| void | symv_add (Structured< VA, SA > A, VB &&B, VC &&C, VD &&D) |
| | d = c + A b where A is symmetric
|
| template<MatrixStructure SA, simdifiable VA, simdifiable VB, simdifiable VD> |
| void | symv_add (Structured< VA, SA > A, VB &&B, VD &&D) |
| | d = d + A b where A is symmetric
|
| template<MatrixStructure SA, simdifiable VA, simdifiable VB, simdifiable VC, simdifiable VD> |
| void | symv_sub (Structured< VA, SA > A, VB &&B, VC &&C, VD &&D) |
| | d = c - A b where A is symmetric
|
| template<MatrixStructure SA, simdifiable VA, simdifiable VB, simdifiable VD> |
| void | symv_sub (Structured< VA, SA > A, VB &&B, VD &&D) |
| | d = d - A b where A is symmetric
|
|
| template<MatrixStructure SA, simdifiable VA, simdifiable VB, simdifiable VD, int RotB = 0> |
| void | trsm (Structured< VA, SA > A, VB &&B, VD &&D, with_rotate_B_t< RotB >={}) |
| | D = A⁻¹ B with A triangular.
|
| template<MatrixStructure SA, simdifiable VA, simdifiable VD, int RotB = 0> |
| void | trsm (Structured< VA, SA > A, VD &&D, with_rotate_B_t< RotB > shift={}) |
| | D = A⁻¹ D with A triangular.
|
| template<MatrixStructure SB, simdifiable VA, simdifiable VB, simdifiable VD, int RotA = 0> |
| void | trsm (VA &&A, Structured< VB, SB > B, VD &&D, with_rotate_A_t< RotA >={}) |
| | D = A B⁻¹ with B triangular.
|
| template<MatrixStructure SB, simdifiable VB, simdifiable VD, int RotA = 0> |
| void | trsm (VD &&D, Structured< VB, SB > B, with_rotate_A_t< RotA > shift={}) |
| | D = D B⁻¹ with B triangular.
|
|
| template<class V> |
| using | simdified_view_type = detail::simdified_view_type<std::remove_reference_t<V>> |
| | Convert the given view or matrix type V (batmat::matrix::View or batmat::matrix::Matrix) to a batched view type using a deduced SIMD type.
|
| template<simdifiable V> |
| using | simdified_view_t = typename simdified_view_type<V>::type |
| template<class V> |
| using | simdified_value_t = typename detail::simdified_value<V>::type |
| template<class V> |
| using | simdified_abi_t = typename detail::simdified_abi<V>::type |
| template<class V> |
| using | simdified_multi_view_type = detail::simdified_multi_view_type<std::remove_reference_t<V>> |
| template<simdifiable_multi V> |
| using | simdified_multi_view_t = typename simdified_multi_view_type<V>::type |
| template<class T, class Abi, StorageOrder Order = StorageOrder::ColMajor> |
| using | view = simd_view_types<std::remove_const_t<T>, Abi>::template view<T, Order> |
| template<class T, class Abi, StorageOrder Order = StorageOrder::ColMajor> |
| using | matrix = simd_view_types<std::remove_const_t<T>, Abi>::template matrix<T, Order> |
| template<class Abi, StorageOrder Order = StorageOrder::ColMajor> |
| using | real_view = simd_view_types<real_t, Abi>::template view<const real_t, Order> |
| template<class Abi, StorageOrder Order = StorageOrder::ColMajor> |
| using | mut_real_view = simd_view_types<real_t, Abi>::template view<real_t, Order> |
|
| constexpr auto | simdify (simdifiable auto &&a) -> simdified_view_t< decltype(a)> |
| constexpr auto | simdify (simdifiable_multi auto &&a) -> simdified_multi_view_t< decltype(a)> |
| constexpr MatrixStructure | transpose (MatrixStructure s) |
| template<class M> |
| | Structured (M &&) -> Structured< M > |
| template<class M, MatrixStructure S> |
| void | simdify (const Structured< M, S > &)=delete |
| template<index_t Rows, index_t Cols, class T, class Abi, StorageOrder Order> |
| cached_uview< Order==StorageOrder::ColMajor ? Cols :Rows, T, Abi, Order > | with_cached_access (const uview< T, Abi, Order > &o) noexcept |
| template<index_t Rows, index_t Cols, class T, class Abi> |
| cached_uview< Cols, T, Abi, StorageOrder::ColMajor > | with_cached_access (const uview< T, Abi, StorageOrder::ColMajor > &o) noexcept |
| template<index_t Rows, index_t Cols, class T, class Abi> |
| uview< T, Abi, StorageOrder::RowMajor > | with_cached_access (const uview< T, Abi, StorageOrder::RowMajor > &o) noexcept |
| template<index_t Rows, index_t Cols, class T, class Abi> |
| cached_uview< Rows, T, Abi, StorageOrder::RowMajor > | with_cached_access (const uview< T, Abi, StorageOrder::RowMajor > &o) noexcept |
| template<index_t Rows, index_t Cols, class T, class Abi> |
| uview< T, Abi, StorageOrder::ColMajor > | with_cached_access (const uview< T, Abi, StorageOrder::ColMajor > &o) noexcept |
|
| template<bool Z = true> |
| constexpr track_zeros_t< Z > | track_zeros |
| template<int I> |
| constexpr with_shift_A_t< I > | with_shift_A |
| template<int I> |
| constexpr with_rotate_B_t< I > | with_rotate_B |
| template<int I> |
| constexpr with_rotate_C_t< I > | with_rotate_C |
| template<int I> |
| constexpr with_rotate_D_t< I > | with_rotate_D |
| template<int I> |
| constexpr with_mask_D_t< I > | with_mask_D |
| template<class...> |
| constexpr std::optional< int > | shift_A = std::nullopt |
| template<class T, class... Ts> |
| constexpr std::optional< int > | shift_A< T, Ts... > = shift_A<Ts...> |
| template<int I, class... Ts> |
| constexpr std::optional< int > | shift_A< with_shift_A_t< I >, Ts... > = I |
| template<class...> |
| constexpr std::optional< int > | rotate_B = std::nullopt |
| template<class T, class... Ts> |
| constexpr std::optional< int > | rotate_B< T, Ts... > = rotate_B<Ts...> |
| template<int I, class... Ts> |
| constexpr std::optional< int > | rotate_B< with_rotate_B_t< I >, Ts... > = I |
| template<class...> |
| constexpr std::optional< int > | rotate_C = std::nullopt |
| template<class T, class... Ts> |
| constexpr std::optional< int > | rotate_C< T, Ts... > = rotate_C<Ts...> |
| template<int I, class... Ts> |
| constexpr std::optional< int > | rotate_C< with_rotate_C_t< I >, Ts... > = I |
| template<class...> |
| constexpr std::optional< int > | rotate_D = std::nullopt |
| template<class T, class... Ts> |
| constexpr std::optional< int > | rotate_D< T, Ts... > = rotate_D<Ts...> |
| template<int I, class... Ts> |
| constexpr std::optional< int > | rotate_D< with_rotate_D_t< I >, Ts... > = I |
| template<class...> |
| constexpr std::optional< int > | mask_D = std::nullopt |
| template<class T, class... Ts> |
| constexpr std::optional< int > | mask_D< T, Ts... > = mask_D<Ts...> |
| template<int I, class... Ts> |
| constexpr std::optional< int > | mask_D< with_mask_D_t< I >, Ts... > = I |
| template<class> |
| constexpr bool | is_shift_opt = false |
| template<int I> |
| constexpr bool | is_shift_opt< with_shift_A_t< I > > = true |
| template<int I> |
| constexpr bool | is_shift_opt< with_rotate_B_t< I > > = true |
| template<int I> |
| constexpr bool | is_shift_opt< with_rotate_C_t< I > > = true |
| template<int I> |
| constexpr bool | is_shift_opt< with_rotate_D_t< I > > = true |
| template<int I> |
| constexpr bool | is_shift_opt< with_mask_D_t< I > > = true |
| template<int I> |
| constexpr with_rotate_t< I > | with_rotate |
| template<int I> |
| constexpr with_mask_t< I > | with_mask |
| template<class...> |
| constexpr std::optional< int > | get_rotate = std::nullopt |
| template<class T, class... Ts> |
| constexpr std::optional< int > | get_rotate< T, Ts... > = get_rotate<Ts...> |
| template<int I, class... Ts> |
| constexpr std::optional< int > | get_rotate< with_rotate_t< I >, Ts... > = I |
| template<class...> |
| constexpr std::optional< int > | get_mask = std::nullopt |
| template<class T, class... Ts> |
| constexpr std::optional< int > | get_mask< T, Ts... > = get_mask<Ts...> |
| template<int I, class... Ts> |
| constexpr std::optional< int > | get_mask< with_mask_t< I >, Ts... > = I |
| template<class> |
| constexpr bool | is_rotate_opt = false |
| template<int I> |
| constexpr bool | is_rotate_opt< with_rotate_t< I > > = true |
| template<int I> |
| constexpr bool | is_rotate_opt< with_mask_t< I > > = true |
| template<class...> |
| constexpr bool | simdify_compatible = false |
| template<simdifiable V, simdifiable... Vs> |
| constexpr bool | simdify_compatible< V, Vs... > |
| template<int I> |
| constexpr with_rotate_A_t< I > | with_rotate_A |