Skip to content

Safe conversions between Array and [T; N] #24

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jan 25, 2024
Merged

Conversation

tarcieri
Copy link
Member

Simply bounding on ArrayType<T> = [T; N] is enough to accomplish this.

I've verified this change against a few of our repos (e.g. block-ciphers, elliptic-curve) and it does not seem to cause any inference problems.

When this bound is in place there's no need for ArrayOps<T, N> either.

Simply bounding on `ArrayType<T> = [T; N]` is enough to accomplish this.

I've verified this change against a few of our repos (e.g.
`block-ciphers`, `elliptic-curve`) and it does not seem to cause any
inference problems.

When this bound is in place there's no need for `ArrayOps<T, N>` either.
@tarcieri tarcieri requested a review from newpavlov January 25, 2024 21:46
@tarcieri
Copy link
Member Author

I guess I was worried that this bound might be viral and it would require downstream bounds, but now that I can actually integration test it against large repos it doesn't seem to be causing any problems.

Perhaps we could even get rid of ArrayOps this way, and just bound on ArraySize<ArrayType<T> = [T; N]> instead, which is both clearer/more explicit and can get rid of unsafe in certain circumstances like this.

@tarcieri tarcieri merged commit aaa466e into master Jan 25, 2024
@tarcieri tarcieri deleted the safe-array-conversions branch January 25, 2024 21:50
tarcieri added a commit that referenced this pull request Jan 25, 2024
Continuation of the approach from #24 which replaces `ArrayOps<T, N>`
bounds with `ArraySize<ArrayType<T> = [T; N]>`.

Though a bit more verbose, this makes the inner type of `Array` explicit
and therefore allows more safe conversions as well as making `unsafe`
code easier to reason about, since the inner type is no longer implicit.

This doesn't go as far as to remove the `ArrayOps` (and `SliceOps)
trait(s) yet, but that should now be possible.
tarcieri added a commit that referenced this pull request Jan 25, 2024
Continuation of the approach from #24 which replaces `ArrayOps<T, N>`
bounds with `ArraySize<ArrayType<T> = [T; N]>`.

Though a bit more verbose, this makes the inner type of `Array` explicit
and therefore allows more safe conversions as well as making `unsafe`
code easier to reason about, since the inner type is no longer implicit.

This doesn't go as far as to remove the `ArrayOps` (and `SliceOps`)
trait(s) yet, but that should now be possible.
tarcieri added a commit that referenced this pull request Jan 27, 2024
After #24, #25, and #26, these traits don't really need to exist and
have largely been replaced by safe type conversions with appropriate
bounds.

In lieu of `ArrayOps<T, N>` we instead can use
`U: ArraySize<ArrayType<T> = [T; N]>>` as a bound, which albeit a bit
more verbose concretely describes the inner type of `Array` to the
compiler.

The `cast_slice_(to|from)_core(_mut)` methods previously defined on the
trait have been preserved, but as static methods of `Array`, making the
change largely a drop in replacement. Places where they were being
called as e.g. `ArrayOps::cast_slice_to_core` just need to be called as
`Array::cast_slice_to_core` instead.
tarcieri added a commit that referenced this pull request Jan 27, 2024
After #24, #25, and #26, these traits don't really need to exist and
have largely been replaced by safe type conversions with appropriate
bounds.

In lieu of `ArrayOps<T, N>` we instead can use
`U: ArraySize<ArrayType<T> = [T; N]>>` as a bound, which albeit a bit
more verbose concretely describes the inner type of `Array` to the
compiler.

The `cast_slice_(to|from)_core(_mut)` methods previously defined on the
trait have been preserved, but as static methods of `Array`, making the
change largely a drop in replacement. Places where they were being
called as e.g. `ArrayOps::cast_slice_to_core` just need to be called as
`Array::cast_slice_to_core` instead.
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