#include <chrono>
#include <iostream>
#include <vector>
#include <cstring>
#include <x86intrin.h>
//---------------------------------------------------------------------------
using namespace std;
//---------------------------------------------------------------------------
template <unsigned len> struct Char { char data[len]; };
//---------------------------------------------------------------------------
struct Order { unsigned customer,item,date; unsigned price; Char<100> comment; };
//---------------------------------------------------------------------------
struct Orders {
   vector<unsigned> data_customer;
   vector<unsigned> data_item;
   vector<unsigned> data_date;
   vector<unsigned> data_price;
   vector<Char<100>> data_comment;

   void insert(Order&& order);
};
//---------------------------------------------------------------------------
void Orders::insert(Order&& order)
{
   data_customer.push_back(order.customer);
   data_item.push_back(order.item);
   data_date.push_back(order.date);
   data_price.push_back(order.price);
   data_comment.push_back(order.comment);
}
//---------------------------------------------------------------------------
void createData(Orders& orders)
{
   for (unsigned index=0;index!=10000000;++index) {
      Order o{index%1000,(7*index)%997,2013,1+(index%3),{'\0'}};
      orders.insert(move(o));
   }
}
//---------------------------------------------------------------------------
void sumPrice(Orders& orders)
{
   auto start=chrono::high_resolution_clock::now();

   unsigned sum;
   {
      __m128i sums=_mm_setzero_si128();
      for (__m128i* iter=reinterpret_cast<__m128i*>(orders.data_price.data()),*limit=iter+orders.data_price.size()/4;iter!=limit;++iter)
         sums=_mm_add_epi32(sums,*iter);
      sum=_mm_extract_epi32(sums,0)+_mm_extract_epi32(sums,1)+ _mm_extract_epi32(sums,2)+ _mm_extract_epi32(sums,3);
      for (unsigned index=(orders.data_price.size()/4)*4,limit=orders.data_price.size();index!=limit;++index)
         sum+=orders.data_price[index];
   }

   auto stop=chrono::high_resolution_clock::now();
   cout << "result: " << sum << endl
        << "query time: " << chrono::duration_cast<chrono::microseconds>(stop-start).count() << endl;
}
//---------------------------------------------------------------------------
int main()
{
   Orders orders;
   createData(orders);
   sumPrice(orders);
}
//---------------------------------------------------------------------------
// result: 1999999
// query time: 2718 microseconds
