10 #ifndef vtk_m_exec_cuda_internal_IteratorFromArrayPortal_h
11 #define vtk_m_exec_cuda_internal_IteratorFromArrayPortal_h
20 VTKM_THIRDPARTY_PRE_INCLUDE
21 #include <thrust/functional.h>
22 #include <thrust/iterator/iterator_facade.h>
23 #include <thrust/system/cuda/execution_policy.h>
24 VTKM_THIRDPARTY_POST_INCLUDE
35 template <
class ArrayPortalType>
36 class IteratorFromArrayPortal
37 :
public ::thrust::iterator_facade<IteratorFromArrayPortal<ArrayPortalType>,
38 typename ArrayPortalType::ValueType,
39 ::thrust::system::cuda::tag,
40 ::thrust::random_access_traversal_tag,
41 vtkm::internal::ArrayPortalValueReference<ArrayPortalType>,
46 IteratorFromArrayPortal()
53 explicit IteratorFromArrayPortal(
const ArrayPortalType& portal,
vtkm::Id index = 0)
60 vtkm::internal::ArrayPortalValueReference<ArrayPortalType> operator[](
61 std::ptrdiff_t idx)
const
63 return vtkm::internal::ArrayPortalValueReference<ArrayPortalType>(
68 ArrayPortalType Portal;
72 friend class ::thrust::iterator_core_access;
75 vtkm::internal::ArrayPortalValueReference<ArrayPortalType> dereference()
const
77 return vtkm::internal::ArrayPortalValueReference<ArrayPortalType>(this->Portal, this->Index);
81 bool equal(
const IteratorFromArrayPortal<ArrayPortalType>& other)
const
87 return (this->Index == other.Index);
91 void increment() { this->Index++; }
94 void decrement() { this->Index--; }
97 void advance(std::ptrdiff_t delta) { this->Index +=
static_cast<vtkm::Id>(delta); }
100 std::ptrdiff_t distance_to(
const IteratorFromArrayPortal<ArrayPortalType>& other)
const
106 return static_cast<std::ptrdiff_t
>(other.Index - this->
Index);
127 template <
typename T>
128 struct is_non_const_reference;
130 template <
typename T>
131 struct is_non_const_reference<
vtkm::internal::ArrayPortalValueReference<T>>
132 : thrust::detail::true_type
138 #endif //vtk_m_exec_cuda_internal_IteratorFromArrayPortal_h