154da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant//===----------------------------------------------------------------------===// 254da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant// 354da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant// The LLVM Compiler Infrastructure 454da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant// 5b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// This file is dual licensed under the MIT and the University of Illinois Open 6b64f8b07c104c6cc986570ac8ee0ed16a9f23976Howard Hinnant// Source Licenses. See LICENSE.TXT for details. 754da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant// 854da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant//===----------------------------------------------------------------------===// 97112dae6acac544a0271a85d95342c583441e2d1Dan Albert// 107112dae6acac544a0271a85d95342c583441e2d1Dan Albert// UNSUPPORTED: libcpp-has-no-threads 1154da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant 1254da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant// <future> 1354da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant 1454da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant// class packaged_task<R(ArgTypes...)> 1554da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant 1654da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant// template <class F> 1754da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant// explicit packaged_task(F&& f); 1854da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant 1954da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant#include <future> 2054da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant#include <cassert> 2154da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant 2254da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnantclass A 2354da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant{ 2454da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant long data_; 2554da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant 2654da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnantpublic: 2754da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant static int n_moves; 2854da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant static int n_copies; 2954da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant 3054da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant explicit A(long i) : data_(i) {} 3154da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant A(A&& a) : data_(a.data_) {++n_moves; a.data_ = -1;} 3254da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant A(const A& a) : data_(a.data_) {++n_copies;} 3354da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant 3454da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant long operator()(long i, long j) const {return data_ + i + j;} 3554da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant}; 3654da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant 3754da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnantint A::n_moves = 0; 3854da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnantint A::n_copies = 0; 3954da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant 4090dc8dd841b975fccfa4a278b9b44065d3644839Dan Albertint func(int i) { return i; } 4190dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert 4254da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnantint main() 4354da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant{ 4454da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant { 4554da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant std::packaged_task<double(int, char)> p(A(5)); 467de47902d08e6cd08977b573b134f21b5782fc4bHoward Hinnant assert(p.valid()); 4754da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant std::future<double> f = p.get_future(); 4854da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant p(3, 'a'); 4954da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant assert(f.get() == 105.0); 5054da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant assert(A::n_copies == 0); 5154da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant assert(A::n_moves > 0); 5254da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant } 5397ecd6491374d756bd9c6da9ef84ab173f5049d6Howard Hinnant A::n_copies = 0; 5454da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant A::n_copies = 0; 5554da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant { 5654da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant A a(5); 5754da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant std::packaged_task<double(int, char)> p(a); 587de47902d08e6cd08977b573b134f21b5782fc4bHoward Hinnant assert(p.valid()); 5954da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant std::future<double> f = p.get_future(); 6054da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant p(3, 'a'); 6154da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant assert(f.get() == 105.0); 6254da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant assert(A::n_copies > 0); 6354da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant assert(A::n_moves > 0); 6454da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant } 6590dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert { 6690dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert std::packaged_task<int(int)> p(&func); 6790dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert assert(p.valid()); 6890dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert std::future<int> f = p.get_future(); 6990dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert p(4); 7090dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert assert(f.get() == 4); 7190dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert } 7290dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert { 7390dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert std::packaged_task<int(int)> p(func); 7490dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert assert(p.valid()); 7590dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert std::future<int> f = p.get_future(); 7690dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert p(4); 7790dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert assert(f.get() == 4); 7890dc8dd841b975fccfa4a278b9b44065d3644839Dan Albert } 7954da338f59b56e267dd6d1c0981e3c607c94c2b7Howard Hinnant} 80