Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Implement generic swap macro in C [duplicate]

Possible Duplicate:
is there an equivalent of std::swap() in c

Hi folks,

I was attempting a problem to write a generic swap macro in C and my macro looks like this:

#define swap(x,y) { x = x + y; y = x - y; x = x - y; } 

It works fine for integers and floats but I am unsure if there is any catch in it. What if by generic macro they mean swapping pointers, characters etc ? Can anyone help me with writing a generic macro for swapping every input ?

Thanks

like image 306
Mohit Dhuper Avatar asked Oct 20 '10 21:10

Mohit Dhuper


1 Answers

This works well only with integers.

For floats it will fail (e.g. try running it with a very large float and a very small one).

I would suggest something as follows:

#define swap(x,y) do \     { unsigned char swap_temp[sizeof(x) == sizeof(y) ? (signed)sizeof(x) : -1]; \      memcpy(swap_temp,&y,sizeof(x)); \      memcpy(&y,&x,       sizeof(x)); \      memcpy(&x,swap_temp,sizeof(x)); \     } while(0) 

memcpy is pretty optimized when the amount to copy is known at compilation time. Also, there's no need to manually pass a type name or use compiler specific extensions.

like image 88
adamk Avatar answered Sep 18 '22 23:09

adamk