diff options
author | Campbell Barton <ideasman42@gmail.com> | 2017-11-22 18:44:02 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2017-11-22 19:11:48 +0300 |
commit | d749320e3b10161430bc4cb7dd92edb63712bf8c (patch) | |
tree | 9ec3788e19c442d7919ace5cff68b4dc255de78b /source | |
parent | 69b5165902d3e433af5b3ece633903162cbc292a (diff) |
BLI_utildefines: Support SWAP macro with two args
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/blenlib/BLI_utildefines.h | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/source/blender/blenlib/BLI_utildefines.h b/source/blender/blenlib/BLI_utildefines.h index 8f8d7cc3b7f..ec6042637aa 100644 --- a/source/blender/blenlib/BLI_utildefines.h +++ b/source/blender/blenlib/BLI_utildefines.h @@ -140,16 +140,25 @@ extern "C" { /* some math and copy defines */ - -#define SWAP(type, a, b) { \ - type sw_ap; \ - CHECK_TYPE(a, type); \ - CHECK_TYPE(b, type); \ - sw_ap = (a); \ - (a) = (b); \ - (b) = sw_ap; \ +#define _VA_SWAP3(type, a, b) { \ + CHECK_TYPE(a, type); \ + CHECK_TYPE(b, type); \ + type SWAP = (a); \ + (a) = (b); \ + (b) = SWAP; \ } (void)0 +#define _VA_SWAP2(a, b) { \ + CHECK_TYPE_PAIR(a, b); \ + struct { char a_[sizeof(a)]; } SWAP, *a_ = (void *)&(a), *b_ = (void *)&(b); \ + SWAP = *a_; \ + *a_ = *b_; \ + *b_ = SWAP; \ +} ((void)0) + +/* SWAP with two or three args (initial type argument is optional) */ +#define SWAP(...) VA_NARGS_CALL_OVERLOAD(_VA_SWAP, __VA_ARGS__) + /* swap with a temp value */ #define SWAP_TVAL(tval, a, b) { \ CHECK_TYPE_PAIR(tval, a); \ |