#include <iostream>
#include <cstdlib>
#include <ctime>
#include <unistd.h>
#include <iomanip>
#include <sys/mman.h>

#include "ProlificScheduler.hpp"
#include "SortTensorTask.hpp"

void print_tensor(int* B, int n, int k) {
	for (int slice=0; slice<k; slice++) {
		std::cout << "Selida : "<<  slice << "\n";
		for (int i=0; i<n; i++) {
			for(int j=0; j<n; j++) {
				std::cout<< std::setw(5) << B[slice *(n*n) + i*n +j] << " " ;
			}
		std::cout<< "\n";
		}
	}
}

int main() {
	srand(time(0));

	int n=3;
	int k=2;

	int total_elements= n*n*k;
	int* B=(int*) mmap(NULL, total_elements * sizeof(int), PROT_READ | PROT_WRITE , MAP_SHARED | MAP_ANONYMOUS , -1 ,0);

	if ( B==MAP_FAILED){
		std::cerr<<"Sfalma " ;
		return 1;
	}

	for(int i=0; i<total_elements; i++) {
		B[i]=(rand()%2001)-1000;
	}

	std::cout<< "Arxika (" << n << "x" << n << "x" << k << ") \n";
	print_tensor(B,n,k);

	SortTensorTask tensorTask(B,n,k);

	std::cout<< " Me prolific scheduler kai " << k << " ergates \n";

	ProlificScheduler scheduler(k);
	scheduler.execute(&tensorTask);

	std::cout<< "Taksinomimenos ana 'selida' kai grammi \n";
	print_tensor(B,n,k);

	munmap(B,total_elements*sizeof(int));

	return 0;

}
