35 #include <thrust/detail/config.h> 36 #include <thrust/detail/type_traits.h> 37 #include <thrust/iterator/detail/iterator_facade_category.h> 38 #include <thrust/iterator/detail/distance_from_result.h> 40 THRUST_NAMESPACE_BEGIN
54 template<
typename Derived,
typename Value,
typename System,
typename Traversal,
typename Reference,
typename Difference>
class iterator_facade;
66 template<
typename Derived,
typename Value,
typename System,
typename Traversal,
typename Reference,
typename Difference>
friend class iterator_facade;
69 template <
typename Derived1,
typename Value1,
typename System1,
typename Traversal1,
typename Reference1,
typename Difference1,
70 typename Derived2,
typename Value2,
typename System2,
typename Traversal2,
typename Reference2,
typename Difference2>
71 inline __host__ __device__
76 template <
typename Derived1,
typename Value1,
typename System1,
typename Traversal1,
typename Reference1,
typename Difference1,
77 typename Derived2,
typename Value2,
typename System2,
typename Traversal2,
typename Reference2,
typename Difference2>
78 inline __host__ __device__
83 template <
typename Derived1,
typename Value1,
typename System1,
typename Traversal1,
typename Reference1,
typename Difference1,
84 typename Derived2,
typename Value2,
typename System2,
typename Traversal2,
typename Reference2,
typename Difference2>
85 inline __host__ __device__
87 operator <(iterator_facade<Derived1,Value1,System1,Traversal1,Reference1,Difference1>
const& lhs,
90 template <
typename Derived1,
typename Value1,
typename System1,
typename Traversal1,
typename Reference1,
typename Difference1,
91 typename Derived2,
typename Value2,
typename System2,
typename Traversal2,
typename Reference2,
typename Difference2>
92 inline __host__ __device__
97 template <
typename Derived1,
typename Value1,
typename System1,
typename Traversal1,
typename Reference1,
typename Difference1,
98 typename Derived2,
typename Value2,
typename System2,
typename Traversal2,
typename Reference2,
typename Difference2>
99 inline __host__ __device__
101 operator <=(iterator_facade<Derived1,Value1,System1,Traversal1,Reference1,Difference1>
const& lhs,
104 template <
typename Derived1,
typename Value1,
typename System1,
typename Traversal1,
typename Reference1,
typename Difference1,
105 typename Derived2,
typename Value2,
typename System2,
typename Traversal2,
typename Reference2,
typename Difference2>
106 inline __host__ __device__
112 template <
typename Derived1,
typename Value1,
typename System1,
typename Traversal1,
typename Reference1,
typename Difference1,
113 typename Derived2,
typename Value2,
typename System2,
typename Traversal2,
typename Reference2,
typename Difference2>
114 inline __host__ __device__
116 typename thrust::detail::distance_from_result<
120 operator-(iterator_facade<Derived1,Value1,System1,Traversal1,Reference1,Difference1>
const& lhs,
123 template<
typename Facade>
127 return f.dereference();
130 template<
typename Facade>
132 static void increment(Facade& f)
137 template<
typename Facade>
139 static void decrement(Facade& f)
144 template <
class Facade1,
class Facade2>
146 static bool equal(Facade1
const& f1, Facade2
const& f2)
166 template <
class Facade>
168 static void advance(Facade& f,
typename Facade::difference_type n)
175 template <
class Facade1,
class Facade2>
177 static typename Facade1::difference_type
178 distance_from(Facade1
const& f1, Facade2
const& f2, thrust::detail::true_type)
180 return -f1.distance_to(f2);
185 template <
class Facade1,
class Facade2>
187 static typename Facade2::difference_type
188 distance_from(Facade1
const& f1, Facade2
const& f2, thrust::detail::false_type)
190 return f2.distance_to(f1);
193 template <
class Facade1,
class Facade2>
195 static typename thrust::detail::distance_from_result<Facade1,Facade2>::type
196 distance_from(Facade1
const& f1, Facade2
const& f2)
200 return distance_from(f1, f2,
201 typename thrust::detail::is_convertible<Facade2,Facade1>::type());
207 template <
typename Derived,
typename Value,
typename System,
typename Traversal,
typename Reference,
typename Difference>
211 return *
static_cast<Derived*
>(&facade);
214 template <
typename Derived,
typename Value,
typename System,
typename Traversal,
typename Reference,
typename Difference>
218 return *
static_cast<Derived const*
>(&facade);
245 template<
typename Derived,
250 typename Difference = std::ptrdiff_t>
263 return *
static_cast<Derived*
>(
this);
267 Derived
const& derived()
const 269 return *
static_cast<Derived const*
>(
this);
277 typedef typename thrust::detail::remove_const<Value>::type
value_type;
299 typedef typename thrust::detail::iterator_facade_category<
300 System, Traversal, Value, Reference
309 return iterator_core_access::dereference(this->derived());
327 return *(this->derived() + n);
336 iterator_core_access::increment(this->derived());
337 return this->derived();
346 Derived tmp(this->derived());
357 iterator_core_access::decrement(this->derived());
358 return this->derived();
367 Derived tmp(this->derived());
380 return this->derived();
391 return this->derived();
401 Derived result(this->derived());
410 template <
typename Derived1,
typename Value1,
typename System1,
typename Traversal1,
typename Reference1,
typename Difference1,
411 typename Derived2,
typename Value2,
typename System2,
typename Traversal2,
typename Reference2,
typename Difference2>
412 inline __host__ __device__
420 ::equal(*static_cast<Derived1 const*>(&lhs),
421 *static_cast<Derived2 const*>(&rhs));
424 template <
typename Derived1,
typename Value1,
typename System1,
typename Traversal1,
typename Reference1,
typename Difference1,
425 typename Derived2,
typename Value2,
typename System2,
typename Traversal2,
typename Reference2,
typename Difference2>
426 inline __host__ __device__
434 ::equal(*static_cast<Derived1 const*>(&lhs),
435 *static_cast<Derived2 const*>(&rhs));
438 template <
typename Derived1,
typename Value1,
typename System1,
typename Traversal1,
typename Reference1,
typename Difference1,
439 typename Derived2,
typename Value2,
typename System2,
typename Traversal2,
typename Reference2,
typename Difference2>
440 inline __host__ __device__
444 operator <(iterator_facade<Derived1,Value1,System1,Traversal1,Reference1,Difference1>
const& lhs,
447 return 0 > iterator_core_access
448 ::distance_from(*static_cast<Derived1 const*>(&lhs),
449 *static_cast<Derived2 const*>(&rhs));
452 template <
typename Derived1,
typename Value1,
typename System1,
typename Traversal1,
typename Reference1,
typename Difference1,
453 typename Derived2,
typename Value2,
typename System2,
typename Traversal2,
typename Reference2,
typename Difference2>
454 inline __host__ __device__
461 return 0 < iterator_core_access
462 ::distance_from(*static_cast<Derived1 const*>(&lhs),
463 *static_cast<Derived2 const*>(&rhs));
466 template <
typename Derived1,
typename Value1,
typename System1,
typename Traversal1,
typename Reference1,
typename Difference1,
467 typename Derived2,
typename Value2,
typename System2,
typename Traversal2,
typename Reference2,
typename Difference2>
468 inline __host__ __device__
472 operator <=(iterator_facade<Derived1,Value1,System1,Traversal1,Reference1,Difference1>
const& lhs,
475 return 0 >= iterator_core_access
476 ::distance_from(*static_cast<Derived1 const*>(&lhs),
477 *static_cast<Derived2 const*>(&rhs));
480 template <
typename Derived1,
typename Value1,
typename System1,
typename Traversal1,
typename Reference1,
typename Difference1,
481 typename Derived2,
typename Value2,
typename System2,
typename Traversal2,
typename Reference2,
typename Difference2>
482 inline __host__ __device__
489 return 0 <= iterator_core_access
490 ::distance_from(*static_cast<Derived1 const*>(&lhs),
491 *static_cast<Derived2 const*>(&rhs));
495 template <
typename Derived1,
typename Value1,
typename System1,
typename Traversal1,
typename Reference1,
typename Difference1,
496 typename Derived2,
typename Value2,
typename System2,
typename Traversal2,
typename Reference2,
typename Difference2>
497 inline __host__ __device__
500 typename thrust::detail::distance_from_result<
508 return iterator_core_access
509 ::distance_from(*static_cast<Derived1 const*>(&lhs),
510 *static_cast<Derived2 const*>(&rhs));
514 template <
typename Derived,
typename Value,
typename System,
typename Traversal,
typename Reference,
typename Difference>
515 inline __host__ __device__
517 typename Derived::difference_type n)
519 Derived tmp(static_cast<Derived const&>(i));
523 template <
typename Derived,
typename Value,
typename System,
typename Traversal,
typename Reference,
typename Difference>
524 inline __host__ __device__
525 Derived
operator+ (
typename Derived::difference_type n,
528 Derived tmp(static_cast<Derived const&>(i));
__host__ __device__ Derived & operator++()
Definition: iterator_facade.h:334
Reference reference
Definition: iterator_facade.h:281
__host__ __device__ reference operator*() const
Definition: iterator_facade.h:307
__host__ __device__ complex< typename detail::promoted_numerical_type< T0, T1 >::type > operator-(const complex< T0 > &x, const complex< T1 > &y)
thrust::reference< T, thrust::system::cpp::tag > reference
Definition: pointer.h:98
__host__ __device__ void advance(InputIterator &i, Distance n)
Definition: iterator_facade.h:60
__host__ __device__ Derived operator--(int)
Definition: iterator_facade.h:365
__host__ __device__ bool operator>=(const pair< T1, T2 > &x, const pair< T1, T2 > &y)
__host__ __device__ Derived & operator--()
Definition: iterator_facade.h:355
__host__ __device__ bool equal(const thrust::detail::execution_policy_base< DerivedPolicy > &exec, InputIterator1 first1, InputIterator1 last1, InputIterator2 first2)
__host__ __device__ reference operator[](difference_type n) const
Definition: iterator_facade.h:325
__host__ __device__ Derived operator-(difference_type n) const
Definition: iterator_facade.h:399
thrust::detail::iterator_facade_category< System, Traversal, Value, Reference >::type iterator_category
Definition: iterator_facade.h:301
__host__ __device__ complex< typename detail::promoted_numerical_type< T0, T1 >::type > operator+(const complex< T0 > &x, const complex< T1 > &y)
__host__ __device__ bool operator!=(const complex< T0 > &x, const complex< T1 > &y)
__host__ __device__ Derived & operator-=(difference_type n)
Definition: iterator_facade.h:388
thrust::detail::remove_const< Value >::type value_type
Definition: iterator_facade.h:277
Definition: iterator_facade.h:54
Difference difference_type
Definition: iterator_facade.h:295
__host__ __device__ bool operator==(const complex< T0 > &x, const complex< T1 > &y)
__host__ __device__ Derived operator++(int)
Definition: iterator_facade.h:344
void pointer
Definition: iterator_facade.h:290
__host__ __device__ bool operator>(const pair< T1, T2 > &x, const pair< T1, T2 > &y)
__host__ __device__ Derived & operator+=(difference_type n)
Definition: iterator_facade.h:377