Attribute Macro fortuples::auto_impl

source ·
#[auto_impl]
Expand description

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

Syntax

Just place the #[fortuples::auto_impl] attribute in front of a trait.

#[fortuples::auto_impl]
trait Trait {
    fn no_args();

    // Note that non-reference arguments should implement the `Clone` trait.
    fn assoc_fn_args<T: Clone, U>(non_ref_arg: T, ref_arg: &U);

    // Note that non-reference arguments should implement the `Clone` trait.
    // But it's not required for `self`.
    fn self_fn_args<T: Clone, U>(self, non_ref_arg: T, ref_arg: &U);
}
Show the macro expansion
impl Trait for () {
    fn no_args() {}
    fn assoc_fn_args<T: Clone, U>(_non_ref_arg: T, _ref_arg: &U) {}
    fn self_fn_args<T: Clone, U>(self, _non_ref_arg: T, _ref_arg: &U) {}
}
impl<Member0> Trait for (Member0,)
where
    Member0: Trait,
{
    fn no_args() {
        Member0::no_args();
    }
    fn assoc_fn_args<T: Clone, U>(_non_ref_arg: T, _ref_arg: &U) {
        Member0::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
    }
    fn self_fn_args<T: Clone, U>(self, _non_ref_arg: T, _ref_arg: &U) {
        self.0.self_fn_args(_non_ref_arg.clone(), _ref_arg);
    }
}
impl<Member0, Member1> Trait for (Member0, Member1)
where
    Member0: Trait,
    Member1: Trait,
{
    fn no_args() {
        Member0::no_args();
        Member1::no_args();
    }
    fn assoc_fn_args<T: Clone, U>(_non_ref_arg: T, _ref_arg: &U) {
        Member0::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member1::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
    }
    fn self_fn_args<T: Clone, U>(self, _non_ref_arg: T, _ref_arg: &U) {
        self.0.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.1.self_fn_args(_non_ref_arg.clone(), _ref_arg);
    }
}
impl<Member0, Member1, Member2> Trait for (Member0, Member1, Member2)
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
{
    fn no_args() {
        Member0::no_args();
        Member1::no_args();
        Member2::no_args();
    }
    fn assoc_fn_args<T: Clone, U>(_non_ref_arg: T, _ref_arg: &U) {
        Member0::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member1::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member2::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
    }
    fn self_fn_args<T: Clone, U>(self, _non_ref_arg: T, _ref_arg: &U) {
        self.0.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.1.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.2.self_fn_args(_non_ref_arg.clone(), _ref_arg);
    }
}
impl<Member0, Member1, Member2, Member3> Trait for (Member0, Member1, Member2, Member3)
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
{
    fn no_args() {
        Member0::no_args();
        Member1::no_args();
        Member2::no_args();
        Member3::no_args();
    }
    fn assoc_fn_args<T: Clone, U>(_non_ref_arg: T, _ref_arg: &U) {
        Member0::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member1::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member2::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member3::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
    }
    fn self_fn_args<T: Clone, U>(self, _non_ref_arg: T, _ref_arg: &U) {
        self.0.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.1.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.2.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.3.self_fn_args(_non_ref_arg.clone(), _ref_arg);
    }
}
impl<Member0, Member1, Member2, Member3, Member4> Trait
    for (Member0, Member1, Member2, Member3, Member4)
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
{
    fn no_args() {
        Member0::no_args();
        Member1::no_args();
        Member2::no_args();
        Member3::no_args();
        Member4::no_args();
    }
    fn assoc_fn_args<T: Clone, U>(_non_ref_arg: T, _ref_arg: &U) {
        Member0::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member1::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member2::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member3::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member4::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
    }
    fn self_fn_args<T: Clone, U>(self, _non_ref_arg: T, _ref_arg: &U) {
        self.0.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.1.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.2.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.3.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.4.self_fn_args(_non_ref_arg.clone(), _ref_arg);
    }
}
impl<Member0, Member1, Member2, Member3, Member4, Member5> Trait
    for (Member0, Member1, Member2, Member3, Member4, Member5)
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
{
    fn no_args() {
        Member0::no_args();
        Member1::no_args();
        Member2::no_args();
        Member3::no_args();
        Member4::no_args();
        Member5::no_args();
    }
    fn assoc_fn_args<T: Clone, U>(_non_ref_arg: T, _ref_arg: &U) {
        Member0::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member1::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member2::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member3::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member4::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member5::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
    }
    fn self_fn_args<T: Clone, U>(self, _non_ref_arg: T, _ref_arg: &U) {
        self.0.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.1.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.2.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.3.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.4.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.5.self_fn_args(_non_ref_arg.clone(), _ref_arg);
    }
}
impl<Member0, Member1, Member2, Member3, Member4, Member5, Member6> Trait
    for (
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
    )
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
{
    fn no_args() {
        Member0::no_args();
        Member1::no_args();
        Member2::no_args();
        Member3::no_args();
        Member4::no_args();
        Member5::no_args();
        Member6::no_args();
    }
    fn assoc_fn_args<T: Clone, U>(_non_ref_arg: T, _ref_arg: &U) {
        Member0::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member1::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member2::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member3::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member4::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member5::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member6::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
    }
    fn self_fn_args<T: Clone, U>(self, _non_ref_arg: T, _ref_arg: &U) {
        self.0.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.1.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.2.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.3.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.4.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.5.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.6.self_fn_args(_non_ref_arg.clone(), _ref_arg);
    }
}
impl<Member0, Member1, Member2, Member3, Member4, Member5, Member6, Member7> Trait
    for (
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
    )
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
{
    fn no_args() {
        Member0::no_args();
        Member1::no_args();
        Member2::no_args();
        Member3::no_args();
        Member4::no_args();
        Member5::no_args();
        Member6::no_args();
        Member7::no_args();
    }
    fn assoc_fn_args<T: Clone, U>(_non_ref_arg: T, _ref_arg: &U) {
        Member0::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member1::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member2::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member3::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member4::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member5::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member6::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member7::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
    }
    fn self_fn_args<T: Clone, U>(self, _non_ref_arg: T, _ref_arg: &U) {
        self.0.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.1.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.2.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.3.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.4.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.5.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.6.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.7.self_fn_args(_non_ref_arg.clone(), _ref_arg);
    }
}
impl<Member0, Member1, Member2, Member3, Member4, Member5, Member6, Member7, Member8> Trait
    for (
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
        Member8,
    )
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
    Member8: Trait,
{
    fn no_args() {
        Member0::no_args();
        Member1::no_args();
        Member2::no_args();
        Member3::no_args();
        Member4::no_args();
        Member5::no_args();
        Member6::no_args();
        Member7::no_args();
        Member8::no_args();
    }
    fn assoc_fn_args<T: Clone, U>(_non_ref_arg: T, _ref_arg: &U) {
        Member0::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member1::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member2::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member3::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member4::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member5::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member6::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member7::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member8::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
    }
    fn self_fn_args<T: Clone, U>(self, _non_ref_arg: T, _ref_arg: &U) {
        self.0.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.1.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.2.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.3.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.4.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.5.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.6.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.7.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.8.self_fn_args(_non_ref_arg.clone(), _ref_arg);
    }
}
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,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
    Member8: Trait,
    Member9: Trait,
{
    fn no_args() {
        Member0::no_args();
        Member1::no_args();
        Member2::no_args();
        Member3::no_args();
        Member4::no_args();
        Member5::no_args();
        Member6::no_args();
        Member7::no_args();
        Member8::no_args();
        Member9::no_args();
    }
    fn assoc_fn_args<T: Clone, U>(_non_ref_arg: T, _ref_arg: &U) {
        Member0::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member1::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member2::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member3::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member4::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member5::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member6::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member7::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member8::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member9::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
    }
    fn self_fn_args<T: Clone, U>(self, _non_ref_arg: T, _ref_arg: &U) {
        self.0.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.1.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.2.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.3.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.4.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.5.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.6.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.7.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.8.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.9.self_fn_args(_non_ref_arg.clone(), _ref_arg);
    }
}
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,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
    Member8: Trait,
    Member9: Trait,
    Member10: Trait,
{
    fn no_args() {
        Member0::no_args();
        Member1::no_args();
        Member2::no_args();
        Member3::no_args();
        Member4::no_args();
        Member5::no_args();
        Member6::no_args();
        Member7::no_args();
        Member8::no_args();
        Member9::no_args();
        Member10::no_args();
    }
    fn assoc_fn_args<T: Clone, U>(_non_ref_arg: T, _ref_arg: &U) {
        Member0::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member1::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member2::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member3::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member4::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member5::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member6::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member7::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member8::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member9::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member10::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
    }
    fn self_fn_args<T: Clone, U>(self, _non_ref_arg: T, _ref_arg: &U) {
        self.0.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.1.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.2.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.3.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.4.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.5.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.6.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.7.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.8.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.9.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.10.self_fn_args(_non_ref_arg.clone(), _ref_arg);
    }
}
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,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
    Member8: Trait,
    Member9: Trait,
    Member10: Trait,
    Member11: Trait,
{
    fn no_args() {
        Member0::no_args();
        Member1::no_args();
        Member2::no_args();
        Member3::no_args();
        Member4::no_args();
        Member5::no_args();
        Member6::no_args();
        Member7::no_args();
        Member8::no_args();
        Member9::no_args();
        Member10::no_args();
        Member11::no_args();
    }
    fn assoc_fn_args<T: Clone, U>(_non_ref_arg: T, _ref_arg: &U) {
        Member0::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member1::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member2::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member3::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member4::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member5::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member6::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member7::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member8::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member9::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member10::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member11::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
    }
    fn self_fn_args<T: Clone, U>(self, _non_ref_arg: T, _ref_arg: &U) {
        self.0.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.1.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.2.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.3.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.4.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.5.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.6.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.7.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.8.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.9.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.10.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.11.self_fn_args(_non_ref_arg.clone(), _ref_arg);
    }
}
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,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
    Member8: Trait,
    Member9: Trait,
    Member10: Trait,
    Member11: Trait,
    Member12: Trait,
{
    fn no_args() {
        Member0::no_args();
        Member1::no_args();
        Member2::no_args();
        Member3::no_args();
        Member4::no_args();
        Member5::no_args();
        Member6::no_args();
        Member7::no_args();
        Member8::no_args();
        Member9::no_args();
        Member10::no_args();
        Member11::no_args();
        Member12::no_args();
    }
    fn assoc_fn_args<T: Clone, U>(_non_ref_arg: T, _ref_arg: &U) {
        Member0::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member1::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member2::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member3::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member4::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member5::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member6::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member7::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member8::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member9::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member10::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member11::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member12::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
    }
    fn self_fn_args<T: Clone, U>(self, _non_ref_arg: T, _ref_arg: &U) {
        self.0.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.1.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.2.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.3.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.4.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.5.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.6.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.7.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.8.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.9.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.10.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.11.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.12.self_fn_args(_non_ref_arg.clone(), _ref_arg);
    }
}
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,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
    Member8: Trait,
    Member9: Trait,
    Member10: Trait,
    Member11: Trait,
    Member12: Trait,
    Member13: Trait,
{
    fn no_args() {
        Member0::no_args();
        Member1::no_args();
        Member2::no_args();
        Member3::no_args();
        Member4::no_args();
        Member5::no_args();
        Member6::no_args();
        Member7::no_args();
        Member8::no_args();
        Member9::no_args();
        Member10::no_args();
        Member11::no_args();
        Member12::no_args();
        Member13::no_args();
    }
    fn assoc_fn_args<T: Clone, U>(_non_ref_arg: T, _ref_arg: &U) {
        Member0::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member1::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member2::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member3::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member4::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member5::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member6::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member7::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member8::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member9::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member10::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member11::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member12::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member13::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
    }
    fn self_fn_args<T: Clone, U>(self, _non_ref_arg: T, _ref_arg: &U) {
        self.0.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.1.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.2.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.3.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.4.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.5.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.6.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.7.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.8.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.9.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.10.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.11.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.12.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.13.self_fn_args(_non_ref_arg.clone(), _ref_arg);
    }
}
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,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
    Member8: Trait,
    Member9: Trait,
    Member10: Trait,
    Member11: Trait,
    Member12: Trait,
    Member13: Trait,
    Member14: Trait,
{
    fn no_args() {
        Member0::no_args();
        Member1::no_args();
        Member2::no_args();
        Member3::no_args();
        Member4::no_args();
        Member5::no_args();
        Member6::no_args();
        Member7::no_args();
        Member8::no_args();
        Member9::no_args();
        Member10::no_args();
        Member11::no_args();
        Member12::no_args();
        Member13::no_args();
        Member14::no_args();
    }
    fn assoc_fn_args<T: Clone, U>(_non_ref_arg: T, _ref_arg: &U) {
        Member0::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member1::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member2::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member3::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member4::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member5::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member6::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member7::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member8::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member9::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member10::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member11::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member12::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member13::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member14::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
    }
    fn self_fn_args<T: Clone, U>(self, _non_ref_arg: T, _ref_arg: &U) {
        self.0.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.1.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.2.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.3.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.4.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.5.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.6.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.7.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.8.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.9.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.10.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.11.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.12.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.13.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.14.self_fn_args(_non_ref_arg.clone(), _ref_arg);
    }
}
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,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
    Member8: Trait,
    Member9: Trait,
    Member10: Trait,
    Member11: Trait,
    Member12: Trait,
    Member13: Trait,
    Member14: Trait,
    Member15: Trait,
{
    fn no_args() {
        Member0::no_args();
        Member1::no_args();
        Member2::no_args();
        Member3::no_args();
        Member4::no_args();
        Member5::no_args();
        Member6::no_args();
        Member7::no_args();
        Member8::no_args();
        Member9::no_args();
        Member10::no_args();
        Member11::no_args();
        Member12::no_args();
        Member13::no_args();
        Member14::no_args();
        Member15::no_args();
    }
    fn assoc_fn_args<T: Clone, U>(_non_ref_arg: T, _ref_arg: &U) {
        Member0::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member1::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member2::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member3::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member4::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member5::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member6::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member7::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member8::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member9::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member10::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member11::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member12::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member13::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member14::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
        Member15::assoc_fn_args(_non_ref_arg.clone(), _ref_arg);
    }
    fn self_fn_args<T: Clone, U>(self, _non_ref_arg: T, _ref_arg: &U) {
        self.0.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.1.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.2.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.3.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.4.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.5.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.6.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.7.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.8.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.9.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.10.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.11.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.12.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.13.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.14.self_fn_args(_non_ref_arg.clone(), _ref_arg);
        self.15.self_fn_args(_non_ref_arg.clone(), _ref_arg);
    }
}

Limitations

  • Trait functions can’t have a return type.
  • There should be no associated types.
  • There should be no associated constants.
  • The functions’ arguments can be only identifiers or wildcards.
#[fortuples::auto_impl]
trait Trait {
    // OK
    fn ident_and_wildcard(arg: i32, _: char);

    // NOT OK
    fn tuple_destruct((a, b): (i32, char));
}
  • There should be no macro calls inside the trait itself.
macro_rules! some_macro {
    () => {};
}

#[fortuples::auto_impl]
trait Trait {
    some_macro!();
}

However, macro calls are allowed inside the default implementations.

macro_rules! some_macro {
    () => {};
}

#[fortuples::auto_impl]
trait Trait {
    fn test() {
        some_macro!();
    }
}

Settings

min_size

#[tuples::min_size] sets the length of the first tuple. By default, it equals 0.

#[fortuples::auto_impl]
#[tuples::min_size(2)]
trait Trait {}
Show the macro expansion
impl<Member0, Member1> Trait for (Member0, Member1)
where
    Member0: Trait,
    Member1: Trait,
{
}
impl<Member0, Member1, Member2> Trait for (Member0, Member1, Member2)
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
{
}
impl<Member0, Member1, Member2, Member3> Trait for (Member0, Member1, Member2, Member3)
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
{
}
impl<Member0, Member1, Member2, Member3, Member4> Trait
    for (Member0, Member1, Member2, Member3, Member4)
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
{
}
impl<Member0, Member1, Member2, Member3, Member4, Member5> Trait
    for (Member0, Member1, Member2, Member3, Member4, Member5)
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
{
}
impl<Member0, Member1, Member2, Member3, Member4, Member5, Member6> Trait
    for (
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
    )
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
{
}
impl<Member0, Member1, Member2, Member3, Member4, Member5, Member6, Member7> Trait
    for (
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
    )
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
{
}
impl<Member0, Member1, Member2, Member3, Member4, Member5, Member6, Member7, Member8> Trait
    for (
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
        Member8,
    )
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
    Member8: Trait,
{
}
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,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
    Member8: Trait,
    Member9: Trait,
{
}
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,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
    Member8: Trait,
    Member9: Trait,
    Member10: Trait,
{
}
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,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
    Member8: Trait,
    Member9: Trait,
    Member10: Trait,
    Member11: Trait,
{
}
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,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
    Member8: Trait,
    Member9: Trait,
    Member10: Trait,
    Member11: Trait,
    Member12: Trait,
{
}
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,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
    Member8: Trait,
    Member9: Trait,
    Member10: Trait,
    Member11: Trait,
    Member12: Trait,
    Member13: Trait,
{
}
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,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
    Member8: Trait,
    Member9: Trait,
    Member10: Trait,
    Member11: Trait,
    Member12: Trait,
    Member13: Trait,
    Member14: Trait,
{
}
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,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
    Member8: Trait,
    Member9: Trait,
    Member10: Trait,
    Member11: Trait,
    Member12: Trait,
    Member13: Trait,
    Member14: Trait,
    Member15: Trait,
{
}
max_size

#[tuples::max_size] sets the length of the last tuple. By default, it equals 16.

#[fortuples::auto_impl]
#[tuples::max_size(4)]
trait Trait {}
Show the macro expansion
impl Trait for () {}
impl<Member0> Trait for (Member0,) where Member0: Trait {}
impl<Member0, Member1> Trait for (Member0, Member1)
where
    Member0: Trait,
    Member1: Trait,
{
}
impl<Member0, Member1, Member2> Trait for (Member0, Member1, Member2)
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
{
}
impl<Member0, Member1, Member2, Member3> Trait for (Member0, Member1, Member2, Member3)
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
{
}
refs_tuple

#[tuples::refs_tuple] adds references to each member type inside the current tuple.

Immutable refs
#[fortuples::auto_impl]
#[tuples::refs_tuple]
trait Trait {}
Show the macro expansion
impl Trait for () {}
impl<Member0> Trait for (&Member0,) where Member0: Trait {}
impl<Member0, Member1> Trait for (&Member0, &Member1)
where
    Member0: Trait,
    Member1: Trait,
{
}
impl<Member0, Member1, Member2> Trait for (&Member0, &Member1, &Member2)
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
{
}
impl<Member0, Member1, Member2, Member3> Trait for (&Member0, &Member1, &Member2, &Member3)
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
{
}
impl<Member0, Member1, Member2, Member3, Member4> Trait
    for (&Member0, &Member1, &Member2, &Member3, &Member4)
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
{
}
impl<Member0, Member1, Member2, Member3, Member4, Member5> Trait
    for (&Member0, &Member1, &Member2, &Member3, &Member4, &Member5)
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
{
}
impl<Member0, Member1, Member2, Member3, Member4, Member5, Member6> Trait
    for (
        &Member0,
        &Member1,
        &Member2,
        &Member3,
        &Member4,
        &Member5,
        &Member6,
    )
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
{
}
impl<Member0, Member1, Member2, Member3, Member4, Member5, Member6, Member7> Trait
    for (
        &Member0,
        &Member1,
        &Member2,
        &Member3,
        &Member4,
        &Member5,
        &Member6,
        &Member7,
    )
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
{
}
impl<Member0, Member1, Member2, Member3, Member4, Member5, Member6, Member7, Member8> Trait
    for (
        &Member0,
        &Member1,
        &Member2,
        &Member3,
        &Member4,
        &Member5,
        &Member6,
        &Member7,
        &Member8,
    )
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
    Member8: Trait,
{
}
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,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
    Member8: Trait,
    Member9: Trait,
{
}
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,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
    Member8: Trait,
    Member9: Trait,
    Member10: Trait,
{
}
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,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
    Member8: Trait,
    Member9: Trait,
    Member10: Trait,
    Member11: Trait,
{
}
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,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
    Member8: Trait,
    Member9: Trait,
    Member10: Trait,
    Member11: Trait,
    Member12: Trait,
{
}
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,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
    Member8: Trait,
    Member9: Trait,
    Member10: Trait,
    Member11: Trait,
    Member12: Trait,
    Member13: Trait,
{
}
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,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
    Member8: Trait,
    Member9: Trait,
    Member10: Trait,
    Member11: Trait,
    Member12: Trait,
    Member13: Trait,
    Member14: Trait,
{
}
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,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
    Member8: Trait,
    Member9: Trait,
    Member10: Trait,
    Member11: Trait,
    Member12: Trait,
    Member13: Trait,
    Member14: Trait,
    Member15: Trait,
{
}
Mutable refs
#[fortuples::auto_impl]
#[tuples::refs_tuple(mut)]
trait Trait {}
Show the macro expansion
impl Trait for () {}
impl<Member0> Trait for (&mut Member0,) where Member0: Trait {}
impl<Member0, Member1> Trait for (&mut Member0, &mut Member1)
where
    Member0: Trait,
    Member1: Trait,
{
}
impl<Member0, Member1, Member2> Trait for (&mut Member0, &mut Member1, &mut Member2)
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
{
}
impl<Member0, Member1, Member2, Member3> Trait
    for (&mut Member0, &mut Member1, &mut Member2, &mut Member3)
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
{
}
impl<Member0, Member1, Member2, Member3, Member4> Trait
    for (
        &mut Member0,
        &mut Member1,
        &mut Member2,
        &mut Member3,
        &mut Member4,
    )
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
{
}
impl<Member0, Member1, Member2, Member3, Member4, Member5> Trait
    for (
        &mut Member0,
        &mut Member1,
        &mut Member2,
        &mut Member3,
        &mut Member4,
        &mut Member5,
    )
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
{
}
impl<Member0, Member1, Member2, Member3, Member4, Member5, Member6> Trait
    for (
        &mut Member0,
        &mut Member1,
        &mut Member2,
        &mut Member3,
        &mut Member4,
        &mut Member5,
        &mut Member6,
    )
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
{
}
impl<Member0, Member1, Member2, Member3, Member4, Member5, Member6, Member7> Trait
    for (
        &mut Member0,
        &mut Member1,
        &mut Member2,
        &mut Member3,
        &mut Member4,
        &mut Member5,
        &mut Member6,
        &mut Member7,
    )
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
{
}
impl<Member0, Member1, Member2, Member3, Member4, Member5, Member6, Member7, Member8> Trait
    for (
        &mut Member0,
        &mut Member1,
        &mut Member2,
        &mut Member3,
        &mut Member4,
        &mut Member5,
        &mut Member6,
        &mut Member7,
        &mut Member8,
    )
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
    Member8: Trait,
{
}
impl<Member0, Member1, Member2, Member3, Member4, Member5, Member6, Member7, Member8, Member9> Trait
    for (
        &mut Member0,
        &mut Member1,
        &mut Member2,
        &mut Member3,
        &mut Member4,
        &mut Member5,
        &mut Member6,
        &mut Member7,
        &mut Member8,
        &mut Member9,
    )
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
    Member8: Trait,
    Member9: Trait,
{
}
impl<
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
        Member8,
        Member9,
        Member10,
    > Trait
    for (
        &mut Member0,
        &mut Member1,
        &mut Member2,
        &mut Member3,
        &mut Member4,
        &mut Member5,
        &mut Member6,
        &mut Member7,
        &mut Member8,
        &mut Member9,
        &mut Member10,
    )
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
    Member8: Trait,
    Member9: Trait,
    Member10: Trait,
{
}
impl<
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
        Member8,
        Member9,
        Member10,
        Member11,
    > Trait
    for (
        &mut Member0,
        &mut Member1,
        &mut Member2,
        &mut Member3,
        &mut Member4,
        &mut Member5,
        &mut Member6,
        &mut Member7,
        &mut Member8,
        &mut Member9,
        &mut Member10,
        &mut Member11,
    )
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
    Member8: Trait,
    Member9: Trait,
    Member10: Trait,
    Member11: Trait,
{
}
impl<
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
        Member8,
        Member9,
        Member10,
        Member11,
        Member12,
    > Trait
    for (
        &mut Member0,
        &mut Member1,
        &mut Member2,
        &mut Member3,
        &mut Member4,
        &mut Member5,
        &mut Member6,
        &mut Member7,
        &mut Member8,
        &mut Member9,
        &mut Member10,
        &mut Member11,
        &mut Member12,
    )
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
    Member8: Trait,
    Member9: Trait,
    Member10: Trait,
    Member11: Trait,
    Member12: Trait,
{
}
impl<
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
        Member8,
        Member9,
        Member10,
        Member11,
        Member12,
        Member13,
    > Trait
    for (
        &mut Member0,
        &mut Member1,
        &mut Member2,
        &mut Member3,
        &mut Member4,
        &mut Member5,
        &mut Member6,
        &mut Member7,
        &mut Member8,
        &mut Member9,
        &mut Member10,
        &mut Member11,
        &mut Member12,
        &mut Member13,
    )
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
    Member8: Trait,
    Member9: Trait,
    Member10: Trait,
    Member11: Trait,
    Member12: Trait,
    Member13: Trait,
{
}
impl<
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
        Member8,
        Member9,
        Member10,
        Member11,
        Member12,
        Member13,
        Member14,
    > Trait
    for (
        &mut Member0,
        &mut Member1,
        &mut Member2,
        &mut Member3,
        &mut Member4,
        &mut Member5,
        &mut Member6,
        &mut Member7,
        &mut Member8,
        &mut Member9,
        &mut Member10,
        &mut Member11,
        &mut Member12,
        &mut Member13,
        &mut Member14,
    )
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
    Member8: Trait,
    Member9: Trait,
    Member10: Trait,
    Member11: Trait,
    Member12: Trait,
    Member13: Trait,
    Member14: Trait,
{
}
impl<
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
        Member8,
        Member9,
        Member10,
        Member11,
        Member12,
        Member13,
        Member14,
        Member15,
    > Trait
    for (
        &mut Member0,
        &mut Member1,
        &mut Member2,
        &mut Member3,
        &mut Member4,
        &mut Member5,
        &mut Member6,
        &mut Member7,
        &mut Member8,
        &mut Member9,
        &mut Member10,
        &mut Member11,
        &mut Member12,
        &mut Member13,
        &mut Member14,
        &mut Member15,
    )
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
    Member8: Trait,
    Member9: Trait,
    Member10: Trait,
    Member11: Trait,
    Member12: Trait,
    Member13: Trait,
    Member14: Trait,
    Member15: Trait,
{
}
debug_expand

#[tuples::debug_expand] will print the macro expansion.

The expansion can be printed either to stdout or a file.

  • #[tuples::debug_expand] prints to stdout.
  • #[tuples::debug_expand(path = "<filepath>")] prints to the file specified by the <filepath>.

All the macro expansions provided in this documentation were obtained using this setting.

Note: the #[tuples::debug_expand] prints the macro expansion only if the debug feature is enabled.

#[fortuples::auto_impl]
#[tuples::debug_expand(path = "doc/expand/auto_impl_debug_expand.rs")]
trait Trait {}
Show the macro expansion
impl Trait for () {}
impl<Member0> Trait for (Member0,) where Member0: Trait {}
impl<Member0, Member1> Trait for (Member0, Member1)
where
    Member0: Trait,
    Member1: Trait,
{
}
impl<Member0, Member1, Member2> Trait for (Member0, Member1, Member2)
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
{
}
impl<Member0, Member1, Member2, Member3> Trait for (Member0, Member1, Member2, Member3)
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
{
}
impl<Member0, Member1, Member2, Member3, Member4> Trait
    for (Member0, Member1, Member2, Member3, Member4)
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
{
}
impl<Member0, Member1, Member2, Member3, Member4, Member5> Trait
    for (Member0, Member1, Member2, Member3, Member4, Member5)
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
{
}
impl<Member0, Member1, Member2, Member3, Member4, Member5, Member6> Trait
    for (
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
    )
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
{
}
impl<Member0, Member1, Member2, Member3, Member4, Member5, Member6, Member7> Trait
    for (
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
    )
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
{
}
impl<Member0, Member1, Member2, Member3, Member4, Member5, Member6, Member7, Member8> Trait
    for (
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
        Member8,
    )
where
    Member0: Trait,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
    Member8: Trait,
{
}
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,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
    Member8: Trait,
    Member9: Trait,
{
}
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,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
    Member8: Trait,
    Member9: Trait,
    Member10: Trait,
{
}
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,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
    Member8: Trait,
    Member9: Trait,
    Member10: Trait,
    Member11: Trait,
{
}
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,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
    Member8: Trait,
    Member9: Trait,
    Member10: Trait,
    Member11: Trait,
    Member12: Trait,
{
}
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,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
    Member8: Trait,
    Member9: Trait,
    Member10: Trait,
    Member11: Trait,
    Member12: Trait,
    Member13: Trait,
{
}
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,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
    Member8: Trait,
    Member9: Trait,
    Member10: Trait,
    Member11: Trait,
    Member12: Trait,
    Member13: Trait,
    Member14: Trait,
{
}
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,
    Member1: Trait,
    Member2: Trait,
    Member3: Trait,
    Member4: Trait,
    Member5: Trait,
    Member6: Trait,
    Member7: Trait,
    Member8: Trait,
    Member9: Trait,
    Member10: Trait,
    Member11: Trait,
    Member12: Trait,
    Member13: Trait,
    Member14: Trait,
    Member15: Trait,
{
}