149 lines
4.5 KiB
C++
149 lines
4.5 KiB
C++
/*
|
|
* Copyright (c) Facebook, Inc. and its 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 <iterator>
|
|
#include <memory>
|
|
#include <type_traits>
|
|
#include <utility>
|
|
#include <vector>
|
|
|
|
#include <folly/functional/Invoke.h>
|
|
|
|
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 <class InputIterator>
|
|
typename std::enable_if<
|
|
!std::is_same<
|
|
invoke_result_t<
|
|
typename std::iterator_traits<InputIterator>::value_type>,
|
|
void>::value,
|
|
std::vector<std::pair<
|
|
size_t,
|
|
invoke_result_t<
|
|
typename std::iterator_traits<InputIterator>::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 <class InputIterator>
|
|
typename std::enable_if<
|
|
std::is_same<
|
|
invoke_result_t<
|
|
typename std::iterator_traits<InputIterator>::value_type>,
|
|
void>::value,
|
|
std::vector<size_t>>::
|
|
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 <class InputIterator>
|
|
typename std::vector<
|
|
typename std::enable_if<
|
|
!std::is_same<
|
|
invoke_result_t<
|
|
typename std::iterator_traits<InputIterator>::value_type>,
|
|
void>::value,
|
|
invoke_result_t<
|
|
typename std::iterator_traits<InputIterator>::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 <class InputIterator>
|
|
typename std::enable_if<
|
|
std::is_same<
|
|
invoke_result_t<
|
|
typename std::iterator_traits<InputIterator>::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 <class InputIterator>
|
|
typename std::enable_if<
|
|
!std::is_same<
|
|
invoke_result_t<
|
|
typename std::iterator_traits<InputIterator>::value_type>,
|
|
void>::value,
|
|
typename std::pair<
|
|
size_t,
|
|
invoke_result_t<
|
|
typename std::iterator_traits<InputIterator>::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 <class InputIterator>
|
|
typename std::enable_if<
|
|
std::is_same<
|
|
invoke_result_t<
|
|
typename std::iterator_traits<InputIterator>::value_type>,
|
|
void>::value,
|
|
size_t>::type inline collectAny(InputIterator first, InputIterator last);
|
|
} // namespace fibers
|
|
} // namespace folly
|
|
|
|
#include <folly/fibers/WhenN-inl.h>
|