/* LatexBeginPackagedTaskSetup */
#include <iostream>
#include <vector>
#include <numeric>
#include <future>

#include "divider.h"

using namespace std;

using data = vector<int>;
using data_it = data::iterator;

int main()
{
  const auto thread_count{9};
  
  vector<int> v(100000000, 1);
  Divider<vector<int>> d{v, thread_count};
  
/* LatexBeginPackagedTaskWork */
  vector<future<int>> partial_results;
  for ( unsigned i{}; i < thread_count; ++i)
  {
    // wrap our function in a future-aware object
    packaged_task<int(data_it, data_it, int)> worker(accumulate<data_it,int>);

    // get a handle to out future result
    partial_results.emplace_back( worker.get_future() );

    // execute our function in it's own thread
    thread{ move(worker), d.begin(i), d.end(i), 0 }.detach();
  }
  
/* LatexBeginPackagedTaskSum */
  cout << "Sum: "
       << accumulate(begin(partial_results), end(partial_results), 0,
                     [](int sum, future<int>& fut){ return sum + fut.get(); })
       << endl;
  
  return 0;
}
/* LatexEndPackagedTask */