/* * Copyright 2008-2012 NVIDIA Corporation * * 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. */ /*! \file partition.h * \brief Reorganizes a range based on a predicate */ #pragma once #include #include #include namespace thrust { /*! \addtogroup reordering * \ingroup algorithms * * \addtogroup partitioning * \ingroup reordering * \{ */ /*! \p partition reorders the elements [first, last) based on the function * object \p pred, such that all of the elements that satisfy \p pred precede the * elements that fail to satisfy it. The postcondition is that, for some iterator * \c middle in the range [first, last), pred(*i) is \c true for every * iterator \c i in the range [first,middle) and \c false for every iterator * \c i in the range [middle, last). The return value of \p partition is * \c middle. * * Note that the relative order of elements in the two reordered sequences is not * necessarily the same as it was in the original sequence. A different algorithm, * \ref stable_partition, does guarantee to preserve the relative order. * * 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 sequence to reorder. * \param last The end of the sequence to reorder. * \param pred A function object which decides to which partition each element of the * sequence [first, last) belongs. * \return An iterator referring to the first element of the second partition, that is, * the sequence of the elements which do not satisfy \p pred. * * \tparam DerivedPolicy The name of the derived execution policy. * \tparam ForwardIterator is a model of Forward Iterator, * and \p ForwardIterator's \c value_type is convertible to \p Predicate's \c argument_type, * and \p ForwardIterator is mutable. * \tparam Predicate is a model of Predicate. * * The following code snippet demonstrates how to use \p partition to reorder a * sequence so that even numbers precede odd numbers using the \p thrust::host execution policy for parallelization: * * \code * #include * #include * ... * struct is_even * { * __host__ __device__ * bool operator()(const int &x) * { * return (x % 2) == 0; * } * }; * ... * int A[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; * const int N = sizeof(A)/sizeof(int); * thrust::partition(thrust::host, * A, A + N, * is_even()); * // A is now {2, 4, 6, 8, 10, 1, 3, 5, 7, 9} * \endcode * * \see http://www.sgi.com/tech/stl/partition.html * \see \p stable_partition * \see \p partition_copy */ template ForwardIterator partition(const thrust::detail::execution_policy_base &exec, ForwardIterator first, ForwardIterator last, Predicate pred); /*! \p partition reorders the elements [first, last) based on the function * object \p pred, such that all of the elements that satisfy \p pred precede the * elements that fail to satisfy it. The postcondition is that, for some iterator * \c middle in the range [first, last), pred(*i) is \c true for every * iterator \c i in the range [first,middle) and \c false for every iterator * \c i in the range [middle, last). The return value of \p partition is * \c middle. * * Note that the relative order of elements in the two reordered sequences is not * necessarily the same as it was in the original sequence. A different algorithm, * \ref stable_partition, does guarantee to preserve the relative order. * * \param first The beginning of the sequence to reorder. * \param last The end of the sequence to reorder. * \param pred A function object which decides to which partition each element of the * sequence [first, last) belongs. * \return An iterator referring to the first element of the second partition, that is, * the sequence of the elements which do not satisfy \p pred. * * \tparam ForwardIterator is a model of Forward Iterator, * and \p ForwardIterator's \c value_type is convertible to \p Predicate's \c argument_type, * and \p ForwardIterator is mutable. * \tparam Predicate is a model of Predicate. * * The following code snippet demonstrates how to use \p partition to reorder a * sequence so that even numbers precede odd numbers. * * \code * #include * ... * struct is_even * { * __host__ __device__ * bool operator()(const int &x) * { * return (x % 2) == 0; * } * }; * ... * int A[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; * const int N = sizeof(A)/sizeof(int); * thrust::partition(A, A + N, * is_even()); * // A is now {2, 4, 6, 8, 10, 1, 3, 5, 7, 9} * \endcode * * \see http://www.sgi.com/tech/stl/partition.html * \see \p stable_partition * \see \p partition_copy */ template ForwardIterator partition(ForwardIterator first, ForwardIterator last, Predicate pred); /*! \p partition reorders the elements [first, last) based on the function * object \p pred applied to a stencil range [stencil, stencil + (last - first)), * such that all of the elements whose corresponding stencil element satisfies \p pred precede all of the elements whose * corresponding stencil element fails to satisfy it. The postcondition is that, for some iterator * \c middle in the range [first, last), pred(*stencil_i) is \c true for every iterator * \c stencil_i in the range [stencil,stencil + (middle - first)) and \c false for every iterator \c stencil_i * in the range [stencil + (middle - first), stencil + (last - first)). * The return value of \p stable_partition is \c middle. * * Note that the relative order of elements in the two reordered sequences is not * necessarily the same as it was in the original sequence. A different algorithm, * \ref stable_partition, does guarantee to preserve the relative order. * * 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 sequence to reorder. * \param last The end of the sequence to reorder. * \param stencil The beginning of the stencil sequence. * \param pred A function object which decides to which partition each element of the * sequence [first, last) belongs. * \return An iterator referring to the first element of the second partition, that is, * the sequence of the elements whose stencil elements do not satisfy \p pred. * * \tparam DerivedPolicy The name of the derived execution policy. * \tparam ForwardIterator is a model of Forward Iterator, * and \p ForwardIterator is mutable. * \tparam InputIterator is a model of Input Iterator, * and \p InputIterator's \c value_type is convertible to \p Predicate's \c argument_type. * \tparam Predicate is a model of Predicate. * * \pre The ranges [first,last) and [stencil, stencil + (last - first)) shall not overlap. * * The following code snippet demonstrates how to use \p partition to reorder a * sequence so that even numbers precede odd numbers using the \p thrust::host execution policy for parallelization: * * \code * #include * #include * ... * struct is_even * { * __host__ __device__ * bool operator()(const int &x) * { * return (x % 2) == 0; * } * }; * ... * int A[] = {0, 1, 0, 1, 0, 1, 0, 1, 0, 1}; * int S[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; * const int N = sizeof(A)/sizeof(int); * thrust::partition(thrust::host, A, A + N, S, is_even()); * // A is now {1, 1, 1, 1, 1, 0, 0, 0, 0, 0} * // S is unmodified * \endcode * * \see http://www.sgi.com/tech/stl/partition.html * \see \p stable_partition * \see \p partition_copy */ template ForwardIterator partition(const thrust::detail::execution_policy_base &exec, ForwardIterator first, ForwardIterator last, InputIterator stencil, Predicate pred); /*! \p partition reorders the elements [first, last) based on the function * object \p pred applied to a stencil range [stencil, stencil + (last - first)), * such that all of the elements whose corresponding stencil element satisfies \p pred precede all of the elements whose * corresponding stencil element fails to satisfy it. The postcondition is that, for some iterator * \c middle in the range [first, last), pred(*stencil_i) is \c true for every iterator * \c stencil_i in the range [stencil,stencil + (middle - first)) and \c false for every iterator \c stencil_i * in the range [stencil + (middle - first), stencil + (last - first)). * The return value of \p stable_partition is \c middle. * * Note that the relative order of elements in the two reordered sequences is not * necessarily the same as it was in the original sequence. A different algorithm, * \ref stable_partition, does guarantee to preserve the relative order. * * \param first The beginning of the sequence to reorder. * \param last The end of the sequence to reorder. * \param stencil The beginning of the stencil sequence. * \param pred A function object which decides to which partition each element of the * sequence [first, last) belongs. * \return An iterator referring to the first element of the second partition, that is, * the sequence of the elements whose stencil elements do not satisfy \p pred. * * \tparam ForwardIterator is a model of Forward Iterator, * and \p ForwardIterator is mutable. * \tparam InputIterator is a model of Input Iterator, * and \p InputIterator's \c value_type is convertible to \p Predicate's \c argument_type. * \tparam Predicate is a model of Predicate. * * \pre The ranges [first,last) and [stencil, stencil + (last - first)) shall not overlap. * * The following code snippet demonstrates how to use \p partition to reorder a * sequence so that even numbers precede odd numbers. * * \code * #include * ... * struct is_even * { * __host__ __device__ * bool operator()(const int &x) * { * return (x % 2) == 0; * } * }; * ... * int A[] = {0, 1, 0, 1, 0, 1, 0, 1, 0, 1}; * int S[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; * const int N = sizeof(A)/sizeof(int); * thrust::partition(A, A + N, S, is_even()); * // A is now {1, 1, 1, 1, 1, 0, 0, 0, 0, 0} * // S is unmodified * \endcode * * \see http://www.sgi.com/tech/stl/partition.html * \see \p stable_partition * \see \p partition_copy */ template ForwardIterator partition(ForwardIterator first, ForwardIterator last, InputIterator stencil, Predicate pred); /*! \p partition_copy differs from \ref partition only in that the reordered * sequence is written to difference output sequences, rather than in place. * * \p partition_copy copies the elements [first, last) based on the * function object \p pred. All of the elements that satisfy \p pred are copied * to the range beginning at \p out_true and all the elements that fail to satisfy it * are copied to the range beginning at \p out_false. * * 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 sequence to reorder. * \param last The end of the sequence to reorder. * \param out_true The destination of the resulting sequence of elements which satisfy \p pred. * \param out_false The destination of the resulting sequence of elements which fail to satisfy \p pred. * \param pred A function object which decides to which partition each element of the * sequence [first, last) belongs. * \return A \p pair p such that p.first is the end of the output range beginning * at \p out_true and p.second is the end of the output range beginning at * \p out_false. * * \tparam DerivedPolicy The name of the derived execution policy. * \tparam InputIterator is a model of Input Iterator, * and \p InputIterator's \c value_type is convertible to \p Predicate's \c argument_type and \p InputIterator's \c value_type * is convertible to \p OutputIterator1 and \p OutputIterator2's \c value_types. * \tparam OutputIterator1 is a model of Output Iterator. * \tparam OutputIterator2 is a model of Output Iterator. * \tparam Predicate is a model of Predicate. * * \pre The input range shall not overlap with either output range. * * The following code snippet demonstrates how to use \p partition_copy to separate a * sequence into two output sequences of even and odd numbers using the \p thrust::host execution policy for parallelization: * * \code * #include * #include * ... * struct is_even * { * __host__ __device__ * bool operator()(const int &x) * { * return (x % 2) == 0; * } * }; * ... * int A[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; * int result[10]; * const int N = sizeof(A)/sizeof(int); * int *evens = result; * int *odds = result + 5; * thrust::partition_copy(thrust::host, A, A + N, evens, odds, is_even()); * // A remains {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} * // result is now {2, 4, 6, 8, 10, 1, 3, 5, 7, 9} * // evens points to {2, 4, 6, 8, 10} * // odds points to {1, 3, 5, 7, 9} * \endcode * * \note The relative order of elements in the two reordered sequences is not * necessarily the same as it was in the original sequence. A different algorithm, * \ref stable_partition_copy, does guarantee to preserve the relative order. * * \see http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2569.pdf * \see \p stable_partition_copy * \see \p partition */ template thrust::pair partition_copy(const thrust::detail::execution_policy_base &exec, InputIterator first, InputIterator last, OutputIterator1 out_true, OutputIterator2 out_false, Predicate pred); /*! \p partition_copy differs from \ref partition only in that the reordered * sequence is written to difference output sequences, rather than in place. * * \p partition_copy copies the elements [first, last) based on the * function object \p pred. All of the elements that satisfy \p pred are copied * to the range beginning at \p out_true and all the elements that fail to satisfy it * are copied to the range beginning at \p out_false. * * \param first The beginning of the sequence to reorder. * \param last The end of the sequence to reorder. * \param out_true The destination of the resulting sequence of elements which satisfy \p pred. * \param out_false The destination of the resulting sequence of elements which fail to satisfy \p pred. * \param pred A function object which decides to which partition each element of the * sequence [first, last) belongs. * \return A \p pair p such that p.first is the end of the output range beginning * at \p out_true and p.second is the end of the output range beginning at * \p out_false. * * \tparam InputIterator is a model of Input Iterator, * and \p InputIterator's \c value_type is convertible to \p Predicate's \c argument_type and \p InputIterator's \c value_type * is convertible to \p OutputIterator1 and \p OutputIterator2's \c value_types. * \tparam OutputIterator1 is a model of Output Iterator. * \tparam OutputIterator2 is a model of Output Iterator. * \tparam Predicate is a model of Predicate. * * \pre The input range shall not overlap with either output range. * * The following code snippet demonstrates how to use \p partition_copy to separate a * sequence into two output sequences of even and odd numbers. * * \code * #include * ... * struct is_even * { * __host__ __device__ * bool operator()(const int &x) * { * return (x % 2) == 0; * } * }; * ... * int A[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; * int result[10]; * const int N = sizeof(A)/sizeof(int); * int *evens = result; * int *odds = result + 5; * thrust::partition_copy(A, A + N, evens, odds, is_even()); * // A remains {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} * // result is now {2, 4, 6, 8, 10, 1, 3, 5, 7, 9} * // evens points to {2, 4, 6, 8, 10} * // odds points to {1, 3, 5, 7, 9} * \endcode * * \note The relative order of elements in the two reordered sequences is not * necessarily the same as it was in the original sequence. A different algorithm, * \ref stable_partition_copy, does guarantee to preserve the relative order. * * \see http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2569.pdf * \see \p stable_partition_copy * \see \p partition */ template thrust::pair partition_copy(InputIterator first, InputIterator last, OutputIterator1 out_true, OutputIterator2 out_false, Predicate pred); /*! \p partition_copy differs from \ref partition only in that the reordered * sequence is written to difference output sequences, rather than in place. * * \p partition_copy copies the elements [first, last) based on the * function object \p pred which is applied to a range of stencil elements. All of the elements * whose corresponding stencil element satisfies \p pred are copied to the range beginning at \p out_true * and all the elements whose stencil element fails to satisfy it are copied to the range beginning * at \p out_false. * * 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 sequence to reorder. * \param last The end of the sequence to reorder. * \param stencil The beginning of the stencil sequence. * \param out_true The destination of the resulting sequence of elements which satisfy \p pred. * \param out_false The destination of the resulting sequence of elements which fail to satisfy \p pred. * \param pred A function object which decides to which partition each element of the * sequence [first, last) belongs. * \return A \p pair p such that p.first is the end of the output range beginning * at \p out_true and p.second is the end of the output range beginning at * \p out_false. * * \tparam DerivedPolicy The name of the derived execution policy. * \tparam InputIterator1 is a model of Input Iterator, * and \p InputIterator's \c value_type is convertible to \p OutputIterator1 and \p OutputIterator2's \c value_types. * \tparam InputIterator2 is a model of Input Iterator, * and \p InputIterator2's \c value_type is convertible to \p Predicate's \c argument_type. * \tparam OutputIterator1 is a model of Output Iterator. * \tparam OutputIterator2 is a model of Output Iterator. * \tparam Predicate is a model of Predicate. * * \pre The input ranges shall not overlap with either output range. * * The following code snippet demonstrates how to use \p partition_copy to separate a * sequence into two output sequences of even and odd numbers using the \p thrust::host execution * policy for parallelization. * * \code * #include * #include * #include * ... * int A[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; * int S[] = {0, 1, 0, 1, 0, 1, 0, 1, 0, 1}; * int result[10]; * const int N = sizeof(A)/sizeof(int); * int *evens = result; * int *odds = result + 5; * thrust::stable_partition_copy(thrust::host, A, A + N, S, evens, odds, thrust::identity()); * // A remains {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} * // S remains {0, 1, 0, 1, 0, 1, 0, 1, 0, 1} * // result is now {2, 4, 6, 8, 10, 1, 3, 5, 7, 9} * // evens points to {2, 4, 6, 8, 10} * // odds points to {1, 3, 5, 7, 9} * \endcode * * \note The relative order of elements in the two reordered sequences is not * necessarily the same as it was in the original sequence. A different algorithm, * \ref stable_partition_copy, does guarantee to preserve the relative order. * * \see http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2569.pdf * \see \p stable_partition_copy * \see \p partition */ template thrust::pair partition_copy(const thrust::detail::execution_policy_base &exec, InputIterator1 first, InputIterator1 last, InputIterator2 stencil, OutputIterator1 out_true, OutputIterator2 out_false, Predicate pred); /*! \p partition_copy differs from \ref partition only in that the reordered * sequence is written to difference output sequences, rather than in place. * * \p partition_copy copies the elements [first, last) based on the * function object \p pred which is applied to a range of stencil elements. All of the elements * whose corresponding stencil element satisfies \p pred are copied to the range beginning at \p out_true * and all the elements whose stencil element fails to satisfy it are copied to the range beginning * at \p out_false. * * \param first The beginning of the sequence to reorder. * \param last The end of the sequence to reorder. * \param stencil The beginning of the stencil sequence. * \param out_true The destination of the resulting sequence of elements which satisfy \p pred. * \param out_false The destination of the resulting sequence of elements which fail to satisfy \p pred. * \param pred A function object which decides to which partition each element of the * sequence [first, last) belongs. * \return A \p pair p such that p.first is the end of the output range beginning * at \p out_true and p.second is the end of the output range beginning at * \p out_false. * * \tparam InputIterator1 is a model of Input Iterator, * and \p InputIterator's \c value_type is convertible to \p OutputIterator1 and \p OutputIterator2's \c value_types. * \tparam InputIterator2 is a model of Input Iterator, * and \p InputIterator2's \c value_type is convertible to \p Predicate's \c argument_type. * \tparam OutputIterator1 is a model of Output Iterator. * \tparam OutputIterator2 is a model of Output Iterator. * \tparam Predicate is a model of Predicate. * * \pre The input ranges shall not overlap with either output range. * * The following code snippet demonstrates how to use \p partition_copy to separate a * sequence into two output sequences of even and odd numbers. * * \code * #include * #include * ... * int A[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; * int S[] = {0, 1, 0, 1, 0, 1, 0, 1, 0, 1}; * int result[10]; * const int N = sizeof(A)/sizeof(int); * int *evens = result; * int *odds = result + 5; * thrust::stable_partition_copy(A, A + N, S, evens, odds, thrust::identity()); * // A remains {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} * // S remains {0, 1, 0, 1, 0, 1, 0, 1, 0, 1} * // result is now {2, 4, 6, 8, 10, 1, 3, 5, 7, 9} * // evens points to {2, 4, 6, 8, 10} * // odds points to {1, 3, 5, 7, 9} * \endcode * * \note The relative order of elements in the two reordered sequences is not * necessarily the same as it was in the original sequence. A different algorithm, * \ref stable_partition_copy, does guarantee to preserve the relative order. * * \see http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2569.pdf * \see \p stable_partition_copy * \see \p partition */ template thrust::pair partition_copy(InputIterator1 first, InputIterator1 last, InputIterator2 stencil, OutputIterator1 out_true, OutputIterator2 out_false, Predicate pred); /*! \p stable_partition is much like \ref partition : it reorders the elements in the * range [first, last) based on the function object \p pred, such that all of * the elements that satisfy \p pred precede all of the elements that fail to satisfy * it. The postcondition is that, for some iterator \p middle in the range * [first, last), pred(*i) is \c true for every iterator \c i in the * range [first,middle) and \c false for every iterator \c i in the range * [middle, last). The return value of \p stable_partition is \c middle. * * \p stable_partition differs from \ref partition in that \p stable_partition is * guaranteed to preserve relative order. That is, if \c x and \c y are elements in * [first, last), and \c stencil_x and \c stencil_y are the stencil elements * in corresponding positions within [stencil, stencil + (last - first)), * and pred(stencil_x) == pred(stencil_y), and if \c x precedes * \c y, then it will still be true after \p stable_partition that \c x precedes \c y. * * The algorithm's execution is parallelized as determined by \p exec. * * \param exec The execution policy to use for parallelization. * \param first The first element of the sequence to reorder. * \param last One position past the last element of the sequence to reorder. * \param pred A function object which decides to which partition each element of the * sequence [first, last) belongs. * \return An iterator referring to the first element of the second partition, that is, * the sequence of the elements which do not satisfy pred. * * \tparam DerivedPolicy The name of the derived execution policy. * \tparam ForwardIterator is a model of Forward Iterator, * and \p ForwardIterator's \c value_type is convertible to \p Predicate's \c argument_type, * and \p ForwardIterator is mutable. * \tparam Predicate is a model of Predicate. * * The following code snippet demonstrates how to use \p stable_partition to reorder a * sequence so that even numbers precede odd numbers using the \p thrust::host execution policy for parallelization: * * \code * #include * #include * ... * struct is_even * { * __host__ __device__ * bool operator()(const int &x) * { * return (x % 2) == 0; * } * }; * ... * int A[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; * const int N = sizeof(A)/sizeof(int); * thrust::stable_partition(thrust::host, * A, A + N, * is_even()); * // A is now {2, 4, 6, 8, 10, 1, 3, 5, 7, 9} * \endcode * * \see http://www.sgi.com/tech/stl/stable_partition.html * \see \p partition * \see \p stable_partition_copy */ template ForwardIterator stable_partition(const thrust::detail::execution_policy_base &exec, ForwardIterator first, ForwardIterator last, Predicate pred); /*! \p stable_partition is much like \ref partition : it reorders the elements in the * range [first, last) based on the function object \p pred, such that all of * the elements that satisfy \p pred precede all of the elements that fail to satisfy * it. The postcondition is that, for some iterator \p middle in the range * [first, last), pred(*i) is \c true for every iterator \c i in the * range [first,middle) and \c false for every iterator \c i in the range * [middle, last). The return value of \p stable_partition is \c middle. * * \p stable_partition differs from \ref partition in that \p stable_partition is * guaranteed to preserve relative order. That is, if \c x and \c y are elements in * [first, last), and \c stencil_x and \c stencil_y are the stencil elements * in corresponding positions within [stencil, stencil + (last - first)), * and pred(stencil_x) == pred(stencil_y), and if \c x precedes * \c y, then it will still be true after \p stable_partition that \c x precedes \c y. * * \param first The first element of the sequence to reorder. * \param last One position past the last element of the sequence to reorder. * \param pred A function object which decides to which partition each element of the * sequence [first, last) belongs. * \return An iterator referring to the first element of the second partition, that is, * the sequence of the elements which do not satisfy pred. * * \tparam ForwardIterator is a model of Forward Iterator, * and \p ForwardIterator's \c value_type is convertible to \p Predicate's \c argument_type, * and \p ForwardIterator is mutable. * \tparam Predicate is a model of Predicate. * * The following code snippet demonstrates how to use \p stable_partition to reorder a * sequence so that even numbers precede odd numbers. * * \code * #include * ... * struct is_even * { * __host__ __device__ * bool operator()(const int &x) * { * return (x % 2) == 0; * } * }; * ... * int A[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; * const int N = sizeof(A)/sizeof(int); * thrust::stable_partition(A, A + N, * is_even()); * // A is now {2, 4, 6, 8, 10, 1, 3, 5, 7, 9} * \endcode * * \see http://www.sgi.com/tech/stl/stable_partition.html * \see \p partition * \see \p stable_partition_copy */ template ForwardIterator stable_partition(ForwardIterator first, ForwardIterator last, Predicate pred); /*! \p stable_partition is much like \p partition: it reorders the elements in the * range [first, last) based on the function object \p pred applied to a stencil * range [stencil, stencil + (last - first)), such that all of * the elements whose corresponding stencil element satisfies \p pred precede all of the elements whose * corresponding stencil element fails to satisfy it. The postcondition is that, for some iterator * \c middle in the range [first, last), pred(*stencil_i) is \c true for every iterator * \c stencil_i in the range [stencil,stencil + (middle - first)) and \c false for every iterator \c stencil_i * in the range [stencil + (middle - first), stencil + (last - first)). * The return value of \p stable_partition is \c middle. * * \p stable_partition differs from \ref partition in that \p stable_partition is * guaranteed to preserve relative order. That is, if \c x and \c y are elements in * [first, last), such that pred(x) == pred(y), and if \c x precedes * \c y, then it will still be true after \p stable_partition that \c x precedes \c y. * * The algorithm's execution is parallelized as determined by \p exec. * * \param exec The execution policy to use for parallelization. * \param first The first element of the sequence to reorder. * \param last One position past the last element of the sequence to reorder. * \param stencil The beginning of the stencil sequence. * \param pred A function object which decides to which partition each element of the * sequence [first, last) belongs. * \return An iterator referring to the first element of the second partition, that is, * the sequence of the elements whose stencil elements do not satisfy \p pred. * * \tparam DerivedPolicy The name of the derived execution policy. * \tparam ForwardIterator is a model of Forward Iterator, * and \p ForwardIterator is mutable. * \tparam InputIterator is a model of Input Iterator, * and \p InputIterator's \c value_type is convertible to \p Predicate's \c argument_type. * \tparam Predicate is a model of Predicate. * * \pre The range [first, last) shall not overlap with the range [stencil, stencil + (last - first)). * * The following code snippet demonstrates how to use \p stable_partition to reorder a * sequence so that even numbers precede odd numbers using the \p thrust::host execution policy for parallelization: * * \code * #include * #include * ... * struct is_even * { * __host__ __device__ * bool operator()(const int &x) * { * return (x % 2) == 0; * } * }; * ... * int A[] = {0, 1, 0, 1, 0, 1, 0, 1, 0, 1}; * int S[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; * const int N = sizeof(A)/sizeof(int); * thrust::stable_partition(thrust::host, A, A + N, S, is_even()); * // A is now {1, 1, 1, 1, 1, 0, 0, 0, 0, 0} * // S is unmodified * \endcode * * \see http://www.sgi.com/tech/stl/stable_partition.html * \see \p partition * \see \p stable_partition_copy */ template ForwardIterator stable_partition(const thrust::detail::execution_policy_base &exec, ForwardIterator first, ForwardIterator last, InputIterator stencil, Predicate pred); /*! \p stable_partition is much like \p partition: it reorders the elements in the * range [first, last) based on the function object \p pred applied to a stencil * range [stencil, stencil + (last - first)), such that all of * the elements whose corresponding stencil element satisfies \p pred precede all of the elements whose * corresponding stencil element fails to satisfy it. The postcondition is that, for some iterator * \c middle in the range [first, last), pred(*stencil_i) is \c true for every iterator * \c stencil_i in the range [stencil,stencil + (middle - first)) and \c false for every iterator \c stencil_i * in the range [stencil + (middle - first), stencil + (last - first)). * The return value of \p stable_partition is \c middle. * * \p stable_partition differs from \ref partition in that \p stable_partition is * guaranteed to preserve relative order. That is, if \c x and \c y are elements in * [first, last), such that pred(x) == pred(y), and if \c x precedes * \c y, then it will still be true after \p stable_partition that \c x precedes \c y. * * \param first The first element of the sequence to reorder. * \param last One position past the last element of the sequence to reorder. * \param stencil The beginning of the stencil sequence. * \param pred A function object which decides to which partition each element of the * sequence [first, last) belongs. * \return An iterator referring to the first element of the second partition, that is, * the sequence of the elements whose stencil elements do not satisfy \p pred. * * \tparam ForwardIterator is a model of Forward Iterator, * and \p ForwardIterator is mutable. * \tparam InputIterator is a model of Input Iterator, * and \p InputIterator's \c value_type is convertible to \p Predicate's \c argument_type. * \tparam Predicate is a model of Predicate. * * \pre The range [first, last) shall not overlap with the range [stencil, stencil + (last - first)). * * The following code snippet demonstrates how to use \p stable_partition to reorder a * sequence so that even numbers precede odd numbers. * * \code * #include * ... * struct is_even * { * __host__ __device__ * bool operator()(const int &x) * { * return (x % 2) == 0; * } * }; * ... * int A[] = {0, 1, 0, 1, 0, 1, 0, 1, 0, 1}; * int S[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; * const int N = sizeof(A)/sizeof(int); * thrust::stable_partition(A, A + N, S, is_even()); * // A is now {1, 1, 1, 1, 1, 0, 0, 0, 0, 0} * // S is unmodified * \endcode * * \see http://www.sgi.com/tech/stl/stable_partition.html * \see \p partition * \see \p stable_partition_copy */ template ForwardIterator stable_partition(ForwardIterator first, ForwardIterator last, InputIterator stencil, Predicate pred); /*! \p stable_partition_copy differs from \ref stable_partition only in that the reordered * sequence is written to different output sequences, rather than in place. * * \p stable_partition_copy copies the elements [first, last) based on the * function object \p pred. All of the elements that satisfy \p pred are copied * to the range beginning at \p out_true and all the elements that fail to satisfy it * are copied to the range beginning at \p out_false. * * \p stable_partition_copy differs from \ref partition_copy in that * \p stable_partition_copy is guaranteed to preserve relative order. That is, if * \c x and \c y are elements in [first, last), such that * pred(x) == pred(y), and if \c x precedes \c y, then it will still be true * after \p stable_partition_copy that \c x precedes \c y in the output. * * The algorithm's execution is parallelized as determined by \p exec. * * \param exec The execution policy to use for parallelization. * \param first The first element of the sequence to reorder. * \param last One position past the last element of the sequence to reorder. * \param out_true The destination of the resulting sequence of elements which satisfy \p pred. * \param out_false The destination of the resulting sequence of elements which fail to satisfy \p pred. * \param pred A function object which decides to which partition each element of the * sequence [first, last) belongs. * \return A \p pair p such that p.first is the end of the output range beginning * at \p out_true and p.second is the end of the output range beginning at * \p out_false. * * \tparam DerivedPolicy The name of the derived execution policy. * \tparam InputIterator is a model of Input Iterator, * and \p InputIterator's \c value_type is convertible to \p Predicate's \c argument_type and \p InputIterator's \c value_type * is convertible to \p OutputIterator1 and \p OutputIterator2's \c value_types. * \tparam OutputIterator1 is a model of Output Iterator. * \tparam OutputIterator2 is a model of Output Iterator. * \tparam Predicate is a model of Predicate. * * \pre The input ranges shall not overlap with either output range. * * The following code snippet demonstrates how to use \p stable_partition_copy to * reorder a sequence so that even numbers precede odd numbers using the \p thrust::host execution policy for parallelization: * * \code * #include * #include * ... * struct is_even * { * __host__ __device__ * bool operator()(const int &x) * { * return (x % 2) == 0; * } * }; * ... * int A[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; * int result[10]; * const int N = sizeof(A)/sizeof(int); * int *evens = result; * int *odds = result + 5; * thrust::stable_partition_copy(thrust::host, A, A + N, evens, odds, is_even()); * // A remains {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} * // result is now {2, 4, 6, 8, 10, 1, 3, 5, 7, 9} * // evens points to {2, 4, 6, 8, 10} * // odds points to {1, 3, 5, 7, 9} * \endcode * * \see http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2569.pdf * \see \p partition_copy * \see \p stable_partition */ template thrust::pair stable_partition_copy(const thrust::detail::execution_policy_base &exec, InputIterator first, InputIterator last, OutputIterator1 out_true, OutputIterator2 out_false, Predicate pred); /*! \p stable_partition_copy differs from \ref stable_partition only in that the reordered * sequence is written to different output sequences, rather than in place. * * \p stable_partition_copy copies the elements [first, last) based on the * function object \p pred. All of the elements that satisfy \p pred are copied * to the range beginning at \p out_true and all the elements that fail to satisfy it * are copied to the range beginning at \p out_false. * * \p stable_partition_copy differs from \ref partition_copy in that * \p stable_partition_copy is guaranteed to preserve relative order. That is, if * \c x and \c y are elements in [first, last), such that * pred(x) == pred(y), and if \c x precedes \c y, then it will still be true * after \p stable_partition_copy that \c x precedes \c y in the output. * * \param first The first element of the sequence to reorder. * \param last One position past the last element of the sequence to reorder. * \param out_true The destination of the resulting sequence of elements which satisfy \p pred. * \param out_false The destination of the resulting sequence of elements which fail to satisfy \p pred. * \param pred A function object which decides to which partition each element of the * sequence [first, last) belongs. * \return A \p pair p such that p.first is the end of the output range beginning * at \p out_true and p.second is the end of the output range beginning at * \p out_false. * * \tparam InputIterator is a model of Input Iterator, * and \p InputIterator's \c value_type is convertible to \p Predicate's \c argument_type and \p InputIterator's \c value_type * is convertible to \p OutputIterator1 and \p OutputIterator2's \c value_types. * \tparam OutputIterator1 is a model of Output Iterator. * \tparam OutputIterator2 is a model of Output Iterator. * \tparam Predicate is a model of Predicate. * * \pre The input ranges shall not overlap with either output range. * * The following code snippet demonstrates how to use \p stable_partition_copy to * reorder a sequence so that even numbers precede odd numbers. * * \code * #include * ... * struct is_even * { * __host__ __device__ * bool operator()(const int &x) * { * return (x % 2) == 0; * } * }; * ... * int A[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; * int result[10]; * const int N = sizeof(A)/sizeof(int); * int *evens = result; * int *odds = result + 5; * thrust::stable_partition_copy(A, A + N, evens, odds, is_even()); * // A remains {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} * // result is now {2, 4, 6, 8, 10, 1, 3, 5, 7, 9} * // evens points to {2, 4, 6, 8, 10} * // odds points to {1, 3, 5, 7, 9} * \endcode * * \see http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2569.pdf * \see \p partition_copy * \see \p stable_partition */ template thrust::pair stable_partition_copy(InputIterator first, InputIterator last, OutputIterator1 out_true, OutputIterator2 out_false, Predicate pred); /*! \p stable_partition_copy differs from \ref stable_partition only in that the reordered * sequence is written to different output sequences, rather than in place. * * \p stable_partition_copy copies the elements [first, last) based on the * function object \p pred which is applied to a range of stencil elements. All of the elements * whose corresponding stencil element satisfies \p pred are copied to the range beginning at \p out_true * and all the elements whose stencil element fails to satisfy it are copied to the range beginning * at \p out_false. * * \p stable_partition_copy differs from \ref partition_copy in that * \p stable_partition_copy is guaranteed to preserve relative order. That is, if * \c x and \c y are elements in [first, last), such that * pred(x) == pred(y), and if \c x precedes \c y, then it will still be true * after \p stable_partition_copy that \c x precedes \c y in the output. * * The algorithm's execution is parallelized as determined by \p exec. * * \param exec The execution policy to use for parallelization. * \param first The first element of the sequence to reorder. * \param last One position past the last element of the sequence to reorder. * \param stencil The beginning of the stencil sequence. * \param out_true The destination of the resulting sequence of elements which satisfy \p pred. * \param out_false The destination of the resulting sequence of elements which fail to satisfy \p pred. * \param pred A function object which decides to which partition each element of the * sequence [first, last) belongs. * \return A \p pair p such that p.first is the end of the output range beginning * at \p out_true and p.second is the end of the output range beginning at * \p out_false. * * \tparam DerivedPolicy The name of the derived execution policy. * \tparam InputIterator1 is a model of Input Iterator, * and \p InputIterator's \c value_type is convertible to \p OutputIterator1 and \p OutputIterator2's \c value_types. * \tparam InputIterator2 is a model of Input Iterator, * and \p InputIterator2's \c value_type is convertible to \p Predicate's \c argument_type. * \tparam OutputIterator1 is a model of Output Iterator. * \tparam OutputIterator2 is a model of Output Iterator. * \tparam Predicate is a model of Predicate. * * \pre The input ranges shall not overlap with either output range. * * The following code snippet demonstrates how to use \p stable_partition_copy to * reorder a sequence so that even numbers precede odd numbers using the \p thrust::host execution policy for parallelization: * * \code * #include * #include * #include * ... * int A[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; * int S[] = {0, 1, 0, 1, 0, 1, 0, 1, 0, 1}; * int result[10]; * const int N = sizeof(A)/sizeof(int); * int *evens = result; * int *odds = result + 5; * thrust::stable_partition_copy(thrust::host, A, A + N, S, evens, odds, thrust::identity()); * // A remains {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} * // S remains {0, 1, 0, 1, 0, 1, 0, 1, 0, 1} * // result is now {2, 4, 6, 8, 10, 1, 3, 5, 7, 9} * // evens points to {2, 4, 6, 8, 10} * // odds points to {1, 3, 5, 7, 9} * \endcode * * \see http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2569.pdf * \see \p partition_copy * \see \p stable_partition */ template thrust::pair stable_partition_copy(const thrust::detail::execution_policy_base &exec, InputIterator1 first, InputIterator1 last, InputIterator2 stencil, OutputIterator1 out_true, OutputIterator2 out_false, Predicate pred); /*! \p stable_partition_copy differs from \ref stable_partition only in that the reordered * sequence is written to different output sequences, rather than in place. * * \p stable_partition_copy copies the elements [first, last) based on the * function object \p pred which is applied to a range of stencil elements. All of the elements * whose corresponding stencil element satisfies \p pred are copied to the range beginning at \p out_true * and all the elements whose stencil element fails to satisfy it are copied to the range beginning * at \p out_false. * * \p stable_partition_copy differs from \ref partition_copy in that * \p stable_partition_copy is guaranteed to preserve relative order. That is, if * \c x and \c y are elements in [first, last), such that * pred(x) == pred(y), and if \c x precedes \c y, then it will still be true * after \p stable_partition_copy that \c x precedes \c y in the output. * * \param first The first element of the sequence to reorder. * \param last One position past the last element of the sequence to reorder. * \param stencil The beginning of the stencil sequence. * \param out_true The destination of the resulting sequence of elements which satisfy \p pred. * \param out_false The destination of the resulting sequence of elements which fail to satisfy \p pred. * \param pred A function object which decides to which partition each element of the * sequence [first, last) belongs. * \return A \p pair p such that p.first is the end of the output range beginning * at \p out_true and p.second is the end of the output range beginning at * \p out_false. * * \tparam InputIterator1 is a model of Input Iterator, * and \p InputIterator's \c value_type is convertible to \p OutputIterator1 and \p OutputIterator2's \c value_types. * \tparam InputIterator2 is a model of Input Iterator, * and \p InputIterator2's \c value_type is convertible to \p Predicate's \c argument_type. * \tparam OutputIterator1 is a model of Output Iterator. * \tparam OutputIterator2 is a model of Output Iterator. * \tparam Predicate is a model of Predicate. * * \pre The input ranges shall not overlap with either output range. * * The following code snippet demonstrates how to use \p stable_partition_copy to * reorder a sequence so that even numbers precede odd numbers. * * \code * #include * #include * ... * int A[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; * int S[] = {0, 1, 0, 1, 0, 1, 0, 1, 0, 1}; * int result[10]; * const int N = sizeof(A)/sizeof(int); * int *evens = result; * int *odds = result + 5; * thrust::stable_partition_copy(A, A + N, S, evens, odds, thrust::identity()); * // A remains {1, 2, 3, 4, 5, 6, 7, 8, 9, 10} * // S remains {0, 1, 0, 1, 0, 1, 0, 1, 0, 1} * // result is now {2, 4, 6, 8, 10, 1, 3, 5, 7, 9} * // evens points to {2, 4, 6, 8, 10} * // odds points to {1, 3, 5, 7, 9} * \endcode * * \see http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2569.pdf * \see \p partition_copy * \see \p stable_partition */ template thrust::pair stable_partition_copy(InputIterator1 first, InputIterator1 last, InputIterator2 stencil, OutputIterator1 out_true, OutputIterator2 out_false, Predicate pred); /*! \} // end stream_compaction */ /*! \} // end reordering */ /*! \addtogroup searching * \{ */ /*! \p partition_point returns an iterator pointing to the end of the true * partition of a partitioned range. \p partition_point requires the input range * [first,last) to be a partition; that is, all elements which satisfy * pred shall appear before those that do not. * * 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 to consider. * \param last The end of the range to consider. * \param pred A function object which decides to which partition each element of the * range [first, last) belongs. * \return An iterator \c mid such that all_of(first, mid, pred) * and none_of(mid, last, pred) are both true. * * \tparam DerivedPolicy The name of the derived execution policy. * \tparam ForwardIterator is a model of Forward Iterator, * and \p ForwardIterator's \c value_type is convertible to \p Predicate's \c argument_type. * \tparam Predicate is a model of Predicate. * * \pre The range [first, last) shall be partitioned by \p pred. * * \note Though similar, \p partition_point is not redundant with \p find_if_not. * \p partition_point's precondition provides an opportunity for a * faster implemention. * * \code * #include * #include * * struct is_even * { * __host__ __device__ * bool operator()(const int &x) * { * return (x % 2) == 0; * } * }; * * ... * * int A[] = {2, 4, 6, 8, 10, 1, 3, 5, 7, 9}; * int * B = thrust::partition_point(thrust::host, A, A + 10, is_even()); * // B - A is 5 * // [A, B) contains only even values * \endcode * * \see \p partition * \see \p find_if_not */ template ForwardIterator partition_point(const thrust::detail::execution_policy_base &exec, ForwardIterator first, ForwardIterator last, Predicate pred); /*! \p partition_point returns an iterator pointing to the end of the true * partition of a partitioned range. \p partition_point requires the input range * [first,last) to be a partition; that is, all elements which satisfy * pred shall appear before those that do not. * \param first The beginning of the range to consider. * \param last The end of the range to consider. * \param pred A function object which decides to which partition each element of the * range [first, last) belongs. * \return An iterator \c mid such that all_of(first, mid, pred) * and none_of(mid, last, pred) are both true. * * \tparam ForwardIterator is a model of Forward Iterator, * and \p ForwardIterator's \c value_type is convertible to \p Predicate's \c argument_type. * \tparam Predicate is a model of Predicate. * * \pre The range [first, last) shall be partitioned by \p pred. * * \note Though similar, \p partition_point is not redundant with \p find_if_not. * \p partition_point's precondition provides an opportunity for a * faster implemention. * * \code * #include * * struct is_even * { * __host__ __device__ * bool operator()(const int &x) * { * return (x % 2) == 0; * } * }; * * ... * * int A[] = {2, 4, 6, 8, 10, 1, 3, 5, 7, 9}; * int * B = thrust::partition_point(A, A + 10, is_even()); * // B - A is 5 * // [A, B) contains only even values * \endcode * * \see \p partition * \see \p find_if_not */ template ForwardIterator partition_point(ForwardIterator first, ForwardIterator last, Predicate pred); /*! \} // searching */ /*! \addtogroup reductions * \{ * \addtogroup predicates * \{ */ /*! \p is_partitioned returns \c true if the given range * is partitioned with respect to a predicate, and \c false otherwise. * * Specifically, \p is_partitioned returns \c true if [first, last) * is empty of if [first, last) is partitioned by \p pred, i.e. if * all elements that satisfy \p pred appear before those that do not. * * 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 to consider. * \param last The end of the range to consider. * \param pred A function object which decides to which partition each element of the * range [first, last) belongs. * \return \c true if the range [first, last) is partitioned with respect * to \p pred, or if [first, last) is empty. \c false, otherwise. * * \tparam DerivedPolicy The name of the derived execution policy. * \tparam InputIterator is a model of Input Iterator, * and \p InputIterator's \c value_type is convertible to \p Predicate's \c argument_type. * \tparam Predicate is a model of Predicate. * * \code * #include * #include * * struct is_even * { * __host__ __device__ * bool operator()(const int &x) * { * return (x % 2) == 0; * } * }; * * ... * * int A[] = {2, 4, 6, 8, 10, 1, 3, 5, 7, 9}; * int B[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; * * thrust::is_partitioned(thrust::host, A, A + 10); // returns true * thrust::is_partitioned(thrust::host, B, B + 10); // returns false * \endcode * * \see \p partition */ template bool is_partitioned(const thrust::detail::execution_policy_base &exec, InputIterator first, InputIterator last, Predicate pred); /*! \p is_partitioned returns \c true if the given range * is partitioned with respect to a predicate, and \c false otherwise. * * Specifically, \p is_partitioned returns \c true if [first, last) * is empty of if [first, last) is partitioned by \p pred, i.e. if * all elements that satisfy \p pred appear before those that do not. * * \param first The beginning of the range to consider. * \param last The end of the range to consider. * \param pred A function object which decides to which partition each element of the * range [first, last) belongs. * \return \c true if the range [first, last) is partitioned with respect * to \p pred, or if [first, last) is empty. \c false, otherwise. * * \tparam InputIterator is a model of Input Iterator, * and \p InputIterator's \c value_type is convertible to \p Predicate's \c argument_type. * \tparam Predicate is a model of Predicate. * * \code * #include * * struct is_even * { * __host__ __device__ * bool operator()(const int &x) * { * return (x % 2) == 0; * } * }; * * ... * * int A[] = {2, 4, 6, 8, 10, 1, 3, 5, 7, 9}; * int B[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; * * thrust::is_partitioned(A, A + 10); // returns true * thrust::is_partitioned(B, B + 10); // returns false * \endcode * * \see \p partition */ template bool is_partitioned(InputIterator first, InputIterator last, Predicate pred); /*! \} // end predicates * \} // end reductions */ } // end thrust #include