Util Macros: reduce multiple access & conversion for CLAMP/CLAMPIS/ABS

This commit is contained in:
Campbell Barton 2013-12-07 14:24:09 +11:00
parent 69065b5b2c
commit f64b3732be
2 changed files with 27 additions and 11 deletions

@ -183,13 +183,6 @@ static const int NAN_INT = 0x7FC00000;
} (void)0
#endif
#ifndef CLAMP
# define CLAMP(a, b, c) { \
if ((a) < (b)) (a) = (b); \
else if ((a) > (c)) (a) = (c); \
} (void)0
#endif
#if BLI_MATH_DO_INLINE
#include "intern/math_base_inline.c"
#endif

@ -180,8 +180,6 @@
} (void)0
#define ABS(a) ( (a) < 0 ? (-(a)) : (a) )
#define FTOCHAR(val) (char)(((val) <= 0.0f) ? 0 : (((val) > (1.0f - 0.5f / 255.0f)) ? 255 : ((255.0f * (val)) + 0.5f)))
#define FTOUSHORT(val) ((val >= 1.0f - 0.5f / 65535) ? 65535 : (val <= 0.0f) ? 0 : (unsigned short)(val * 65535.0f + 0.5f))
#define USHORTTOUCHAR(val) ((unsigned char)(((val) >= 65535 - 128) ? 255 : ((val) + 128) >> 8))
@ -242,12 +240,37 @@
} (void)0
/* some misc stuff.... */
/* avoid multiple access & type conversions for supported compilers */
#if defined(__GNUC__) || defined(__clang__)
#define ABS(a) ({ \
typeof(a) a_ = (a); \
((a_) < 0 ? (-(a_)) : (a_)); })
#define CLAMPIS(a, b, c) ({ \
typeof(a) a_ = (a), b_ = (b), c_ = (c); \
((a_) < (b_) ? (b_) : (a_) > (c_) ? (c_) : (a_)); })
#define CLAMP(a, b, c) { \
typeof(a) b_ = (b), c_ = (c); \
if ((a) < (b_)) (a) = (b_); \
else if ((a) > (c_)) (a) = (c_); \
} (void)0
#else
#define ABS(a) ((a) < 0 ? (-(a)) : (a))
#define CLAMPIS(a, b, c) ((a) < (b) ? (b) : (a) > (c) ? (c) : (a))
#define CLAMP(a, b, c) { \
if ((a) < (b)) (a) = (b); \
if ((a) < (b)) (a) = (b); \
else if ((a) > (c)) (a) = (c); \
} (void)0
#define CLAMPIS(a, b, c) ((a) < (b) ? (b) : (a) > (c) ? (c) : (a))
#endif
#define IS_EQ(a, b) ( \
CHECK_TYPE_INLINE(a, double), CHECK_TYPE_INLINE(b, double), \