#include <iostream>
#include <exception>
#include <numeric>
#include <vector>
#include <cstdlib>
typedef std::vector< int > vector_t;
{
vector_t::const_iterator m_begin;
vector_t::const_iterator m_end;
msg_sum_part(
const vector_t::const_iterator & b,
const vector_t::const_iterator & e )
: m_begin( b )
, m_end( e )
{}
};
{
const vector_t & m_vector;
msg_sum_vector( const vector_t & v ) : m_vector( v )
{}
};
{
public :
a_vector_summator_t( context_t ctx,
so_5::mbox_t self_mbox )
, m_self_mbox(
std::move(self_mbox) )
, m_part_summator_mbox( so_environment().create_mbox() )
{}
{
}
{
*this,
{
m_part_summator_mbox,
[]( const msg_sum_part & part ) {
return std::accumulate( part.m_begin, part.m_end, 0 );
} );
} );
}
int evt_sum( const msg_sum_vector & evt )
{
auto m = evt.m_vector.begin() + evt.m_vector.size() / 2;
return std::accumulate( evt.m_vector.begin(), m, 0 ) +
so_5::request_value< int, msg_sum_part >(
m, evt.m_vector.end() );
}
private :
};
class progress_indicator_t
{
public :
progress_indicator_t( std::size_t total )
: m_total( total )
, m_percents( 0 )
{}
~progress_indicator_t()
{
std::cout << std::endl;
}
void update( std::size_t current )
{
int p = static_cast< int >(
(double(current + 1) / double(m_total)) * 100);
if( p != m_percents )
{
m_percents = p;
std::cout << m_percents << "\r" << std::flush;
}
}
private :
const std::size_t m_total;
int m_percents;
};
{
public :
a_runner_t( context_t ctx, std::size_t iterations )
, ITERATIONS( iterations )
, m_summator_mbox( so_environment().create_mbox() )
{}
{
create_summator_coop();
fill_test_vector();
do_calculations();
}
private :
const std::size_t ITERATIONS;
vector_t m_vector;
void create_summator_coop()
{
*this,
coop.
make_agent< a_vector_summator_t >( m_summator_mbox );
} );
}
void fill_test_vector()
{
const std::size_t CAPACITY = 1000;
m_vector.reserve( CAPACITY );
for( int i = 0; i != static_cast< int >(CAPACITY); ++i )
m_vector.push_back( i );
}
void do_calculations()
{
progress_indicator_t indicator( (ITERATIONS) );
for( std::size_t i = 0; i != ITERATIONS; ++i )
{
so_5::request_value< int, msg_sum_vector >(
indicator.update( i );
}
}
};
int main( int argc, char ** argv )
{
try
{
const std::size_t ITERATIONS = 2 == argc ?
static_cast< std::size_t >(std::atoi( argv[1] )) :
10u;
"active_obj" ),
} );
},
p.add_named_dispatcher(
"active_obj",
} );
}
catch( const std::exception & ex )
{
std::cerr << "Error: " << ex.what() << std::endl;
return 1;
}
return 0;
}