Crate fortuples

source ·
Expand description

Procedural macros to generalize inherent and trait implementations over tuples.

Introduction

When it is a need to implement either a trait or a generalized type for a combination of tuples, Rust requires separate implementations to be provided for each tuple variety manually.

This crate provides a proc-macro fortuples! to write code templates similar to the quote! macro. This macro will expand the provided code template for each tuple variety.

Also, an attribute macro #[auto_impl] that implements a given trait for tuple combinations in a completely automatic way.

This crate is inspired by the impl_trait_for_tuples.


Differences from impl_trait_for_tuples

You can write inherent implementations
struct Vector<T>(T);

fortuples! {
    #[tuples::member_type(f32)]
    #[tuples::min_size(2)]
    #[tuples::max_size(3)]
    #[tuples::tuple_name(Coords)]
    impl Vector<#Coords> {
        fn length(&self) -> f32 {
            let coords = &self.0;

            (#(#coords * #coords)+*).sqrt()
        }
    }
}

You don’t need to use a custom keyword for_tuples! inside the implementation body

Instead, the fortuples! macro follows the quote!-like syntax without extra tokens.

trait Trait {
    type Ret;
    type Arg;

    fn test(arg: Self::Arg) -> Self::Ret;
}
impl_trait_for_tuples

#[impl_for_tuples(5)]
impl Trait for Tuple {
    for_tuples!( type Ret = ( #( Tuple::Ret ),* ); );
    for_tuples!( type Arg = ( #( Tuple::Arg ),* ); );

    fn test(arg: Self::Arg) -> Self::Ret {
        for_tuples!( ( #( Tuple::test(arg.Tuple) ),* ) )
    }
}
fortuples

fortuples! {
    #[tuples::max_size(5)] // <-- optional, default = 16
    impl Trait for #Tuple
    where
        #(#Member: Trait),*
    {
        type Ret = ( #(#Member::Ret),* );
        type Arg = ( #(#Member::Arg),* );

        fn test(arg: Self::Arg) -> Self::Ret {
            ( #(#Member::test(#arg)),* )
        }
    }
}

Separate attribute macro for full-automatic implementation
impl_trait_for_tuples
#[impl_for_tuples(5)]
trait Notify {
    fn notify(&self);
}
fortuples::auto_impl
#[fortuples::auto_impl]
#[tuples::max_size(5)] // <-- optional, default = 16
trait Notify {
    fn notify(&self);
}

Examples

fortuples! proc-macro

Here is commented example of fortuples! usage.

You can also view the example without comments to see how the macro could look in the wild.

You can find the example’s macro expansion here.

See the fortuples! macro documentation to learn about the macro settings (like #[tuples::min_size]).


trait Trait {
    type Ret;

    type Arg;

    type FixedType;

    const VALUE: i32;

    const LENGTH: usize;

    fn test_assoc_fn(arg: Self::Arg) -> Self::Ret;

    fn test_self_fn(&self) -> Result<(), ()>;
}

fortuples! {
    #[tuples::min_size(1)]
    // +----- ^^^^^^^^^^^
    // | The `fortuples!` macro will generate implementations starting with the empty tuple.
    // |
    // | Due to the `min_size` setting,
    // | the implementations will start from the `(Member0,)` tuple.

    impl Trait for #Tuple
    // +----------- ^^^^^
    // | a meta-variable that will expand to
    // | `(Member0,)`, `(Member0, Member1)`, and so on.

    where
        #(#Member: Trait<FixedType = i32>),*
    //  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    // | A repetition -- the code inside the `#(...),*`
    // | will expand as many times as many elements are in the current #Tuple.
    // |
    // | Inside the i-th code fragment, the #Member meta-variable will be substituted
    // | by the i-th member type of the current #Tuple.
    {
        // The `Ret` type will be a tuple consisting of the `Ret` types
        // from the current #Tuple member types
        type Ret = (#(#Member::Ret),*);

        // The `Arg` type will be a tuple consisting of the `Arg` types
        // from the current #Tuple member types
        type Arg = (#(#Member::Arg),*);

        // The `VALUE` will be a sum of all `VALUE`s of the #Tuple member types.
        const VALUE: i32 = #(#Member::VALUE)+*;
        // +------------------------------- ^
        // | Note that a `+` sign separates the `VALUE`s.

        const LENGTH: usize = #len(Tuple);
        // +----------------- ^^^^^^^^^^^
        // | This expands to the current #Tuple length.

        type FixedType = i32;

        fn test_assoc_fn(arg: Self::Arg) -> Self::Ret {
            ( #(#Member::test_assoc_fn(#arg)),* )
            // +----------------------- ^^^
            // | Any identifier after the `#` sign that is neither
            // | #Tuple, #Member, nor #len(Tuple)
            // | is interpreted as a tuple variable.
            // |
            // | So the above code will expand like this:
            // | ```
            // |    (
            // |        Member0::test_assoc_fn(arg.0),
            // |        Member1::test_assoc_fn(arg.1),
            // |        ...
            // |        MemberN::test_assoc_fn(arg.N),
            // |    )
            // | ```
            // | where `N` equals `#len(Tuple)`
        }

        fn test_self_fn(&self) -> Result<(), ()> {
            #(#self.test_self_fn()?;)*
            // +-------------------- ^
            // | Note that there is no separator here.

            Ok(())
        }
    }
}
Show the example without comments
fortuples! proc-macro (without comments)

trait Trait {
    type Ret;

    type Arg;

    type FixedType;

    const VALUE: i32;

    const LENGTH: usize;

    fn test_assoc_fn(arg: Self::Arg) -> Self::Ret;

    fn test_self_fn(&self) -> Result<(), ()>;
}

fortuples! {
    #[tuples::min_size(1)]
    impl Trait for #Tuple
    where
        #(#Member: Trait<FixedType = i32>),*
    {
        type Ret = (#(#Member::Ret),*);

        type Arg = (#(#Member::Arg),*);

        const VALUE: i32 = #(#Member::VALUE)+*;

        const LENGTH: usize = #len(Tuple);

        type FixedType = i32;

        fn test_assoc_fn(arg: Self::Arg) -> Self::Ret {
            ( #(#Member::test_assoc_fn(#arg)),* )
        }

        fn test_self_fn(&self) -> Result<(), ()> {
            #(#self.test_self_fn()?;)*

            Ok(())
        }
    }
}
Show the macro expansion
fortuples! proc-macro expansion
impl<Member0> Trait for (Member0,)
where
    Member0: Trait<FixedType = i32>,
{
    type Ret = (Member0::Ret,);
    type Arg = (Member0::Arg,);
    const VALUE: i32 = Member0::VALUE;
    const LENGTH: usize = 1usize;
    type FixedType = i32;
    fn test_assoc_fn(arg: Self::Arg) -> Self::Ret {
        (Member0::test_assoc_fn(arg.0),)
    }
    fn test_self_fn(&self) -> Result<(), ()> {
        self.0.test_self_fn()?;
        Ok(())
    }
}
impl<Member0, Member1> Trait for (Member0, Member1)
where
    Member0: Trait<FixedType = i32>,
    Member1: Trait<FixedType = i32>,
{
    type Ret = (Member0::Ret, Member1::Ret);
    type Arg = (Member0::Arg, Member1::Arg);
    const VALUE: i32 = Member0::VALUE + Member1::VALUE;
    const LENGTH: usize = 2usize;
    type FixedType = i32;
    fn test_assoc_fn(arg: Self::Arg) -> Self::Ret {
        (Member0::test_assoc_fn(arg.0), Member1::test_assoc_fn(arg.1))
    }
    fn test_self_fn(&self) -> Result<(), ()> {
        self.0.test_self_fn()?;
        self.1.test_self_fn()?;
        Ok(())
    }
}
impl<Member0, Member1, Member2> Trait for (Member0, Member1, Member2)
where
    Member0: Trait<FixedType = i32>,
    Member1: Trait<FixedType = i32>,
    Member2: Trait<FixedType = i32>,
{
    type Ret = (Member0::Ret, Member1::Ret, Member2::Ret);
    type Arg = (Member0::Arg, Member1::Arg, Member2::Arg);
    const VALUE: i32 = Member0::VALUE + Member1::VALUE + Member2::VALUE;
    const LENGTH: usize = 3usize;
    type FixedType = i32;
    fn test_assoc_fn(arg: Self::Arg) -> Self::Ret {
        (
            Member0::test_assoc_fn(arg.0),
            Member1::test_assoc_fn(arg.1),
            Member2::test_assoc_fn(arg.2),
        )
    }
    fn test_self_fn(&self) -> Result<(), ()> {
        self.0.test_self_fn()?;
        self.1.test_self_fn()?;
        self.2.test_self_fn()?;
        Ok(())
    }
}
impl<Member0, Member1, Member2, Member3> Trait for (Member0, Member1, Member2, Member3)
where
    Member0: Trait<FixedType = i32>,
    Member1: Trait<FixedType = i32>,
    Member2: Trait<FixedType = i32>,
    Member3: Trait<FixedType = i32>,
{
    type Ret = (Member0::Ret, Member1::Ret, Member2::Ret, Member3::Ret);
    type Arg = (Member0::Arg, Member1::Arg, Member2::Arg, Member3::Arg);
    const VALUE: i32 = Member0::VALUE + Member1::VALUE + Member2::VALUE + Member3::VALUE;
    const LENGTH: usize = 4usize;
    type FixedType = i32;
    fn test_assoc_fn(arg: Self::Arg) -> Self::Ret {
        (
            Member0::test_assoc_fn(arg.0),
            Member1::test_assoc_fn(arg.1),
            Member2::test_assoc_fn(arg.2),
            Member3::test_assoc_fn(arg.3),
        )
    }
    fn test_self_fn(&self) -> Result<(), ()> {
        self.0.test_self_fn()?;
        self.1.test_self_fn()?;
        self.2.test_self_fn()?;
        self.3.test_self_fn()?;
        Ok(())
    }
}
impl<Member0, Member1, Member2, Member3, Member4> Trait
    for (Member0, Member1, Member2, Member3, Member4)
where
    Member0: Trait<FixedType = i32>,
    Member1: Trait<FixedType = i32>,
    Member2: Trait<FixedType = i32>,
    Member3: Trait<FixedType = i32>,
    Member4: Trait<FixedType = i32>,
{
    type Ret = (
        Member0::Ret,
        Member1::Ret,
        Member2::Ret,
        Member3::Ret,
        Member4::Ret,
    );
    type Arg = (
        Member0::Arg,
        Member1::Arg,
        Member2::Arg,
        Member3::Arg,
        Member4::Arg,
    );
    const VALUE: i32 =
        Member0::VALUE + Member1::VALUE + Member2::VALUE + Member3::VALUE + Member4::VALUE;
    const LENGTH: usize = 5usize;
    type FixedType = i32;
    fn test_assoc_fn(arg: Self::Arg) -> Self::Ret {
        (
            Member0::test_assoc_fn(arg.0),
            Member1::test_assoc_fn(arg.1),
            Member2::test_assoc_fn(arg.2),
            Member3::test_assoc_fn(arg.3),
            Member4::test_assoc_fn(arg.4),
        )
    }
    fn test_self_fn(&self) -> Result<(), ()> {
        self.0.test_self_fn()?;
        self.1.test_self_fn()?;
        self.2.test_self_fn()?;
        self.3.test_self_fn()?;
        self.4.test_self_fn()?;
        Ok(())
    }
}
impl<Member0, Member1, Member2, Member3, Member4, Member5> Trait
    for (Member0, Member1, Member2, Member3, Member4, Member5)
where
    Member0: Trait<FixedType = i32>,
    Member1: Trait<FixedType = i32>,
    Member2: Trait<FixedType = i32>,
    Member3: Trait<FixedType = i32>,
    Member4: Trait<FixedType = i32>,
    Member5: Trait<FixedType = i32>,
{
    type Ret = (
        Member0::Ret,
        Member1::Ret,
        Member2::Ret,
        Member3::Ret,
        Member4::Ret,
        Member5::Ret,
    );
    type Arg = (
        Member0::Arg,
        Member1::Arg,
        Member2::Arg,
        Member3::Arg,
        Member4::Arg,
        Member5::Arg,
    );
    const VALUE: i32 = Member0::VALUE
        + Member1::VALUE
        + Member2::VALUE
        + Member3::VALUE
        + Member4::VALUE
        + Member5::VALUE;
    const LENGTH: usize = 6usize;
    type FixedType = i32;
    fn test_assoc_fn(arg: Self::Arg) -> Self::Ret {
        (
            Member0::test_assoc_fn(arg.0),
            Member1::test_assoc_fn(arg.1),
            Member2::test_assoc_fn(arg.2),
            Member3::test_assoc_fn(arg.3),
            Member4::test_assoc_fn(arg.4),
            Member5::test_assoc_fn(arg.5),
        )
    }
    fn test_self_fn(&self) -> Result<(), ()> {
        self.0.test_self_fn()?;
        self.1.test_self_fn()?;
        self.2.test_self_fn()?;
        self.3.test_self_fn()?;
        self.4.test_self_fn()?;
        self.5.test_self_fn()?;
        Ok(())
    }
}
impl<Member0, Member1, Member2, Member3, Member4, Member5, Member6> Trait
    for (
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
    )
where
    Member0: Trait<FixedType = i32>,
    Member1: Trait<FixedType = i32>,
    Member2: Trait<FixedType = i32>,
    Member3: Trait<FixedType = i32>,
    Member4: Trait<FixedType = i32>,
    Member5: Trait<FixedType = i32>,
    Member6: Trait<FixedType = i32>,
{
    type Ret = (
        Member0::Ret,
        Member1::Ret,
        Member2::Ret,
        Member3::Ret,
        Member4::Ret,
        Member5::Ret,
        Member6::Ret,
    );
    type Arg = (
        Member0::Arg,
        Member1::Arg,
        Member2::Arg,
        Member3::Arg,
        Member4::Arg,
        Member5::Arg,
        Member6::Arg,
    );
    const VALUE: i32 = Member0::VALUE
        + Member1::VALUE
        + Member2::VALUE
        + Member3::VALUE
        + Member4::VALUE
        + Member5::VALUE
        + Member6::VALUE;
    const LENGTH: usize = 7usize;
    type FixedType = i32;
    fn test_assoc_fn(arg: Self::Arg) -> Self::Ret {
        (
            Member0::test_assoc_fn(arg.0),
            Member1::test_assoc_fn(arg.1),
            Member2::test_assoc_fn(arg.2),
            Member3::test_assoc_fn(arg.3),
            Member4::test_assoc_fn(arg.4),
            Member5::test_assoc_fn(arg.5),
            Member6::test_assoc_fn(arg.6),
        )
    }
    fn test_self_fn(&self) -> Result<(), ()> {
        self.0.test_self_fn()?;
        self.1.test_self_fn()?;
        self.2.test_self_fn()?;
        self.3.test_self_fn()?;
        self.4.test_self_fn()?;
        self.5.test_self_fn()?;
        self.6.test_self_fn()?;
        Ok(())
    }
}
impl<Member0, Member1, Member2, Member3, Member4, Member5, Member6, Member7> Trait
    for (
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
    )
where
    Member0: Trait<FixedType = i32>,
    Member1: Trait<FixedType = i32>,
    Member2: Trait<FixedType = i32>,
    Member3: Trait<FixedType = i32>,
    Member4: Trait<FixedType = i32>,
    Member5: Trait<FixedType = i32>,
    Member6: Trait<FixedType = i32>,
    Member7: Trait<FixedType = i32>,
{
    type Ret = (
        Member0::Ret,
        Member1::Ret,
        Member2::Ret,
        Member3::Ret,
        Member4::Ret,
        Member5::Ret,
        Member6::Ret,
        Member7::Ret,
    );
    type Arg = (
        Member0::Arg,
        Member1::Arg,
        Member2::Arg,
        Member3::Arg,
        Member4::Arg,
        Member5::Arg,
        Member6::Arg,
        Member7::Arg,
    );
    const VALUE: i32 = Member0::VALUE
        + Member1::VALUE
        + Member2::VALUE
        + Member3::VALUE
        + Member4::VALUE
        + Member5::VALUE
        + Member6::VALUE
        + Member7::VALUE;
    const LENGTH: usize = 8usize;
    type FixedType = i32;
    fn test_assoc_fn(arg: Self::Arg) -> Self::Ret {
        (
            Member0::test_assoc_fn(arg.0),
            Member1::test_assoc_fn(arg.1),
            Member2::test_assoc_fn(arg.2),
            Member3::test_assoc_fn(arg.3),
            Member4::test_assoc_fn(arg.4),
            Member5::test_assoc_fn(arg.5),
            Member6::test_assoc_fn(arg.6),
            Member7::test_assoc_fn(arg.7),
        )
    }
    fn test_self_fn(&self) -> Result<(), ()> {
        self.0.test_self_fn()?;
        self.1.test_self_fn()?;
        self.2.test_self_fn()?;
        self.3.test_self_fn()?;
        self.4.test_self_fn()?;
        self.5.test_self_fn()?;
        self.6.test_self_fn()?;
        self.7.test_self_fn()?;
        Ok(())
    }
}
impl<Member0, Member1, Member2, Member3, Member4, Member5, Member6, Member7, Member8> Trait
    for (
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
        Member8,
    )
where
    Member0: Trait<FixedType = i32>,
    Member1: Trait<FixedType = i32>,
    Member2: Trait<FixedType = i32>,
    Member3: Trait<FixedType = i32>,
    Member4: Trait<FixedType = i32>,
    Member5: Trait<FixedType = i32>,
    Member6: Trait<FixedType = i32>,
    Member7: Trait<FixedType = i32>,
    Member8: Trait<FixedType = i32>,
{
    type Ret = (
        Member0::Ret,
        Member1::Ret,
        Member2::Ret,
        Member3::Ret,
        Member4::Ret,
        Member5::Ret,
        Member6::Ret,
        Member7::Ret,
        Member8::Ret,
    );
    type Arg = (
        Member0::Arg,
        Member1::Arg,
        Member2::Arg,
        Member3::Arg,
        Member4::Arg,
        Member5::Arg,
        Member6::Arg,
        Member7::Arg,
        Member8::Arg,
    );
    const VALUE: i32 = Member0::VALUE
        + Member1::VALUE
        + Member2::VALUE
        + Member3::VALUE
        + Member4::VALUE
        + Member5::VALUE
        + Member6::VALUE
        + Member7::VALUE
        + Member8::VALUE;
    const LENGTH: usize = 9usize;
    type FixedType = i32;
    fn test_assoc_fn(arg: Self::Arg) -> Self::Ret {
        (
            Member0::test_assoc_fn(arg.0),
            Member1::test_assoc_fn(arg.1),
            Member2::test_assoc_fn(arg.2),
            Member3::test_assoc_fn(arg.3),
            Member4::test_assoc_fn(arg.4),
            Member5::test_assoc_fn(arg.5),
            Member6::test_assoc_fn(arg.6),
            Member7::test_assoc_fn(arg.7),
            Member8::test_assoc_fn(arg.8),
        )
    }
    fn test_self_fn(&self) -> Result<(), ()> {
        self.0.test_self_fn()?;
        self.1.test_self_fn()?;
        self.2.test_self_fn()?;
        self.3.test_self_fn()?;
        self.4.test_self_fn()?;
        self.5.test_self_fn()?;
        self.6.test_self_fn()?;
        self.7.test_self_fn()?;
        self.8.test_self_fn()?;
        Ok(())
    }
}
impl<Member0, Member1, Member2, Member3, Member4, Member5, Member6, Member7, Member8, Member9> Trait
    for (
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
        Member8,
        Member9,
    )
where
    Member0: Trait<FixedType = i32>,
    Member1: Trait<FixedType = i32>,
    Member2: Trait<FixedType = i32>,
    Member3: Trait<FixedType = i32>,
    Member4: Trait<FixedType = i32>,
    Member5: Trait<FixedType = i32>,
    Member6: Trait<FixedType = i32>,
    Member7: Trait<FixedType = i32>,
    Member8: Trait<FixedType = i32>,
    Member9: Trait<FixedType = i32>,
{
    type Ret = (
        Member0::Ret,
        Member1::Ret,
        Member2::Ret,
        Member3::Ret,
        Member4::Ret,
        Member5::Ret,
        Member6::Ret,
        Member7::Ret,
        Member8::Ret,
        Member9::Ret,
    );
    type Arg = (
        Member0::Arg,
        Member1::Arg,
        Member2::Arg,
        Member3::Arg,
        Member4::Arg,
        Member5::Arg,
        Member6::Arg,
        Member7::Arg,
        Member8::Arg,
        Member9::Arg,
    );
    const VALUE: i32 = Member0::VALUE
        + Member1::VALUE
        + Member2::VALUE
        + Member3::VALUE
        + Member4::VALUE
        + Member5::VALUE
        + Member6::VALUE
        + Member7::VALUE
        + Member8::VALUE
        + Member9::VALUE;
    const LENGTH: usize = 10usize;
    type FixedType = i32;
    fn test_assoc_fn(arg: Self::Arg) -> Self::Ret {
        (
            Member0::test_assoc_fn(arg.0),
            Member1::test_assoc_fn(arg.1),
            Member2::test_assoc_fn(arg.2),
            Member3::test_assoc_fn(arg.3),
            Member4::test_assoc_fn(arg.4),
            Member5::test_assoc_fn(arg.5),
            Member6::test_assoc_fn(arg.6),
            Member7::test_assoc_fn(arg.7),
            Member8::test_assoc_fn(arg.8),
            Member9::test_assoc_fn(arg.9),
        )
    }
    fn test_self_fn(&self) -> Result<(), ()> {
        self.0.test_self_fn()?;
        self.1.test_self_fn()?;
        self.2.test_self_fn()?;
        self.3.test_self_fn()?;
        self.4.test_self_fn()?;
        self.5.test_self_fn()?;
        self.6.test_self_fn()?;
        self.7.test_self_fn()?;
        self.8.test_self_fn()?;
        self.9.test_self_fn()?;
        Ok(())
    }
}
impl<
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
        Member8,
        Member9,
        Member10,
    > Trait
    for (
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
        Member8,
        Member9,
        Member10,
    )
where
    Member0: Trait<FixedType = i32>,
    Member1: Trait<FixedType = i32>,
    Member2: Trait<FixedType = i32>,
    Member3: Trait<FixedType = i32>,
    Member4: Trait<FixedType = i32>,
    Member5: Trait<FixedType = i32>,
    Member6: Trait<FixedType = i32>,
    Member7: Trait<FixedType = i32>,
    Member8: Trait<FixedType = i32>,
    Member9: Trait<FixedType = i32>,
    Member10: Trait<FixedType = i32>,
{
    type Ret = (
        Member0::Ret,
        Member1::Ret,
        Member2::Ret,
        Member3::Ret,
        Member4::Ret,
        Member5::Ret,
        Member6::Ret,
        Member7::Ret,
        Member8::Ret,
        Member9::Ret,
        Member10::Ret,
    );
    type Arg = (
        Member0::Arg,
        Member1::Arg,
        Member2::Arg,
        Member3::Arg,
        Member4::Arg,
        Member5::Arg,
        Member6::Arg,
        Member7::Arg,
        Member8::Arg,
        Member9::Arg,
        Member10::Arg,
    );
    const VALUE: i32 = Member0::VALUE
        + Member1::VALUE
        + Member2::VALUE
        + Member3::VALUE
        + Member4::VALUE
        + Member5::VALUE
        + Member6::VALUE
        + Member7::VALUE
        + Member8::VALUE
        + Member9::VALUE
        + Member10::VALUE;
    const LENGTH: usize = 11usize;
    type FixedType = i32;
    fn test_assoc_fn(arg: Self::Arg) -> Self::Ret {
        (
            Member0::test_assoc_fn(arg.0),
            Member1::test_assoc_fn(arg.1),
            Member2::test_assoc_fn(arg.2),
            Member3::test_assoc_fn(arg.3),
            Member4::test_assoc_fn(arg.4),
            Member5::test_assoc_fn(arg.5),
            Member6::test_assoc_fn(arg.6),
            Member7::test_assoc_fn(arg.7),
            Member8::test_assoc_fn(arg.8),
            Member9::test_assoc_fn(arg.9),
            Member10::test_assoc_fn(arg.10),
        )
    }
    fn test_self_fn(&self) -> Result<(), ()> {
        self.0.test_self_fn()?;
        self.1.test_self_fn()?;
        self.2.test_self_fn()?;
        self.3.test_self_fn()?;
        self.4.test_self_fn()?;
        self.5.test_self_fn()?;
        self.6.test_self_fn()?;
        self.7.test_self_fn()?;
        self.8.test_self_fn()?;
        self.9.test_self_fn()?;
        self.10.test_self_fn()?;
        Ok(())
    }
}
impl<
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
        Member8,
        Member9,
        Member10,
        Member11,
    > Trait
    for (
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
        Member8,
        Member9,
        Member10,
        Member11,
    )
where
    Member0: Trait<FixedType = i32>,
    Member1: Trait<FixedType = i32>,
    Member2: Trait<FixedType = i32>,
    Member3: Trait<FixedType = i32>,
    Member4: Trait<FixedType = i32>,
    Member5: Trait<FixedType = i32>,
    Member6: Trait<FixedType = i32>,
    Member7: Trait<FixedType = i32>,
    Member8: Trait<FixedType = i32>,
    Member9: Trait<FixedType = i32>,
    Member10: Trait<FixedType = i32>,
    Member11: Trait<FixedType = i32>,
{
    type Ret = (
        Member0::Ret,
        Member1::Ret,
        Member2::Ret,
        Member3::Ret,
        Member4::Ret,
        Member5::Ret,
        Member6::Ret,
        Member7::Ret,
        Member8::Ret,
        Member9::Ret,
        Member10::Ret,
        Member11::Ret,
    );
    type Arg = (
        Member0::Arg,
        Member1::Arg,
        Member2::Arg,
        Member3::Arg,
        Member4::Arg,
        Member5::Arg,
        Member6::Arg,
        Member7::Arg,
        Member8::Arg,
        Member9::Arg,
        Member10::Arg,
        Member11::Arg,
    );
    const VALUE: i32 = Member0::VALUE
        + Member1::VALUE
        + Member2::VALUE
        + Member3::VALUE
        + Member4::VALUE
        + Member5::VALUE
        + Member6::VALUE
        + Member7::VALUE
        + Member8::VALUE
        + Member9::VALUE
        + Member10::VALUE
        + Member11::VALUE;
    const LENGTH: usize = 12usize;
    type FixedType = i32;
    fn test_assoc_fn(arg: Self::Arg) -> Self::Ret {
        (
            Member0::test_assoc_fn(arg.0),
            Member1::test_assoc_fn(arg.1),
            Member2::test_assoc_fn(arg.2),
            Member3::test_assoc_fn(arg.3),
            Member4::test_assoc_fn(arg.4),
            Member5::test_assoc_fn(arg.5),
            Member6::test_assoc_fn(arg.6),
            Member7::test_assoc_fn(arg.7),
            Member8::test_assoc_fn(arg.8),
            Member9::test_assoc_fn(arg.9),
            Member10::test_assoc_fn(arg.10),
            Member11::test_assoc_fn(arg.11),
        )
    }
    fn test_self_fn(&self) -> Result<(), ()> {
        self.0.test_self_fn()?;
        self.1.test_self_fn()?;
        self.2.test_self_fn()?;
        self.3.test_self_fn()?;
        self.4.test_self_fn()?;
        self.5.test_self_fn()?;
        self.6.test_self_fn()?;
        self.7.test_self_fn()?;
        self.8.test_self_fn()?;
        self.9.test_self_fn()?;
        self.10.test_self_fn()?;
        self.11.test_self_fn()?;
        Ok(())
    }
}
impl<
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
        Member8,
        Member9,
        Member10,
        Member11,
        Member12,
    > Trait
    for (
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
        Member8,
        Member9,
        Member10,
        Member11,
        Member12,
    )
where
    Member0: Trait<FixedType = i32>,
    Member1: Trait<FixedType = i32>,
    Member2: Trait<FixedType = i32>,
    Member3: Trait<FixedType = i32>,
    Member4: Trait<FixedType = i32>,
    Member5: Trait<FixedType = i32>,
    Member6: Trait<FixedType = i32>,
    Member7: Trait<FixedType = i32>,
    Member8: Trait<FixedType = i32>,
    Member9: Trait<FixedType = i32>,
    Member10: Trait<FixedType = i32>,
    Member11: Trait<FixedType = i32>,
    Member12: Trait<FixedType = i32>,
{
    type Ret = (
        Member0::Ret,
        Member1::Ret,
        Member2::Ret,
        Member3::Ret,
        Member4::Ret,
        Member5::Ret,
        Member6::Ret,
        Member7::Ret,
        Member8::Ret,
        Member9::Ret,
        Member10::Ret,
        Member11::Ret,
        Member12::Ret,
    );
    type Arg = (
        Member0::Arg,
        Member1::Arg,
        Member2::Arg,
        Member3::Arg,
        Member4::Arg,
        Member5::Arg,
        Member6::Arg,
        Member7::Arg,
        Member8::Arg,
        Member9::Arg,
        Member10::Arg,
        Member11::Arg,
        Member12::Arg,
    );
    const VALUE: i32 = Member0::VALUE
        + Member1::VALUE
        + Member2::VALUE
        + Member3::VALUE
        + Member4::VALUE
        + Member5::VALUE
        + Member6::VALUE
        + Member7::VALUE
        + Member8::VALUE
        + Member9::VALUE
        + Member10::VALUE
        + Member11::VALUE
        + Member12::VALUE;
    const LENGTH: usize = 13usize;
    type FixedType = i32;
    fn test_assoc_fn(arg: Self::Arg) -> Self::Ret {
        (
            Member0::test_assoc_fn(arg.0),
            Member1::test_assoc_fn(arg.1),
            Member2::test_assoc_fn(arg.2),
            Member3::test_assoc_fn(arg.3),
            Member4::test_assoc_fn(arg.4),
            Member5::test_assoc_fn(arg.5),
            Member6::test_assoc_fn(arg.6),
            Member7::test_assoc_fn(arg.7),
            Member8::test_assoc_fn(arg.8),
            Member9::test_assoc_fn(arg.9),
            Member10::test_assoc_fn(arg.10),
            Member11::test_assoc_fn(arg.11),
            Member12::test_assoc_fn(arg.12),
        )
    }
    fn test_self_fn(&self) -> Result<(), ()> {
        self.0.test_self_fn()?;
        self.1.test_self_fn()?;
        self.2.test_self_fn()?;
        self.3.test_self_fn()?;
        self.4.test_self_fn()?;
        self.5.test_self_fn()?;
        self.6.test_self_fn()?;
        self.7.test_self_fn()?;
        self.8.test_self_fn()?;
        self.9.test_self_fn()?;
        self.10.test_self_fn()?;
        self.11.test_self_fn()?;
        self.12.test_self_fn()?;
        Ok(())
    }
}
impl<
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
        Member8,
        Member9,
        Member10,
        Member11,
        Member12,
        Member13,
    > Trait
    for (
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
        Member8,
        Member9,
        Member10,
        Member11,
        Member12,
        Member13,
    )
where
    Member0: Trait<FixedType = i32>,
    Member1: Trait<FixedType = i32>,
    Member2: Trait<FixedType = i32>,
    Member3: Trait<FixedType = i32>,
    Member4: Trait<FixedType = i32>,
    Member5: Trait<FixedType = i32>,
    Member6: Trait<FixedType = i32>,
    Member7: Trait<FixedType = i32>,
    Member8: Trait<FixedType = i32>,
    Member9: Trait<FixedType = i32>,
    Member10: Trait<FixedType = i32>,
    Member11: Trait<FixedType = i32>,
    Member12: Trait<FixedType = i32>,
    Member13: Trait<FixedType = i32>,
{
    type Ret = (
        Member0::Ret,
        Member1::Ret,
        Member2::Ret,
        Member3::Ret,
        Member4::Ret,
        Member5::Ret,
        Member6::Ret,
        Member7::Ret,
        Member8::Ret,
        Member9::Ret,
        Member10::Ret,
        Member11::Ret,
        Member12::Ret,
        Member13::Ret,
    );
    type Arg = (
        Member0::Arg,
        Member1::Arg,
        Member2::Arg,
        Member3::Arg,
        Member4::Arg,
        Member5::Arg,
        Member6::Arg,
        Member7::Arg,
        Member8::Arg,
        Member9::Arg,
        Member10::Arg,
        Member11::Arg,
        Member12::Arg,
        Member13::Arg,
    );
    const VALUE: i32 = Member0::VALUE
        + Member1::VALUE
        + Member2::VALUE
        + Member3::VALUE
        + Member4::VALUE
        + Member5::VALUE
        + Member6::VALUE
        + Member7::VALUE
        + Member8::VALUE
        + Member9::VALUE
        + Member10::VALUE
        + Member11::VALUE
        + Member12::VALUE
        + Member13::VALUE;
    const LENGTH: usize = 14usize;
    type FixedType = i32;
    fn test_assoc_fn(arg: Self::Arg) -> Self::Ret {
        (
            Member0::test_assoc_fn(arg.0),
            Member1::test_assoc_fn(arg.1),
            Member2::test_assoc_fn(arg.2),
            Member3::test_assoc_fn(arg.3),
            Member4::test_assoc_fn(arg.4),
            Member5::test_assoc_fn(arg.5),
            Member6::test_assoc_fn(arg.6),
            Member7::test_assoc_fn(arg.7),
            Member8::test_assoc_fn(arg.8),
            Member9::test_assoc_fn(arg.9),
            Member10::test_assoc_fn(arg.10),
            Member11::test_assoc_fn(arg.11),
            Member12::test_assoc_fn(arg.12),
            Member13::test_assoc_fn(arg.13),
        )
    }
    fn test_self_fn(&self) -> Result<(), ()> {
        self.0.test_self_fn()?;
        self.1.test_self_fn()?;
        self.2.test_self_fn()?;
        self.3.test_self_fn()?;
        self.4.test_self_fn()?;
        self.5.test_self_fn()?;
        self.6.test_self_fn()?;
        self.7.test_self_fn()?;
        self.8.test_self_fn()?;
        self.9.test_self_fn()?;
        self.10.test_self_fn()?;
        self.11.test_self_fn()?;
        self.12.test_self_fn()?;
        self.13.test_self_fn()?;
        Ok(())
    }
}
impl<
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
        Member8,
        Member9,
        Member10,
        Member11,
        Member12,
        Member13,
        Member14,
    > Trait
    for (
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
        Member8,
        Member9,
        Member10,
        Member11,
        Member12,
        Member13,
        Member14,
    )
where
    Member0: Trait<FixedType = i32>,
    Member1: Trait<FixedType = i32>,
    Member2: Trait<FixedType = i32>,
    Member3: Trait<FixedType = i32>,
    Member4: Trait<FixedType = i32>,
    Member5: Trait<FixedType = i32>,
    Member6: Trait<FixedType = i32>,
    Member7: Trait<FixedType = i32>,
    Member8: Trait<FixedType = i32>,
    Member9: Trait<FixedType = i32>,
    Member10: Trait<FixedType = i32>,
    Member11: Trait<FixedType = i32>,
    Member12: Trait<FixedType = i32>,
    Member13: Trait<FixedType = i32>,
    Member14: Trait<FixedType = i32>,
{
    type Ret = (
        Member0::Ret,
        Member1::Ret,
        Member2::Ret,
        Member3::Ret,
        Member4::Ret,
        Member5::Ret,
        Member6::Ret,
        Member7::Ret,
        Member8::Ret,
        Member9::Ret,
        Member10::Ret,
        Member11::Ret,
        Member12::Ret,
        Member13::Ret,
        Member14::Ret,
    );
    type Arg = (
        Member0::Arg,
        Member1::Arg,
        Member2::Arg,
        Member3::Arg,
        Member4::Arg,
        Member5::Arg,
        Member6::Arg,
        Member7::Arg,
        Member8::Arg,
        Member9::Arg,
        Member10::Arg,
        Member11::Arg,
        Member12::Arg,
        Member13::Arg,
        Member14::Arg,
    );
    const VALUE: i32 = Member0::VALUE
        + Member1::VALUE
        + Member2::VALUE
        + Member3::VALUE
        + Member4::VALUE
        + Member5::VALUE
        + Member6::VALUE
        + Member7::VALUE
        + Member8::VALUE
        + Member9::VALUE
        + Member10::VALUE
        + Member11::VALUE
        + Member12::VALUE
        + Member13::VALUE
        + Member14::VALUE;
    const LENGTH: usize = 15usize;
    type FixedType = i32;
    fn test_assoc_fn(arg: Self::Arg) -> Self::Ret {
        (
            Member0::test_assoc_fn(arg.0),
            Member1::test_assoc_fn(arg.1),
            Member2::test_assoc_fn(arg.2),
            Member3::test_assoc_fn(arg.3),
            Member4::test_assoc_fn(arg.4),
            Member5::test_assoc_fn(arg.5),
            Member6::test_assoc_fn(arg.6),
            Member7::test_assoc_fn(arg.7),
            Member8::test_assoc_fn(arg.8),
            Member9::test_assoc_fn(arg.9),
            Member10::test_assoc_fn(arg.10),
            Member11::test_assoc_fn(arg.11),
            Member12::test_assoc_fn(arg.12),
            Member13::test_assoc_fn(arg.13),
            Member14::test_assoc_fn(arg.14),
        )
    }
    fn test_self_fn(&self) -> Result<(), ()> {
        self.0.test_self_fn()?;
        self.1.test_self_fn()?;
        self.2.test_self_fn()?;
        self.3.test_self_fn()?;
        self.4.test_self_fn()?;
        self.5.test_self_fn()?;
        self.6.test_self_fn()?;
        self.7.test_self_fn()?;
        self.8.test_self_fn()?;
        self.9.test_self_fn()?;
        self.10.test_self_fn()?;
        self.11.test_self_fn()?;
        self.12.test_self_fn()?;
        self.13.test_self_fn()?;
        self.14.test_self_fn()?;
        Ok(())
    }
}
impl<
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
        Member8,
        Member9,
        Member10,
        Member11,
        Member12,
        Member13,
        Member14,
        Member15,
    > Trait
    for (
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
        Member8,
        Member9,
        Member10,
        Member11,
        Member12,
        Member13,
        Member14,
        Member15,
    )
where
    Member0: Trait<FixedType = i32>,
    Member1: Trait<FixedType = i32>,
    Member2: Trait<FixedType = i32>,
    Member3: Trait<FixedType = i32>,
    Member4: Trait<FixedType = i32>,
    Member5: Trait<FixedType = i32>,
    Member6: Trait<FixedType = i32>,
    Member7: Trait<FixedType = i32>,
    Member8: Trait<FixedType = i32>,
    Member9: Trait<FixedType = i32>,
    Member10: Trait<FixedType = i32>,
    Member11: Trait<FixedType = i32>,
    Member12: Trait<FixedType = i32>,
    Member13: Trait<FixedType = i32>,
    Member14: Trait<FixedType = i32>,
    Member15: Trait<FixedType = i32>,
{
    type Ret = (
        Member0::Ret,
        Member1::Ret,
        Member2::Ret,
        Member3::Ret,
        Member4::Ret,
        Member5::Ret,
        Member6::Ret,
        Member7::Ret,
        Member8::Ret,
        Member9::Ret,
        Member10::Ret,
        Member11::Ret,
        Member12::Ret,
        Member13::Ret,
        Member14::Ret,
        Member15::Ret,
    );
    type Arg = (
        Member0::Arg,
        Member1::Arg,
        Member2::Arg,
        Member3::Arg,
        Member4::Arg,
        Member5::Arg,
        Member6::Arg,
        Member7::Arg,
        Member8::Arg,
        Member9::Arg,
        Member10::Arg,
        Member11::Arg,
        Member12::Arg,
        Member13::Arg,
        Member14::Arg,
        Member15::Arg,
    );
    const VALUE: i32 = Member0::VALUE
        + Member1::VALUE
        + Member2::VALUE
        + Member3::VALUE
        + Member4::VALUE
        + Member5::VALUE
        + Member6::VALUE
        + Member7::VALUE
        + Member8::VALUE
        + Member9::VALUE
        + Member10::VALUE
        + Member11::VALUE
        + Member12::VALUE
        + Member13::VALUE
        + Member14::VALUE
        + Member15::VALUE;
    const LENGTH: usize = 16usize;
    type FixedType = i32;
    fn test_assoc_fn(arg: Self::Arg) -> Self::Ret {
        (
            Member0::test_assoc_fn(arg.0),
            Member1::test_assoc_fn(arg.1),
            Member2::test_assoc_fn(arg.2),
            Member3::test_assoc_fn(arg.3),
            Member4::test_assoc_fn(arg.4),
            Member5::test_assoc_fn(arg.5),
            Member6::test_assoc_fn(arg.6),
            Member7::test_assoc_fn(arg.7),
            Member8::test_assoc_fn(arg.8),
            Member9::test_assoc_fn(arg.9),
            Member10::test_assoc_fn(arg.10),
            Member11::test_assoc_fn(arg.11),
            Member12::test_assoc_fn(arg.12),
            Member13::test_assoc_fn(arg.13),
            Member14::test_assoc_fn(arg.14),
            Member15::test_assoc_fn(arg.15),
        )
    }
    fn test_self_fn(&self) -> Result<(), ()> {
        self.0.test_self_fn()?;
        self.1.test_self_fn()?;
        self.2.test_self_fn()?;
        self.3.test_self_fn()?;
        self.4.test_self_fn()?;
        self.5.test_self_fn()?;
        self.6.test_self_fn()?;
        self.7.test_self_fn()?;
        self.8.test_self_fn()?;
        self.9.test_self_fn()?;
        self.10.test_self_fn()?;
        self.11.test_self_fn()?;
        self.12.test_self_fn()?;
        self.13.test_self_fn()?;
        self.14.test_self_fn()?;
        self.15.test_self_fn()?;
        Ok(())
    }
}

auto_impl attribute

There is an option to implement a trait in a completely automatic way using the auto_impl attribute.

This attribute will automatically generate implementations of the given trait for tuple combinations.

To view the example’s macro expansion, click here.

See the auto_impl documentation to learn about the attribute’s settings and limitations.

#[fortuples::auto_impl]
trait AutoImplTrait {
    fn test(&self, a: i32, b: &f32);
}
Show the macro expansion
auto_impl proc-macro expansion
impl AutoImplTrait for () {
    fn test(&self, _a: i32, _b: &f32) {}
}
impl<Member0> AutoImplTrait for (Member0,)
where
    Member0: AutoImplTrait,
{
    fn test(&self, _a: i32, _b: &f32) {
        self.0.test(_a.clone(), _b);
    }
}
impl<Member0, Member1> AutoImplTrait for (Member0, Member1)
where
    Member0: AutoImplTrait,
    Member1: AutoImplTrait,
{
    fn test(&self, _a: i32, _b: &f32) {
        self.0.test(_a.clone(), _b);
        self.1.test(_a.clone(), _b);
    }
}
impl<Member0, Member1, Member2> AutoImplTrait for (Member0, Member1, Member2)
where
    Member0: AutoImplTrait,
    Member1: AutoImplTrait,
    Member2: AutoImplTrait,
{
    fn test(&self, _a: i32, _b: &f32) {
        self.0.test(_a.clone(), _b);
        self.1.test(_a.clone(), _b);
        self.2.test(_a.clone(), _b);
    }
}
impl<Member0, Member1, Member2, Member3> AutoImplTrait for (Member0, Member1, Member2, Member3)
where
    Member0: AutoImplTrait,
    Member1: AutoImplTrait,
    Member2: AutoImplTrait,
    Member3: AutoImplTrait,
{
    fn test(&self, _a: i32, _b: &f32) {
        self.0.test(_a.clone(), _b);
        self.1.test(_a.clone(), _b);
        self.2.test(_a.clone(), _b);
        self.3.test(_a.clone(), _b);
    }
}
impl<Member0, Member1, Member2, Member3, Member4> AutoImplTrait
    for (Member0, Member1, Member2, Member3, Member4)
where
    Member0: AutoImplTrait,
    Member1: AutoImplTrait,
    Member2: AutoImplTrait,
    Member3: AutoImplTrait,
    Member4: AutoImplTrait,
{
    fn test(&self, _a: i32, _b: &f32) {
        self.0.test(_a.clone(), _b);
        self.1.test(_a.clone(), _b);
        self.2.test(_a.clone(), _b);
        self.3.test(_a.clone(), _b);
        self.4.test(_a.clone(), _b);
    }
}
impl<Member0, Member1, Member2, Member3, Member4, Member5> AutoImplTrait
    for (Member0, Member1, Member2, Member3, Member4, Member5)
where
    Member0: AutoImplTrait,
    Member1: AutoImplTrait,
    Member2: AutoImplTrait,
    Member3: AutoImplTrait,
    Member4: AutoImplTrait,
    Member5: AutoImplTrait,
{
    fn test(&self, _a: i32, _b: &f32) {
        self.0.test(_a.clone(), _b);
        self.1.test(_a.clone(), _b);
        self.2.test(_a.clone(), _b);
        self.3.test(_a.clone(), _b);
        self.4.test(_a.clone(), _b);
        self.5.test(_a.clone(), _b);
    }
}
impl<Member0, Member1, Member2, Member3, Member4, Member5, Member6> AutoImplTrait
    for (
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
    )
where
    Member0: AutoImplTrait,
    Member1: AutoImplTrait,
    Member2: AutoImplTrait,
    Member3: AutoImplTrait,
    Member4: AutoImplTrait,
    Member5: AutoImplTrait,
    Member6: AutoImplTrait,
{
    fn test(&self, _a: i32, _b: &f32) {
        self.0.test(_a.clone(), _b);
        self.1.test(_a.clone(), _b);
        self.2.test(_a.clone(), _b);
        self.3.test(_a.clone(), _b);
        self.4.test(_a.clone(), _b);
        self.5.test(_a.clone(), _b);
        self.6.test(_a.clone(), _b);
    }
}
impl<Member0, Member1, Member2, Member3, Member4, Member5, Member6, Member7> AutoImplTrait
    for (
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
    )
where
    Member0: AutoImplTrait,
    Member1: AutoImplTrait,
    Member2: AutoImplTrait,
    Member3: AutoImplTrait,
    Member4: AutoImplTrait,
    Member5: AutoImplTrait,
    Member6: AutoImplTrait,
    Member7: AutoImplTrait,
{
    fn test(&self, _a: i32, _b: &f32) {
        self.0.test(_a.clone(), _b);
        self.1.test(_a.clone(), _b);
        self.2.test(_a.clone(), _b);
        self.3.test(_a.clone(), _b);
        self.4.test(_a.clone(), _b);
        self.5.test(_a.clone(), _b);
        self.6.test(_a.clone(), _b);
        self.7.test(_a.clone(), _b);
    }
}
impl<Member0, Member1, Member2, Member3, Member4, Member5, Member6, Member7, Member8> AutoImplTrait
    for (
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
        Member8,
    )
where
    Member0: AutoImplTrait,
    Member1: AutoImplTrait,
    Member2: AutoImplTrait,
    Member3: AutoImplTrait,
    Member4: AutoImplTrait,
    Member5: AutoImplTrait,
    Member6: AutoImplTrait,
    Member7: AutoImplTrait,
    Member8: AutoImplTrait,
{
    fn test(&self, _a: i32, _b: &f32) {
        self.0.test(_a.clone(), _b);
        self.1.test(_a.clone(), _b);
        self.2.test(_a.clone(), _b);
        self.3.test(_a.clone(), _b);
        self.4.test(_a.clone(), _b);
        self.5.test(_a.clone(), _b);
        self.6.test(_a.clone(), _b);
        self.7.test(_a.clone(), _b);
        self.8.test(_a.clone(), _b);
    }
}
impl<Member0, Member1, Member2, Member3, Member4, Member5, Member6, Member7, Member8, Member9>
    AutoImplTrait
    for (
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
        Member8,
        Member9,
    )
where
    Member0: AutoImplTrait,
    Member1: AutoImplTrait,
    Member2: AutoImplTrait,
    Member3: AutoImplTrait,
    Member4: AutoImplTrait,
    Member5: AutoImplTrait,
    Member6: AutoImplTrait,
    Member7: AutoImplTrait,
    Member8: AutoImplTrait,
    Member9: AutoImplTrait,
{
    fn test(&self, _a: i32, _b: &f32) {
        self.0.test(_a.clone(), _b);
        self.1.test(_a.clone(), _b);
        self.2.test(_a.clone(), _b);
        self.3.test(_a.clone(), _b);
        self.4.test(_a.clone(), _b);
        self.5.test(_a.clone(), _b);
        self.6.test(_a.clone(), _b);
        self.7.test(_a.clone(), _b);
        self.8.test(_a.clone(), _b);
        self.9.test(_a.clone(), _b);
    }
}
impl<
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
        Member8,
        Member9,
        Member10,
    > AutoImplTrait
    for (
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
        Member8,
        Member9,
        Member10,
    )
where
    Member0: AutoImplTrait,
    Member1: AutoImplTrait,
    Member2: AutoImplTrait,
    Member3: AutoImplTrait,
    Member4: AutoImplTrait,
    Member5: AutoImplTrait,
    Member6: AutoImplTrait,
    Member7: AutoImplTrait,
    Member8: AutoImplTrait,
    Member9: AutoImplTrait,
    Member10: AutoImplTrait,
{
    fn test(&self, _a: i32, _b: &f32) {
        self.0.test(_a.clone(), _b);
        self.1.test(_a.clone(), _b);
        self.2.test(_a.clone(), _b);
        self.3.test(_a.clone(), _b);
        self.4.test(_a.clone(), _b);
        self.5.test(_a.clone(), _b);
        self.6.test(_a.clone(), _b);
        self.7.test(_a.clone(), _b);
        self.8.test(_a.clone(), _b);
        self.9.test(_a.clone(), _b);
        self.10.test(_a.clone(), _b);
    }
}
impl<
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
        Member8,
        Member9,
        Member10,
        Member11,
    > AutoImplTrait
    for (
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
        Member8,
        Member9,
        Member10,
        Member11,
    )
where
    Member0: AutoImplTrait,
    Member1: AutoImplTrait,
    Member2: AutoImplTrait,
    Member3: AutoImplTrait,
    Member4: AutoImplTrait,
    Member5: AutoImplTrait,
    Member6: AutoImplTrait,
    Member7: AutoImplTrait,
    Member8: AutoImplTrait,
    Member9: AutoImplTrait,
    Member10: AutoImplTrait,
    Member11: AutoImplTrait,
{
    fn test(&self, _a: i32, _b: &f32) {
        self.0.test(_a.clone(), _b);
        self.1.test(_a.clone(), _b);
        self.2.test(_a.clone(), _b);
        self.3.test(_a.clone(), _b);
        self.4.test(_a.clone(), _b);
        self.5.test(_a.clone(), _b);
        self.6.test(_a.clone(), _b);
        self.7.test(_a.clone(), _b);
        self.8.test(_a.clone(), _b);
        self.9.test(_a.clone(), _b);
        self.10.test(_a.clone(), _b);
        self.11.test(_a.clone(), _b);
    }
}
impl<
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
        Member8,
        Member9,
        Member10,
        Member11,
        Member12,
    > AutoImplTrait
    for (
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
        Member8,
        Member9,
        Member10,
        Member11,
        Member12,
    )
where
    Member0: AutoImplTrait,
    Member1: AutoImplTrait,
    Member2: AutoImplTrait,
    Member3: AutoImplTrait,
    Member4: AutoImplTrait,
    Member5: AutoImplTrait,
    Member6: AutoImplTrait,
    Member7: AutoImplTrait,
    Member8: AutoImplTrait,
    Member9: AutoImplTrait,
    Member10: AutoImplTrait,
    Member11: AutoImplTrait,
    Member12: AutoImplTrait,
{
    fn test(&self, _a: i32, _b: &f32) {
        self.0.test(_a.clone(), _b);
        self.1.test(_a.clone(), _b);
        self.2.test(_a.clone(), _b);
        self.3.test(_a.clone(), _b);
        self.4.test(_a.clone(), _b);
        self.5.test(_a.clone(), _b);
        self.6.test(_a.clone(), _b);
        self.7.test(_a.clone(), _b);
        self.8.test(_a.clone(), _b);
        self.9.test(_a.clone(), _b);
        self.10.test(_a.clone(), _b);
        self.11.test(_a.clone(), _b);
        self.12.test(_a.clone(), _b);
    }
}
impl<
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
        Member8,
        Member9,
        Member10,
        Member11,
        Member12,
        Member13,
    > AutoImplTrait
    for (
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
        Member8,
        Member9,
        Member10,
        Member11,
        Member12,
        Member13,
    )
where
    Member0: AutoImplTrait,
    Member1: AutoImplTrait,
    Member2: AutoImplTrait,
    Member3: AutoImplTrait,
    Member4: AutoImplTrait,
    Member5: AutoImplTrait,
    Member6: AutoImplTrait,
    Member7: AutoImplTrait,
    Member8: AutoImplTrait,
    Member9: AutoImplTrait,
    Member10: AutoImplTrait,
    Member11: AutoImplTrait,
    Member12: AutoImplTrait,
    Member13: AutoImplTrait,
{
    fn test(&self, _a: i32, _b: &f32) {
        self.0.test(_a.clone(), _b);
        self.1.test(_a.clone(), _b);
        self.2.test(_a.clone(), _b);
        self.3.test(_a.clone(), _b);
        self.4.test(_a.clone(), _b);
        self.5.test(_a.clone(), _b);
        self.6.test(_a.clone(), _b);
        self.7.test(_a.clone(), _b);
        self.8.test(_a.clone(), _b);
        self.9.test(_a.clone(), _b);
        self.10.test(_a.clone(), _b);
        self.11.test(_a.clone(), _b);
        self.12.test(_a.clone(), _b);
        self.13.test(_a.clone(), _b);
    }
}
impl<
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
        Member8,
        Member9,
        Member10,
        Member11,
        Member12,
        Member13,
        Member14,
    > AutoImplTrait
    for (
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
        Member8,
        Member9,
        Member10,
        Member11,
        Member12,
        Member13,
        Member14,
    )
where
    Member0: AutoImplTrait,
    Member1: AutoImplTrait,
    Member2: AutoImplTrait,
    Member3: AutoImplTrait,
    Member4: AutoImplTrait,
    Member5: AutoImplTrait,
    Member6: AutoImplTrait,
    Member7: AutoImplTrait,
    Member8: AutoImplTrait,
    Member9: AutoImplTrait,
    Member10: AutoImplTrait,
    Member11: AutoImplTrait,
    Member12: AutoImplTrait,
    Member13: AutoImplTrait,
    Member14: AutoImplTrait,
{
    fn test(&self, _a: i32, _b: &f32) {
        self.0.test(_a.clone(), _b);
        self.1.test(_a.clone(), _b);
        self.2.test(_a.clone(), _b);
        self.3.test(_a.clone(), _b);
        self.4.test(_a.clone(), _b);
        self.5.test(_a.clone(), _b);
        self.6.test(_a.clone(), _b);
        self.7.test(_a.clone(), _b);
        self.8.test(_a.clone(), _b);
        self.9.test(_a.clone(), _b);
        self.10.test(_a.clone(), _b);
        self.11.test(_a.clone(), _b);
        self.12.test(_a.clone(), _b);
        self.13.test(_a.clone(), _b);
        self.14.test(_a.clone(), _b);
    }
}
impl<
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
        Member8,
        Member9,
        Member10,
        Member11,
        Member12,
        Member13,
        Member14,
        Member15,
    > AutoImplTrait
    for (
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
        Member8,
        Member9,
        Member10,
        Member11,
        Member12,
        Member13,
        Member14,
        Member15,
    )
where
    Member0: AutoImplTrait,
    Member1: AutoImplTrait,
    Member2: AutoImplTrait,
    Member3: AutoImplTrait,
    Member4: AutoImplTrait,
    Member5: AutoImplTrait,
    Member6: AutoImplTrait,
    Member7: AutoImplTrait,
    Member8: AutoImplTrait,
    Member9: AutoImplTrait,
    Member10: AutoImplTrait,
    Member11: AutoImplTrait,
    Member12: AutoImplTrait,
    Member13: AutoImplTrait,
    Member14: AutoImplTrait,
    Member15: AutoImplTrait,
{
    fn test(&self, _a: i32, _b: &f32) {
        self.0.test(_a.clone(), _b);
        self.1.test(_a.clone(), _b);
        self.2.test(_a.clone(), _b);
        self.3.test(_a.clone(), _b);
        self.4.test(_a.clone(), _b);
        self.5.test(_a.clone(), _b);
        self.6.test(_a.clone(), _b);
        self.7.test(_a.clone(), _b);
        self.8.test(_a.clone(), _b);
        self.9.test(_a.clone(), _b);
        self.10.test(_a.clone(), _b);
        self.11.test(_a.clone(), _b);
        self.12.test(_a.clone(), _b);
        self.13.test(_a.clone(), _b);
        self.14.test(_a.clone(), _b);
        self.15.test(_a.clone(), _b);
    }
}

Macros

  • A macro for manual generalization of inherent and trait implementations over tuples.

Attribute Macros

  • An attribute macro for generating full-automatic trait implementations for tuples.