1pub use self::{eval::*, gradient::*, prop::*, scalar::Scalar, store::*};
7
8pub(crate) mod eval;
9pub(crate) mod gradient;
10pub(crate) mod prop;
11pub(crate) mod scalar;
12pub(crate) mod store;
13
14pub trait AsSlice<T> {
15 fn as_slice(&self) -> &[T];
16}
17
18impl<S, T> AsSlice<T> for S
19where
20 S: AsRef<[T]>,
21{
22 fn as_slice(&self) -> &[T] {
23 self.as_ref()
24 }
25}
26
27pub trait AsSliceMut<T> {
28 fn as_slice_mut(&mut self) -> &mut [T];
29}
30
31impl<S, T> AsSliceMut<T> for S
32where
33 S: AsMut<[T]>,
34{
35 fn as_slice_mut(&mut self) -> &mut [T] {
36 self.as_mut()
37 }
38}
39
40pub(crate) mod prelude {
41 pub use super::eval::*;
42 pub use super::gradient::*;
43 pub use super::prop::*;
44 pub use super::scalar::*;
45 pub use super::store::*;
46 pub use super::{AsSlice, AsSliceMut};
47}
48
49#[cfg(test)]
50mod tests {
51 use super::scalar::Scalar;
52 use num::Complex;
53
54 #[test]
55 fn test_scalar() {
56 let a = 3f64;
57 let b = Complex::new(4f64, 0f64);
58
59 assert_eq!(Scalar::sqr(a), 9f64);
60 assert_eq!(Scalar::sqrt(b), 2f64.into());
61 }
62}