202 lines
5.1 KiB
C++
202 lines
5.1 KiB
C++
// Copyright (C) 2010 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)
|
|
|
|
#include <boost/config.hpp>
|
|
#ifndef BOOST_NO_CXX11_RVALUE_REFERENCES
|
|
|
|
#include <boost/detail/lightweight_test.hpp>
|
|
#include <boost/thread/future.hpp>
|
|
#include <boost/utility/result_of.hpp>
|
|
#include <functional>
|
|
|
|
struct async_func {
|
|
virtual ~async_func() { }
|
|
virtual void run() =0;
|
|
};
|
|
|
|
template <typename Ret>
|
|
class async_func_pt : public async_func {
|
|
boost::packaged_task<Ret> f;
|
|
public:
|
|
void run() {
|
|
std::cout << __FILE__ << ":" << __LINE__ << std::endl;
|
|
f(); }
|
|
async_func_pt (boost::packaged_task<Ret>&& f) : f(boost::move(f)) {}
|
|
~async_func_pt() { }
|
|
boost::unique_future<Ret> get_future() { return f.get_future(); }
|
|
};
|
|
|
|
void async_core (async_func* p) {
|
|
std::cout << __FILE__ << ":" << __LINE__ << std::endl;
|
|
p->run();
|
|
}
|
|
|
|
|
|
|
|
|
|
template <typename F>
|
|
boost::unique_future<typename boost::result_of< F() >::type>
|
|
async (F&& f)
|
|
{
|
|
std::cout << __FILE__ << ":" << __LINE__ << std::endl;
|
|
typedef typename boost::result_of< F() >::type RetType;
|
|
std::cout << __FILE__ << ":" << __LINE__ << std::endl;
|
|
async_func_pt<RetType>* p= new async_func_pt<RetType> (boost::packaged_task<RetType>(boost::forward<F>(f)));
|
|
std::cout << __FILE__ << ":" << __LINE__ << std::endl;
|
|
boost::unique_future<RetType> future_result= p->get_future();
|
|
std::cout << __FILE__ << ":" << __LINE__ << std::endl;
|
|
async_core (p);
|
|
std::cout << __FILE__ << ":" << __LINE__ << std::endl;
|
|
return boost::move(future_result);
|
|
}
|
|
|
|
template <typename F, typename A1>
|
|
boost::unique_future<typename boost::result_of< F(A1) >::type>
|
|
async (F&& f, A1&& a1)
|
|
{
|
|
std::cout << __FILE__ << ":" << __LINE__ << std::endl;
|
|
// This should be all it needs. But get a funny error deep inside Boost.
|
|
// problem overloading with && ?
|
|
return async (boost::bind(f,a1));
|
|
}
|
|
|
|
|
|
int calculate_the_answer_to_life_the_universe_and_everything()
|
|
{
|
|
return 42;
|
|
}
|
|
|
|
|
|
size_t foo (const std::string& s)
|
|
{
|
|
return s.size();
|
|
}
|
|
|
|
|
|
|
|
void test1()
|
|
{
|
|
// this one works
|
|
// most fundimental form:
|
|
std::cout << __FILE__ << ":" << __LINE__ << std::endl;
|
|
boost::unique_future<int> fi= async (&calculate_the_answer_to_life_the_universe_and_everything);
|
|
int i= fi.get();
|
|
BOOST_TEST (i== 42);
|
|
|
|
|
|
// This one chokes at compile time
|
|
std::cout << __FILE__ << ":" << __LINE__ << std::endl;
|
|
boost::unique_future<size_t> fut_1= async (&foo, "Life");
|
|
|
|
BOOST_TEST (fut_1.get()== 4);
|
|
}
|
|
|
|
int main()
|
|
{
|
|
test1();
|
|
return boost::report_errors();
|
|
|
|
}
|
|
|
|
#else
|
|
int main()
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
#endif
|
|
/*
|
|
*
|
|
"/Users/viboes/clang/llvmCore-3.0-rc1.install/bin/clang++"
|
|
-o "../../../bin.v2/libs/thread/test/test_ml.test/clang-darwin-3.0x/debug/threading-multi/test_ml"
|
|
"../../../bin.v2/libs/thread/test/test_ml.test/clang-darwin-3.0x/debug/threading-multi/test_ml.o"
|
|
"../../../bin.v2/libs/test/build/clang-darwin-3.0x/debug/link-static/threading-multi/libboost_unit_test_framework.a"
|
|
"../../../bin.v2/libs/thread/build/clang-darwin-3.0x/debug/threading-multi/libboost_thread.dylib"
|
|
"../../../bin.v2/libs/chrono/build/clang-darwin-3.0x/debug/threading-multi/libboost_chrono.dylib"
|
|
"../../../bin.v2/libs/system/build/clang-darwin-3.0x/debug/threading-multi/libboost_system.dylib" -g
|
|
*/
|
|
|
|
|
|
/*
|
|
*
|
|
* #include <boost/test/unit_test.hpp>
|
|
#include <boost/thread/future.hpp>
|
|
#include <boost/utility/result_of.hpp>
|
|
#include <functional>
|
|
|
|
struct async_func {
|
|
virtual ~async_func() { }
|
|
virtual void run() =0;
|
|
};
|
|
|
|
template <typename Ret>
|
|
class async_func_pt : public async_func {
|
|
boost::packaged_task<Ret> f;
|
|
public:
|
|
void run() override { f(); }
|
|
async_func_pt (boost::packaged_task<Ret>&& f) : f(std::move(f)) {}
|
|
~async_func_pt() { }
|
|
boost::unique_future<Ret> get_future() { return f.get_future(); }
|
|
};
|
|
|
|
void async_core (async_func* p);
|
|
|
|
|
|
|
|
|
|
template <typename F>
|
|
boost::unique_future<typename boost::result_of< F() >::type>
|
|
async (F&& f)
|
|
{
|
|
typedef typename boost::result_of< F() >::type RetType;
|
|
async_func_pt<RetType>* p= new async_func_pt<RetType> (boost::packaged_task<RetType>(f));
|
|
boost::unique_future<RetType> future_result= p->get_future();
|
|
async_core (p);
|
|
return std::move(future_result);
|
|
}
|
|
|
|
template <typename F, typename A1>
|
|
boost::unique_future<typename boost::result_of< F(A1) >::type>
|
|
async (F&& f, A1&& a1)
|
|
{
|
|
// This should be all it needs. But get a funny error deep inside Boost.
|
|
// problem overloading with && ?
|
|
return async (std::tr1::bind(f,a1));
|
|
}
|
|
|
|
BOOST_AUTO_TEST_SUITE(thread_pool_tests)
|
|
|
|
int calculate_the_answer_to_life_the_universe_and_everything()
|
|
{
|
|
return 42;
|
|
}
|
|
|
|
|
|
size_t foo (const std::string& s)
|
|
{
|
|
return s.size();
|
|
}
|
|
|
|
|
|
|
|
BOOST_AUTO_TEST_CASE( async_test )
|
|
{
|
|
// this one works
|
|
// most fundimental form:
|
|
boost::unique_future<int> fi= async (&calculate_the_answer_to_life_the_universe_and_everything);
|
|
int i= fi.get();
|
|
BOOST_CHECK_EQUAL (i, 42);
|
|
|
|
|
|
// This one chokes at compile time
|
|
boost::unique_future<size_t> fut_1= async (&foo, "Life");
|
|
|
|
BOOST_CHECK_EQUAL (fut_1.get(), 4);
|
|
}
|
|
|
|
|
|
BOOST_AUTO_TEST_SUITE_END()
|
|
*/
|