#include <stdint.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <x86intrin.h>
#include <signal.h>
#include "helpers.c"
#include "helpers.h"


#define PLSIZE 63



struct lst {
  struct lst * next;
  long int payload[PLSIZE];
}  l;


struct lst * mkws(int size) 
{
	int i,j;
	struct lst * ws0,*ws;

	if (size == 0) 
		return NULL;

	srand(time(0));
	ws = calloc(1,sizeof(struct lst));
	ws->next = NULL;

	for (i=0;i<PLSIZE;i++) 
		ws->payload[i]=(rand())%2;

	for (j=1;j<size;j++) {
		ws0=ws;
		ws = calloc(1,sizeof(struct lst));
		if (ws==NULL) {
			fprintf(stderr,"Can't add element...\n");
			exit(1);
		}
		for (i=0;i<PLSIZE;i++) 
			ws->payload[i]=(rand())%2;
		ws->next = ws0;
	}
	return ws;
}

long int z = 0;

void kill_prg(int){
	printf("Nombre de tests effectués: %ld\n", z);
}

int main(int argc, char ** argv) 
{
	struct lst * ws, * ws0;

	long long int start, end, dif;

	long int i, x, size, it;

	if (argc != 3) {
		printf("Usage: %s <list size> <iterations>\n",argv[0]);
		exit(1);
	}
	set_signal_handler(SIGTSTP, &kill_prg);
	size=strtol(argv[1],NULL,0);

	ws = mkws(size);
	if (ws == NULL) {
		printf("NIL list created...\n");
		exit(1);
	}

	it = strtol(argv[2],NULL,0);

	start = __rdtsc(); 
	for (i = 0; i < it; i++) {
		ws0 = ws;
		while (ws0 != NULL) {
			x = ws0->payload[3];
			x++;
			z++;
			ws0 = ws0->next;
		}
	}
	end = __rdtsc();

	dif = end - start;
	printf("Cycles/element = %lf\n", ((double) dif)/((double) size*it));
	exit(0);
}
