// Implementing accumulate with for_each
// See: http://stackoverflow.com/questions/3906796/how-to-fold-stl-container
// Arun Saha, 2010-Oct-11
#include <numeric>
#include <iostream>
#include <algorithm>
#include <cassert>
using namespace std;
struct result_functor {
result_functor( int initial, int multiplier ) :
result_( initial ), multiplier_( multiplier ) {
}
int operator()( int x ) {
result_ += multiplier_ * x;
return result_;
}
int result_;
int multiplier_;
};
int myfunction (int x, int y) {
return x + 2 * y;
}
struct myclass {
int operator()(int x, int y) const {
return x + 3 * y;
}
} myobject;
int main() {
const int init = 100;
const int numbers[] = { 10, 20, 30 };
const int accum_sum = std::accumulate( numbers, numbers + 3, init );
cout << accum_sum << endl;
const result_functor for_sum = for_each( numbers, numbers + 3, result_functor( init, +1 ) );
cout << for_sum.result_ << endl;
assert( accum_sum == for_sum.result_ );
const int accum_minus = std::accumulate( numbers, numbers + 3, init, minus<int>() );
cout << accum_minus << endl;
const result_functor for_minus = for_each( numbers, numbers + 3, result_functor( init, -1 ) );
cout << for_minus.result_ << endl;
assert( accum_minus == for_minus.result_ );
const int myfunction_result = std::accumulate( numbers, numbers + 3, init, myfunction );
cout << myfunction_result << endl;
const result_functor for_myfunction = for_each( numbers, numbers + 3, result_functor( init, +2 ) );
cout << for_myfunction.result_ << endl;
assert( myfunction_result == for_myfunction.result_ );
const int myobject_result = std::accumulate( numbers, numbers + 3, init, myobject );
cout << myobject_result << endl;
const result_functor for_myobject = for_each( numbers, numbers + 3, result_functor( init, +3 ) );
cout << for_myobject.result_ << endl;
assert( myobject_result == for_myobject.result_ );
}