fixed_trig/
cordic_number.rs1use 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> + 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
29impl<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}