blob: d8e96d60d4075402840f7d4e501db0bf71801e50 [file] [log] [blame]
// Copyright Keld Helsgaun 2000, Oliver Kowalke 2014.
// Distributed under the Boost Software License, Version 1.0.
// (See accompanying file LICENSE_1_0.txt or copy at
// http://www.boost.org/LICENSE_1_0.txt)
#include <cstdlib>
#include <iostream>
#include <boost/bind.hpp>
#include <boost/coroutine/all.hpp>
#include <boost/move/move.hpp>
#include <boost/random/random_device.hpp>
#include <boost/random/uniform_int_distribution.hpp>
typedef boost::coroutines::symmetric_coroutine< void > coro_t;
class player
{
private:
int die()
{
boost::random::uniform_int_distribution<> dist( 1, 6);
return dist( gen);
}
void run_( coro_t::yield_type & yield)
{
int sum = 0;
while ( ( sum += die() ) < 100)
yield( nxt->coro);
std::cout << "player " << id << " winns" << std::endl;
}
player( player const&);
player & operator=( player const&);
public:
int id;
player * nxt;
coro_t::call_type coro;
boost::random::random_device gen;
player( int id_) :
id( id_), nxt( 0),
coro( boost::bind( & player::run_, this, _1) ),
gen()
{}
void run()
{ coro(); }
};
int main( int argc, char * argv[])
{
player * first = new player( 1);
player * p = first;
for ( int i = 2; i <= 4; ++i)
{
p->nxt = new player( i);
p = p->nxt;
}
p->nxt = first;
first->run();
std::cout << "Done" << std::endl;
return EXIT_SUCCESS;
}