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.