better SWAP() macro