// Safe swap integer. (1.00)

#include <limits.h>
#include <stdio.h>

void swapint(int *a, int *b)
{
    int t = *a; *a = *b; *b = t; // preferred
}

void swapint_xor(int *a, int *b)
{
    if (a != b)
    {
        *a ^= *b; *b ^= *a; *a ^= *b;
    }
}

void swapint_add(int *a, int *b)
{
    if (a != b)
    {
        __builtin_add_overflow(*a, *b, a);
        __builtin_sub_overflow(*a, *b, b);
        __builtin_sub_overflow(*a, *b, a);
    }
}

int main(void)
{
    typedef void (*swap_type)(int *, int *);

    swap_type fs[] = {
        swapint,
        swapint_xor,
        swapint_add,
        0
    };

    for (swap_type *f = fs; *f; f++)
    {
        int a = 1;
        int b = INT_MAX;
        (*f)(&a, &b);
        printf("f(a,b): a = %d, b = %d; ", a, b);
        (*f)(&a, &a);
        printf("f(a,a): a = %d\n", a);
    }
    return 0;
}