AliceVision
Photogrammetric Computer Vision Framework
MathTrait.hpp
1 // This file is part of the AliceVision project.
2 // Copyright (c) 2016 AliceVision contributors.
3 // Copyright (c) 2012 openMVG contributors.
4 // This Source Code Form is subject to the terms of the Mozilla Public License,
5 // v. 2.0. If a copy of the MPL was not distributed with this file,
6 // You can obtain one at https://mozilla.org/MPL/2.0/.
7 
8 #pragma once
9 
10 #include <cmath>
11 
12 namespace aliceVision {
13 /* Type trait used to specialize math functions */
14 
15 template<typename T>
16 class MathTrait
17 {
18  public:
19  // Trigonometric functions
20  static inline T cos(const T val);
21  static inline T sin(const T val);
22  static inline T tan(const T val);
23 
24  // Inverse trigonometric functions
25  static inline T acos(const T val);
26  static inline T asin(const T val);
27  static inline T atan(const T val);
28  static inline T atan2(const T y, const T x);
29 
30  // Exponential functions
31  static inline T exp(const T val);
32  static inline T log(const T val);
33  static inline T log10(const T val);
34 
35  // Power functions
36  static inline T pow(const T base, const T expo);
37  static inline T sqrt(const T val);
38  static inline T cbrt(const T val);
39 
40  // Rounding functions
41  static inline T floor(const T val);
42  static inline T ceil(const T val);
43  static inline T round(const T val);
44 
45  // Absolute value
46  static inline T abs(const T val);
47 };
48 
52 template<>
53 inline float MathTrait<float>::cos(const float val)
54 {
55  return cosf(val);
56 }
57 
58 template<>
59 inline float MathTrait<float>::sin(const float val)
60 {
61  return sinf(val);
62 }
63 
64 template<>
65 inline float MathTrait<float>::tan(const float val)
66 {
67  return tanf(val);
68 }
69 
70 template<>
71 inline float MathTrait<float>::acos(const float val)
72 {
73  return acosf(val);
74 }
75 
76 template<>
77 inline float MathTrait<float>::asin(const float val)
78 {
79  return asinf(val);
80 }
81 
82 template<>
83 inline float MathTrait<float>::atan(const float val)
84 {
85  return atanf(val);
86 }
87 
88 template<>
89 inline float MathTrait<float>::atan2(const float y, const float x)
90 {
91  return atan2f(y, x);
92 }
93 
94 template<>
95 inline float MathTrait<float>::exp(const float val)
96 {
97  return expf(val);
98 }
99 
100 template<>
101 inline float MathTrait<float>::log(const float val)
102 {
103  return logf(val);
104 }
105 
106 template<>
107 inline float MathTrait<float>::log10(const float val)
108 {
109  return log10f(val);
110 }
111 
112 template<>
113 inline float MathTrait<float>::pow(const float base, const float expo)
114 {
115  return powf(base, expo);
116 }
117 
118 template<>
119 inline float MathTrait<float>::sqrt(const float val)
120 {
121  return sqrtf(val);
122 }
123 
124 template<>
125 inline float MathTrait<float>::cbrt(const float val)
126 {
127 #ifdef _MSC_VER
128  return cbrt(val);
129 #else
130  return cbrtf(val);
131 #endif
132 }
133 
134 template<>
135 inline float MathTrait<float>::floor(const float val)
136 {
137  return floorf(val);
138 }
139 
140 template<>
141 inline float MathTrait<float>::ceil(const float val)
142 {
143  return ceilf(val);
144 }
145 
146 template<>
147 inline float MathTrait<float>::round(const float val)
148 {
149  if (val >= 0.0f)
150  {
151  return floorf(val + 0.5f);
152  }
153  else
154  {
155  return ceilf(val - 0.5f);
156  }
157 }
158 
159 template<>
160 inline float MathTrait<float>::abs(const float val)
161 {
162  return fabsf(val);
163 }
164 
168 template<>
169 inline double MathTrait<double>::cos(const double val)
170 {
171  return cos(val);
172 }
173 
174 template<>
175 inline double MathTrait<double>::sin(const double val)
176 {
177  return sin(val);
178 }
179 
180 template<>
181 inline double MathTrait<double>::tan(const double val)
182 {
183  return tan(val);
184 }
185 
186 template<>
187 inline double MathTrait<double>::acos(const double val)
188 {
189  return acos(val);
190 }
191 
192 template<>
193 inline double MathTrait<double>::asin(const double val)
194 {
195  return asin(val);
196 }
197 
198 template<>
199 inline double MathTrait<double>::atan(const double val)
200 {
201  return atan(val);
202 }
203 
204 template<>
205 inline double MathTrait<double>::atan2(const double y, const double x)
206 {
207  return atan2(y, x);
208 }
209 
210 template<>
211 inline double MathTrait<double>::exp(const double val)
212 {
213  return exp(val);
214 }
215 
216 template<>
217 inline double MathTrait<double>::log(const double val)
218 {
219  return log(val);
220 }
221 
222 template<>
223 inline double MathTrait<double>::log10(const double val)
224 {
225  return log10(val);
226 }
227 
228 template<>
229 inline double MathTrait<double>::pow(const double base, const double expo)
230 {
231  return pow(base, expo);
232 }
233 
234 template<>
235 inline double MathTrait<double>::sqrt(const double val)
236 {
237  return sqrt(val);
238 }
239 
240 template<>
241 inline double MathTrait<double>::cbrt(const double val)
242 {
243  return cbrt(val);
244 }
245 
246 template<>
247 inline double MathTrait<double>::floor(const double val)
248 {
249  return floor(val);
250 }
251 
252 template<>
253 inline double MathTrait<double>::ceil(const double val)
254 {
255  return ceil(val);
256 }
257 
258 template<>
259 inline double MathTrait<double>::round(const double val)
260 {
261  if (val >= 0.0)
262  {
263  return floor(val + 0.5);
264  }
265  else
266  {
267  return ceil(val - 0.5);
268  }
269 }
270 
271 template<>
272 inline double MathTrait<double>::abs(const double val)
273 {
274  return fabs(val);
275 }
276 
280 template<>
281 inline long double MathTrait<long double>::cos(const long double val)
282 {
283  return cosl(val);
284 }
285 
286 template<>
287 inline long double MathTrait<long double>::sin(const long double val)
288 {
289  return sinl(val);
290 }
291 
292 template<>
293 inline long double MathTrait<long double>::tan(const long double val)
294 {
295  return tanl(val);
296 }
297 
298 template<>
299 inline long double MathTrait<long double>::acos(const long double val)
300 {
301  return acosl(val);
302 }
303 
304 template<>
305 inline long double MathTrait<long double>::asin(const long double val)
306 {
307  return asinl(val);
308 }
309 
310 template<>
311 inline long double MathTrait<long double>::atan(const long double val)
312 {
313  return atanl(val);
314 }
315 
316 template<>
317 inline long double MathTrait<long double>::atan2(const long double y, const long double x)
318 {
319  return atan2l(y, x);
320 }
321 
322 template<>
323 inline long double MathTrait<long double>::exp(const long double val)
324 {
325  return expl(val);
326 }
327 
328 template<>
329 inline long double MathTrait<long double>::log(const long double val)
330 {
331  return logl(val);
332 }
333 
334 template<>
335 inline long double MathTrait<long double>::log10(const long double val)
336 {
337  return log10l(val);
338 }
339 
340 template<>
341 inline long double MathTrait<long double>::pow(const long double base, const long double expo)
342 {
343  return powl(base, expo);
344 }
345 
346 template<>
347 inline long double MathTrait<long double>::sqrt(const long double val)
348 {
349  return sqrtl(val);
350 }
351 
352 template<>
353 inline long double MathTrait<long double>::cbrt(const long double val)
354 {
355 #ifdef _MSC_VER
356  return cbrt(val);
357 #else
358  return cbrtl(val);
359 #endif
360 }
361 
362 template<>
363 inline long double MathTrait<long double>::floor(const long double val)
364 {
365  return floorl(val);
366 }
367 
368 template<>
369 inline long double MathTrait<long double>::ceil(const long double val)
370 {
371  return ceill(val);
372 }
373 
374 template<>
375 inline long double MathTrait<long double>::round(const long double val)
376 {
377  if (val >= 0.0l)
378  {
379  return floorl(val + 0.5l);
380  }
381  else
382  {
383  return ceill(val - 0.5l);
384  }
385 }
386 
387 template<>
388 inline long double MathTrait<long double>::abs(const long double val)
389 {
390  return fabsl(val);
391 }
392 } // namespace aliceVision
aliceVision::MathTrait
Definition: MathTrait.hpp:16
aliceVision
Definition: checkerDetector.cpp:32