acme
Foundational cross-platform layer of the ca2 framework
Loading...
Searching...
No Matches
frequency.h
1// Created by camilo on 2022-11-26 00:24 <3ThomasBorregaardSorensen!!
2#pragma once
3
4
5//#include "acme/prototype/time/time.h"
6
7constexpr ::f64 f64_equal_delta = 0.0001;
8
9constexpr bool f64_equals(::f64 d1, ::f64 d2, ::f64 delta)
10{
11
12 auto d = d1 - d2;
13
14 return -(delta / 2.0) < d && d < (delta / 2.0);
15
16}
17
18
19constexpr bool f64_equals(::f64 d1, ::f64 d2)
20{
21
22 return f64_equals(d1, d2, f64_equal_delta);
23
24}
25
26
27constexpr ::std::strong_ordering f64_order(::f64 d1, ::f64 d2, ::f64 delta)
28{
29
30 auto d = d1 - d2;
31
32 if (d > (delta / 2.0))
33 {
34
35 return std::strong_ordering::greater;
36
37 }
38 else if (d < -(delta / 2.0))
39 {
40
41 return std::strong_ordering::less;
42
43 }
44 else
45 {
46
47 return std::strong_ordering::equal;
48
49 }
50
51}
52
53
54constexpr ::std::strong_ordering f64_order(::f64 d1, ::f64 d2)
55{
56
57 return f64_order(d1, d2, f64_equal_delta);
58
59}
60
61
62class frequency :
63 public FREQUENCY
64{
65public:
66
67
68 constexpr frequency(zero_t ezero = zero_t{}) :FREQUENCY{} {}
69 constexpr frequency(::f64 dHertz) : FREQUENCY{dHertz} {}
70 constexpr frequency(const ::FREQUENCY & frequency) : FREQUENCY(frequency) {}
71
72 template < prototype_floating FLOATING >
73 constexpr frequency operator *(FLOATING d) const
74 {
75
76 return m_dHertz * d;
77
78 }
79
80 template < prototype_floating FLOATING >
81 constexpr frequency operator / (FLOATING d) const
82 {
83
84 return m_dHertz / d;
85
86 }
87
88
89 ::frequency operator = (const ::frequency & frequency)
90 {
91
92 m_dHertz = frequency.m_dHertz;
93
94 return *this;
95
96 }
97
98
99 constexpr bool is_null() const { return m_dHertz == 0.0; }
100 constexpr bool is_set() const { return m_dHertz != 0.0; }
101 constexpr bool operator !() const { return this->is_null(); }
102
103
104 explicit operator bool() const noexcept { return this->is_set(); }
105
106
107 bool operator == (const ::frequency frequency) const
108 {
109
110 return f64_equals(m_dHertz, frequency.m_dHertz);
111
112 }
113
114
115 ::std::strong_ordering operator <=> (const ::frequency frequency) const
116 {
117
118 return f64_order(m_dHertz, frequency.m_dHertz);
119
120 }
121
122
123 ::f64 hertz() const { return m_dHertz; }
124
125
126
127};
128
129
130
131template < prototype_floating FLOATING >
132constexpr ::frequency operator / (FLOATING d, const class time& time)
133{
134
135 auto nanosecond = (time.m_iSecond * 1'000'000'000.0 + time.m_iNanosecond);
136
137 return FREQUENCY{d * 1'000'000'000.0 / nanosecond};
138
139}
140
141
142template < prototype_integral INTEGRAL >
143constexpr ::frequency operator / (INTEGRAL i, const class time& time)
144{
145
146 auto nanosecond = (time.m_iSecond * 1'000'000'000 + time.m_iNanosecond);
147
148 return FREQUENCY{(::f64)(i * 1'000'000'000) / (::f64)nanosecond};
149
150}
151
152
153template < prototype_floating FLOATING >
154constexpr ::frequency operator * (FLOATING d, const frequency & frequency)
155{
156
157 return FREQUENCY{ d * frequency.m_dHertz};
158
159}
160
161
162template < prototype_floating FLOATING >
163constexpr class time operator / (FLOATING d, const frequency & frequency)
164{
165
166 auto dSeconds = d / frequency.m_dHertz;
167
168 return { dSeconds };
169
170}
171
172
173template < prototype_integral INTEGRAL >
174constexpr class time operator / (INTEGRAL i, const frequency & frequency)
175{
176
177 auto dSeconds = (::f64) i / frequency.m_dHertz;
178
179 return { dSeconds };
180
181}
182
183
184template < prototype_integral INTEGRAL >
185constexpr ::frequency operator * (INTEGRAL i, const frequency & frequency)
186{
187
188 return (::f64)i * frequency.m_dHertz;
189
190}
191
192
193constexpr ::f64 operator * (const class ::time & time, const frequency & frequency)
194{
195
196 return time.floating_second() * frequency.m_dHertz;
197
198}
199
200
201constexpr ::f64 operator * (const frequency & frequency, const class ::time & time)
202{
203
204 return frequency.m_dHertz * time.floating_second();
205
206}
207
208
209
Definition frequency.h:64
Definition aaa_nanosecond.h:9
Definition aaa_time.h:13
Definition _structures.h:10
Definition _structures.h:50