summaryrefslogtreecommitdiff
path: root/src/lib.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib.rs')
-rw-r--r--src/lib.rs82
1 files changed, 41 insertions, 41 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 6d93428..b7b58ba 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -1,8 +1,11 @@
use varihappy_macros::{
- repeat, tuple_expr_reverse, tuple_new, tuple_reverse, tuple_trait_def, type_to_field_access,
+ repeat, tuple_expr_reverse, tuple_len, tuple_new, tuple_reverse, tuple_trait_def,
+ type_to_field_access,
};
pub trait Tuple {
+ const LEN: usize;
+
type AsRef<'a>: Tuple
where
Self: 'a;
@@ -26,6 +29,15 @@ pub trait Tuple1: Tuple {
fn into_rest(self) -> Self::Rest;
}
+pub trait ArrayTupleOrEmpty<T>: Tuple {}
+
+pub trait ArrayTuple: Tuple {
+ type Item;
+}
+
+impl<T> ArrayTupleOrEmpty<T> for () {}
+impl<I, T: ArrayTuple<Item = I>> ArrayTupleOrEmpty<T> for T {}
+
impl Tuple for () {
type AsRef<'a>
= ()
@@ -38,49 +50,13 @@ impl Tuple for () {
type Reversed = ();
+ const LEN: usize = 0;
+
fn as_ref(&self) -> Self::AsRef<'_> {}
fn as_mut(&mut self) -> Self::AsMut<'_> {}
fn rev(self) -> Self::Reversed {}
}
-impl<A> Tuple for (A,) {
- type AsRef<'a>
- = (&'a A,)
- where
- Self: 'a;
- type AsMut<'a>
- = (&'a mut A,)
- where
- Self: 'a;
- type Reversed = (A,);
-
- fn as_ref(&self) -> Self::AsRef<'_> {
- (&self.0,)
- }
-
- fn as_mut(&mut self) -> Self::AsMut<'_> {
- (&mut self.0,)
- }
-
- fn rev(self) -> Self::Reversed {
- (self.0,)
- }
-}
-
-impl<A> Tuple1 for (A,) {
- type Item0 = A;
- type Rest = ();
-
- fn into_0(self) -> Self::Item0 {
- self.0
- }
- fn split_into(self) -> (Self::Item0, Self::Rest) {
- (self.0, ())
- }
-
- fn into_rest(self) -> Self::Rest {}
-}
-
macro_rules! tuple_apply {
(($($letter: ident,)*), $other: ident) => {
$other!(($($letter,)*))
@@ -119,6 +95,7 @@ macro_rules! tuple_expr_mut {
macro_rules! tuple_expr_rest {
($this: ident, (A, $($letter: ident,)*)) => {
+ #[allow(unused_variables, clippy::unused_unit)]
{
let this = $this;
($(type_to_field_access!($letter),)*)
@@ -138,6 +115,8 @@ macro_rules! tuple_expr_split {
macro_rules! impl_tuple_inner {
(($($letter: ident,)*)) => {
impl<$($letter),*> Tuple for ($($letter,)*) {
+ const LEN: usize = tuple_len!(($($letter,)*));
+
type AsRef<'a> = ($(&'a $letter,)*) where Self: 'a;
type AsMut<'a> = ($(&'a mut $letter,)*) where Self: 'a;
type Reversed = tuple_apply!(($($letter,)*), tuple_reverse);
@@ -213,5 +192,26 @@ macro_rules! tuple_trait {
};
}
-repeat!(64, impl_tuple);
-repeat!(64, tuple_trait);
+macro_rules! t {
+ ($_t:tt) => {
+ T
+ };
+}
+
+macro_rules! impl_array_tuple_inner {
+ (($($letter: ident,)*)) => {
+ impl<T> ArrayTuple for ($(t!($letter),)*) {
+ type Item = T;
+ }
+ };
+}
+
+macro_rules! impl_array_tuple {
+ ($number: literal) => {
+ tuple_new! { $number, impl_array_tuple_inner }
+ };
+}
+
+repeat!(1..64, impl_tuple);
+repeat!(2..64, tuple_trait);
+repeat!(1..64, impl_array_tuple);