diff options
Diffstat (limited to 'boost/compute/algorithm/mismatch.hpp')
-rw-r--r-- | boost/compute/algorithm/mismatch.hpp | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/boost/compute/algorithm/mismatch.hpp b/boost/compute/algorithm/mismatch.hpp new file mode 100644 index 0000000000..e7db883004 --- /dev/null +++ b/boost/compute/algorithm/mismatch.hpp @@ -0,0 +1,89 @@ +//---------------------------------------------------------------------------// +// Copyright (c) 2013 Kyle Lutz <kyle.r.lutz@gmail.com> +// +// Distributed under the Boost Software License, Version 1.0 +// See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt +// +// See http://boostorg.github.com/compute for more information. +//---------------------------------------------------------------------------// + +#ifndef BOOST_COMPUTE_ALGORITHM_MISMATCH_HPP +#define BOOST_COMPUTE_ALGORITHM_MISMATCH_HPP + +#include <iterator> +#include <utility> + +#include <boost/compute/system.hpp> +#include <boost/compute/functional.hpp> +#include <boost/compute/command_queue.hpp> +#include <boost/compute/algorithm/find.hpp> +#include <boost/compute/iterator/transform_iterator.hpp> +#include <boost/compute/iterator/zip_iterator.hpp> +#include <boost/compute/functional/detail/unpack.hpp> + +namespace boost { +namespace compute { + +/// Returns a pair of iterators pointing to the first position where the +/// range [\p first1, \p last1) and the range starting at \p first2 +/// differ. +template<class InputIterator1, class InputIterator2> +inline std::pair<InputIterator1, InputIterator2> +mismatch(InputIterator1 first1, + InputIterator1 last1, + InputIterator2 first2, + command_queue &queue = system::default_queue()) +{ + typedef typename std::iterator_traits<InputIterator1>::value_type value_type; + + ::boost::compute::equal_to<value_type> op; + + InputIterator2 last2 = first2 + std::distance(first1, last1); + + InputIterator1 iter = + boost::get<0>( + ::boost::compute::find( + ::boost::compute::make_transform_iterator( + ::boost::compute::make_zip_iterator( + boost::make_tuple(first1, first2) + ), + detail::unpack(op) + ), + ::boost::compute::make_transform_iterator( + ::boost::compute::make_zip_iterator( + boost::make_tuple(last1, last2) + ), + detail::unpack(op) + ), + false, + queue + ).base().get_iterator_tuple() + ); + + return std::make_pair(iter, first2 + std::distance(first1, iter)); +} + +/// \overload +template<class InputIterator1, class InputIterator2> +inline std::pair<InputIterator1, InputIterator2> +mismatch(InputIterator1 first1, + InputIterator1 last1, + InputIterator2 first2, + InputIterator2 last2, + command_queue &queue = system::default_queue()) +{ + if(std::distance(first1, last1) < std::distance(first2, last2)){ + return ::boost::compute::mismatch(first1, last1, first2, queue); + } + else { + return ::boost::compute::mismatch( + first1, first1 + std::distance(first2, last2), first2, queue + ); + } +} + +} // end compute namespace +} // end boost namespace + +#endif // BOOST_COMPUTE_ALGORITHM_MISMATCH_HPP |