39 #ifndef ECUDA_ALGO_REVERSE_HPP
40 #define ECUDA_ALGO_REVERSE_HPP
45 #include "../global.hpp"
46 #include "../iterator.hpp"
48 #include "../algorithm.hpp"
53 template<
class B
idirectionalIterator>
__HOST__ __DEVICE__ inline void reverse( BidirectionalIterator first, BidirectionalIterator last );
58 template<
class ForwardIterator>
60 reverse( ForwardIterator first, ForwardIterator last,
71 template<
class ForwardIterator>
73 reverse( ForwardIterator first, ForwardIterator last,
78 while( (first!=last) and (first!=--last) ) {
86 const bool isSomeKindOfContiguous =
87 ecuda::is_same<iterator_contiguity,ecuda::true_type>::value ||
88 ecuda::is_same<iterator_category,device_contiguous_block_iterator_tag>::value;
89 ECUDA_STATIC_ASSERT(isSomeKindOfContiguous,CANNOT_REVERSE_RANGE_REPRESENTED_BY_NONCONTIGUOUS_DEVICE_MEMORY);
91 typedef typename ecuda::remove_const<typename ecuda::iterator_traits<ForwardIterator>::value_type>::type value_type;
92 std::vector< value_type, host_allocator<value_type> > v( ::
ecuda::distance( first, last ) );
103 template<
class B
idirectionalIterator>
__HOST__ __DEVICE__ OutputIterator copy(InputIterator first, InputIterator last, OutputIterator result)
Replacement for std::copy.
__HOST__ __DEVICE__ void reverse(BidirectionalIterator first, BidirectionalIterator last)
base_type::iterator_category iterator_category
__HOST__ __DEVICE__ void swap(T &a, T &b) __NOEXCEPT__
ecuda::false_type is_device_iterator
ECUDA_SUPPRESS_HD_WARNINGS __HOST__ __DEVICE__ void reverse(BidirectionalIterator first, BidirectionalIterator last)
#define ECUDA_STATIC_ASSERT(x, msg)
#define ECUDA_SUPPRESS_HD_WARNINGS
ECUDA_SUPPRESS_HD_WARNINGS __HOST__ __DEVICE__ std::iterator_traits< Iterator >::difference_type distance(const Iterator &first, const Iterator &last)