90 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			90 lines
		
	
	
		
			3.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| //---------------------------------------------------------------------------//
 | |
| // 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
 | 
