#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
#include<string.h>
#include "arrayList.h"
#include "timedefs.h"

void intPrint(void *d){
        printf("%d ",*((int *)d));
}

int intCmp( void *i1, void *i2){
	return *(int *)i1 - *(int *)i2;
}

void stringPrint(void *d){
        printf("%s ",*((char **)d));
}

void insertSortedInList( LIST *l, int *inputs, int nInputs){
	int i, j, k;
	for(i=0; i < nInputs; i++){
		k = inputs[i];
                j = arrayListNextBigger( l, &k,  intCmp);
                arrayListAddBefore(l, j, &k);
	}
}


int main(int argc, char *argv[]){
        LIST intList;
	unsigned med;
	int i, j, k, nInputs;
	int *inputs;

	if(argc < 2){
		printf("usage: %s time n \n OR \n %s int <int 1>, <int2>, .....\n", argv[0], argv[0]);
		return -1;
	}

	if(strcmp(argv[1], "time") == 0){
		nInputs = atoi(argv[2]);
		inputs = (int *)malloc(sizeof(int) * nInputs);
		assert(arrayListCreate(&intList, sizeof(int), intPrint, NULL) != -1);
		for(i=0; i < nInputs; i++)
				inputs[i] = rand()%1000;
		DO(arrayListCreate(&intList, sizeof(int), intPrint, NULL);
		insertSortedInList( &intList, inputs, nInputs); arrayListDispose(&intList););
		med = median_get();
		printf("Median time for %d inserts is %u cycles\n",nInputs, med/N);
	}	

	else if(strcmp(argv[1], "int") == 0){

		assert(arrayListCreate(&intList, sizeof(int), intPrint, NULL) != -1);

		for(i=1; i < argc; i++){
			k = atoi(argv[i]);
			j = arrayListNextBigger( &intList, &k,  intCmp);
			arrayListAddBefore(&intList, j, &k);
		}

        	arrayListPrint(&intList);
		arrayListDispose(&intList);
	}
	else printf("usage: %s time n \n OR \n %s int <int 1>, <int2>, .....\n", argv[0], argv[0]);
}


