1eb5cfb02SEric Fiselier //===----------------------------------------------------------------------===// 2eb5cfb02SEric Fiselier // 357b08b09SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 457b08b09SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 557b08b09SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6eb5cfb02SEric Fiselier // 7eb5cfb02SEric Fiselier //===----------------------------------------------------------------------===// 8eb5cfb02SEric Fiselier // 9*a7f9895cSLouis Dionne // UNSUPPORTED: no-threads 1031cbe0f2SLouis Dionne // UNSUPPORTED: c++03 11eb5cfb02SEric Fiselier 12eb5cfb02SEric Fiselier // <future> 13eb5cfb02SEric Fiselier 14eb5cfb02SEric Fiselier // class packaged_task<R(ArgTypes...)> 15eb5cfb02SEric Fiselier 16eb5cfb02SEric Fiselier // template <class F> 17eb5cfb02SEric Fiselier // explicit packaged_task(F&& f); 18eb5cfb02SEric Fiselier 19eb5cfb02SEric Fiselier #include <future> 20eb5cfb02SEric Fiselier #include <cassert> 21eb5cfb02SEric Fiselier 227fc6a556SMarshall Clow #include "test_macros.h" 237fc6a556SMarshall Clow 24eb5cfb02SEric Fiselier class A 25eb5cfb02SEric Fiselier { 26eb5cfb02SEric Fiselier long data_; 27eb5cfb02SEric Fiselier 28eb5cfb02SEric Fiselier public: 29eb5cfb02SEric Fiselier static int n_moves; 30eb5cfb02SEric Fiselier static int n_copies; 31eb5cfb02SEric Fiselier A(long i)32eb5cfb02SEric Fiselier explicit A(long i) : data_(i) {} A(A && a)33eb5cfb02SEric Fiselier A(A&& a) : data_(a.data_) {++n_moves; a.data_ = -1;} A(const A & a)34eb5cfb02SEric Fiselier A(const A& a) : data_(a.data_) {++n_copies;} 35eb5cfb02SEric Fiselier operator ()(long i,long j) const36eb5cfb02SEric Fiselier long operator()(long i, long j) const {return data_ + i + j;} 37eb5cfb02SEric Fiselier }; 38eb5cfb02SEric Fiselier 39eb5cfb02SEric Fiselier int A::n_moves = 0; 40eb5cfb02SEric Fiselier int A::n_copies = 0; 41eb5cfb02SEric Fiselier func(int i)42eb5cfb02SEric Fiselierint func(int i) { return i; } 43eb5cfb02SEric Fiselier main(int,char **)442df59c50SJF Bastienint main(int, char**) 45eb5cfb02SEric Fiselier { 46eb5cfb02SEric Fiselier { 47eb5cfb02SEric Fiselier std::packaged_task<double(int, char)> p(A(5)); 48eb5cfb02SEric Fiselier assert(p.valid()); 49eb5cfb02SEric Fiselier std::future<double> f = p.get_future(); 503f05377dSMuiez Ahmed p(3, 97); 51eb5cfb02SEric Fiselier assert(f.get() == 105.0); 52eb5cfb02SEric Fiselier assert(A::n_copies == 0); 53eb5cfb02SEric Fiselier assert(A::n_moves > 0); 54eb5cfb02SEric Fiselier } 55eb5cfb02SEric Fiselier A::n_copies = 0; 56eb5cfb02SEric Fiselier A::n_copies = 0; 57eb5cfb02SEric Fiselier { 58eb5cfb02SEric Fiselier A a(5); 59eb5cfb02SEric Fiselier std::packaged_task<double(int, char)> p(a); 60eb5cfb02SEric Fiselier assert(p.valid()); 61eb5cfb02SEric Fiselier std::future<double> f = p.get_future(); 623f05377dSMuiez Ahmed p(3, 97); 63eb5cfb02SEric Fiselier assert(f.get() == 105.0); 64eb5cfb02SEric Fiselier assert(A::n_copies > 0); 65eb5cfb02SEric Fiselier assert(A::n_moves > 0); 66eb5cfb02SEric Fiselier } 67eb5cfb02SEric Fiselier { 68eb5cfb02SEric Fiselier std::packaged_task<int(int)> p(&func); 69eb5cfb02SEric Fiselier assert(p.valid()); 70eb5cfb02SEric Fiselier std::future<int> f = p.get_future(); 71eb5cfb02SEric Fiselier p(4); 72eb5cfb02SEric Fiselier assert(f.get() == 4); 73eb5cfb02SEric Fiselier } 74eb5cfb02SEric Fiselier { 75eb5cfb02SEric Fiselier std::packaged_task<int(int)> p(func); 76eb5cfb02SEric Fiselier assert(p.valid()); 77eb5cfb02SEric Fiselier std::future<int> f = p.get_future(); 78eb5cfb02SEric Fiselier p(4); 79eb5cfb02SEric Fiselier assert(f.get() == 4); 80eb5cfb02SEric Fiselier } 812df59c50SJF Bastien 822df59c50SJF Bastien return 0; 83eb5cfb02SEric Fiselier } 84