|
4 | 4 |
|
5 | 5 | #ifdef __cplusplus
|
6 | 6 |
|
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 |
| -} |
12 |
| - |
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 |
| -} |
19 |
| - |
20 |
| -template <class T> auto radians(const T °) -> decltype(deg * DEG_TO_RAD) { |
21 |
| - return deg * DEG_TO_RAD; |
22 |
| -} |
23 |
| - |
24 |
| -template <class T> auto degrees(const T &rad) -> decltype(rad * RAD_TO_DEG) { |
25 |
| - return rad * RAD_TO_DEG; |
26 |
| -} |
27 |
| - |
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 |
| -} |
| 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 | + } |
| 12 | + |
| 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 | + } |
| 19 | + |
| 20 | + template <class T> auto radians(const T °) -> decltype(deg * DEG_TO_RAD) { |
| 21 | + return deg * DEG_TO_RAD; |
| 22 | + } |
| 23 | + |
| 24 | + template <class T> auto degrees(const T &rad) -> decltype(rad * RAD_TO_DEG) { |
| 25 | + return rad * RAD_TO_DEG; |
| 26 | + } |
| 27 | + |
| 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 | 43 |
|
44 | 44 | #else // __cplusplus
|
45 | 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 |
| - }) |
56 |
| - |
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 |
| - }) |
| 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 | + }) |
| 56 | + |
| 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 | 125 |
|
126 | 126 | #endif
|
0 commit comments