#include<iostream>
#include <chrono>
#include<cstdlib>	
#include "arraylist.hpp"
#include "analyzer.hpp"


using namespace std::chrono;


int main(int argc, char ** argv){
  int i;
  // Tableau dynamique.
  ArrayList<int> a;
  // Analyse du temps pris par les opérations.
  Analyzer time_analysis;
  // Analyse du nombre de copies faites par les opérations.
  Analyzer copy_analysis;
  // Analyse de l'espace mémoire inutilisé.
  Analyzer memory_analysis;
  high_resolution_clock::time_point before, after;
  // Booléen permettant de savoir si une allocation a été effectuée.
  bool memory_allocation;

  for(i = 0; i < 1000000 ; i++){
    // Ajout d'un élément et mesure du temps pris par l'opération.
    before = high_resolution_clock::now();
    memory_allocation = a.append(i);
    after = high_resolution_clock::now();

    // Enregistrement du temps pris par l'opération
    auto duration = std::chrono::duration_cast<std::chrono::nanoseconds>(after - before);    
    time_analysis.append(static_cast<double>(duration.count()));
    // Enregistrement du nombre de copies efféctuées par l'opération.
    // S'il y a eu réallocation de mémoire, il a fallu recopier tout le tableau.
    copy_analysis.append( (memory_allocation)? i:1 );
    // Enregistrement de l'espace mémoire non-utilisé.
    memory_analysis.append( a.capacity() - a.size() );
  }

  // Affichage de quelques statistiques sur l'expérience.
  std::cerr<<"Total cost :"<<time_analysis.get_total_cost()<<std::endl;
  std::cerr<<"Average cost :"<<time_analysis.get_average_cost()<<std::endl;
  std::cerr<<"Variance :"<<time_analysis.get_variance()<<std::endl;
  std::cerr<<"Standard deviation :"<<time_analysis.get_standard_deviation()<<std::endl;    

  // Sauvegarde les données de l'expérience.
  time_analysis.save_values("../plots/dynamic_array_time_cpp.plot");
  copy_analysis.save_values("../plots/dynamic_array_copy_cpp.plot");
  memory_analysis.save_values("../plots/dynamic_array_memory_cpp.plot");
  
  return 0;
}