/* * Copyright (c) Meta Platforms, Inc. and affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #pragma once #include #include #include #include #include #include namespace folly { namespace fibers { /** * Schedules several tasks and blocks until n of these tasks are completed. * If any of these n tasks throws an exception, this exception will be * re-thrown, but only when n tasks are complete. If several tasks throw * exceptions one of them will be re-thrown. * * @param first Range of tasks to be scheduled * @param last * @param n Number of tasks to wait for * * @return vector of pairs (task index, return value of task) */ template typename std::enable_if< !std::is_same< invoke_result_t< typename std::iterator_traits::value_type>, void>::value, std::vector::value_type>>>>:: type inline collectN(InputIterator first, InputIterator last, size_t n); /** * collectN specialization for functions returning void * * @param first Range of tasks to be scheduled * @param last * @param n Number of tasks to wait for * * @return vector of completed task indices */ template typename std::enable_if< std::is_same< invoke_result_t< typename std::iterator_traits::value_type>, void>::value, std::vector>:: type inline collectN(InputIterator first, InputIterator last, size_t n); /** * Schedules several tasks and blocks until all of these tasks are completed. * If any of the tasks throws an exception, this exception will be re-thrown, * but only when all the tasks are complete. If several tasks throw exceptions * one of them will be re-thrown. * * @param first Range of tasks to be scheduled * @param last * * @return vector of values returned by tasks */ template typename std::vector< typename std::enable_if< !std::is_same< invoke_result_t< typename std::iterator_traits::value_type>, void>::value, invoke_result_t< typename std::iterator_traits::value_type>>:: type> inline collectAll(InputIterator first, InputIterator last); /** * collectAll specialization for functions returning void * * @param first Range of tasks to be scheduled * @param last */ template typename std::enable_if< std::is_same< invoke_result_t< typename std::iterator_traits::value_type>, void>::value, void>::type inline collectAll(InputIterator first, InputIterator last); /** * Schedules several tasks and blocks until one of them is completed. * If this task throws an exception, this exception will be re-thrown. * Exceptions thrown by all other tasks will be ignored. * * @param first Range of tasks to be scheduled * @param last * * @return pair of index of the first completed task and its return value */ template typename std::enable_if< !std::is_same< invoke_result_t< typename std::iterator_traits::value_type>, void>::value, typename std::pair< size_t, invoke_result_t< typename std::iterator_traits::value_type>>>:: type inline collectAny(InputIterator first, InputIterator last); /** * WhenAny specialization for functions returning void. * * @param first Range of tasks to be scheduled * @param last * * @return index of the first completed task */ template typename std::enable_if< std::is_same< invoke_result_t< typename std::iterator_traits::value_type>, void>::value, size_t>::type inline collectAny(InputIterator first, InputIterator last); } // namespace fibers } // namespace folly #include