/*
 * Bubble sort a list of 10 integers
 *
 * I'd rather have the method without pointers.
 * As a user of the function, I don't have to think about passing pointers, which is also nice
 */
#include <iostream>


#define LIST_SIZE 10
#define USE_PTR 1

void sort( int* A, const int size );
#if !USE_PTR
void order( int& a, int& b );
#else
void orderptr( int* a, int* b );
#endif


int main() {
	int list[LIST_SIZE] = { 2295, 14500, 9127, 23079, 20612, 5571, 21959, 10032, 18339, 16673 };

	// Print the original
	std::cout << "Original: ";

	for( int i = 0; i < LIST_SIZE ; i++ )
	{
		if ( i != 0 )
		{
			std::cout << ", ";
		}

		std::cout << list[i];
	}
	std::cout << std::endl;

	// sort it
	sort( list, LIST_SIZE );

	// Print it
	std::cout << "Sorted: ";
	for( int i = 0; i < LIST_SIZE ; i++ )
	{
		if ( i != 0 )
		{
			std::cout << ", ";
		}

		std::cout << list[i];
	}
	std::cout << std::endl;

	return 0;
}

void sort( int* A, const int size ) {
	for (int i = 0 ; i < size ; i++ ) {
		for (int j = 0 ; j < size - 1 ; j++) {
			#if !USE_PTR
			order( A[ i ], A[ j ] );
			#else
			orderptr( &A[ i ], &A[ j ] );
			#endif
		}
	}
}

#if !USE_PTR
void order( int& a, int& b ) {
	// b is greater or equal to a, do nothing
	if ( a < b ) {
		return;
	}
	
	int tmp = a;
	a = b;
	b = tmp;
}
#else
void orderptr( int* a, int* b ) {
	if ( *a < *b ) {
		return;
	}

	int tmp = *a;
	*a = *b;
	*b = tmp;
}
#endif
