#include "libscl.h"
#include <ctime>
#include <algorithm>
#include <numeric>  // textbook is wrong here
using namespace std;
using namespace scl;

int main(int argc, char** argp, char** envp)
{
  clock_t time_start, time_stop, time_sum;
  
  typedef vector<double>::size_type vst;
  typedef vector<double>::iterator vitr;

  cout << endl;
  cout << "Vector size"<<'\n';
  const vst n = 100000000;
  cout << "n = " << n << '\n';
  cout << endl;

  {
    cout << "Define and allocate"<<'\n';
    time_start = clock();
    vector<double> a(n);
    time_stop = clock();
    cout<<"time = " << time_stop - time_start << '\n';
    time_sum = time_stop - time_start;
  
    cout << "Direct initialization"<<'\n';
    time_start = clock();
    for (vitr ai=a.begin(); ai!=a.end(); ++ai) {
      *ai = 0.1;
    }
    time_stop = clock();
    cout<<"time = " << time_stop - time_start << '\n';
    time_sum += time_stop - time_start;
    cout<<"sum = " << time_sum << '\n';
    cout << endl;
  }

  {
    cout << "Define without allocation"<<'\n';
    time_start = clock();
    vector<double> b;
    time_stop = clock();
    cout<<"time = " << time_stop - time_start << '\n';
    time_sum = time_stop - time_start;

    cout << "Initialization via push_back"<<'\n';
    time_start = clock();
    for (vst i=0; i<n; ++i) {
      b.push_back(0.1);
    }
    time_stop = clock();
    cout<<"time = " << time_stop - time_start << '\n';
    time_sum += time_stop - time_start;
    cout<<"sum = " << time_sum << '\n';
    cout << endl;
  }

  {
    cout << "Define and reserve"<<'\n';
    time_start = clock();
    vector<double> c;
    c.reserve(n);
    time_stop = clock();
    cout<<"time = " << time_stop - time_start << '\n';
    time_sum = time_stop - time_start;
  
    cout << "Initialization via push_back"<<'\n';
    time_start = clock();
    for (vst i=0; i<n; ++i) {
      c.push_back(0.1);
    }
    time_stop = clock();
    cout<<"time = " << time_stop - time_start << '\n';
    time_sum += time_stop - time_start;
    cout<<"sum = " << time_sum << '\n';
    cout << endl;
  }

  return 0;
}
