avutil/common: add FFDIFFSIGN macro
This is of use for defining comparator callbacks. Common approaches like return x-y are not safe due to the risks of overflow. Furthermore, the (x > y) - (x < y) trick is optimized to branchless code. This also documents this macro accordingly. Reviewed-by: Michael Niedermayer <michael@niedermayer.cc> Signed-off-by: Ganesh Ajjanagadde <gajjanagadde@gmail.com>
This commit is contained in:
parent
03f5bcd921
commit
265f83fd35
@ -76,6 +76,17 @@
|
|||||||
*/
|
*/
|
||||||
#define FFNABS(a) ((a) <= 0 ? (a) : (-(a)))
|
#define FFNABS(a) ((a) <= 0 ? (a) : (-(a)))
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Comparator.
|
||||||
|
* For two numerical expressions x and y, gives 1 if x > y, -1 if x < y, and 0
|
||||||
|
* if x == y. This is useful for instance in a qsort comparator callback.
|
||||||
|
* Furthermore, compilers are able to optimize this to branchless code, and
|
||||||
|
* there is no risk of overflow with signed types.
|
||||||
|
* As with many macros, this evaluates its argument multiple times, it thus
|
||||||
|
* must not have a side-effect.
|
||||||
|
*/
|
||||||
|
#define FFDIFFSIGN(x,y) (((x)>(y)) - ((x)<(y)))
|
||||||
|
|
||||||
#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
|
#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
|
||||||
#define FFMAX3(a,b,c) FFMAX(FFMAX(a,b),c)
|
#define FFMAX3(a,b,c) FFMAX(FFMAX(a,b),c)
|
||||||
#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
|
#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user