// SPDX-FileCopyrightText: Copyright (c) 2008-2013, NVIDIA Corporation. All rights reserved. // SPDX-License-Identifier: Apache-2.0 /*! \file tabulate.h * \brief Fills a range with the tabulation of a function */ #pragma once #include #if defined(_CCCL_IMPLICIT_SYSTEM_HEADER_GCC) # pragma GCC system_header #elif defined(_CCCL_IMPLICIT_SYSTEM_HEADER_CLANG) # pragma clang system_header #elif defined(_CCCL_IMPLICIT_SYSTEM_HEADER_MSVC) # pragma system_header #endif // no system header #include THRUST_NAMESPACE_BEGIN /*! \addtogroup transformations * \{ */ /*! \p tabulate fills the range [first, last) with the value of a function applied to each * element's index. * * For each iterator \c i in the range [first, last), \p tabulate performs the assignment * *i = unary_op(i - first). * * The algorithm's execution is parallelized as determined by \p exec. * * \param exec The execution policy to use for parallelization. * \param first The beginning of the range. * \param last The end of the range. * \param unary_op The unary operation to apply. * * \tparam DerivedPolicy The name of the derived execution policy. * \tparam ForwardIterator is a model of Forward * Iterator, and \p ForwardIterator is mutable, and if \c x and \c y are objects of \c ForwardIterator's \c * value_type, then x + y is defined, and if \c T is \p ForwardIterator's \c value_type, then T(0) is * defined. * \tparam UnaryOperation The function's return type must be convertible to \c OutputIterator's \c value_type. * * The following code snippet demonstrates how to use \p tabulate to generate the first \c n non-positive integers * using the \p thrust::host execution policy for parallelization: * * \code * #include * #include * #include * ... * const int N = 10; * int A[N]; * thrust::tabulate(thrust::host, A, A + 10, ::cuda::std::negate()); * // A is now {0, -1, -2, -3, -4, -5, -6, -7, -8, -9} * \endcode * * \see thrust::fill * \see thrust::generate * \see thrust::sequence * * \verbatim embed:rst:leading-asterisk * .. versionadded:: 2.2.0 * \endverbatim */ template _CCCL_HOST_DEVICE void tabulate(const thrust::detail::execution_policy_base& exec, ForwardIterator first, ForwardIterator last, UnaryOperation unary_op); /*! \p tabulate fills the range [first, last) with the value of a function applied to each * element's index. * * For each iterator \c i in the range [first, last), \p tabulate performs the assignment * *i = unary_op(i - first). * * \param first The beginning of the range. * \param last The end of the range. * \param unary_op The unary operation to apply. * * \tparam ForwardIterator is a model of Forward * Iterator, and \p ForwardIterator is mutable, and if \c x and \c y are objects of \c ForwardIterator's \c * value_type, then x + y is defined, and if \c T is \p ForwardIterator's \c value_type, then T(0) is * defined. * \tparam UnaryOperation The function's return type must be convertible to \c OutputIterator's \c value_type. * * The following code snippet demonstrates how to use \p tabulate to generate the first \c n non-positive integers: * * \code * #include * #include * ... * const int N = 10; * int A[N]; * thrust::tabulate(A, A + 10, ::cuda::std::negate()); * // A is now {0, -1, -2, -3, -4, -5, -6, -7, -8, -9} * \endcode * * \see thrust::fill * \see thrust::generate * \see thrust::sequence * * \verbatim embed:rst:leading-asterisk * .. versionadded:: 2.2.0 * \endverbatim */ template void tabulate(ForwardIterator first, ForwardIterator last, UnaryOperation unary_op); /*! \} // end transformations */ THRUST_NAMESPACE_END #include