// Copyright (C) 2014 Vicente Botet
//
//  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)

#define BOOST_THREAD_VERSION 4

// BoostFutureTest.cpp : Defines the entry point for the console application.
//

#include <iostream>

// boost version 1.60.0
// has the following set.
#define BOOST_THREAD_VERSION 4
// #define BOOST_THREAD_PROVIDES_EXECUTORS

#include <boost/thread/future.hpp>


int main()
{
#if __cplusplus >= 201103L

    int value = 0;
    int tmpValue = 0;
    boost::promise<void> promise1;
    boost::promise<void> promise2;

    auto future1 = promise1.get_future();

    auto waitFuture = future1.then([&tmpValue, &promise2](boost::future<void> future){
        assert(future.is_ready());  // this works correctly and is ready.

        auto fut = boost::async(boost::launch::async, [&promise2, &tmpValue](){
          boost::this_thread::sleep_for(boost::chrono::seconds(1));
            tmpValue = 1;
            promise2.set_value();
            std::cout << "Step 2 "<< std::endl; // should print 1 but prints 0
        });
        std::cout << "Step 1 "<< std::endl; // should print 1 but prints 0

        return promise2.get_future();
        //return ;
    }).then([&value, &tmpValue](boost::future<boost::future<void>> future){
    //}).then([&value, &tmpValue](boost::future<void> future){
      // error: no matching function for call to ‘boost::future<boost::future<void> >::then(main()::<lambda(boost::future<void>)>)’
      // as expected

        assert(future.is_ready());  // this doesn't work correctly and is not ready.


        value = tmpValue;
    });


    promise1.set_value();
    waitFuture.wait();

    std::cout << "value = " << value << std::endl; // should print 1 but prints 0
#endif
    return 0;
}

