#include <assert.h>
#include <stdio.h>
#include <string.h>

#define yoba_swap(foo, bar) do {  \
    char temp[sizeof(foo)];             \
    assert(sizeof(foo) == sizeof(bar)); \
    memcpy(&temp, &foo, sizeof(foo));   \
    memcpy(&foo, &bar, sizeof(foo));    \
    memcpy(&bar, &temp, sizeof(foo));   \
} while (0)


int main(void)
{
    printf("Arrays:\n");
    int a1[3] = { 1, 2, 3 };
    int a2[3] = { 4, 5, 6 };
    printf("Before: a1 = { %d, %d, %d }; a2 = { %d, %d, %d }\n", a1[0], a1[1], a1[2], a2[0], a2[1], a2[2]);
    yoba_swap(a1, a2);
    printf("After:  a1 = { %d, %d, %d }; a2 = { %d, %d, %d }\n", a1[0], a1[1], a1[2], a2[0], a2[1], a2[2]);
    printf("Single values:\n");
    double d1 = 1.0;
    double d2 = 2.0;
    printf("Before: d1 = %g, d2 = %g\n", d1, d2);
    yoba_swap(d1, d2);
    printf("After:  d1 = %g, d2 = %g\n", d1, d2);
}
