Macro fortuples::fortuples

source ·
fortuples!() { /* proc-macro */ }
Expand description

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

This documentation will provide the macro’s syntax and settings details.

If you’re looking for an example, please see one inside the crate documentation.

Syntax

The general syntax looks like the following:

fortuples! {
    |optional: fortuples! settings and other attributes|

    |optional unsafe| impl |optional generics| |implementation body|
}

The macro will expand the provided code several times for different tuple varieties – (), (Member0,), (Member0, Member1), and so on.

Meta-variables

The macro provides several meta-variables which can be used inside the |implementation body|:

  • #Tuple expands to the current tuple – (), (Member0,), (Member0, Member1), …
  • #len(Tuple) expands to the current tuple’s length:
#Tuple#len(Tuple)
()0usize
(Member0,)1usize
(Member0, Member1)2usize
  • #Member expands to the current tuple’s member type. It can be used within a repetition only (see below).
  • #<id> (where <id> is an arbitrary identifier) expands the id as if it were a tuple variable. It can be used within a repetition only (see below).
Repetition

Repetition is done using #(...)* or #(...),* (or #(...)<separator>* in general).

It expands the code within the parentheses as often as many elements are in the current tuple separated by the <separator> if provided.

Note: when using a comma as a separator, the macro always leaves the trailing comma.

For instance, #(println!("Hi");)* will expand for different tuple varieties like the following:

#Tuple#(println!(“Hi”);)*
()
(Member0,)println!("Hi");
(Member0, Member1)println!("Hi"); println!("Hi");

#Member repetition

The meta-variable #Member expands like the following:

#Tuple#(#Member),*
()
(Member0,)Member0,
(Member0, Member1)Member0, Member1,

#<id> repetition

The meta-variable #<id> expands like the following:

#Tuple#(#<id>),*
()
(Member0,)<id>.0,
(Member0, Member1)<id>.0, <id>.1,
Recursion

You can do a repetition recursively:

#Tuplevec![ #(vec![ #(#myvar),* ]),* ]
()
(Member0,)vec![vec![myvar.0,],]
(Member0, Member1)vec![vec![myvar.0, myvar.1,], vec![myvar.0, myvar.1,],]

Settings

min_size

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

trait Trait {}

fortuples! {
    #[tuples::min_size(2)]
    impl Trait for #Tuple {}
}
Show the macro expansion
impl<Member0, Member1> Trait for (Member0, Member1) {}
impl<Member0, Member1, Member2> Trait for (Member0, Member1, Member2) {}
impl<Member0, Member1, Member2, Member3> Trait for (Member0, Member1, Member2, Member3) {}
impl<Member0, Member1, Member2, Member3, Member4> Trait
    for (Member0, Member1, Member2, Member3, Member4)
{
}
impl<Member0, Member1, Member2, Member3, Member4, Member5> Trait
    for (Member0, Member1, Member2, Member3, Member4, Member5)
{
}
impl<Member0, Member1, Member2, Member3, Member4, Member5, Member6> Trait
    for (
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
    )
{
}
impl<Member0, Member1, Member2, Member3, Member4, Member5, Member6, Member7> Trait
    for (
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
    )
{
}
impl<Member0, Member1, Member2, Member3, Member4, Member5, Member6, Member7, Member8> Trait
    for (
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
        Member8,
    )
{
}
impl<Member0, Member1, Member2, Member3, Member4, Member5, Member6, Member7, Member8, Member9> Trait
    for (
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
        Member8,
        Member9,
    )
{
}
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,
    )
{
}
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,
    )
{
}
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,
    )
{
}
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,
    )
{
}
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,
    )
{
}
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,
    )
{
}
max_size

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

trait Trait {}

fortuples! {
    #[tuples::max_size(4)]
    impl Trait for #Tuple {}
}
Show the macro expansion
impl Trait for () {}
impl<Member0> Trait for (Member0,) {}
impl<Member0, Member1> Trait for (Member0, Member1) {}
impl<Member0, Member1, Member2> Trait for (Member0, Member1, Member2) {}
impl<Member0, Member1, Member2, Member3> Trait for (Member0, Member1, Member2, Member3) {}
tuple_name

#[tuples::tuple_name] sets the name of the meta-variable that represents the current tuple.

It is Tuple by default.

struct Vector<T>(T);

fortuples! {
    #[tuples::tuple_name(Coords)]
    #[tuples::min_size(2)]
    #[tuples::max_size(3)]
    impl Vector<#Coords> {}
}
Show the macro expansion
impl<Member0, Member1> Vector<(Member0, Member1)> {}
impl<Member0, Member1, Member2> Vector<(Member0, Member1, Member2)> {}
member_name

#[tuples::member_name] sets the name of the meta-variable that represents the current tuple’s member type.

It is Member by default.

struct Vector<T>(T);

fortuples! {
    #[tuples::tuple_name(Coords)]
    #[tuples::member_name(CoordT)]
    #[tuples::min_size(2)]
    #[tuples::max_size(3)]
    impl Vector<#Coords>
    where
        #(#CoordT: Into<f32>),*
    {}
}
Show the macro expansion
impl<CoordT0, CoordT1> Vector<(CoordT0, CoordT1)>
where
    CoordT0: Into<f32>,
    CoordT1: Into<f32>,
{
}
impl<CoordT0, CoordT1, CoordT2> Vector<(CoordT0, CoordT1, CoordT2)>
where
    CoordT0: Into<f32>,
    CoordT1: Into<f32>,
    CoordT2: Into<f32>,
{
}
member_type

#[tuples::member_type] sets all member types to a specific type.

struct Vector<T>(T);

fortuples! {
    #[tuples::tuple_name(Coords)]
    #[tuples::member_type(f32)]
    #[tuples::min_size(2)]
    #[tuples::max_size(3)]
    impl Vector<#Coords> {}
}
Show the macro expansion
impl Vector<(f32, f32)> {}
impl Vector<(f32, f32, f32)> {}
refs_tuple

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

Immutable refs
trait Trait {}

fortuples! {
    #[tuples::refs_tuple]
    impl Trait for #Tuple {}
}
Show the macro expansion
impl Trait for () {}
impl<Member0> Trait for (&Member0,) {}
impl<Member0, Member1> Trait for (&Member0, &Member1) {}
impl<Member0, Member1, Member2> Trait for (&Member0, &Member1, &Member2) {}
impl<Member0, Member1, Member2, Member3> Trait for (&Member0, &Member1, &Member2, &Member3) {}
impl<Member0, Member1, Member2, Member3, Member4> Trait
    for (&Member0, &Member1, &Member2, &Member3, &Member4)
{
}
impl<Member0, Member1, Member2, Member3, Member4, Member5> Trait
    for (&Member0, &Member1, &Member2, &Member3, &Member4, &Member5)
{
}
impl<Member0, Member1, Member2, Member3, Member4, Member5, Member6> Trait
    for (
        &Member0,
        &Member1,
        &Member2,
        &Member3,
        &Member4,
        &Member5,
        &Member6,
    )
{
}
impl<Member0, Member1, Member2, Member3, Member4, Member5, Member6, Member7> Trait
    for (
        &Member0,
        &Member1,
        &Member2,
        &Member3,
        &Member4,
        &Member5,
        &Member6,
        &Member7,
    )
{
}
impl<Member0, Member1, Member2, Member3, Member4, Member5, Member6, Member7, Member8> Trait
    for (
        &Member0,
        &Member1,
        &Member2,
        &Member3,
        &Member4,
        &Member5,
        &Member6,
        &Member7,
        &Member8,
    )
{
}
impl<Member0, Member1, Member2, Member3, Member4, Member5, Member6, Member7, Member8, Member9> Trait
    for (
        &Member0,
        &Member1,
        &Member2,
        &Member3,
        &Member4,
        &Member5,
        &Member6,
        &Member7,
        &Member8,
        &Member9,
    )
{
}
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,
    )
{
}
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,
    )
{
}
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,
    )
{
}
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,
    )
{
}
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,
    )
{
}
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,
    )
{
}
Mutable refs
trait Trait {}

fortuples! {
    #[tuples::refs_tuple(mut)]
    impl Trait for #Tuple {}
}
Show the macro expansion
impl Trait for () {}
impl<Member0> Trait for (&mut Member0,) {}
impl<Member0, Member1> Trait for (&mut Member0, &mut Member1) {}
impl<Member0, Member1, Member2> Trait for (&mut Member0, &mut Member1, &mut Member2) {}
impl<Member0, Member1, Member2, Member3> Trait
    for (&mut Member0, &mut Member1, &mut Member2, &mut Member3)
{
}
impl<Member0, Member1, Member2, Member3, Member4> Trait
    for (
        &mut Member0,
        &mut Member1,
        &mut Member2,
        &mut Member3,
        &mut Member4,
    )
{
}
impl<Member0, Member1, Member2, Member3, Member4, Member5> Trait
    for (
        &mut Member0,
        &mut Member1,
        &mut Member2,
        &mut Member3,
        &mut Member4,
        &mut Member5,
    )
{
}
impl<Member0, Member1, Member2, Member3, Member4, Member5, Member6> Trait
    for (
        &mut Member0,
        &mut Member1,
        &mut Member2,
        &mut Member3,
        &mut Member4,
        &mut Member5,
        &mut Member6,
    )
{
}
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,
    )
{
}
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,
    )
{
}
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,
    )
{
}
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,
    )
{
}
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,
    )
{
}
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,
    )
{
}
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,
    )
{
}
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,
    )
{
}
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,
    )
{
}
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.

trait Trait {}

fortuples! {
    #[tuples::debug_expand(path = "doc/expand/fortuples_debug_expand.rs")]
    impl Trait for #Tuple {}
}
Show the macro expansion
impl Trait for () {}
impl<Member0> Trait for (Member0,) {}
impl<Member0, Member1> Trait for (Member0, Member1) {}
impl<Member0, Member1, Member2> Trait for (Member0, Member1, Member2) {}
impl<Member0, Member1, Member2, Member3> Trait for (Member0, Member1, Member2, Member3) {}
impl<Member0, Member1, Member2, Member3, Member4> Trait
    for (Member0, Member1, Member2, Member3, Member4)
{
}
impl<Member0, Member1, Member2, Member3, Member4, Member5> Trait
    for (Member0, Member1, Member2, Member3, Member4, Member5)
{
}
impl<Member0, Member1, Member2, Member3, Member4, Member5, Member6> Trait
    for (
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
    )
{
}
impl<Member0, Member1, Member2, Member3, Member4, Member5, Member6, Member7> Trait
    for (
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
    )
{
}
impl<Member0, Member1, Member2, Member3, Member4, Member5, Member6, Member7, Member8> Trait
    for (
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
        Member8,
    )
{
}
impl<Member0, Member1, Member2, Member3, Member4, Member5, Member6, Member7, Member8, Member9> Trait
    for (
        Member0,
        Member1,
        Member2,
        Member3,
        Member4,
        Member5,
        Member6,
        Member7,
        Member8,
        Member9,
    )
{
}
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,
    )
{
}
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,
    )
{
}
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,
    )
{
}
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,
    )
{
}
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,
    )
{
}
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,
    )
{
}