39 #ifndef ECUDA_ALGO_EQUAL_HPP
40 #define ECUDA_ALGO_EQUAL_HPP
45 #include "../global.hpp"
46 #include "../iterator.hpp"
47 #include "../utility.hpp"
52 template<
class InputIterator1,
class InputIterator2>
__HOST__ __DEVICE__ inline bool equal( InputIterator1 first1, InputIterator1 last1, InputIterator2 first2 );
57 template<
class InputIterator1,
class InputIterator2>
67 template<
class InputIterator1,
class InputIterator2>
73 typedef typename ecuda::remove_const<typename ecuda::iterator_traits<InputIterator1>::value_type>::type valtype1;
74 std::vector< valtype1, host_allocator<valtype1> > v1( static_cast<std::size_t>(
ecuda::distance(first1,last1)) );
76 return std::equal( v1.begin(), v1.end(), first2 );
81 template<
class InputIterator,
typename T,
typename P>
83 device_contiguous_block_iterator<T,P> first1,
84 device_contiguous_block_iterator<T,P> last1,
89 while( first1 != last1 ) {
90 typename device_contiguous_block_iterator<T,P>::contiguous_iterator blockBegin = first1.contiguous_begin();
91 typename device_contiguous_block_iterator<T,P>::contiguous_iterator blockEnd = first1.contiguous_end();
92 if( !::
ecuda::equal( blockBegin, blockEnd, first2 ) )
return false;
101 template<
class InputIterator1,
class InputIterator2>
104 InputIterator2 last2 = first2;
109 template<
class InputIterator1,
typename T,
typename P>
111 InputIterator1 first1, InputIterator1 last1,
112 device_contiguous_block_iterator<T,P> first2,
116 while( first1 != last1 ) {
117 typename device_contiguous_block_iterator<T,P>::contiguous_iterator blockBegin = first2.contiguous_begin();
118 typename device_contiguous_block_iterator<T,P>::contiguous_iterator blockEnd = first2.contiguous_end();
119 if( !
equal( blockBegin, blockEnd, first1 ) )
return false;
127 template<
class InputIterator1,
class InputIterator2>
129 InputIterator1 first1, InputIterator1 last1,
130 InputIterator2 first2,
135 for( ; first1 != last1; ++first1, ++first2 )
if( !(*first1 == *first2) )
return false;
139 typedef typename ecuda::remove_const<typename ecuda::iterator_traits<InputIterator1>::value_type>::type valtype1;
140 typedef typename ecuda::remove_const<typename ecuda::iterator_traits<InputIterator2>::value_type>::type valtype2;
141 InputIterator2 last2 = first2;
144 std::vector< valtype1, host_allocator<valtype1> > v1(
ecuda::distance( first1, last1 ) );
145 std::vector< valtype2, host_allocator<valtype2> > v2(
ecuda::distance( first2, last2 ) );
148 return std::equal( v1.begin(), v1.end(), v2.begin() );
172 template<
class InputIterator1,
class InputIterator2>
__HOST__ __DEVICE__ OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result)
Replacement for std::copy.
ECUDA_SUPPRESS_HD_WARNINGS __HOST__ __DEVICE__ void advance(InputIterator &iterator, Distance n)
Increments given iterator by n elements.
ecuda::false_type is_device_iterator
ECUDA_SUPPRESS_HD_WARNINGS __HOST__ __DEVICE__ bool equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2)
Replacement for std::equal.
Couples together a pair of values.
__HOST__ __DEVICE__ bool equal(InputIterator1 first1, InputIterator1 last1, InputIterator2 first2)
Replacement for std::equal.
#define ECUDA_SUPPRESS_HD_WARNINGS
ECUDA_SUPPRESS_HD_WARNINGS __HOST__ __DEVICE__ std::iterator_traits< Iterator >::difference_type distance(const Iterator &first, const Iterator &last)