Extended CUDA Library (ecuda)  2.0
 All Classes Namespaces Files Functions Variables Typedefs Friends Macros
iterator.hpp
Go to the documentation of this file.
1 /*
2 Copyright (c) 2014-2016, Scott Zuyderduyn
3 All rights reserved.
4 
5 Redistribution and use in source and binary forms, with or without
6 modification, are permitted provided that the following conditions are met:
7 
8 1. Redistributions of source code must retain the above copyright notice, this
9  list of conditions and the following disclaimer.
10 2. Redistributions in binary form must reproduce the above copyright notice,
11  this list of conditions and the following disclaimer in the documentation
12  and/or other materials provided with the distribution.
13 
14 THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
15 ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
16 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
17 DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
18 ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
19 (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
20 LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
21 ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22 (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
23 SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
24 
25 The views and conclusions contained in the software and documentation are those
26 of the authors and should not be interpreted as representing official policies,
27 either expressed or implied, of the FreeBSD Project.
28 */
29 
30 //----------------------------------------------------------------------------
31 // iterator.hpp
32 //
33 // STL-style iterators customized to work with device memory.
34 //
35 // Author: Scott D. Zuyderduyn, Ph.D. (scott.zuyderduyn@utoronto.ca)
36 //----------------------------------------------------------------------------
37 
38 #pragma once
39 #ifndef ECUDA_ITERATOR_HPP
40 #define ECUDA_ITERATOR_HPP
41 
42 #include <iterator>
43 
44 #include "global.hpp"
45 #include "algorithm.hpp" // for ecuda::swap
46 #include "type_traits.hpp"
47 
48 namespace ecuda {
49 
50 // NOTE: libc++ requires inheritance from one of the 5 STL iterator categories (libstdc++ does not)
51 
52 template<typename T,typename P> class padded_ptr; // forward declaration
53 
57 struct device_iterator_tag : ::std::bidirectional_iterator_tag {};
58 
62 struct device_contiguous_iterator_tag : ::std::random_access_iterator_tag {}; // libc++ requires inheritance from one of the 5 STL iterator categories
63 
72 
73 template<typename T,typename P,typename Category=device_iterator_tag>
74 class device_iterator //: std::iterator<Category,T,std::ptrdiff_t,PointerType>
75 {
76 //private:
77 // typedef std::iterator<Category,T,std::ptrdiff_t,P> base_type;
78 
79 public:
80  typedef Category iterator_category;
81  typedef T value_type;
82  typedef std::ptrdiff_t difference_type;
83  typedef P pointer;
84  typedef typename ecuda::add_lvalue_reference<T>::type reference;
85 
86  template<typename U,typename Q,typename Category2> friend class device_iterator;
87  template<typename U> friend class device_contiguous_iterator;
88 
89 protected:
90  pointer ptr;
91 
92 public:
93  __HOST__ __DEVICE__ device_iterator( const pointer& ptr = pointer() ) : ptr(ptr) {}
94  __HOST__ __DEVICE__ device_iterator( const device_iterator& src ) : ptr(src.ptr) {}
95  template<typename U,typename Q> __HOST__ __DEVICE__ device_iterator( const device_iterator<U,Q,Category>& src ) : ptr(src.ptr) {}
96 
98  {
99  ptr = other.ptr;
100  return *this;
101  }
102 
103  #ifdef ECUDA_CPP11_AVAILABLE
104  __HOST__ device_iterator( device_iterator&& src ) : ptr(std::move(src.ptr)) {}
106  {
107  ptr = std::move( src.ptr );
108  return *this;
109  }
110  #endif
111 
112  __HOST__ __DEVICE__ inline device_iterator& operator++() { ++ptr; return *this; }
114  {
115  device_iterator tmp(*this);
116  ++(*this);
117  return tmp;
118  }
119 
120  __HOST__ __DEVICE__ inline device_iterator& operator--() { --ptr; return *this; }
122  {
123  device_iterator tmp(*this);
124  --(*this);
125  return tmp;
126  }
127 
128  __HOST__ __DEVICE__ inline bool operator==( const device_iterator& other ) const __NOEXCEPT__ { return ptr == other.ptr; }
129  __HOST__ __DEVICE__ inline bool operator!=( const device_iterator& other ) const __NOEXCEPT__ { return !operator==(other); }
130 
131  __DEVICE__ inline reference operator*() { return *ptr; }
132  __HOST__ __DEVICE__ inline pointer operator->() const { return ptr; }
133 
134  template<typename U,typename Q>
136  {
137  ptr = other.ptr;
138  return *this;
139  }
140 
141 };
142 
143 template<typename T>
144 class device_contiguous_iterator : public device_iterator<T,typename ecuda::add_pointer<T>::type,device_contiguous_iterator_tag>
145 {
146 
147 private:
149 
150 public:
154  typedef typename base_type::pointer pointer;
155  typedef typename base_type::reference reference;
156 
157 public:
161 
163  {
164  base_type::operator=(other);
165  return *this;
166  }
167 
168  #ifdef ECUDA_CPP11_AVAILABLE
169  __HOST__ device_contiguous_iterator( device_contiguous_iterator&& src ) : base_type(std::move(src)) {}
171  {
172  base_type::operator=(std::move(src));
173  return *this;
174  }
175  #endif
176 
179 
180  __HOST__ __DEVICE__ inline device_contiguous_iterator& operator+=( difference_type x ) { base_type::ptr += x; return *this; }
181  __HOST__ __DEVICE__ inline device_contiguous_iterator& operator-=( difference_type x ) { base_type::ptr -= x; return *this; }
182 
183  __DEVICE__ inline reference operator[]( difference_type x ) const { return *(base_type::ptr+x); }
184 
185  __HOST__ __DEVICE__ inline difference_type operator-( const device_contiguous_iterator& other ) { return base_type::ptr - other.ptr; }
186 
187  __HOST__ __DEVICE__ inline bool operator<( const device_contiguous_iterator& other ) const __NOEXCEPT__ { return base_type::ptr < other.ptr; }
188  __HOST__ __DEVICE__ inline bool operator>( const device_contiguous_iterator& other ) const __NOEXCEPT__ { return base_type::ptr > other.ptr; }
189  __HOST__ __DEVICE__ inline bool operator<=( const device_contiguous_iterator& other ) const __NOEXCEPT__ { return operator<(other) || operator==(other); }
190  __HOST__ __DEVICE__ inline bool operator>=( const device_contiguous_iterator& other ) const __NOEXCEPT__ { return operator>(other) || operator==(other); }
191 
192 };
193 
194 template<typename T,typename P>
195 class device_contiguous_block_iterator : public device_iterator<T,padded_ptr<T,P>,device_contiguous_block_iterator_tag>
196 {
197 
198 private:
200 
201 public:
205  typedef typename base_type::pointer pointer;
206  typedef typename base_type::reference reference;
207 
208  //typedef P contiguous_pointer;
210 
211 private:
212  difference_type width;
213  difference_type offset;
214  template<typename U,typename Q> friend class device_contiguous_block_iterator;
215 
216 public:
217  __HOST__ __DEVICE__ device_contiguous_block_iterator( const pointer& ptr = pointer(), const difference_type width = difference_type(), const difference_type offset = difference_type() ) : base_type(ptr), width(width), offset(offset) {}
218  __HOST__ __DEVICE__ device_contiguous_block_iterator( const device_contiguous_block_iterator& src ) : base_type(src), width(src.width), offset(src.offset) {}
219  template<typename U,typename Q>
220  __HOST__ __DEVICE__ device_contiguous_block_iterator( const device_contiguous_block_iterator<U,Q>& src ) : base_type(src), width(src.width), offset(src.offset) {}
221 
223  {
225  width = src.width;
226  offset = src.offset;
227  return *this;
228  }
229 
230  #ifdef ECUDA_CPP11_AVAILABLE
232  base_type(std::move(src)),
233  width(std::move(src.width)),
234  offset(std::move(src.offset))
235  {
236  }
237 
239  {
240  base_type::operator=(std::move(src));
241  width = std::move(src.width);
242  offset = std::move(src.offset);
243  return *this;
244  }
245  #endif
246 
248  {
249  ++base_type::ptr;
250  ++offset;
251  if( offset == width ) {
252  base_type::ptr.skip_bytes( base_type::ptr.get_pitch() - width*sizeof(value_type) ); // move past padding
253  offset = 0;
254  }
255  return *this;
256  }
258  {
260  ++(*this);
261  return tmp;
262  }
263 
265  {
266  --base_type::ptr;
267  --offset;
268  if( offset < 0 ) {
269  base_type::ptr.skip_bytes( width*sizeof(value_type) - base_type::ptr.get_pitch() ); // move past padding
270  offset = width-1;
271  }
272  return *this;
273  }
275  {
277  --(*this);
278  return tmp;
279  }
280 
282  {
284  tmp += x;
285  return tmp;
286  }
287 
289 
291  {
292  const int rows = x / width;
293  base_type::ptr.skip_bytes( rows * base_type::ptr.get_pitch() );
294  x -= rows * width;
295  base_type::ptr += x;
296  offset += x;
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; }
299  return *this;
300  }
302 
303  __DEVICE__ inline reference operator[]( difference_type x ) const { return *operator+(x); }
304 
306  {
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);
310  difference_type span = ( p - q ); // bytes difference
311  difference_type diff = span/base_type::ptr.get_pitch()*width;
312  span = span % base_type::ptr.get_pitch();
313  if( span > (width*sizeof(value_type) ) )
314  diff += width;
315  else
316  diff += span / sizeof(value_type);
317  return diff;
318  }
319 
320  __HOST__ __DEVICE__ inline bool operator< ( const device_contiguous_block_iterator& other ) const __NOEXCEPT__ { return base_type::ptr < other.ptr; }
321  __HOST__ __DEVICE__ inline bool operator> ( const device_contiguous_block_iterator& other ) const __NOEXCEPT__ { return base_type::ptr > other.ptr; }
322  __HOST__ __DEVICE__ inline bool operator<=( const device_contiguous_block_iterator& other ) const __NOEXCEPT__ { return operator<(other) || operator==(other); }
323  __HOST__ __DEVICE__ inline bool operator>=( const device_contiguous_block_iterator& other ) const __NOEXCEPT__ { return operator>(other) || operator==(other); }
324 
325  __HOST__ __DEVICE__ inline contiguous_iterator contiguous_begin() const __NOEXCEPT__ { return contiguous_iterator( naked_cast<typename ecuda::add_pointer<T>::type>( base_type::ptr.get() ) ); }
326  __HOST__ __DEVICE__ inline contiguous_iterator contiguous_end() const __NOEXCEPT__ { return contiguous_iterator( naked_cast<typename ecuda::add_pointer<T>::type>( base_type::ptr.get() ) + (width-offset) ); }
327  __HOST__ __DEVICE__ inline std::size_t get_width() const __NOEXCEPT__ { return width; }
328  __HOST__ __DEVICE__ inline std::size_t get_offset() const __NOEXCEPT__ { return offset; }
329 
330 };
331 
332 
333 template<class Iterator>
334 class reverse_device_iterator //: public std::iterator<device_iterator_tag,typename Iterator::value_type,typename Iterator::difference_type,typename Iterator::pointer>
335 {
336 private:
337  typedef std::iterator<device_iterator_tag,typename Iterator::value_type,typename Iterator::difference_type,typename Iterator::pointer> base_type;
338 
339 public:
340  typedef Iterator iterator_type;
341  typedef typename base_type::iterator_category iterator_category;
342  typedef typename base_type::value_type value_type;
343  typedef typename base_type::difference_type difference_type;
344  typedef typename base_type::pointer pointer;
345  typedef typename base_type::reference reference;
346 
347 private:
348  Iterator parentIterator;
349 
350 public:
351  __HOST__ __DEVICE__ reverse_device_iterator( Iterator parentIterator = Iterator() ) : parentIterator(parentIterator) {}
352  __HOST__ __DEVICE__ reverse_device_iterator( const reverse_device_iterator& src ) : parentIterator(src.parentIterator) {}
353  template<class Iterator2>
355 
356  #ifdef ECUDA_CPP11_AVAILABLE
357  __HOST__ reverse_device_iterator( reverse_device_iterator&& src ) { ecuda::swap( parentIterator, src.parentIterator ); }
359  {
360  ecuda::swap( parentIterator, src.parentIterator );
361  return *this;
362  }
363  #endif
364 
365  __HOST__ __DEVICE__ Iterator base() const { return parentIterator; }
366 
367  __HOST__ __DEVICE__ inline reverse_device_iterator& operator++() { --parentIterator; return *this; }
369  {
370  reverse_device_iterator tmp(*this);
371  ++(*this);
372  return tmp;
373  }
374 
375  __HOST__ __DEVICE__ inline reverse_device_iterator& operator--() { ++parentIterator; return *this; }
377  {
378  reverse_device_iterator tmp(*this);
379  --(*this);
380  return tmp;
381  }
382 
383  __HOST__ __DEVICE__ inline bool operator==( const reverse_device_iterator& other ) const { return parentIterator == other.parentIterator; }
384  __HOST__ __DEVICE__ inline bool operator!=( const reverse_device_iterator& other ) const { return !operator==(other); }
385 
387  {
388  Iterator tmp(parentIterator);
389  --tmp;
390  return tmp.operator*();
391  }
392 
394  {
395  Iterator tmp(parentIterator);
396  --tmp;
397  return tmp.operator->();
398  }
399 
400  __HOST__ __DEVICE__ inline difference_type operator-( const reverse_device_iterator& other ) { return parentIterator - other.parentIterator; }
401 
404 
405  __HOST__ __DEVICE__ inline bool operator<( const reverse_device_iterator& other ) const { return parentIterator < other.parentIterator; }
406  __HOST__ __DEVICE__ inline bool operator>( const reverse_device_iterator& other ) const { return parentIterator > other.parentIterator; }
407  __HOST__ __DEVICE__ inline bool operator<=( const reverse_device_iterator& other ) const { return operator<(other) || operator==(other); }
408  __HOST__ __DEVICE__ inline bool operator>=( const reverse_device_iterator& other ) const { return operator>(other) || operator==(other); }
409 
410  __HOST__ __DEVICE__ inline reverse_device_iterator& operator+=( difference_type x ) { parentIterator -= x; return *this; }
411  __HOST__ __DEVICE__ inline reverse_device_iterator& operator-=( difference_type x ) { parentIterator += x; return *this; }
412 
413  __DEVICE__ reference operator[]( difference_type x ) const { return parentIterator.operator[]( -x-1 ); }
414 
416  {
417  parentIterator = other.parentIterator;
418  return *this;
419  }
420 
421  template<class Iterator2>
423  {
424  parentIterator = other.parentIterator;
425  return *this;
426  }
427 
428 };
429 
430 template<class Iterator>
431 class iterator_traits : private std::iterator_traits<Iterator>
432 {
433 private:
434  typedef std::iterator_traits<Iterator> base_type;
435 public:
436  typedef typename base_type::difference_type difference_type;
437  typedef typename base_type::iterator_category iterator_category;
438  typedef typename base_type::pointer pointer;
439  typedef typename base_type::reference reference;
440  typedef typename base_type::value_type value_type;
441  typedef ecuda::false_type is_device_iterator;
442  // is_contiguous (deliberately not present for host memory iterators)
443 };
444 
445 template<typename T,typename PointerType,typename Category>
446 class iterator_traits< device_iterator<T,PointerType,Category> > : private std::iterator_traits< device_iterator<T,PointerType,Category> >
447 {
448 private:
449  typedef std::iterator_traits< device_iterator<T,PointerType,Category> > base_type;
450 public:
451  typedef typename base_type::difference_type difference_type;
452  typedef typename base_type::iterator_category iterator_category;
453  typedef typename base_type::pointer pointer;
454  typedef typename base_type::reference reference;
455  typedef typename base_type::value_type value_type;
456  typedef ecuda::true_type is_device_iterator;
457  typedef ecuda::false_type is_contiguous;
458 };
459 
460 template<typename T>
461 class iterator_traits< device_contiguous_iterator<T> > : private std::iterator_traits< device_contiguous_iterator<T> >
462 {
463 private:
464  typedef std::iterator_traits< device_contiguous_iterator<T> > base_type;
465 public:
466  typedef typename base_type::difference_type difference_type;
467  typedef typename base_type::iterator_category iterator_category;
468  typedef typename base_type::pointer pointer;
469  typedef typename base_type::reference reference;
470  typedef typename base_type::value_type value_type;
471  typedef ecuda::true_type is_device_iterator;
472  typedef ecuda::true_type is_contiguous;
473 };
474 
475 template<typename T,typename P>
476 class iterator_traits< device_contiguous_block_iterator<T,P> > : private iterator_traits< device_iterator<T,padded_ptr<T,P>,device_contiguous_block_iterator_tag> >
477 {
478 private:
480 public:
483  typedef typename base_type::pointer pointer;
484  typedef typename base_type::reference reference;
487  typedef ecuda::true_type is_contiguous;
488 };
489 
490 template<typename Iterator>
491 class iterator_traits< reverse_device_iterator<Iterator> > : private std::iterator_traits< reverse_device_iterator<Iterator> >
492 {
493 private:
494  typedef std::iterator_traits< reverse_device_iterator<Iterator> > base_type;
495 public:
496  typedef typename base_type::difference_type difference_type;
497  typedef typename base_type::iterator_category iterator_category;
498  typedef typename base_type::pointer pointer;
499  typedef typename base_type::reference reference;
500  typedef typename base_type::value_type value_type;
501  typedef ecuda::true_type is_device_iterator;
502  typedef ecuda::false_type is_contiguous;
503 };
504 
505 template<typename T>
506 class iterator_traits<T*> : private std::iterator_traits<T*>
507 {
508 private:
509  typedef std::iterator_traits<T*> base_type;
510 public:
511  typedef typename base_type::difference_type difference_type;
512  typedef typename base_type::iterator_category iterator_category;
513  typedef typename base_type::pointer pointer;
514  typedef typename base_type::reference reference;
515  typedef typename base_type::value_type value_type;
516  typedef ecuda::false_type is_device_iterator;
517  // is_contiguous (deliberately not present for host memory iterators)
518 };
519 
521 namespace impl {
522 
523 template<class InputIterator, typename Distance>
524 __HOST__ __DEVICE__ inline
525 void advance(
526  InputIterator& iterator,
527  Distance n,
528  ecuda::true_type // device memory
529 )
530 {
531  typedef typename ecuda::iterator_traits<InputIterator>::iterator_category iterator_category;
532  typedef typename ecuda::iterator_traits<InputIterator>::is_contiguous iterator_contiguity;
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 ) {
537  iterator += n;
538  } else {
539  for( Distance i = 0; i < n; ++i ) ++iterator;
540  }
541 }
542 
543 template<class InputIterator, typename Distance>
544 __HOST__ __DEVICE__ inline
545 void advance(
546  InputIterator& iterator,
547  Distance n,
548  ecuda::false_type // host memory
549 )
550 {
551  #ifdef __CUDA_ARCH__
552  // never called from device code
553  #else
554  std::advance( iterator, n );
555  #endif
556 }
557 
558 } // namespace impl
560 
573 template<class InputIterator,typename Distance>
574 __HOST__ __DEVICE__ inline void advance( InputIterator& iterator, Distance n )
575 {
577 }
578 
580 namespace impl {
581 
582 template<class Iterator>
583 __HOST__ __DEVICE__ inline // yes, it's inline since the actual run-time portion always resolves to a few statements
584 typename std::iterator_traits<Iterator>::difference_type distance(
585  Iterator first, Iterator last,
586  ecuda::true_type // device memory
587 )
588 {
589  typedef typename ecuda::iterator_traits<Iterator>::iterator_category iterator_category;
590  typedef typename ecuda::iterator_traits<Iterator>::is_contiguous iterator_contiguity;
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;
594  #ifdef __CUDA_ARCH__
595  if( isIteratorSomeKindOfContiguous ) {
596  return ( last - first );
597  } else {
598  typename std::iterator_traits<Iterator>::difference_type n = 0;
599  while( first != last ) { ++n; ++first; }
600  return n;
601  }
602  #else
603  ECUDA_STATIC_ASSERT( isIteratorSomeKindOfContiguous, CANNOT_CALCULATE_DISTANCE_OF_NONCONTIGUOUS_DEVICE_ITERATOR_FROM_HOST_CODE );
604  return ( last - first );
605  #endif
606 }
607 
608 template<class Iterator>
609 __HOST__ __DEVICE__ inline
610 typename std::iterator_traits<Iterator>::difference_type distance(
611  const Iterator& first, const Iterator& last,
612  ecuda::false_type // host memory
613 )
614 {
615  #ifdef __CUDA_ARCH__
616  return 0; // never called from device code
617  #else
618  return std::distance( first, last );
619  #endif
620 }
621 
622 } // namespace impl
624 
626 template<class Iterator>
627 __HOST__ __DEVICE__ inline typename std::iterator_traits<Iterator>::difference_type distance( const Iterator& first, const Iterator& last )
628 {
630 }
631 
632 template<typename T,typename P>
634 inline
635 typename std::iterator_traits< device_contiguous_block_iterator<T,P> >::difference_type
637 {
638  return last - first;
639 }
640 
641 } // namespace ecuda
642 
643 #endif
__HOST__ __DEVICE__ device_iterator & operator--()
Definition: iterator.hpp:120
Iterator category denoting device memory.
Definition: iterator.hpp:57
base_type::iterator_category iterator_category
Definition: iterator.hpp:512
Category iterator_category
Definition: iterator.hpp:80
__HOST__ __DEVICE__ bool operator<=(const device_contiguous_iterator &other) const __NOEXCEPT__
Definition: iterator.hpp:189
__HOST__ __DEVICE__ device_iterator & operator++()
Definition: iterator.hpp:112
__HOST__ __DEVICE__ device_iterator operator++(int)
Definition: iterator.hpp:113
__HOST__ __DEVICE__ bool operator>=(const device_contiguous_iterator &other) const __NOEXCEPT__
Definition: iterator.hpp:190
base_type::iterator_category iterator_category
Definition: iterator.hpp:202
__HOST__ __DEVICE__ reverse_device_iterator & operator=(const reverse_device_iterator< Iterator2 > &other)
Definition: iterator.hpp:422
__DEVICE__ reference operator[](difference_type x) const
Definition: iterator.hpp:303
__HOST__ __DEVICE__ reverse_device_iterator & operator+=(difference_type x)
Definition: iterator.hpp:410
ECUDA_SUPPRESS_HD_WARNINGS __HOST__ __DEVICE__ void advance(InputIterator &iterator, Distance n)
Increments given iterator by n elements.
Definition: iterator.hpp:574
base_type::reference reference
Definition: iterator.hpp:514
__HOST__ __DEVICE__ bool operator!=(const device_iterator &other) const __NOEXCEPT__
Definition: iterator.hpp:129
__HOST__ __DEVICE__ device_iterator & operator=(const device_iterator &other)
Definition: iterator.hpp:97
Iterator category denoting device memory that is made of contiguous blocks (but the blocks themselves...
Definition: iterator.hpp:71
__HOST__ __DEVICE__ device_contiguous_block_iterator(const device_contiguous_block_iterator &src)
Definition: iterator.hpp:218
__HOST__ __DEVICE__ device_contiguous_iterator operator+(difference_type x) const
Definition: iterator.hpp:177
base_type::iterator_category iterator_category
Definition: iterator.hpp:437
base_type::iterator_category iterator_category
Definition: iterator.hpp:151
__HOST__ __DEVICE__ reverse_device_iterator & operator++()
Definition: iterator.hpp:367
base_type::pointer pointer
Definition: iterator.hpp:513
base_type::value_type value_type
Definition: iterator.hpp:342
__HOST__ __DEVICE__ reverse_device_iterator operator++(int)
Definition: iterator.hpp:368
__HOST__ __DEVICE__ device_iterator & operator=(const device_iterator< U, Q, Category > &other)
Definition: iterator.hpp:135
__HOST__ __DEVICE__ reverse_device_iterator(const reverse_device_iterator &src)
Definition: iterator.hpp:352
__HOST__ __DEVICE__ bool operator<(const device_contiguous_block_iterator &other) const __NOEXCEPT__
Definition: iterator.hpp:320
__HOST__ __DEVICE__ reverse_device_iterator(Iterator parentIterator=Iterator())
Definition: iterator.hpp:351
__HOST__ __DEVICE__ contiguous_iterator contiguous_end() const __NOEXCEPT__
Definition: iterator.hpp:326
Iterator category denoting contiguous device memory.
Definition: iterator.hpp:62
__HOST__ __DEVICE__ device_contiguous_block_iterator & operator-=(difference_type x)
Definition: iterator.hpp:301
__DEVICE__ reference operator[](difference_type x) const
Definition: iterator.hpp:183
__HOST__ __DEVICE__ bool operator>(const reverse_device_iterator &other) const
Definition: iterator.hpp:406
__HOST__ __DEVICE__ device_iterator(const device_iterator< U, Q, Category > &src)
Definition: iterator.hpp:95
device_contiguous_iterator< T > contiguous_iterator
Definition: iterator.hpp:209
__HOST__ __DEVICE__ device_contiguous_iterator & operator+=(difference_type x)
Definition: iterator.hpp:180
__HOST__ __DEVICE__ bool operator>=(const device_contiguous_block_iterator &other) const __NOEXCEPT__
Definition: iterator.hpp:323
__HOST__ __DEVICE__ std::size_t get_width() const __NOEXCEPT__
Definition: iterator.hpp:327
#define __NOEXCEPT__
Definition: global.hpp:140
base_type::value_type value_type
Definition: iterator.hpp:152
__HOST__ __DEVICE__ device_contiguous_iterator(const device_contiguous_iterator &src)
Definition: iterator.hpp:159
__HOST__ __DEVICE__ reverse_device_iterator operator-(difference_type x) const
Definition: iterator.hpp:403
#define __HOST__
Definition: global.hpp:150
__HOST__ __DEVICE__ pointer operator->() const
Definition: iterator.hpp:132
A specialized pointer to padded memory.
Definition: iterator.hpp:52
__HOST__ __DEVICE__ device_iterator(const device_iterator &src)
Definition: iterator.hpp:94
ecuda::false_type is_device_iterator
Definition: iterator.hpp:516
__HOST__ __DEVICE__ void swap(T &a, T &b) __NOEXCEPT__
Definition: algorithm.hpp:54
__HOST__ __DEVICE__ bool operator>(const device_contiguous_iterator &other) const __NOEXCEPT__
Definition: iterator.hpp:188
__HOST__ __DEVICE__ device_contiguous_block_iterator & operator++()
Definition: iterator.hpp:247
std::ptrdiff_t difference_type
Definition: iterator.hpp:82
base_type::reference reference
Definition: iterator.hpp:345
base_type::iterator_category iterator_category
Definition: iterator.hpp:341
__HOST__ __DEVICE__ contiguous_iterator contiguous_begin() const __NOEXCEPT__
Definition: iterator.hpp:325
__HOST__ __DEVICE__ difference_type operator-(const reverse_device_iterator &other)
Definition: iterator.hpp:400
ecuda::false_type is_device_iterator
Definition: iterator.hpp:441
__HOST__ __DEVICE__ bool operator<=(const device_contiguous_block_iterator &other) const __NOEXCEPT__
Definition: iterator.hpp:322
__HOST__ __DEVICE__ Iterator base() const
Definition: iterator.hpp:365
__DEVICE__ reference operator[](difference_type x) const
Definition: iterator.hpp:413
__HOST__ __DEVICE__ device_contiguous_block_iterator & operator+=(difference_type x)
Definition: iterator.hpp:290
__HOST__ __DEVICE__ device_contiguous_block_iterator & operator=(const device_contiguous_block_iterator &src)
Definition: iterator.hpp:222
__HOST__ __DEVICE__ difference_type operator-(const device_contiguous_block_iterator &other) const
Definition: iterator.hpp:305
__HOST__ __DEVICE__ device_iterator operator--(int)
Definition: iterator.hpp:121
__HOST__ __DEVICE__ bool operator>(const device_contiguous_block_iterator &other) const __NOEXCEPT__
Definition: iterator.hpp:321
__HOST__ __DEVICE__ device_contiguous_block_iterator operator-(difference_type x) const
Definition: iterator.hpp:288
__HOST__ __DEVICE__ device_contiguous_block_iterator & operator--()
Definition: iterator.hpp:264
__HOST__ __DEVICE__ reverse_device_iterator & operator-=(difference_type x)
Definition: iterator.hpp:411
__HOST__ __DEVICE__ pointer operator->() const
Definition: iterator.hpp:393
__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)
Definition: iterator.hpp:636
__DEVICE__ reference operator*()
Definition: iterator.hpp:131
base_type::reference reference
Definition: iterator.hpp:439
__HOST__ __DEVICE__ reverse_device_iterator(const reverse_device_iterator< Iterator2 > &src)
Definition: iterator.hpp:354
__HOST__ __DEVICE__ bool operator==(const reverse_device_iterator &other) const
Definition: iterator.hpp:383
__DEVICE__ reference operator*() const
Definition: iterator.hpp:386
#define ECUDA_STATIC_ASSERT(x, msg)
Definition: global.hpp:191
__HOST__ __DEVICE__ device_contiguous_block_iterator(const device_contiguous_block_iterator< U, Q > &src)
Definition: iterator.hpp:220
base_type::pointer pointer
Definition: iterator.hpp:344
__HOST__ __DEVICE__ device_contiguous_iterator operator-(difference_type x) const
Definition: iterator.hpp:178
__HOST__ __DEVICE__ device_contiguous_block_iterator(const pointer &ptr=pointer(), const difference_type width=difference_type(), const difference_type offset=difference_type())
Definition: iterator.hpp:217
__HOST__ __DEVICE__ device_contiguous_iterator(const device_contiguous_iterator< U > &src)
Definition: iterator.hpp:160
base_type::pointer pointer
Definition: iterator.hpp:438
__HOST__ __DEVICE__ device_iterator(const pointer &ptr=pointer())
Definition: iterator.hpp:93
base_type::difference_type difference_type
Definition: iterator.hpp:436
base_type::difference_type difference_type
Definition: iterator.hpp:511
#define __DEVICE__
Definition: global.hpp:151
__HOST__ __DEVICE__ device_contiguous_block_iterator operator--(int)
Definition: iterator.hpp:274
__HOST__ __DEVICE__ bool operator<=(const reverse_device_iterator &other) const
Definition: iterator.hpp:407
__HOST__ __DEVICE__ bool operator!=(const reverse_device_iterator &other) const
Definition: iterator.hpp:384
#define ECUDA_SUPPRESS_HD_WARNINGS
Definition: global.hpp:58
base_type::value_type value_type
Definition: iterator.hpp:515
__HOST__ __DEVICE__ reverse_device_iterator operator+(difference_type x) const
Definition: iterator.hpp:402
ecuda::add_lvalue_reference< T >::type reference
Definition: iterator.hpp:84
__HOST__ __DEVICE__ device_contiguous_iterator & operator=(const device_contiguous_iterator &other)
Definition: iterator.hpp:162
__HOST__ __DEVICE__ reverse_device_iterator & operator=(const reverse_device_iterator &other)
Definition: iterator.hpp:415
base_type::difference_type difference_type
Definition: iterator.hpp:204
__HOST__ __DEVICE__ bool operator<(const device_contiguous_iterator &other) const __NOEXCEPT__
Definition: iterator.hpp:187
__HOST__ __DEVICE__ bool operator==(const device_iterator &other) const __NOEXCEPT__
Definition: iterator.hpp:128
base_type::difference_type difference_type
Definition: iterator.hpp:343
__HOST__ __DEVICE__ device_contiguous_block_iterator operator+(difference_type x) const
Definition: iterator.hpp:281
__HOST__ __DEVICE__ bool operator<(const reverse_device_iterator &other) const
Definition: iterator.hpp:405
base_type::difference_type difference_type
Definition: iterator.hpp:153
__HOST__ __DEVICE__ device_contiguous_block_iterator operator++(int)
Definition: iterator.hpp:257
__HOST__ __DEVICE__ reverse_device_iterator & operator--()
Definition: iterator.hpp:375
__HOST__ __DEVICE__ reverse_device_iterator operator--(int)
Definition: iterator.hpp:376
friend class device_iterator
Definition: iterator.hpp:86
__HOST__ __DEVICE__ difference_type operator-(const device_contiguous_iterator &other)
Definition: iterator.hpp:185
__HOST__ __DEVICE__ device_contiguous_iterator(const pointer &ptr=pointer())
Definition: iterator.hpp:158
__HOST__ __DEVICE__ std::size_t get_offset() const __NOEXCEPT__
Definition: iterator.hpp:328
__HOST__ __DEVICE__ device_contiguous_iterator & operator-=(difference_type x)
Definition: iterator.hpp:181
ECUDA_SUPPRESS_HD_WARNINGS __HOST__ __DEVICE__ std::iterator_traits< Iterator >::difference_type distance(const Iterator &first, const Iterator &last)
Definition: iterator.hpp:627
__HOST__ __DEVICE__ bool operator>=(const reverse_device_iterator &other) const
Definition: iterator.hpp:408
base_type::value_type value_type
Definition: iterator.hpp:440
base_type::reference reference
Definition: iterator.hpp:155