#include <iostream>
#include <cstdlib>
#include <ctime>
#include <chrono>
#include <random>
#include "row.hpp"
using namespace std;

void tests(){
	int *b=new int[10];
	for(int i=0;i<10;i++){
		b[i]=rand()%100;
	}
	row<int> *a=new row<int>(b,10);
	cout<<"Original: "<<*a<<endl;
	bubble_sort(*a);
	cout<<"Bubble: "<<*a<<endl;
	delete a;
	delete[] b;
}

void run_benchmark(uint32_t size){
	mt19937 generator(12345);
	uniform_real_distribution<double> dist(-100000.0,100000.0);
	double* raw_data=new double[size];
	for(uint32_t i=0;i<size;i++){
		raw_data[i]=dist(generator);
	}
	row<double> master_row(raw_data,size);
	typedef void (*SortFunction) (row<double>&);
	SortFunction sorters[]={&bubble_sort, &selection_sort, &insertion_sort, &merge_sort, &quick_sort, &enumeration_sort};
	string names[]={"Bubble Sort","Selection Sort","Insertion Sort","Merge Sort","Quick Sort","Enumeration Sort"};
	for(int i=0;i<6;i++){
		row<double> test_row=master_row;
		auto start=chrono::high_resolution_clock::now();
		sorters[i](test_row);
		auto end=chrono::high_resolution_clock::now();
		chrono::duration<double,milli> duration=end-start;
		cout<<names[i]<<" took: "<<duration.count()<<" ms\n";
	}
	delete[] raw_data;
}

int main(){
	srand(time(NULL));
	tests();
	run_benchmark(1000);
	run_benchmark(10000);
	return 0;
}
