#include <iostream>
#include <chrono>
#include <cstdlib>
#include <cassert>

template<typename T, class = typename std::enable_if<std::is_integral<T>::value>::type>
void swap_xor(T &a, T &b)
{a ^= b; b ^= a; a ^= b;}

int main() 
{
	double avgstd = 0.0, avgxor = 0.0;
	unsigned long long nbP = 0;
	int a, b, c;
	for(unsigned int i = 0; i<1000000; ++i)
	{
		a = c = rand();
		b = rand();
		auto start = std::chrono::steady_clock::now();
		std::swap(a,b);
		auto t1 = std::chrono::steady_clock::now();
		swap_xor(a,b);
		auto end = std::chrono::steady_clock::now();
		assert(a==c);
		unsigned long long tstd = std::chrono::duration_cast<std::chrono::nanoseconds> (t1-start).count();
		unsigned long long txor = std::chrono::duration_cast<std::chrono::nanoseconds> (end-t1).count();

		avgstd = (avgstd*nbP + tstd)/(nbP+1);
		avgxor = (avgxor*nbP + txor)/(nbP+1);
		++nbP;
	}
	std::cout << "Timing for swaps, averaged on " <<nbP<<" swaps. In nanoseconds.\n";
	std::cout << "std swap: "<<avgstd <<" ns. XOR swaps: "<<avgxor <<" ns."<<std::endl;
	return 0; 
}