-
Notifications
You must be signed in to change notification settings - Fork 192
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Implement a generic length parameter for Vec<T, N>
- Loading branch information
Showing
8 changed files
with
339 additions
and
190 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
use core::{ | ||
fmt::{Debug, Display}, | ||
ops::{Add, AddAssign, Sub, SubAssign}, | ||
}; | ||
|
||
macro_rules! impl_lentype { | ||
($($LenT:ty),*) => {$( | ||
impl LenType for $LenT { | ||
const ZERO: Self = 0; | ||
const ONE: Self = 1; | ||
const MAX: usize = Self::MAX as _; | ||
} | ||
)*} | ||
} | ||
|
||
pub trait LenType: | ||
Send | ||
+ Sync | ||
+ Copy | ||
+ Display | ||
+ Debug | ||
+ PartialEq | ||
+ Add<Output = Self> | ||
+ AddAssign | ||
+ Sub<Output = Self> | ||
+ SubAssign | ||
+ PartialOrd | ||
+ TryFrom<usize, Error: Debug> | ||
+ TryInto<usize, Error: Debug> | ||
{ | ||
const ZERO: Self; | ||
const ONE: Self; | ||
const MAX: usize; | ||
|
||
fn from_usize(val: usize) -> Self { | ||
val.try_into().unwrap() | ||
} | ||
fn into_usize(self) -> usize { | ||
self.try_into().unwrap() | ||
} | ||
} | ||
|
||
impl_lentype!(u8, u16, u32, usize); | ||
|
||
macro_rules! impl_lentodefault { | ||
($LenT:ty: $($len:literal),*) => {$( | ||
impl LenToDefault for Const<$len> { | ||
type Default = $LenT; | ||
} | ||
)*}; | ||
} | ||
|
||
pub struct Const<const N: usize>; | ||
|
||
#[diagnostic::on_unimplemented( | ||
message = "Length `N` does not have a default LenType mapping", | ||
note = "Provide the `LenType` explicitly, such as `usize`" | ||
)] | ||
pub trait LenToDefault { | ||
type Default: LenType; | ||
} | ||
|
||
pub type DefaultLenType<const N: usize> = <Const<N> as LenToDefault>::Default; | ||
|
||
impl_lentodefault!(u8: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255); | ||
impl_lentodefault!(u16: 256, 300, 400, 500, 512, 600, 700, 800, 900, 1000, 1024, 2000, 2048, 4000, 4096, 8000, 8192, 16000, 16384, 32000, 32768, 65000, 65535); | ||
impl_lentodefault!(u32: 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304, 8388608, 16777216, 33554432, 67108864, 134217728, 268435456, 536870912, 1073741824, 2147483648); | ||
|
||
pub const fn check_capacity_fits<LenT: LenType, const N: usize>() { | ||
assert!(LenT::MAX >= N, "The capacity is larger than LenT can hold, increase the size of `LenT` or reduce the capacity") | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.