Expand description
Marker types for passing constants as type arguments.
§Example
This example emulates specialization,
eliding a .clone() call when the created array is only one element long.
use typewit::{const_marker::Usize, TypeCmp, TypeEq};
let arr = [3u8, 5, 8];
assert_eq!(repeat(3), []);
assert_eq!(repeat(3), [3]);
assert_eq!(repeat(3), [3, 3]);
assert_eq!(repeat(3), [3, 3, 3]);
assert_eq!(repeat(3), [3, 3, 3, 3]);
fn repeat<T: Clone, const OUT: usize>(val: T) -> [T; OUT] {
// `te_len` ìs a `TypeEq<Usize<OUT>, Usize<1>>`
if let TypeCmp::Eq(te_len) = Usize::<OUT>.equals(Usize::<1>) {
// This branch is ran when `OUT == 1`
TypeEq::new::<T>() // returns `TypeEq<T, T>`
.in_array(te_len) // returns `TypeEq<[T; OUT], [T; 1]>`
.to_left([val]) // goes from `[T; 1]` to `[T; OUT]`
} else {
// This branch is ran when `OUT != 1`
[(); OUT].map(|_| val.clone())
}
}Modules§
- slice
adt_const_markerMarker types forconst FOO: &'static [T]parameters.
Structs§
- Marker type for passing
const VAL: boolas a type parameter. - Marker type for passing
const VAL: charas a type parameter. - Marker type for passing
const VAL: i8as a type parameter. - Marker type for passing
const VAL: i16as a type parameter. - Marker type for passing
const VAL: i32as a type parameter. - Marker type for passing
const VAL: i64as a type parameter. - Marker type for passing
const VAL: i128as a type parameter. - Marker type for passing
const VAL: isizeas a type parameter. - Str
adt_const_markerMarker type for passingconst VAL: &'static stras a type parameter. - Marker type for passing
const VAL: u8as a type parameter. - Marker type for passing
const VAL: u16as a type parameter. - Marker type for passing
const VAL: u32as a type parameter. - Marker type for passing
const VAL: u64as a type parameter. - Marker type for passing
const VAL: u128as a type parameter. - Marker type for passing
const VAL: usizeas a type parameter.