const generic expr based fixed length array manipulation crate
what the hell
bendn 6 weeks ago
parent 2c4b7a7 · commit 340d683
-rw-r--r--Cargo.toml2
-rw-r--r--src/lib.rs21
-rw-r--r--src/slice.rs12
3 files changed, 17 insertions, 18 deletions
diff --git a/Cargo.toml b/Cargo.toml
index 91d8c54..02cee49 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -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]>"]
diff --git a/src/lib.rs b/src/lib.rs
index f8d3212..3cd9a05 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -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]:,