message: De-generalize `twos_complement' helper function
diff: use std::default::Default;
  -use std::ops::{Add, Div, Mul, Neg, Rem, Shl, Shr, Sub, Not, DerefMut};
  +use std::ops::{Add, Div, Mul, Neg, Rem, Shl, Shr, Sub, Not};
  use std::str::{self, FromStr};
  use std::fmt;
  use std::cmp::Ordering::{self, Less, Greater, Equal};
  @@ -16,7 +16,7 @@ use serde;
  use rand::Rng;
  use integer::Integer;
  -use traits::{ToPrimitive, FromPrimitive, Num, WrappingAdd, CheckedAdd, CheckedSub,
  +use traits::{ToPrimitive, FromPrimitive, Num, CheckedAdd, CheckedSub,
  CheckedMul, CheckedDiv, Signed, Zero, One};
  use self::Sign::{Minus, NoSign, Plus};
  @@ -1214,16 +1214,14 @@ fn twos_complement_be(digits: &mut [u8]) {
  /// Perform in-place two's complement of the given digit iterator
  /// starting from the least significant byte.
  #[inline]
  -fn twos_complement<T, R, I>(digits: I)
  - where I: IntoIterator<Item = R>,
  - R: DerefMut<Target = T>,
  - T: Clone + Not<Output = T> + WrappingAdd + Zero + One
  +fn twos_complement<'a, I>(digits: I)
  + where I: IntoIterator<Item = &'a mut u8>
  {
  let mut carry = true;
  for mut d in digits {
  - *d = d.clone().not();
  + *d = d.not();
  if carry {
  - *d = d.wrapping_add(&T::one());
  + *d = d.wrapping_add(1);
  carry = d.is_zero();
  }
  }
  