use super::*;
use crate::{
order::BitOrder,
store::BitStore,
};
use core::{
ops::{
Add,
AddAssign,
BitAnd,
BitAndAssign,
BitOr,
BitOrAssign,
BitXor,
BitXorAssign,
Deref,
DerefMut,
Index,
IndexMut,
Range,
RangeFrom,
RangeFull,
RangeInclusive,
RangeTo,
RangeToInclusive,
Neg,
Not,
Shl,
ShlAssign,
Shr,
ShrAssign,
Sub,
SubAssign,
},
};
impl<O, T> Add for BitVec<O, T>
where O: BitOrder, T: BitStore {
type Output = Self;
fn add(mut self, addend: Self) -> Self::Output {
self += addend;
self
}
}
impl<O, T> AddAssign for BitVec<O, T>
where O: BitOrder, T: BitStore {
fn add_assign(&mut self, mut addend: Self) {
use core::iter::repeat;
if addend.len() > self.len() {
mem::swap(self, &mut addend);
}
let mut c = false;
let mut stack = BitVec::<O, T>::with_capacity(self.len());
let addend = addend.into_iter().rev().chain(repeat(false));
for (a, b) in self.iter().copied().rev().zip(addend) {
let (y, z) = crate::rca1(a, b, c);
stack.push(y);
c = z;
}
if c {
stack.push(true);
}
self.clear();
self.extend(stack.into_iter().rev());
}
}
impl<O, T, I> BitAnd<I> for BitVec<O, T>
where O: BitOrder, T: BitStore, I: IntoIterator<Item=bool> {
type Output = Self;
fn bitand(mut self, rhs: I) -> Self::Output {
self &= rhs;
self
}
}
impl<O, T, I> BitAndAssign<I> for BitVec<O, T>
where O: BitOrder, T: BitStore, I: IntoIterator<Item=bool> {
fn bitand_assign(&mut self, rhs: I) {
let mut len = 0;
for bit in rhs.into_iter().take(self.len()) {
let cur = unsafe { *self.get_unchecked(len) };
unsafe { self.set_unchecked(len, cur & bit); }
len += 1;
}
self.truncate(len);
}
}
impl<O, T, I> BitOr<I> for BitVec<O, T>
where O: BitOrder, T: BitStore, I: IntoIterator<Item=bool> {
type Output = Self;
fn bitor(mut self, rhs: I) -> Self::Output {
self |= rhs;
self
}
}
impl<O, T, I> BitOrAssign<I> for BitVec<O, T>
where O: BitOrder, T: BitStore, I: IntoIterator<Item=bool> {
fn bitor_assign(&mut self, rhs: I) {
let mut len = 0;
for bit in rhs.into_iter().take(self.len()) {
let cur = unsafe { *self.get_unchecked(len) };
unsafe { self.set_unchecked(len, cur | bit); }
len += 1;
}
self.truncate(len);
}
}
impl<O, T, I> BitXor<I> for BitVec<O, T>
where O: BitOrder, T: BitStore, I: IntoIterator<Item=bool> {
type Output = Self;
fn bitxor(mut self, rhs: I) -> Self::Output {
self ^= rhs;
self
}
}
impl<O, T, I> BitXorAssign<I> for BitVec<O, T>
where O: BitOrder, T: BitStore, I: IntoIterator<Item=bool> {
fn bitxor_assign(&mut self, rhs: I) {
let mut len = 0;
for bit in rhs.into_iter().take(self.len()) {
let cur = unsafe { *self.get_unchecked(len) };
unsafe { self.set_unchecked(len, cur ^ bit); }
len += 1;
}
self.truncate(len);
}
}
impl<O, T> Deref for BitVec<O, T>
where O: BitOrder, T: BitStore {
type Target = BitSlice<O, T>;
fn deref(&self) -> &Self::Target {
self.as_bitslice()
}
}
impl<O, T> DerefMut for BitVec<O, T>
where O: BitOrder, T: BitStore {
fn deref_mut(&mut self) -> &mut Self::Target {
self.as_mut_bitslice()
}
}
impl<O, T> Drop for BitVec<O, T>
where O: BitOrder, T: BitStore {
fn drop(&mut self) {
let bp = mem::replace(&mut self.pointer, BitPtr::empty());
let (ptr, cap) = (bp.pointer(), self.capacity);
drop(unsafe { Vec::from_raw_parts(ptr.w(), 0, cap) });
}
}
impl<O, T> Index<usize> for BitVec<O, T>
where O: BitOrder, T: BitStore {
type Output = bool;
fn index(&self, cursor: usize) -> &Self::Output {
&self.as_bitslice()[cursor]
}
}
impl<O, T> Index<Range<usize>> for BitVec<O, T>
where O: BitOrder, T: BitStore {
type Output = BitSlice<O, T>;
fn index(&self, range: Range<usize>) -> &Self::Output {
&self.as_bitslice()[range]
}
}
impl<O, T> IndexMut<Range<usize>> for BitVec<O, T>
where O: BitOrder, T: BitStore {
fn index_mut(&mut self, range: Range<usize>) -> &mut Self::Output {
&mut self.as_mut_bitslice()[range]
}
}
impl<O, T> Index<RangeFrom<usize>> for BitVec<O, T>
where O: BitOrder, T: BitStore {
type Output = BitSlice<O, T>;
fn index(&self, range: RangeFrom<usize>) -> &Self::Output {
&self.as_bitslice()[range]
}
}
impl<O, T> IndexMut<RangeFrom<usize>> for BitVec<O, T>
where O: BitOrder, T: BitStore {
fn index_mut(&mut self, range: RangeFrom<usize>) -> &mut Self::Output {
&mut self.as_mut_bitslice()[range]
}
}
impl<O, T> Index<RangeFull> for BitVec<O, T>
where O: BitOrder, T: BitStore {
type Output = BitSlice<O, T>;
fn index(&self, _: RangeFull) -> &Self::Output {
self.as_bitslice()
}
}
impl<O, T> IndexMut<RangeFull> for BitVec<O, T>
where O: BitOrder, T: BitStore {
fn index_mut(&mut self, _: RangeFull) -> &mut Self::Output {
self.as_mut_bitslice()
}
}
impl<O, T> Index<RangeInclusive<usize>> for BitVec<O, T>
where O: BitOrder, T: BitStore {
type Output = BitSlice<O, T>;
fn index(&self, range: RangeInclusive<usize>) -> &Self::Output {
&self.as_bitslice()[range]
}
}
impl<O, T> IndexMut<RangeInclusive<usize>> for BitVec<O, T>
where O: BitOrder, T: BitStore {
fn index_mut(&mut self, range: RangeInclusive<usize>) -> &mut Self::Output {
&mut self.as_mut_bitslice()[range]
}
}
impl<O, T> Index<RangeTo<usize>> for BitVec<O, T>
where O: BitOrder, T: BitStore {
type Output = BitSlice<O, T>;
fn index(&self, range: RangeTo<usize>) -> &Self::Output {
&self.as_bitslice()[range]
}
}
impl<O, T> IndexMut<RangeTo<usize>> for BitVec<O, T>
where O: BitOrder, T: BitStore {
fn index_mut(&mut self, range: RangeTo<usize>) -> &mut Self::Output {
&mut self.as_mut_bitslice()[range]
}
}
impl<O, T> Index<RangeToInclusive<usize>> for BitVec<O, T>
where O: BitOrder, T: BitStore {
type Output = BitSlice<O, T>;
fn index(&self, range: RangeToInclusive<usize>) -> &Self::Output {
&self.as_bitslice()[range]
}
}
impl<O, T> IndexMut<RangeToInclusive<usize>> for BitVec<O, T>
where O: BitOrder, T: BitStore {
fn index_mut(&mut self, range: RangeToInclusive<usize>) -> &mut Self::Output {
&mut self.as_mut_bitslice()[range]
}
}
impl<O, T> Neg for BitVec<O, T>
where O: BitOrder, T: BitStore {
type Output = Self;
fn neg(mut self) -> Self::Output {
if self.is_empty() || self.not_any() {
return self;
}
self = !self;
let mut one = Self::new();
one.push(true);
self += one;
self
}
}
impl<O, T> Not for BitVec<O, T>
where O: BitOrder, T: BitStore {
type Output = Self;
fn not(mut self) -> Self::Output {
let _ = self.as_mut_bitslice().not();
self
}
}
__bitvec_shift!(u8, u16, u32, u64, i8, i16, i32, i64);
impl<O, T> Shl<usize> for BitVec<O, T>
where O: BitOrder, T: BitStore {
type Output = Self;
fn shl(mut self, shamt: usize) -> Self::Output {
self <<= shamt;
self
}
}
impl<O, T> ShlAssign<usize> for BitVec<O, T>
where O: BitOrder, T: BitStore {
fn shl_assign(&mut self, shamt: usize) {
let len = self.len();
if shamt >= len {
self.set_all(false);
self.clear();
return;
}
for idx in shamt .. len {
let val = self[idx];
self.set(idx.saturating_sub(shamt), val);
}
let trunc = len.saturating_sub(shamt);
for idx in trunc .. len {
self.set(idx, false);
}
self.truncate(trunc);
}
}
impl<O, T> Shr<usize> for BitVec<O, T>
where O: BitOrder, T: BitStore {
type Output = Self;
fn shr(mut self, shamt: usize) -> Self::Output {
self >>= shamt;
self
}
}
impl<O, T> ShrAssign<usize> for BitVec<O, T>
where O: BitOrder, T: BitStore {
fn shr_assign(&mut self, shamt: usize) {
let old_len = self.len();
for _ in 0 .. shamt {
self.push(false);
}
for idx in (0 .. old_len).rev() {
let val = self[idx];
self.set(idx.saturating_add(shamt), val);
}
for idx in 0 .. shamt {
self.set(idx, false);
}
}
}
impl<O, T> Sub for BitVec<O, T>
where O: BitOrder, T: BitStore {
type Output = Self;
fn sub(mut self, subtrahend: Self) -> Self::Output {
self -= subtrahend;
self
}
}
impl<O, T> SubAssign for BitVec<O, T>
where O: BitOrder, T: BitStore {
fn sub_assign(&mut self, mut subtrahend: Self) {
if subtrahend.not_any() {
return;
}
subtrahend = -subtrahend;
let (llen, rlen) = (self.len(), subtrahend.len());
if rlen > llen {
let diff = rlen - llen;
*self >>= diff;
}
else {
if llen > rlen {
let diff = llen - rlen;
let sign = subtrahend[0];
subtrahend >>= diff;
subtrahend[.. diff].set_all(sign);
}
}
let old = self.len();
*self += subtrahend;
if self.len() > old {
*self <<= 1;
}
}
}