Crate tuple [−] [src]
Examples
extern crate tuple; use tuple::*;
All following operations are defined on the T1
.. Tn
type of this crate,
as well for the normal tuple types.
Element-wise operations
let a = T2(3, 4) + T2(5, 4); assert_eq!(a, T2(8, 8)); let b = T2(3u32, 4.0f32) * T2(7, 3.0); assert_eq!(b, T2(21, 12.));
Indexing
This is implemented in the TupleElements
trait.
Indexing works as expected and panics when out of bounds.
There are also get
and get_mut
functions that return Option<&T>
and Option<&mut T>
.
assert_eq!(T3(1, 2, 3)[2], 3); assert_eq!(T2(7, 8).get(1), Some(&8)); assert_eq!(T2(7, 8).get(2), None);
Joining two tuples
let a = T2(1, 2); let b = T3(3, 4, 5); assert_eq!(a.join(b), T5(1, 2, 3, 4, 5));
Splitting a tuple in two parts
let a = T4(1, 2, 3, 4); let (b, c): (T1<_>, _) = a.split(); // split needs a type hint for the left side assert_eq!(b, T1(1)); assert_eq!(c, T3(2, 3, 4));
Rotate and Reverse
let a = T4((), 2, 3, true); assert_eq!(a.rot_l(), T4(2, 3, true, ())); // rotate left assert_eq!(a.rot_r(), T4(true, (), 2, 3)); // rotate right assert_eq!(a.reverse(), T4(true, 3, 2, ())); // reverse
Adding a Trait
#[macro_use] extern crate tuple; extern crate num_traits; use tuple::*; use num_traits::Zero; use std::ops::{Add, Sub, Mul}; use std::fmt::Debug; trait Ring: Add + Sub + Mul + Zero + Debug + Sized {} // The name is up to you macro_rules! impl_ring { // This line is defined by this crate and can't be changed ($($Tuple:ident { $($idx:tt -> $T:ident),* } )*) => ($( // This is expanded for every Tuple type impl<$($T),*> Ring for $Tuple<$($T),*> where Self: Zero, $( $T: Ring ),* {} // this has to match again )*) } // actually implement it! impl_tuple!(impl_ring);
Macros
impl_tuple |
Structs
Elements | |
T1 | |
T2 | |
T3 | |
T4 | |
T5 | |
T6 | |
T7 | |
T8 |
Traits
OpJoin |
Allows to join/concatenate two tuples |
OpReverse | |
OpRotateLeft | |
OpRotateRight | |
OpSplit | |
TupleElements |