-
Notifications
You must be signed in to change notification settings - Fork 1.6k
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
Allow slicing to fixed-length arrays #1833
Comments
So it doesn’t work with the slicing/indexing syntax, but I agree that it would be nice to have some API that does this. However, doing it "right" likely requires type-lever integers. With made-up syntax, it could look like: impl<T> [T] {
pub fn as_array<int N>(&self) -> &[T; N] {
assert_eq!(self.len(), N);
let ptr = self.as_ptr() as *const [T; N];
unsafe { &*ptr }
}
} In the meantime, you can fake it with a macro like the one used in ring.
If the size is fixed for your program that’s even easier. You can use a similar pattern, casting raw pointers: fn to_4x4(array: &[f32; 16]) -> &[[f32; 4]; 4] {
unsafe { &*(array as *const _ as *const _) }
} However this case is more complicated than |
Ah! Thanks for your solution. Yeah, it would be really handy to have these type-level integers. |
Use the arrayref crate until we get type-level integers or similar. |
How about allowing something similar to zig? |
Update since my 7-years-old comment above: we now have const generics, and these impls in the standard library: impl<T, const N: usize> TryFrom<&[T]> for &[T; N]
impl<T, const N: usize> TryFrom<&[T]> for [T; N] where T: Copy So you can write: let y: [_; 4] = (&x[5..][..4]).try_into().unwrap(); Maybe with a helper function: fn const_slice_to<T, const N: usize>(x: &[T]) -> &[T; N] {
x.try_into().unwarp()
}
let y: [_; 4] = *const_slice_to(x); // or:
let y = *const_slice_to::<4>(x); |
I think it would be nice to do something like that:
Why isn't
y
of type[i32; 2]
now?I wanted to convert a
[f32; 16]
to an[[f32; 4]; 4]
, however there seems to be no easy way to do that.The text was updated successfully, but these errors were encountered: