-
Notifications
You must be signed in to change notification settings - Fork 230
Closed
Labels
Description
The addition of LenType to vecs and the DefaultLenType means that arbitrary length of Vec are much less usable.
Not all lengths "just work" with Vec like they did previously
For example, the following: Vec<u8, 587> does not compile anymore, and needs to be worked around with Vec<u8, u16, 587>.
This itself is I think a significant downgrade in readability (the benefits of LenType are in most cases I think not worth making code less readable, since the overhead of the Vec itself will often be negligible compared to the buffer of the Vec).
In a library setting it forces the library writer to be explicit of the LenType:
fn some_func<const N: usize>() -> Vec<u8, N> {
todo!()
}Fails to compile with
error[E0277]: Length `N` does not have a default `LenType` mapping
--> src/lib.rs:261:35
|
261 | fn some_func<const N: usize>() -> Vec<u8, N> {
| ^^^^^^^^^^ the trait `SmallestLenType` is not implemented for `Const<N>`
|
= note: Provide the `LenType` explicitly, such as `usize`
= help: the following other types implement trait `SmallestLenType`:
Const<0>
Const<1000>
Const<100>
Const<101>
Const<1024>
Const<102>
Const<103>
Const<1048576>
and 287 others
It makes compatibility with View types much harder.
Because of the LenType the following fails to compile:
let vec: &mut VecView<u8> = Vec::<u8, 8>::new();error[E0308]: mismatched types
--> src/lib.rs:262:33
|
262 | let vec: &mut VecView<u8> = Vec::<u8, 8>::new();
| ---------------- ^^^^^^^^^^^^^^^^^^^ expected `&mut VecInner<u8, usize, ...>`, found `VecInner<u8, u8, ...>`
| |
| expected due to this
|
= note: expected mutable reference `&mut VecInner<_, usize, VecStorageInner<[MaybeUninit<u8>]>>`
found struct `VecInner<_, u8, VecStorageInner<[MaybeUninit<u8>; 8]>>
It can be worked around by specifying the LenType, but this will mean that the VecView will not coerce from most Vecs since most will not use usize as the LenType.
mkj