const generic expr based fixed length array manipulation crate
what the hell
| -rw-r--r-- | Cargo.toml | 2 | ||||
| -rw-r--r-- | src/lib.rs | 21 | ||||
| -rw-r--r-- | src/slice.rs | 12 |
3 files changed, 17 insertions, 18 deletions
@@ -1,6 +1,6 @@ [package] name = "atools" -version = "0.1.12" +version = "0.1.13" edition = "2024" description = "const generic expr based fixed length array manipulation" authors = ["bend-n <[email protected]>"] @@ -11,7 +11,6 @@ iter_intersperse, const_trait_impl, maybe_uninit_array_assume_init, - iter_map_windows, const_precise_live_drops )] #![warn( @@ -175,7 +174,7 @@ pub const trait Deconstruct<T, const N: usize> { [(); N - 1]:; } -impl<T, const N: usize> const Deconstruct<T, N> for [T; N] +const impl<T, const N: usize> Deconstruct<T, N> for [T; N] where T: [const] Destruct, { @@ -239,26 +238,26 @@ pub const trait Couple<T, const N: usize, const O: usize> { fn couple(self, with: [T; O]) -> [T; N + O]; } -impl<T, const N: usize, const O: usize> const Couple<T, N, O> for [T; N] { +const impl<T, const N: usize, const O: usize> Couple<T, N, O> for [T; N] { fn couple(self, with: [T; O]) -> [T; N + O] { // SAFETY: adjacent unsafe { transmute_unchecked(Pair(self, with)) } } } -impl<T, const N: usize> const Join<T, N, 1, T> for [T; N] { +const impl<T, const N: usize> Join<T, N, 1, T> for [T; N] { fn join(self, with: T) -> [T; N + 1] { self.couple([with]) } } -impl<T> const Join<T, 1, 1, T> for T { +const impl<T> Join<T, 1, 1, T> for T { fn join(self, with: T) -> [T; 2] { [self, with] } } -impl<T, const O: usize> const Join<T, 1, O, [T; O]> for T { +const impl<T, const O: usize> Join<T, 1, O, [T; O]> for T { fn join(self, with: [T; O]) -> [T; 1 + O] { [self].couple(with) } @@ -281,7 +280,7 @@ pub const trait Chunked<T, const N: usize> { [(); N % C + usize::MAX]:; } -impl<const N: usize, T> const Chunked<T, N> for [T; N] { +const impl<const N: usize, T> Chunked<T, N> for [T; N] { #[allow(private_bounds)] fn chunked<const C: usize>(self) -> [[T; C]; N / C] where @@ -319,7 +318,7 @@ pub const trait Flatten<T, const N: usize, const N2: usize> { fn flatten(self) -> [T; N * N2]; } -impl<T, const N: usize, const M: usize> const Flatten<T, N, M> for [[T; M]; N] { +const impl<T, const N: usize, const M: usize> Flatten<T, N, M> for [[T; M]; N] { fn flatten(self) -> [T; N * M] { // SAFETY: layout is the same. unsafe { core::intrinsics::transmute_unchecked(self) } @@ -352,7 +351,7 @@ pub const trait Split<T, const N: usize> { T: [const] Destruct; } -impl<T, const N: usize> const Split<T, N> for [T; N] { +const impl<T, const N: usize> Split<T, N> for [T; N] { fn split<const AT: usize>(self) -> ([T; AT], [T; N - AT]) { // SAFETY: N - AT overflows when AT > N so the size of the returned "array" is the same. unsafe { Pair::splat(self) } @@ -391,7 +390,7 @@ pub const trait SkipEvery<T, const N: usize> { fn skip_every<const SKIP_EVERY_N: usize>(self) -> [T; (N / SKIP_EVERY_N) * (SKIP_EVERY_N - 1)]; } -impl<T: [const] Destruct, const N: usize> const SkipEvery<T, N> for [T; N] { +const impl<T: [const] Destruct, const N: usize> SkipEvery<T, N> for [T; N] { fn skip_every<const SKIP_EVERY_N: usize>(self) -> [T; (N / SKIP_EVERY_N) * (SKIP_EVERY_N - 1)] { let mut out = [const { MU::uninit() }; _]; let mut i = 0; @@ -420,7 +419,7 @@ impl<T: [const] Destruct, const N: usize> const SkipEvery<T, N> for [T; N] { } } -impl<T, const N: usize> const Zip<T, N> for [T; N] { +const impl<T, const N: usize> Zip<T, N> for [T; N] { fn zip<U>(self, with: [U; N]) -> [(T, U); N] { let mut out = unsafe { MU::<[MU<_>; N]>::uninit().assume_init() }; let mut i = 0usize; diff --git a/src/slice.rs b/src/slice.rs index f64e260..56cb875 100644 --- a/src/slice.rs +++ b/src/slice.rs @@ -30,28 +30,28 @@ impl Range { pub const trait Ranged { fn range(self) -> Range; } -impl const Ranged for core::ops::Range<usize> { +const impl Ranged for core::ops::Range<usize> { fn range(self) -> Range { Range::Range(self.start, self.end) } } -impl const Ranged for RangeInclusive<usize> { +const impl Ranged for RangeInclusive<usize> { fn range(self) -> Range { Range::Range(*self.start(), *self.end() + 1) } } -impl const Ranged for RangeFrom<usize> { +const impl Ranged for RangeFrom<usize> { fn range(self) -> Range { Range::RangeFrom(self.start) } } -impl const Ranged for RangeTo<usize> { +const impl Ranged for RangeTo<usize> { fn range(self) -> Range { Range::RangeTo(self.end) } } -impl const Ranged for RangeToInclusive<usize> { +const impl Ranged for RangeToInclusive<usize> { fn range(self) -> Range { Range::RangeTo(self.end + 1) } @@ -86,7 +86,7 @@ const unsafe fn slice<T, const N: usize, const TO: usize>(x: &[T; N], begin: usi unsafe { &*x.as_ptr().add(begin).cast::<[T; TO]>() } } -impl<T, const N: usize> const Slice<T, N> for [T; N] { +const impl<T, const N: usize> Slice<T, N> for [T; N] { fn slice<const RANGE: Range>(&self) -> &[T; RANGE.length::<N>()] where [(); RANGE.valid::<N>() - 1]:, |