brintos

brintos / llvm-project-archived public Read only

0
0
Text · 2.6 KiB · e6c833e Raw
122 lines · cpp
1//===----------------------------------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8//9// UNSUPPORTED: no-threads10// UNSUPPORTED: c++0311 12// <future>13 14// class packaged_task<R(ArgTypes...)>15 16// void operator()(ArgTypes... args);17 18#include <future>19#include <cassert>20 21#include "make_test_thread.h"22#include "test_macros.h"23 24class A25{26    long data_;27 28public:29    explicit A(long i) : data_(i) {}30 31    long operator()(long i, long j) const32    {33      if (j == 122)34        TEST_THROW(A(6));35      return data_ + i + j;36    }37};38 39void func0(std::packaged_task<double(int, char)> p)40{41    std::this_thread::sleep_for(std::chrono::milliseconds(500));42    p(3, 97);43}44 45void func1(std::packaged_task<double(int, char)> p)46{47    std::this_thread::sleep_for(std::chrono::milliseconds(500));48    p(3, 122);49}50 51void func2(std::packaged_task<double(int, char)> p)52{53#ifndef TEST_HAS_NO_EXCEPTIONS54  p(3, 97);55  try {56    p(3, 99);57    }58    catch (const std::future_error& e)59    {60        assert(e.code() == make_error_code(std::future_errc::promise_already_satisfied));61    }62#else63    ((void)p);64#endif65}66 67void func3(std::packaged_task<double(int, char)> p)68{69#ifndef TEST_HAS_NO_EXCEPTIONS70    try71    {72      p(3, 97);73    }74    catch (const std::future_error& e)75    {76        assert(e.code() == make_error_code(std::future_errc::no_state));77    }78#else79    ((void)p);80#endif81}82 83int main(int, char**)84{85    {86        std::packaged_task<double(int, char)> p(A(5));87        std::future<double> f = p.get_future();88        support::make_test_thread(func0, std::move(p)).detach();89        assert(f.get() == 105.0);90    }91#ifndef TEST_HAS_NO_EXCEPTIONS92    {93        std::packaged_task<double(int, char)> p(A(5));94        std::future<double> f = p.get_future();95        support::make_test_thread(func1, std::move(p)).detach();96        try97        {98            f.get();99            assert(false);100        }101        catch (const A& e)102        {103          assert(e(3, 97) == 106.0);104        }105    }106    {107        std::packaged_task<double(int, char)> p(A(5));108        std::future<double> f = p.get_future();109        std::thread t = support::make_test_thread(func2, std::move(p));110        assert(f.get() == 105.0);111        t.join();112    }113    {114        std::packaged_task<double(int, char)> p;115        std::thread t = support::make_test_thread(func3, std::move(p));116        t.join();117    }118#endif119 120  return 0;121}122