Skip to content

ctutils: pluggable trait impls for [T] and [T; N]#1388

Merged
tarcieri merged 1 commit intomasterfrom
ctutils/pluggable-array-and-slice-impls
Jan 18, 2026
Merged

ctutils: pluggable trait impls for [T] and [T; N]#1388
tarcieri merged 1 commit intomasterfrom
ctutils/pluggable-array-and-slice-impls

Conversation

@tarcieri
Copy link
Copy Markdown
Member

Introduces a set of helper traits for the following:

  • CtAssign: CtAssignSlice
  • CtEq: CtEqSlice
  • CtSelect: CtSelectArray

Implementing a *Slice trait unlocks a blanket impl for the corresponding trait for [T], e.g. impl'ing CtAssignSlice for T means CtAssign will now work with [T].

Likewise, implementing CtSelectArray unlocks the blanket impl of CtSelect for [T; N], and CtSelectArray itself is already blanket impl'd for types which impl Clone + CtAssignSlice + CtSelect.

All traits provide a default implementation with the option to plug in a faster one. The implementations on core integers thunk to the corresponding Cmov/CmovEq impls on slices of core integers, which in some cases have been optimized (especially u8).

Introduces a set of helper traits for the following:

- `CtAssign`: `CtAssignSlice`
- `CtEq`: `CtEqSlice`
- `CtSelect`: `CtSelectArray`

Implementing a `*Slice` trait unlocks a blanket impl for the
corresponding trait for `[T]`, e.g. impl'ing `CtAssignSlice` for `T`
means `CtAssign` will now work with `[T]`.

Likewise, implementing `CtSelectArray` unlocks the blanket impl of
`CtSelect` for `[T; N]`, and `CtSelectArray` itself is already blanket
impl'd for types which impl `Clone + CtAssignSlice + CtSelect`.

All traits provide a default implementation with the option to plug in a
faster one. The implementations on core integers thunk to the
corresponding `Cmov`/`CmovEq` impls on slices of core integers, which
in some cases have been optimized (especially `u8`).
@tarcieri tarcieri merged commit b5d28ce into master Jan 18, 2026
12 checks passed
@tarcieri tarcieri deleted the ctutils/pluggable-array-and-slice-impls branch January 18, 2026 03:55
@tarcieri tarcieri mentioned this pull request Jan 20, 2026
tarcieri added a commit that referenced this pull request Jan 20, 2026
## Added
- `core::num::NonZero<T>` support (#1368)
- Pluggable trait impls for `[T]` and `[T; N]` with helper traits: (#1388)
  - `CtAssign`: `CtAssignSlice`
  - `CtEq`: `CtEqSlice`
  - `CtSelect`: `CtSelectArray`
- `CtSelectUsingCtAssign` marker trait (#1391)

## Changed
- Split `CtAssign` out of `CtSelect` (#1363)
- Bump `cmov` to v0.5 (#1386)

## Removed
- `BytesCtEq`/`BytesCtSelect` no longer needed because default `[u8]`
  impls are fast (#1376)
- `target_pointer_width` gating (#1389)
- `unsafe` code (#1405)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant