/* * 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 mismatch.h * \brief Search for differences between ranges */ #pragma once #include #include #include namespace thrust { /*! \addtogroup algorithms */ /*! \addtogroup searching * \ingroup algorithms * \{ */ /*! \p mismatch finds the first position where the two ranges [first1, last1) * and [first2, first2 + (last1 - first1)) differ. The two versions of * \p mismatch use different tests for whether elements differ. * * This version of \p mismatch finds the first iterator \c i in [first1, last1) * such that *i == *(first2 + (i - first1)) is \c false. The return value is a * \c pair whose first element is \c i and whose second element is *(first2 + (i - first1)). * If no such iterator \c i exists, the return value is a \c pair whose first element * is \c last1 and whose second element is *(first2 + (last1 - first1)). * * The algorithm's execution is parallelized as determined by \p exec. * * \param exec The execution policy to use for parallelization. * \param first1 The beginning of the first sequence. * \param last1 The end of the first sequence. * \param first2 The beginning of the second sequence. * \return The first position where the sequences differ. * * \tparam DerivedPolicy The name of the derived execution policy. * \tparam InputIterator1 is a model of Input Iterator * and \p InputIterator1's \c value_type is equality comparable to \p InputIterator2's \c value_type. * \tparam InputIterator2 is a model of Input Iterator. * * \code * #include * #include * #include * ... * thrust::device_vector vec1(4); * thrust::device_vector vec2(4); * * vec1[0] = 0; vec2[0] = 0; * vec1[1] = 5; vec2[1] = 5; * vec1[2] = 3; vec2[2] = 8; * vec1[3] = 7; vec2[3] = 7; * * typedef thrust::device_vector::iterator Iterator; * thrust::pair result; * * result = thrust::mismatch(thrust::device, vec1.begin(), vec1.end(), vec2.begin()); * * // result.first is vec1.begin() + 2 * // result.second is vec2.begin() + 2 * \endcode * * \see find * \see find_if */ template thrust::pair mismatch(const thrust::detail::execution_policy_base &exec, InputIterator1 first1, InputIterator1 last1, InputIterator2 first2); /*! \p mismatch finds the first position where the two ranges [first1, last1) * and [first2, first2 + (last1 - first1)) differ. The two versions of * \p mismatch use different tests for whether elements differ. * * This version of \p mismatch finds the first iterator \c i in [first1, last1) * such that *i == *(first2 + (i - first1)) is \c false. The return value is a * \c pair whose first element is \c i and whose second element is *(first2 + (i - first1)). * If no such iterator \c i exists, the return value is a \c pair whose first element * is \c last1 and whose second element is *(first2 + (last1 - first1)). * * \param first1 The beginning of the first sequence. * \param last1 The end of the first sequence. * \param first2 The beginning of the second sequence. * \return The first position where the sequences differ. * * \tparam InputIterator1 is a model of Input Iterator * and \p InputIterator1's \c value_type is equality comparable to \p InputIterator2's \c value_type. * \tparam InputIterator2 is a model of Input Iterator. * * \code * #include * #include * ... * thrust::device_vector vec1(4); * thrust::device_vector vec2(4); * * vec1[0] = 0; vec2[0] = 0; * vec1[1] = 5; vec2[1] = 5; * vec1[2] = 3; vec2[2] = 8; * vec1[3] = 7; vec2[3] = 7; * * typedef thrust::device_vector::iterator Iterator; * thrust::pair result; * * result = thrust::mismatch(vec1.begin(), vec1.end(), vec2.begin()); * * // result.first is vec1.begin() + 2 * // result.second is vec2.begin() + 2 * \endcode * * \see find * \see find_if */ template thrust::pair mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2); /*! \p mismatch finds the first position where the two ranges [first1, last1) * and [first2, first2 + (last1 - first1)) differ. The two versions of * \p mismatch use different tests for whether elements differ. * * This version of \p mismatch finds the first iterator \c i in [first1, last1) * such that pred(\*i, \*(first2 + (i - first1)) is \c false. The return value is a * \c pair whose first element is \c i and whose second element is *(first2 + (i - first1)). * If no such iterator \c i exists, the return value is a \c pair whose first element is * \c last1 and whose second element is *(first2 + (last1 - first1)). * * The algorithm's execution is parallelized as determined by \p exec. * * \param exec The execution policy to use for parallelization. * \param first1 The beginning of the first sequence. * \param last1 The end of the first sequence. * \param first2 The beginning of the second sequence. * \param pred The binary predicate to compare elements. * \return The first position where the sequences differ. * * \tparam DerivedPolicy The name of the derived execution policy. * \tparam InputIterator1 is a model of Input Iterator. * \tparam InputIterator2 is a model of Input Iterator. * \tparam Predicate is a model of Input Iterator. * * \code * #include * #include * #include * ... * thrust::device_vector vec1(4); * thrust::device_vector vec2(4); * * vec1[0] = 0; vec2[0] = 0; * vec1[1] = 5; vec2[1] = 5; * vec1[2] = 3; vec2[2] = 8; * vec1[3] = 7; vec2[3] = 7; * * typedef thrust::device_vector::iterator Iterator; * thrust::pair result; * * result = thrust::mismatch(thrust::device, vec1.begin(), vec1.end(), vec2.begin(), thrust::equal_to()); * * // result.first is vec1.begin() + 2 * // result.second is vec2.begin() + 2 * \endcode * * \see find * \see find_if */ template thrust::pair mismatch(const thrust::detail::execution_policy_base &exec, InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, BinaryPredicate pred); /*! \p mismatch finds the first position where the two ranges [first1, last1) * and [first2, first2 + (last1 - first1)) differ. The two versions of * \p mismatch use different tests for whether elements differ. * * This version of \p mismatch finds the first iterator \c i in [first1, last1) * such that pred(\*i, \*(first2 + (i - first1)) is \c false. The return value is a * \c pair whose first element is \c i and whose second element is *(first2 + (i - first1)). * If no such iterator \c i exists, the return value is a \c pair whose first element is * \c last1 and whose second element is *(first2 + (last1 - first1)). * * \param first1 The beginning of the first sequence. * \param last1 The end of the first sequence. * \param first2 The beginning of the second sequence. * \param pred The binary predicate to compare elements. * \return The first position where the sequences differ. * * \tparam InputIterator1 is a model of Input Iterator. * \tparam InputIterator2 is a model of Input Iterator. * \tparam Predicate is a model of Input Iterator. * * \code * #include * #include * ... * thrust::device_vector vec1(4); * thrust::device_vector vec2(4); * * vec1[0] = 0; vec2[0] = 0; * vec1[1] = 5; vec2[1] = 5; * vec1[2] = 3; vec2[2] = 8; * vec1[3] = 7; vec2[3] = 7; * * typedef thrust::device_vector::iterator Iterator; * thrust::pair result; * * result = thrust::mismatch(vec1.begin(), vec1.end(), vec2.begin(), thrust::equal_to()); * * // result.first is vec1.begin() + 2 * // result.second is vec2.begin() + 2 * \endcode * * \see find * \see find_if */ template thrust::pair mismatch(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2, BinaryPredicate pred); /*! \} // end searching */ } // end namespace thrust #include