1#![no_std]
2
3extern crate cmsis_dsp_sys_pregenerated as cmsis_dsp_sys;
26
27pub mod basic;
28pub mod transform;
29pub mod complex;
30#[cfg(feature = "libm")]
31mod libm_c;
32#[cfg(all(feature = "micromath", not(feature = "libm")))]
33mod micromath_c;
34
35use core::convert::TryInto;
36use core::fmt::Debug;
37
38#[derive(Debug)]
40pub enum Error {
41 Argument,
42 Length,
43 SizeMismatch,
44 NanInf,
45 Singular,
46 TestFailure,
47 Unknown,
48}
49
50trait StatusCode {
51 fn check_status(self) -> Result<()>;
54}
55
56impl StatusCode for cmsis_dsp_sys::arm_status::Type {
57 fn check_status(self) -> Result<()> {
58 use cmsis_dsp_sys::arm_status::*;
59 match self {
60 ARM_MATH_SUCCESS => Ok(()),
61 ARM_MATH_ARGUMENT_ERROR => Err(Error::Argument),
62 ARM_MATH_LENGTH_ERROR => Err(Error::Length),
63 ARM_MATH_NANINF => Err(Error::NanInf),
64 ARM_MATH_SINGULAR => Err(Error::Singular),
65 ARM_MATH_SIZE_MISMATCH => Err(Error::SizeMismatch),
66 ARM_MATH_TEST_FAILURE => Err(Error::TestFailure),
67 _ => Err(Error::Unknown),
68 }
69 }
70}
71
72pub type Result<T> = ::core::result::Result<T, Error>;
74
75
76
77fn check_length<L, N>(lengths: L) -> N
80 where
81 L: Lengths,
82 usize: TryInto<N>,
83 <usize as TryInto<N>>::Error: Debug,
84{
85 lengths.assert_lengths_equal();
86 lengths
87 .length()
88 .try_into()
89 .expect("Length too large for size type")
90}
91
92trait Lengths {
93 fn assert_lengths_equal(&self);
94 fn length(&self) -> usize;
95}
96
97impl Lengths for usize {
98 fn assert_lengths_equal(&self) {
99 }
101
102 fn length(&self) -> usize {
103 *self
104 }
105}
106
107impl Lengths for (usize, usize) {
108 fn assert_lengths_equal(&self) {
109 assert_eq!(self.0, self.1);
110 }
111
112 fn length(&self) -> usize {
113 self.0
114 }
115}
116
117impl Lengths for (usize, usize, usize) {
118 fn assert_lengths_equal(&self) {
119 assert!(self.0 == self.1 && self.1 == self.2);
120 }
121
122 fn length(&self) -> usize {
123 self.0
124 }
125}