39 #ifndef ECUDA_ITERATOR_HPP
40 #define ECUDA_ITERATOR_HPP
73 template<
typename T,
typename P,
typename Category=device_iterator_tag>
84 typedef typename ecuda::add_lvalue_reference<T>::type
reference;
103 #ifdef ECUDA_CPP11_AVAILABLE
107 ptr = std::move( src.ptr );
134 template<
typename U,
typename Q>
168 #ifdef ECUDA_CPP11_AVAILABLE
194 template<
typename T,
typename P>
219 template<
typename U,
typename Q>
230 #ifdef ECUDA_CPP11_AVAILABLE
232 base_type(std::move(src)),
233 width(std::move(src.width)),
234 offset(std::move(src.offset))
241 width = std::move(src.width);
242 offset = std::move(src.offset);
251 if( offset == width ) {
252 base_type::ptr.skip_bytes( base_type::ptr.get_pitch() - width*
sizeof(
value_type) );
269 base_type::ptr.skip_bytes( width*
sizeof(
value_type) - base_type::ptr.get_pitch() );
292 const int rows = x / width;
293 base_type::ptr.skip_bytes( rows * base_type::ptr.get_pitch() );
297 if( offset > width ) { base_type::ptr.skip_bytes( base_type::ptr.get_pitch() - width*
sizeof(
value_type) ); offset -= width; }
298 if( offset < 0 ) { base_type::ptr.skip_bytes( width*
sizeof(
value_type) - base_type::ptr.get_pitch() ); offset += width; }
307 typedef const char* char_pointer_type;
308 char_pointer_type p = naked_cast<char_pointer_type>(base_type::ptr);
309 char_pointer_type q = naked_cast<char_pointer_type>(other.ptr);
312 span = span % base_type::ptr.get_pitch();
333 template<
class Iterator>
337 typedef std::iterator<device_iterator_tag,typename Iterator::value_type,typename Iterator::difference_type,typename Iterator::pointer> base_type;
348 Iterator parentIterator;
353 template<
class Iterator2>
356 #ifdef ECUDA_CPP11_AVAILABLE
388 Iterator tmp(parentIterator);
390 return tmp.operator*();
395 Iterator tmp(parentIterator);
397 return tmp.operator->();
417 parentIterator = other.parentIterator;
421 template<
class Iterator2>
424 parentIterator = other.parentIterator;
430 template<
class Iterator>
434 typedef std::iterator_traits<Iterator> base_type;
445 template<
typename T,
typename Po
interType,
typename Category>
449 typedef std::iterator_traits< device_iterator<T,PointerType,Category> > base_type;
464 typedef std::iterator_traits< device_contiguous_iterator<T> > base_type;
475 template<
typename T,
typename P>
490 template<
typename Iterator>
494 typedef std::iterator_traits< reverse_device_iterator<Iterator> > base_type;
509 typedef std::iterator_traits<T*> base_type;
523 template<
class InputIterator,
typename Distance>
526 InputIterator& iterator,
533 const bool isIteratorSomeKindOfContiguous =
534 ecuda::is_same<iterator_contiguity,ecuda::true_type>::value ||
535 ecuda::is_same< iterator_category, device_contiguous_block_iterator_tag >::value;
536 if( isIteratorSomeKindOfContiguous ) {
539 for( Distance i = 0; i < n; ++i ) ++iterator;
543 template<
class InputIterator,
typename Distance>
546 InputIterator& iterator,
573 template<
class InputIterator,
typename Distance>
582 template<
class Iterator>
584 typename std::iterator_traits<Iterator>::difference_type
distance(
585 Iterator first, Iterator last,
591 const bool isIteratorSomeKindOfContiguous =
592 ecuda::is_same<iterator_contiguity,ecuda::true_type>::value ||
593 ecuda::is_same<iterator_category,device_contiguous_block_iterator_tag>::value;
595 if( isIteratorSomeKindOfContiguous ) {
596 return ( last - first );
598 typename std::iterator_traits<Iterator>::difference_type n = 0;
599 while( first != last ) { ++n; ++first; }
603 ECUDA_STATIC_ASSERT( isIteratorSomeKindOfContiguous, CANNOT_CALCULATE_DISTANCE_OF_NONCONTIGUOUS_DEVICE_ITERATOR_FROM_HOST_CODE );
604 return ( last - first );
608 template<
class Iterator>
610 typename std::iterator_traits<Iterator>::difference_type
distance(
611 const Iterator& first,
const Iterator& last,
626 template<
class Iterator>
632 template<
typename T,
typename P>
635 typename std::iterator_traits< device_contiguous_block_iterator<T,P> >::difference_type
__HOST__ __DEVICE__ device_iterator & operator--()
Iterator category denoting device memory.
base_type::iterator_category iterator_category
Category iterator_category
__HOST__ __DEVICE__ bool operator<=(const device_contiguous_iterator &other) const __NOEXCEPT__
__HOST__ __DEVICE__ device_iterator & operator++()
__HOST__ __DEVICE__ device_iterator operator++(int)
__HOST__ __DEVICE__ bool operator>=(const device_contiguous_iterator &other) const __NOEXCEPT__
base_type::iterator_category iterator_category
__HOST__ __DEVICE__ reverse_device_iterator & operator=(const reverse_device_iterator< Iterator2 > &other)
__DEVICE__ reference operator[](difference_type x) const
base_type::pointer pointer
__HOST__ __DEVICE__ reverse_device_iterator & operator+=(difference_type x)
base_type::reference reference
ECUDA_SUPPRESS_HD_WARNINGS __HOST__ __DEVICE__ void advance(InputIterator &iterator, Distance n)
Increments given iterator by n elements.
base_type::reference reference
__HOST__ __DEVICE__ bool operator!=(const device_iterator &other) const __NOEXCEPT__
__HOST__ __DEVICE__ device_iterator & operator=(const device_iterator &other)
Iterator category denoting device memory that is made of contiguous blocks (but the blocks themselves...
__HOST__ __DEVICE__ device_contiguous_block_iterator(const device_contiguous_block_iterator &src)
__HOST__ __DEVICE__ device_contiguous_iterator operator+(difference_type x) const
base_type::iterator_category iterator_category
base_type::iterator_category iterator_category
__HOST__ __DEVICE__ reverse_device_iterator & operator++()
base_type::pointer pointer
base_type::value_type value_type
__HOST__ __DEVICE__ reverse_device_iterator operator++(int)
__HOST__ __DEVICE__ device_iterator & operator=(const device_iterator< U, Q, Category > &other)
__HOST__ __DEVICE__ reverse_device_iterator(const reverse_device_iterator &src)
__HOST__ __DEVICE__ bool operator<(const device_contiguous_block_iterator &other) const __NOEXCEPT__
base_type::value_type value_type
__HOST__ __DEVICE__ reverse_device_iterator(Iterator parentIterator=Iterator())
base_type::iterator_category iterator_category
__HOST__ __DEVICE__ contiguous_iterator contiguous_end() const __NOEXCEPT__
Iterator category denoting contiguous device memory.
__HOST__ __DEVICE__ device_contiguous_block_iterator & operator-=(difference_type x)
__DEVICE__ reference operator[](difference_type x) const
__HOST__ __DEVICE__ bool operator>(const reverse_device_iterator &other) const
__HOST__ __DEVICE__ device_iterator(const device_iterator< U, Q, Category > &src)
device_contiguous_iterator< T > contiguous_iterator
ecuda::false_type is_contiguous
__HOST__ __DEVICE__ device_contiguous_iterator & operator+=(difference_type x)
base_type::difference_type difference_type
__HOST__ __DEVICE__ bool operator>=(const device_contiguous_block_iterator &other) const __NOEXCEPT__
__HOST__ __DEVICE__ std::size_t get_width() const __NOEXCEPT__
base_type::reference reference
base_type::value_type value_type
__HOST__ __DEVICE__ device_contiguous_iterator(const device_contiguous_iterator &src)
__HOST__ __DEVICE__ reverse_device_iterator operator-(difference_type x) const
friend class device_contiguous_block_iterator
__HOST__ __DEVICE__ pointer operator->() const
A specialized pointer to padded memory.
__HOST__ __DEVICE__ device_iterator(const device_iterator &src)
ecuda::true_type is_contiguous
ecuda::false_type is_device_iterator
base_type::reference reference
__HOST__ __DEVICE__ void swap(T &a, T &b) __NOEXCEPT__
ecuda::true_type is_device_iterator
__HOST__ __DEVICE__ bool operator>(const device_contiguous_iterator &other) const __NOEXCEPT__
__HOST__ __DEVICE__ device_contiguous_block_iterator & operator++()
ecuda::true_type is_contiguous
base_type::reference reference
std::ptrdiff_t difference_type
base_type::reference reference
base_type::iterator_category iterator_category
base_type::value_type value_type
__HOST__ __DEVICE__ contiguous_iterator contiguous_begin() const __NOEXCEPT__
__HOST__ __DEVICE__ difference_type operator-(const reverse_device_iterator &other)
ecuda::false_type is_device_iterator
__HOST__ __DEVICE__ bool operator<=(const device_contiguous_block_iterator &other) const __NOEXCEPT__
__HOST__ __DEVICE__ Iterator base() const
base_type::difference_type difference_type
__DEVICE__ reference operator[](difference_type x) const
base_type::reference reference
__HOST__ __DEVICE__ device_contiguous_block_iterator & operator+=(difference_type x)
__HOST__ __DEVICE__ device_contiguous_block_iterator & operator=(const device_contiguous_block_iterator &src)
__HOST__ __DEVICE__ difference_type operator-(const device_contiguous_block_iterator &other) const
__HOST__ __DEVICE__ device_iterator operator--(int)
__HOST__ __DEVICE__ bool operator>(const device_contiguous_block_iterator &other) const __NOEXCEPT__
__HOST__ __DEVICE__ device_contiguous_block_iterator operator-(difference_type x) const
__HOST__ __DEVICE__ device_contiguous_block_iterator & operator--()
base_type::pointer pointer
__HOST__ __DEVICE__ reverse_device_iterator & operator-=(difference_type x)
base_type::value_type value_type
base_type::iterator_category iterator_category
__HOST__ __DEVICE__ pointer operator->() const
__HOST__ __DEVICE__ std::iterator_traits< device_contiguous_block_iterator< T, P > >::difference_type distance(const device_contiguous_block_iterator< T, P > &first, const device_contiguous_block_iterator< T, P > &last)
__DEVICE__ reference operator*()
ecuda::true_type is_device_iterator
base_type::reference reference
__HOST__ __DEVICE__ reverse_device_iterator(const reverse_device_iterator< Iterator2 > &src)
__HOST__ __DEVICE__ bool operator==(const reverse_device_iterator &other) const
__DEVICE__ reference operator*() const
base_type::iterator_category iterator_category
#define ECUDA_STATIC_ASSERT(x, msg)
__HOST__ __DEVICE__ device_contiguous_block_iterator(const device_contiguous_block_iterator< U, Q > &src)
base_type::pointer pointer
base_type::pointer pointer
base_type::difference_type difference_type
__HOST__ __DEVICE__ device_contiguous_iterator operator-(difference_type x) const
base_type::pointer pointer
__HOST__ __DEVICE__ device_contiguous_block_iterator(const pointer &ptr=pointer(), const difference_type width=difference_type(), const difference_type offset=difference_type())
__HOST__ __DEVICE__ device_contiguous_iterator(const device_contiguous_iterator< U > &src)
base_type::pointer pointer
base_type::difference_type difference_type
base_type::iterator_category iterator_category
__HOST__ __DEVICE__ device_iterator(const pointer &ptr=pointer())
base_type::value_type value_type
base_type::value_type value_type
base_type::difference_type difference_type
base_type::difference_type difference_type
base_type::pointer pointer
__HOST__ __DEVICE__ device_contiguous_block_iterator operator--(int)
ecuda::true_type is_device_iterator
__HOST__ __DEVICE__ bool operator<=(const reverse_device_iterator &other) const
__HOST__ __DEVICE__ bool operator!=(const reverse_device_iterator &other) const
#define ECUDA_SUPPRESS_HD_WARNINGS
base_type::pointer pointer
base_type::value_type value_type
__HOST__ __DEVICE__ reverse_device_iterator operator+(difference_type x) const
ecuda::add_lvalue_reference< T >::type reference
__HOST__ __DEVICE__ device_contiguous_iterator & operator=(const device_contiguous_iterator &other)
base_type::is_device_iterator is_device_iterator
__HOST__ __DEVICE__ reverse_device_iterator & operator=(const reverse_device_iterator &other)
base_type::difference_type difference_type
__HOST__ __DEVICE__ bool operator<(const device_contiguous_iterator &other) const __NOEXCEPT__
__HOST__ __DEVICE__ bool operator==(const device_iterator &other) const __NOEXCEPT__
base_type::difference_type difference_type
__HOST__ __DEVICE__ device_contiguous_block_iterator operator+(difference_type x) const
__HOST__ __DEVICE__ bool operator<(const reverse_device_iterator &other) const
base_type::difference_type difference_type
__HOST__ __DEVICE__ device_contiguous_block_iterator operator++(int)
__HOST__ __DEVICE__ reverse_device_iterator & operator--()
__HOST__ __DEVICE__ reverse_device_iterator operator--(int)
friend class device_iterator
__HOST__ __DEVICE__ difference_type operator-(const device_contiguous_iterator &other)
__HOST__ __DEVICE__ device_contiguous_iterator(const pointer &ptr=pointer())
__HOST__ __DEVICE__ std::size_t get_offset() const __NOEXCEPT__
ecuda::false_type is_contiguous
__HOST__ __DEVICE__ device_contiguous_iterator & operator-=(difference_type x)
ECUDA_SUPPRESS_HD_WARNINGS __HOST__ __DEVICE__ std::iterator_traits< Iterator >::difference_type distance(const Iterator &first, const Iterator &last)
__HOST__ __DEVICE__ bool operator>=(const reverse_device_iterator &other) const
base_type::value_type value_type
base_type::reference reference