use core::ops::{Shr, ShrAssign};
use core::str::FromStr;
use malachite_base::num::arithmetic::traits::{EntrywiseShrRound, ShrRound};
use malachite_base::num::basic::unsigneds::PrimitiveUnsigned;
use malachite_base::rounding_modes::RoundingMode::*;
use malachite_base::test_util::generators::unsigned_vector_unsigned_pair_gen_var_6;
use malachite_base::unsigned_vector::UnsignedVector;
use malachite_base::vector::Vector;
#[test]
fn test_shr() {
let test = |s, bits: u32, out| {
let v = UnsignedVector::<u8>::from_str(s).unwrap();
let w = &v >> bits;
assert_eq!(w.to_string(), out);
assert_eq!(v.clone() >> bits, w);
let mut x = v;
x >>= bits;
assert_eq!(x, w);
};
test("()", 0, "()");
test("()", 10, "()");
test("(1, 2, 3, 5)", 0, "(1, 2, 3, 5)");
test("(1, 2, 3, 5)", 1, "(0, 1, 1, 2)");
test("(4, 8, 12)", 2, "(1, 2, 3)");
test("(255, 128)", 7, "(1, 1)");
test("(255, 128)", 8, "(0, 0)");
test("(255, 128)", 200, "(0, 0)");
}
fn shr_properties_helper<T: PrimitiveUnsigned + ShrRound<U, Output = T>, U: PrimitiveUnsigned>()
where
UnsignedVector<T>: Shr<U, Output = UnsignedVector<T>> + ShrAssign<U>,
for<'a> &'a UnsignedVector<T>:
Shr<U, Output = UnsignedVector<T>> + EntrywiseShrRound<U, Output = UnsignedVector<T>>,
{
unsigned_vector_unsigned_pair_gen_var_6::<T, U>().test_properties(|(v, bits)| {
let w = &v >> bits;
assert_eq!(v.clone() >> bits, w);
let mut x = v.clone();
x >>= bits;
assert_eq!(x, w);
assert_eq!(w.dimension(), v.dimension());
for (&x, &y) in v.elements.iter().zip(&w.elements) {
assert_eq!(y, x.shr_round(bits, Floor).0);
assert!(y <= x);
}
assert_eq!((&v).entrywise_shr_round(bits, Floor), w);
assert_eq!((&v).entrywise_shr_round(bits, Down), w);
if bits >= U::exact_from(T::WIDTH) {
assert!(w.is_zero());
}
assert_eq!(&v >> U::ZERO, v);
if let Some(double) = bits.checked_add(bits) {
assert_eq!(&w >> bits, &v >> double);
}
});
}
#[test]
fn shr_properties() {
apply_fn_to_unsigneds_and_unsigneds!(shr_properties_helper);
}