use std::ops::{Add, AddAssign};
use super::DenseVector;
impl<T, V> Add<V> for DenseVector<T>
where
T: AddAssign<T>,
V: IntoIterator<Item = (usize, T)>,
<V as IntoIterator>::IntoIter: ExactSizeIterator,
{
type Output = Self;
#[inline]
fn add(mut self, rhs: V) -> Self::Output {
self.add_assign(rhs);
self
}
}
impl<T, V> AddAssign<V> for DenseVector<T>
where
T: AddAssign<T>,
V: IntoIterator<Item = (usize, T)>,
<V as IntoIterator>::IntoIter: ExactSizeIterator,
{
#[inline]
fn add_assign(&mut self, rhs: V) {
let iter = rhs.into_iter();
debug_assert_eq!(self.len(), iter.len());
for (lhs, (_, rhs)) in self.components.iter_mut().zip(iter) {
*lhs += rhs;
}
}
}
#[cfg(test)]
mod test {
use super::*;
use expectest::prelude::*;
#[test]
fn add() {
let subject = DenseVector::from(vec![0.0, 0.5, 1.0, 2.0, 3.0]);
let other = DenseVector::from(vec![2.0, 1.0, 0.0, -1.0, -2.0]);
let expected = DenseVector::from(vec![2.0, 1.5, 1.0, 1.0, 1.0]);
let result = subject + other;
expect!(result).to(be_equal_to(expected));
}
#[test]
fn add_ref() {
let subject = DenseVector::from(vec![0.0, 0.5, 1.0, 2.0, 3.0]);
let other = DenseVector::from(vec![2.0, 1.0, 0.0, -1.0, -2.0]);
let expected = DenseVector::from(vec![2.0, 1.5, 1.0, 1.0, 1.0]);
let result = subject + &other;
expect!(result).to(be_equal_to(expected));
}
#[test]
fn add_assign() {
let subject = DenseVector::from(vec![0.0, 0.5, 1.0, 2.0, 3.0]);
let other = DenseVector::from(vec![2.0, 1.0, 0.0, -1.0, -2.0]);
let expected = DenseVector::from(vec![2.0, 1.5, 1.0, 1.0, 1.0]);
let mut result = subject;
result += &other;
expect!(result).to(be_equal_to(expected));
}
}