1 use alloc::borrow::Cow;
2 use core::iter::repeat;
3 
4 use smallvec::SmallVec;
5 
6 use crate::big_digit::BITS;
7 use crate::BigUint;
8 
9 #[inline]
biguint_shl(n: Cow<BigUint>, bits: usize) -> BigUint10 pub fn biguint_shl(n: Cow<BigUint>, bits: usize) -> BigUint {
11     let n_unit = bits / BITS;
12     let mut data = match n_unit {
13         0 => n.into_owned().data,
14         _ => {
15             let len = n_unit + n.data.len() + 1;
16             let mut data = SmallVec::with_capacity(len);
17             data.extend(repeat(0).take(n_unit));
18             data.extend(n.data.iter().cloned());
19             data
20         }
21     };
22 
23     let n_bits = bits % BITS;
24     if n_bits > 0 {
25         let mut carry = 0;
26         for elem in data[n_unit..].iter_mut() {
27             let new_carry = *elem >> (BITS - n_bits);
28             *elem = (*elem << n_bits) | carry;
29             carry = new_carry;
30         }
31         if carry != 0 {
32             data.push(carry);
33         }
34     }
35 
36     BigUint::new_native(data)
37 }
38