18 #ifndef viskores_cont_internal_IteratorFromArrayPortal_h
19 #define viskores_cont_internal_IteratorFromArrayPortal_h
32 template <
class ArrayPortalType>
33 class IteratorFromArrayPortal
36 using value_type =
typename std::remove_const<typename ArrayPortalType::ValueType>::type;
37 using reference = viskores::internal::ArrayPortalValueReference<ArrayPortalType>;
38 using pointer =
typename std::add_pointer<value_type>::type;
40 using difference_type = std::ptrdiff_t;
42 using iterator_category = std::random_access_iterator_tag;
44 using iter = IteratorFromArrayPortal<ArrayPortalType>;
48 IteratorFromArrayPortal()
56 explicit IteratorFromArrayPortal(
const ArrayPortalType& portal,
viskores::Id index = 0)
65 reference
operator*()
const {
return reference(this->Portal, this->
Index); }
68 reference operator->()
const {
return reference(this->Portal, this->
Index); }
71 reference operator[](difference_type idx)
const
85 iter operator++(
int) {
return iter(this->Portal, this->
Index++); }
96 iter operator--(
int) {
return iter(this->Portal, this->
Index--); }
99 iter& operator+=(difference_type n)
107 iter& operator-=(difference_type n)
120 ArrayPortalType Portal;
124 template <
class ArrayPortalType>
126 const ArrayPortalType& portal)
128 return IteratorFromArrayPortal<ArrayPortalType>(portal, 0);
131 template <
class ArrayPortalType>
133 const ArrayPortalType& portal)
135 return IteratorFromArrayPortal<ArrayPortalType>(portal, portal.GetNumberOfValues());
138 template <
typename PortalType>
140 viskores::cont::internal::IteratorFromArrayPortal<PortalType>
const& lhs,
141 viskores::cont::internal::IteratorFromArrayPortal<PortalType>
const& rhs)
143 return lhs.Index == rhs.Index;
146 template <
typename PortalType>
148 viskores::cont::internal::IteratorFromArrayPortal<PortalType>
const& lhs,
149 viskores::cont::internal::IteratorFromArrayPortal<PortalType>
const& rhs)
151 return lhs.Index != rhs.Index;
154 template <
typename PortalType>
156 viskores::cont::internal::IteratorFromArrayPortal<PortalType>
const& lhs,
157 viskores::cont::internal::IteratorFromArrayPortal<PortalType>
const& rhs)
159 return lhs.Index < rhs.Index;
162 template <
typename PortalType>
164 viskores::cont::internal::IteratorFromArrayPortal<PortalType>
const& lhs,
165 viskores::cont::internal::IteratorFromArrayPortal<PortalType>
const& rhs)
167 return lhs.Index <= rhs.Index;
170 template <
typename PortalType>
172 viskores::cont::internal::IteratorFromArrayPortal<PortalType>
const& lhs,
173 viskores::cont::internal::IteratorFromArrayPortal<PortalType>
const& rhs)
175 return lhs.Index > rhs.Index;
178 template <
typename PortalType>
180 viskores::cont::internal::IteratorFromArrayPortal<PortalType>
const& lhs,
181 viskores::cont::internal::IteratorFromArrayPortal<PortalType>
const& rhs)
183 return lhs.Index >= rhs.Index;
186 template <
typename PortalType>
188 viskores::cont::internal::IteratorFromArrayPortal<PortalType>
const& lhs,
189 viskores::cont::internal::IteratorFromArrayPortal<PortalType>
const& rhs)
191 return lhs.Index - rhs.Index;
194 template <
typename PortalType>
196 viskores::cont::internal::IteratorFromArrayPortal<PortalType>
const& iter,
199 return viskores::cont::internal::IteratorFromArrayPortal<PortalType>(
200 iter.Portal, iter.Index +
static_cast<viskores::Id>(n));
203 template <
typename PortalType>
206 viskores::cont::internal::IteratorFromArrayPortal<PortalType>
const& iter)
208 return viskores::cont::internal::IteratorFromArrayPortal<PortalType>(
209 iter.Portal, iter.Index +
static_cast<viskores::Id>(n));
215 #endif //viskores_cont_internal_IteratorFromArrayPortal_h