fixed_trig/
cordic_number.rs

1use fixed::types::extra::{
2    IsLessOrEqual, True, Unsigned, U13, U14, U16, U29, U30, U32, U5, U6, U61, U62, U64, U8,
3};
4use fixed::types::U0F64;
5use fixed::{FixedI16, FixedI32, FixedI64, FixedI8};
6use std::ops::{Add, AddAssign, BitXor, Div, Mul, MulAssign, Neg, Shl, Shr, Sub, SubAssign};
7
8pub trait CordicNumber:
9    Copy
10    + PartialOrd
11    + AddAssign
12    + SubAssign
13    + Div<Output = Self>
14    + Mul<Output = Self> // FIXME: remove that
15    + Neg<Output = Self>
16    + Sub<Output = Self>
17    + Add<Output = Self>
18    + Shr<u8, Output = Self>
19    + Shl<u8, Output = Self>
20{
21    fn zero() -> Self;
22    fn one() -> Self;
23    fn frac_pi_2() -> Self;
24    fn pi() -> Self;
25    fn from_u0f64(val: U0F64) -> Self;
26    fn num_fract_bits() -> u8;
27}
28
29// The IsLessOrEqual constraints are for (in order):
30// - The Fixed type
31// - The FRAC_PI_2 constant.
32// - The PI constant.
33impl<Fract> CordicNumber for FixedI8<Fract>
34where
35    Fract: Unsigned
36        + IsLessOrEqual<U8, Output = True>
37        + IsLessOrEqual<U6, Output = True>
38        + IsLessOrEqual<U5, Output = True>,
39{
40    #[inline(always)]
41    fn zero() -> Self {
42        Self::from_bits(0)
43    }
44
45    #[inline(always)]
46    fn one() -> Self {
47        Self::from_num(1.0)
48    }
49
50    #[inline(always)]
51    fn frac_pi_2() -> Self {
52        Self::FRAC_PI_2
53    }
54
55    #[inline(always)]
56    fn pi() -> Self {
57        Self::PI
58    }
59
60    #[inline(always)]
61    fn from_u0f64(val: U0F64) -> Self {
62        val.to_num()
63    }
64
65    #[inline(always)]
66    fn num_fract_bits() -> u8 {
67        Fract::to_u8()
68    }
69}
70
71impl<Fract> CordicNumber for FixedI32<Fract>
72where
73    Fract: Unsigned
74        + IsLessOrEqual<U32, Output = True>
75        + IsLessOrEqual<U30, Output = True>
76        + IsLessOrEqual<U29, Output = True>,
77{
78    #[inline(always)]
79    fn zero() -> Self {
80        Self::from_bits(0)
81    }
82
83    #[inline(always)]
84    fn one() -> Self {
85        Self::from_num(1.0)
86    }
87
88    #[inline(always)]
89    fn frac_pi_2() -> Self {
90        Self::FRAC_PI_2
91    }
92
93    #[inline(always)]
94    fn pi() -> Self {
95        Self::PI
96    }
97
98    #[inline(always)]
99    fn from_u0f64(val: U0F64) -> Self {
100        val.to_num()
101    }
102
103    #[inline(always)]
104    fn num_fract_bits() -> u8 {
105        Fract::to_u8()
106    }
107}
108
109impl<Fract> CordicNumber for FixedI16<Fract>
110where
111    Fract: Unsigned
112        + IsLessOrEqual<U16, Output = True>
113        + IsLessOrEqual<U14, Output = True>
114        + IsLessOrEqual<U13, Output = True>,
115{
116    #[inline(always)]
117    fn zero() -> Self {
118        Self::from_bits(0)
119    }
120
121    #[inline(always)]
122    fn one() -> Self {
123        Self::from_num(1.0)
124    }
125
126    #[inline(always)]
127    fn frac_pi_2() -> Self {
128        Self::FRAC_PI_2
129    }
130
131    #[inline(always)]
132    fn pi() -> Self {
133        Self::PI
134    }
135
136    #[inline(always)]
137    fn from_u0f64(val: U0F64) -> Self {
138        val.to_num()
139    }
140
141    #[inline(always)]
142    fn num_fract_bits() -> u8 {
143        Fract::to_u8()
144    }
145}
146
147impl<Fract> CordicNumber for FixedI64<Fract>
148where
149    Fract: Unsigned
150        + IsLessOrEqual<U64, Output = True>
151        + IsLessOrEqual<U62, Output = True>
152        + IsLessOrEqual<U61, Output = True>,
153{
154    #[inline(always)]
155    fn zero() -> Self {
156        Self::from_bits(0)
157    }
158
159    #[inline(always)]
160    fn one() -> Self {
161        Self::from_num(1.0)
162    }
163
164    #[inline(always)]
165    fn frac_pi_2() -> Self {
166        Self::FRAC_PI_2
167    }
168
169    #[inline(always)]
170    fn pi() -> Self {
171        Self::PI
172    }
173
174    #[inline(always)]
175    fn from_u0f64(val: U0F64) -> Self {
176        val.to_num()
177    }
178
179    #[inline(always)]
180    fn num_fract_bits() -> u8 {
181        Fract::to_u8()
182    }
183}