Rollup merge of #35863 - matthew-piziak:shl-example, r=steveklabnik

add evocative examples for `Shl` and `Shr`

r? @steveklabnik
This commit is contained in:
Guillaume Gomez 2016-08-30 10:39:06 +02:00 committed by GitHub
commit b4a6b6bd9e

View File

@ -1034,25 +1034,54 @@ bitxor_impl! { bool usize u8 u16 u32 u64 isize i8 i16 i32 i64 }
/// ///
/// # Examples /// # Examples
/// ///
/// A trivial implementation of `Shl`. When `Foo << Foo` happens, it ends up /// An implementation of `Shl` that lifts the `<<` operation on integers to a
/// calling `shl`, and therefore, `main` prints `Shifting left!`. /// `Scalar` struct.
/// ///
/// ``` /// ```
/// use std::ops::Shl; /// use std::ops::Shl;
/// ///
/// struct Foo; /// #[derive(PartialEq, Debug)]
/// struct Scalar(usize);
/// ///
/// impl Shl<Foo> for Foo { /// impl Shl<Scalar> for Scalar {
/// type Output = Foo; /// type Output = Self;
/// ///
/// fn shl(self, _rhs: Foo) -> Foo { /// fn shl(self, Scalar(rhs): Self) -> Scalar {
/// println!("Shifting left!"); /// let Scalar(lhs) = self;
/// self /// Scalar(lhs << rhs)
/// }
/// }
/// fn main() {
/// assert_eq!(Scalar(4) << Scalar(2), Scalar(16));
/// }
/// ```
///
/// An implementation of `Shl` that spins a vector leftward by a given amount.
///
/// ```
/// use std::ops::Shl;
///
/// #[derive(PartialEq, Debug)]
/// struct SpinVector<T: Clone> {
/// vec: Vec<T>,
/// }
///
/// impl<T: Clone> Shl<usize> for SpinVector<T> {
/// type Output = Self;
///
/// fn shl(self, rhs: usize) -> SpinVector<T> {
/// // rotate the vector by `rhs` places
/// let (a, b) = self.vec.split_at(rhs);
/// let mut spun_vector: Vec<T> = vec![];
/// spun_vector.extend_from_slice(b);
/// spun_vector.extend_from_slice(a);
/// SpinVector { vec: spun_vector }
/// } /// }
/// } /// }
/// ///
/// fn main() { /// fn main() {
/// Foo << Foo; /// assert_eq!(SpinVector { vec: vec![0, 1, 2, 3, 4] } << 2,
/// SpinVector { vec: vec![2, 3, 4, 0, 1] });
/// } /// }
/// ``` /// ```
#[lang = "shl"] #[lang = "shl"]
@ -1106,25 +1135,54 @@ shl_impl_all! { u8 u16 u32 u64 usize i8 i16 i32 i64 isize }
/// ///
/// # Examples /// # Examples
/// ///
/// A trivial implementation of `Shr`. When `Foo >> Foo` happens, it ends up /// An implementation of `Shr` that lifts the `>>` operation on integers to a
/// calling `shr`, and therefore, `main` prints `Shifting right!`. /// `Scalar` struct.
/// ///
/// ``` /// ```
/// use std::ops::Shr; /// use std::ops::Shr;
/// ///
/// struct Foo; /// #[derive(PartialEq, Debug)]
/// struct Scalar(usize);
/// ///
/// impl Shr<Foo> for Foo { /// impl Shr<Scalar> for Scalar {
/// type Output = Foo; /// type Output = Self;
/// ///
/// fn shr(self, _rhs: Foo) -> Foo { /// fn shr(self, Scalar(rhs): Self) -> Scalar {
/// println!("Shifting right!"); /// let Scalar(lhs) = self;
/// self /// Scalar(lhs >> rhs)
/// }
/// }
/// fn main() {
/// assert_eq!(Scalar(16) >> Scalar(2), Scalar(4));
/// }
/// ```
///
/// An implementation of `Shr` that spins a vector rightward by a given amount.
///
/// ```
/// use std::ops::Shr;
///
/// #[derive(PartialEq, Debug)]
/// struct SpinVector<T: Clone> {
/// vec: Vec<T>,
/// }
///
/// impl<T: Clone> Shr<usize> for SpinVector<T> {
/// type Output = Self;
///
/// fn shr(self, rhs: usize) -> SpinVector<T> {
/// // rotate the vector by `rhs` places
/// let (a, b) = self.vec.split_at(self.vec.len() - rhs);
/// let mut spun_vector: Vec<T> = vec![];
/// spun_vector.extend_from_slice(b);
/// spun_vector.extend_from_slice(a);
/// SpinVector { vec: spun_vector }
/// } /// }
/// } /// }
/// ///
/// fn main() { /// fn main() {
/// Foo >> Foo; /// assert_eq!(SpinVector { vec: vec![0, 1, 2, 3, 4] } >> 2,
/// SpinVector { vec: vec![3, 4, 0, 1, 2] });
/// } /// }
/// ``` /// ```
#[lang = "shr"] #[lang = "shr"]