#[cfg(test)]
use super::common::any_complex;
use super::common::{rotate_matrix, Angle, ComplexMatrix, JonesMatrix};
#[cfg(test)]
use na::Matrix2;
#[cfg(test)]
use proptest::prelude::*;
#[derive(Debug, Copy, Clone)]
pub struct CompositeElement {
mat: ComplexMatrix,
}
impl CompositeElement {
pub fn from_matrix(mat: ComplexMatrix) -> Self {
CompositeElement { mat }
}
}
impl JonesMatrix for CompositeElement {
fn rotated(&self, angle: Angle) -> Self {
CompositeElement {
mat: rotate_matrix(&self.mat, &angle),
}
}
fn rotate(&mut self, angle: Angle) {
self.mat = rotate_matrix(&self.mat, &angle);
}
fn matrix(&self) -> ComplexMatrix {
self.mat
}
}
#[cfg(test)]
impl Arbitrary for CompositeElement {
type Parameters = ();
type Strategy = BoxedStrategy<CompositeElement>;
fn arbitrary_with(_: Self::Parameters) -> Self::Strategy {
(any_complex(), any_complex(), any_complex(), any_complex())
.prop_map(|(m00, m01, m10, m11)| {
let mat = Matrix2::new(m00, m01, m10, m11);
CompositeElement { mat }
})
.boxed()
}
}