Break min()
and max()
parameter dependencies
Also convert most functions in `rt_math.h` to `constexpr` by implementing `min()` and `max()` natively. `constexpr` indeed has a positive impact on the generated assembly.
This commit is contained in:
@@ -27,57 +27,68 @@ constexpr float RT_PI_F_2 = RT_PI_2;
|
|||||||
constexpr float RT_INFINITY_F = std::numeric_limits<float>::infinity();
|
constexpr float RT_INFINITY_F = std::numeric_limits<float>::infinity();
|
||||||
constexpr float RT_NAN_F = std::numeric_limits<float>::quiet_NaN();
|
constexpr float RT_NAN_F = std::numeric_limits<float>::quiet_NaN();
|
||||||
|
|
||||||
template <typename T>
|
template<typename T>
|
||||||
inline T SQR (T x)
|
constexpr T SQR(T x)
|
||||||
{
|
{
|
||||||
// return std::pow(x,2); Slower than:
|
|
||||||
return x * x;
|
return x * x;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
inline const T& min(const T& a, const T& b)
|
constexpr const T& min(const T& a)
|
||||||
{
|
{
|
||||||
return std::min(a, b);
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
constexpr const T& min(const T& a, const T& b)
|
||||||
|
{
|
||||||
|
return a < b ? a : b;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T, typename... ARGS>
|
template<typename T, typename... ARGS>
|
||||||
inline const T& min(const T& a, const T& b, const ARGS&... args)
|
constexpr const T& min(const T& a, const T& b, const ARGS&... args)
|
||||||
{
|
{
|
||||||
return min(min(a, b), args...);
|
return min(min(a, b), min(args...));
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
inline const T& max(const T& a, const T& b)
|
constexpr const T& max(const T& a)
|
||||||
{
|
{
|
||||||
return std::max(a, b);
|
return a;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<typename T>
|
||||||
|
constexpr const T& max(const T& a, const T& b)
|
||||||
|
{
|
||||||
|
return a < b ? b : a;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T, typename... ARGS>
|
template<typename T, typename... ARGS>
|
||||||
inline const T& max(const T& a, const T& b, const ARGS&... args)
|
constexpr const T& max(const T& a, const T& b, const ARGS&... args)
|
||||||
{
|
{
|
||||||
return max(max(a, b), args...);
|
return max(max(a, b), max(args...));
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
inline const T& LIM(const T& a, const T& b, const T& c)
|
constexpr const T& LIM(const T& a, const T& b, const T& c)
|
||||||
{
|
{
|
||||||
return std::max(b, std::min(a, c));
|
return max(b, min(a, c));
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
inline T LIM01(const T& a)
|
constexpr T LIM01(const T& a)
|
||||||
{
|
{
|
||||||
return std::max(T(0), std::min(a, T(1)));
|
return max(T(0), min(a, T(1)));
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
inline T CLIP(const T& a)
|
constexpr T CLIP(const T& a)
|
||||||
{
|
{
|
||||||
return LIM(a, static_cast<T>(0), static_cast<T>(MAXVAL));
|
return LIM(a, static_cast<T>(0), static_cast<T>(MAXVAL));
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename T>
|
template<typename T>
|
||||||
inline T intp(T a, T b, T c)
|
constexpr T intp(T a, T b, T c)
|
||||||
{
|
{
|
||||||
// calculate a * b + (1 - a) * c
|
// calculate a * b + (1 - a) * c
|
||||||
// following is valid:
|
// following is valid:
|
||||||
@@ -101,13 +112,13 @@ inline T norm2(const T& x, const T& y)
|
|||||||
template< typename T >
|
template< typename T >
|
||||||
inline T norminf(const T& x, const T& y)
|
inline T norminf(const T& x, const T& y)
|
||||||
{
|
{
|
||||||
return std::max(std::abs(x), std::abs(y));
|
return max(std::abs(x), std::abs(y));
|
||||||
}
|
}
|
||||||
|
|
||||||
inline int float2uint16range(float d) // clips input to [0;65535] and rounds
|
constexpr int float2uint16range(float d)
|
||||||
{
|
{
|
||||||
d = CLIP(d); // clip to [0;65535]
|
// clips input to [0;65535] and rounds
|
||||||
return d + 0.5f;
|
return CLIP(d) + 0.5f;
|
||||||
}
|
}
|
||||||
|
|
||||||
constexpr std::uint8_t uint16ToUint8Rounded(std::uint16_t i)
|
constexpr std::uint8_t uint16ToUint8Rounded(std::uint16_t i)
|
||||||
|
Reference in New Issue
Block a user