pub struct Triplet<T> {
pub x: T,
pub y: T,
pub z: T,
}Expand description
Represents a pair consisting of 3 values.
Fields§
§x: T§y: T§z: TImplementations§
Source§impl<T> Triplet<T>
impl<T> Triplet<T>
Sourcepub const fn new(x: T, y: T, z: T) -> Triplet<T>
pub const fn new(x: T, y: T, z: T) -> Triplet<T>
Creates a new pair.
§Examples
use pair_macro::Pair;
let p = Pair::new(1, 2);
assert_eq!(1, p.x);
assert_eq!(2, p.y);Examples found in repository?
26fn main() {
27 println!("dynpick-force-torque-sensor demo started.");
28 println!("Make sure that the sensor is connected to the computer.");
29 println!("Make sure setting udev rule. See examples/setup_udev_rule.sh in detail.");
30
31 // Search USB-connected dynpick sensor.
32 let path = match search_usb_sensor_path() {
33 Ok(Some(path)) => path,
34 Ok(None) => {
35 println!("No dynpick sensor is connected.");
36 return;
37 }
38 Err(e) => {
39 println!("{}", e);
40 return;
41 }
42 };
43 println!("Found a sensor. Path: {}", path);
44
45 // Specify the sensitivity manually.
46 let sensitivity = {
47 let force = Triplet::new(24.9, 24.6, 24.5);
48 let torque = Triplet::new(1664.7, 1639.7, 1638.0);
49 Sensitivity::new(force, torque)
50 };
51
52 // Connect the found sensor.
53 let sensor = DynpickSensorBuilder::open(path)
54 .map(|b| b.set_sensitivity_manually(sensitivity))
55 .and_then(|b| b.build());
56 let mut sensor = match sensor {
57 Ok(s) => s,
58 Err(e) => {
59 println!("{}", e);
60 return;
61 }
62 };
63 println!("Successfully opened the sensor.");
64
65 // Correct zero-point
66 match sensor.zeroed_next() {
67 Ok(_) => println!("Offset the sensor."),
68 Err(e) => {
69 println!("An error occurred during offset: {}", e);
70 return;
71 }
72 }
73
74 // Repeatedly receive wrenches from the sensor.
75 let measurement_count = 1000;
76 for i in 0..measurement_count {
77 std::thread::sleep(sensor.inner_port().timeout());
78
79 match sensor.update() {
80 Ok(w) => println!("[{}/{}] {:?}", i + 1, measurement_count, w),
81 Err(e) => println!("[{}/{}] {}", i + 1, measurement_count, e),
82 }
83 }
84
85 // Info
86 println!("Product info: {:?}", sensor.receive_product_info());
87
88 println!("dynpick-force-torque-sensor demo finished.");
89}Sourcepub fn from_cloned(value: T) -> Triplet<T>where
T: Clone,
pub fn from_cloned(value: T) -> Triplet<T>where
T: Clone,
Creates a new pair by cloning the specified value.
§Examples
use pair_macro::Pair;
let p = Pair::from_cloned([1, 2]);
assert_eq!([1, 2], p.x);
assert_eq!([1, 2], p.y);Sourcepub const fn as_ref(&self) -> Triplet<&T>
pub const fn as_ref(&self) -> Triplet<&T>
Converts from &name<T> to name<&T>.
§Examples
use pair_macro::Pair;
let p = Pair::new(1, 2);
let q = p.as_ref();
assert_eq!(Pair::new(&1, &2), q);Sourcepub fn as_mut(&mut self) -> Triplet<&mut T>
pub fn as_mut(&mut self) -> Triplet<&mut T>
Converts from &mut name<T> to name<&mut T>.
§Examples
use pair_macro::Pair;
let mut p = Pair::new(1, 2);
let q = p.as_mut();
assert_eq!(Pair::new(&mut 1, &mut 2), q);Sourcepub fn map<U, F>(self, f: F) -> Triplet<U>where
F: FnMut(T) -> U,
pub fn map<U, F>(self, f: F) -> Triplet<U>where
F: FnMut(T) -> U,
Applies an unary operation f to each value.
§Examples
use pair_macro::Pair;
let p = Pair::new(1, 2).map(|value| value * 2);
assert_eq!(2, p.x);
assert_eq!(4, p.y);Sourcepub fn map_in_place<F>(&mut self, f: F) -> &mut Triplet<T>
pub fn map_in_place<F>(&mut self, f: F) -> &mut Triplet<T>
Sourcepub fn map_entrywise<U, V, F>(self, rhs: Triplet<U>, f: F) -> Triplet<V>where
F: FnMut(T, U) -> V,
pub fn map_entrywise<U, V, F>(self, rhs: Triplet<U>, f: F) -> Triplet<V>where
F: FnMut(T, U) -> V,
Applies a binary operation f that takes two values, then produces another pair.
§Examples
use pair_macro::Pair;
let p = Pair::new(6, 8);
let q = Pair::new(3, 2);
let r = p.map_entrywise(q, |lhs, rhs| lhs / rhs);
assert_eq!(2, r.x);
assert_eq!(4, r.y);Sourcepub fn map_entrywise_in_place<U, F>(
&mut self,
rhs: Triplet<U>,
f: F,
) -> &mut Triplet<T>
pub fn map_entrywise_in_place<U, F>( &mut self, rhs: Triplet<U>, f: F, ) -> &mut Triplet<T>
Applies a binary operation f that takes two values, then stores the result in-place.
§Returns
A mutable reference to itself.
§Examples
use pair_macro::Pair;
let mut p = Pair::new(2, 3);
let q = Pair::new(4, 5);
let r = Pair::new(6, 7);
p.map_entrywise_in_place(q, |lhs, rhs| *lhs += rhs)
.map_entrywise_in_place(r, |lhs, rhs| *lhs *= rhs);
assert_eq!(36, p.x);
assert_eq!(56, p.y);Sourcepub fn fold<U, F>(self, init: U, f: F) -> Uwhere
F: FnMut(U, T) -> U,
👎Deprecated since 0.1.3: Use into_iter().fold(init, f) instead
pub fn fold<U, F>(self, init: U, f: F) -> Uwhere
F: FnMut(U, T) -> U,
Applies a function f to each values, then produces a single, final value.
§Params
initthe initial value that the accumulator will have on the first call.faccumulator that takes two arguments: current accumation and an value.
§Examples
use pair_macro::Pair;
let p = Pair::new(2, 3);
let sum = p.fold(0, |accumulate, current| accumulate + current);
let product = p.fold(1, |accumulate, current| accumulate * current);
assert_eq!(5, sum);
assert_eq!(6, product);Sourcepub fn iter(&self) -> impl Iterator<Item = &T>
pub fn iter(&self) -> impl Iterator<Item = &T>
Returns an iterator that yields references of each value.
§Examples
use pair_macro::Pair;
let p = Pair::new(2, 3);
let mut iter = p.iter();
assert_eq!(Some(&2), iter.next());
assert_eq!(Some(&3), iter.next());
assert!(iter.next().is_none());Sourcepub fn iter_mut(&mut self) -> impl Iterator<Item = &mut T>
pub fn iter_mut(&mut self) -> impl Iterator<Item = &mut T>
Returns an iterator that yields mutable references of each value.
§Examples
use pair_macro::Pair;
let mut p = Pair::new(2, 3);
let mut iter = p.iter_mut();
assert_eq!(Some(&mut 2), iter.next());
assert_eq!(Some(&mut 3), iter.next());
assert!(iter.next().is_none());Sourcepub fn into_iter(self) -> impl Iterator<Item = T>
pub fn into_iter(self) -> impl Iterator<Item = T>
Consuming this pair, returns an iterator that yields each value.
§Examples
use pair_macro::Pair;
let p = Pair::new(2, 3);
let mut iter = p.into_iter();
assert_eq!(Some(2), iter.next());
assert_eq!(Some(3), iter.next());
assert!(iter.next().is_none());Source§impl<T> Triplet<T>where
T: Deref,
impl<T> Triplet<T>where
T: Deref,
Sourcepub fn as_deref(&self) -> Triplet<&<T as Deref>::Target>
pub fn as_deref(&self) -> Triplet<&<T as Deref>::Target>
Converts from $name<T> or &$name<T> to $name<&T::Target>.
Leaves the original pair in-place, creating a new one with a reference to the original one, additionally coercing the contents via Deref.
§Examples
use pair_macro::Pair;
let p = Pair::new(2, 3);
let q = p.as_ref(); // Pair<&i32>
let r = q.as_deref(); // Pair<&i32>, using trait implementation Deref<Target=i32> for &i32
assert_eq!(Pair::new(&2, &3), r);Source§impl<T> Triplet<T>where
T: DerefMut,
impl<T> Triplet<T>where
T: DerefMut,
Sourcepub fn as_deref_mut(&mut self) -> Triplet<&mut <T as Deref>::Target>
pub fn as_deref_mut(&mut self) -> Triplet<&mut <T as Deref>::Target>
Converts from $name<T> or &mut $name<T> to $name<&mut T::Target>.
Leaves the original pair in-place, creating a new one with a mutable reference to the original one, additionally coercing the contents via DerefMut.
§Examples
use pair_macro::Pair;
let mut p = Pair::new(2, 3);
let mut q = p.as_mut(); // Pair<&mut i32>
let r = q.as_deref_mut(); // Pair<&mut i32>, using trait implementation DerefMut<Target=i32> for &mut i32
assert_eq!(Pair::new(&mut 2, &mut 3), r);Source§impl<T> Triplet<Option<T>>
impl<T> Triplet<Option<T>>
Sourcepub fn into_option(self) -> Option<Triplet<T>>
pub fn into_option(self) -> Option<Triplet<T>>
Converts from name<Option<T>> to Option<name<T>>.
§Returns
Some(pair) if all values of the pair are Some(..), None otherwise.
§Examples
use pair_macro::Pair;
let p = Pair::new(Some(1), Some(2)).into_option();
assert_eq!(Some(Pair::new(1, 2)), p);
let q = Pair::new(Some(1), None).into_option();
assert!(q.is_none());
let r = Pair::<Option<i32>>::new(None, None).into_option();
assert!(r.is_none());Source§impl<T, E> Triplet<Result<T, E>>
impl<T, E> Triplet<Result<T, E>>
Sourcepub fn into_result(self) -> Result<Triplet<T>, E>
pub fn into_result(self) -> Result<Triplet<T>, E>
Converts from name<Result<T, E>> to Result<name<T>, E>.
§Returns
Ok(pair) if all values of the pair are Ok(..).
Err(e) if any value of the pair is Err(e), where e is the value of the first Err(..) value.
§Examples
use pair_macro::Pair;
use core::str::FromStr;
let p = Pair::new("1", "2").map(i32::from_str).into_result();
assert_eq!(Ok(Pair::new(1, 2)), p);
let q = Pair::new("1", "lamy").map(i32::from_str).into_result();
assert!(q.is_err());
let r = Pair::new("yukihana", "lamy").map(i32::from_str).into_result();
assert!(r.is_err());Trait Implementations§
Source§impl<T> AddAssign for Triplet<T>where
T: AddAssign,
impl<T> AddAssign for Triplet<T>where
T: AddAssign,
Source§fn add_assign(&mut self, rhs: Triplet<T>)
fn add_assign(&mut self, rhs: Triplet<T>)
+= operation. Read moreSource§impl<T, U> DivAssign<U> for Triplet<T>
impl<T, U> DivAssign<U> for Triplet<T>
Source§fn div_assign(&mut self, rhs: U)
fn div_assign(&mut self, rhs: U)
/= operation. Read moreSource§impl<T, U> MulAssign<U> for Triplet<T>
impl<T, U> MulAssign<U> for Triplet<T>
Source§fn mul_assign(&mut self, rhs: U)
fn mul_assign(&mut self, rhs: U)
*= operation. Read moreSource§impl<T, U> RemAssign<U> for Triplet<T>
impl<T, U> RemAssign<U> for Triplet<T>
Source§fn rem_assign(&mut self, rhs: U)
fn rem_assign(&mut self, rhs: U)
%= operation. Read moreSource§impl<T> SubAssign for Triplet<T>where
T: SubAssign,
impl<T> SubAssign for Triplet<T>where
T: SubAssign,
Source§fn sub_assign(&mut self, rhs: Triplet<T>)
fn sub_assign(&mut self, rhs: Triplet<T>)
-= operation. Read more