Skip to content

Commit f6ca7a7

Browse files
authored
Merge pull request #194 from jgfoster/arvmath
Prevent name clashes with math macros
2 parents 5351b02 + dc4ccff commit f6ca7a7

File tree

2 files changed

+118
-17
lines changed

2 files changed

+118
-17
lines changed

Diff for: CHANGELOG.md

+1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
1111

1212
### Changed
1313
- Move repository from https://github.com/ianfixes/arduino_ci to https://github.com/Arduino-CI/arduino_ci
14+
- Revise math macros to avoid name clashes
1415

1516
### Deprecated
1617

Diff for: cpp/arduino/AvrMath.h

+117-17
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,126 @@
11
#pragma once
2+
#include "ArduinoDefines.h"
23
#include <math.h>
34

4-
#define constrain(x,l,h) ((x)<(l)?(l):((x)>(h)?(h):(x)))
5-
#define map(x,inMin,inMax,outMin,outMax) (((x)-(inMin))*((outMax)-(outMin))/((inMax)-(inMin))+outMin)
5+
#ifdef __cplusplus
66

7-
#define sq(x) ((x)*(x))
7+
template <class Amt, class Low, class High>
8+
auto constrain(const Amt &amt, const Low &low, const High &high)
9+
-> decltype(amt < low ? low : (amt > high ? high : amt)) {
10+
return (amt < low ? low : (amt > high ? high : amt));
11+
}
812

9-
#define radians(deg) ((deg)*DEG_TO_RAD)
10-
#define degrees(rad) ((rad)*RAD_TO_DEG)
13+
template <class X, class InMin, class InMax, class OutMin, class OutMax>
14+
auto map(const X &x, const InMin &inMin, const InMax &inMax,
15+
const OutMin &outMin, const OutMax &outMax)
16+
-> decltype((x - inMin) * (outMax - outMin) / (inMax - inMin) + outMin) {
17+
return (x - inMin) * (outMax - outMin) / (inMax - inMin) + outMin;
18+
}
1119

12-
#ifdef abs
13-
#undef abs
14-
#endif
15-
#define abs(x) ((x)>0?(x):-(x))
20+
template <class T> auto radians(const T &deg) -> decltype(deg * DEG_TO_RAD) {
21+
return deg * DEG_TO_RAD;
22+
}
1623

17-
#ifdef max
18-
#undef max
19-
#endif
20-
#define max(a,b) ((a)>(b)?(a):(b))
24+
template <class T> auto degrees(const T &rad) -> decltype(rad * RAD_TO_DEG) {
25+
return rad * RAD_TO_DEG;
26+
}
2127

22-
#ifdef min
23-
#undef min
24-
#endif
25-
#define min(a,b) ((a)<(b)?(a):(b))
28+
template <class T> auto sq(const T &x) -> decltype(x * x) { return x * x; }
29+
30+
template <class T> auto abs(const T &x) -> decltype(x > 0 ? x : -x) {
31+
return x > 0 ? x : -x;
32+
}
33+
34+
template <class T, class L>
35+
auto min(const T &a, const L &b) -> decltype((b < a) ? b : a) {
36+
return (b < a) ? b : a;
37+
}
38+
39+
template <class T, class L>
40+
auto max(const T &a, const L &b) -> decltype((b < a) ? b : a) {
41+
return (a < b) ? b : a;
42+
}
43+
44+
#else // __cplusplus
45+
46+
#ifdef constrain
47+
#undef constrain
48+
#endif
49+
#define constrain(amt, low, high) \
50+
({ \
51+
__typeof__(amt) _amt = (amt); \
52+
__typeof__(low) _low = (low); \
53+
__typeof__(high) _high = (high); \
54+
(amt < low ? low : (amt > high ? high : amt)); \
55+
})
2656

57+
#ifdef map
58+
#undef map
59+
#endif
60+
#define map(x, inMin, inMax, outMin, outMax) \
61+
({ \
62+
__typeof__(x) _x = (x); \
63+
__typeof__(inMin) _inMin = (inMin); \
64+
__typeof__(inMax) _inMax = (inMax); \
65+
__typeof__(outMin) _outMin = (outMin); \
66+
__typeof__(outMax) _outMax = (outMax); \
67+
(_x - _inMin) * (_outMax - _outMin) / (_inMax - _inMin) + _outMin; \
68+
})
69+
70+
#ifdef radians
71+
#undef radians
72+
#endif
73+
#define radians(deg) \
74+
({ \
75+
__typeof__(deg) _deg = (deg); \
76+
_deg *DEG_TO_RAD; \
77+
})
78+
79+
#ifdef degrees
80+
#undef degrees
81+
#endif
82+
#define degrees(rad) \
83+
({ \
84+
__typeof__(rad) _rad = (rad); \
85+
_rad *RAD_TO_DEG; \
86+
})
87+
88+
#ifdef sq
89+
#undef sq
90+
#endif
91+
#define sq(x) \
92+
({ \
93+
__typeof__(x) _x = (x); \
94+
_x *_x; \
95+
})
96+
97+
#ifdef abs
98+
#undef abs
99+
#endif
100+
#define abs(x) \
101+
({ \
102+
__typeof__(x) _x = (x); \
103+
_x > 0 ? _x : -_x; \
104+
})
105+
106+
#ifdef min
107+
#undef min
108+
#endif
109+
#define min(a, b) \
110+
({ \
111+
__typeof__(a) _a = (a); \
112+
__typeof__(b) _b = (b); \
113+
_a < _b ? _a : _b; \
114+
})
115+
116+
#ifdef max
117+
#undef max
118+
#endif
119+
#define max(a, b) \
120+
({ \
121+
__typeof__(a) _a = (a); \
122+
__typeof__(b) _b = (b); \
123+
_a > _b ? _a : _b; \
124+
})
125+
126+
#endif

0 commit comments

Comments
 (0)