acme_core/specs/
mod.rs

1/*
2    Appellation: specs <mod>
3    Contrib: FL03 <jo3mccain@icloud.com>
4*/
5
6pub 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}