123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201 |
- // 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()
- */
|