8 #ifndef MULTI_ARRAY_ITERATOR_OPENFPM_HPP_
9 #define MULTI_ARRAY_ITERATOR_OPENFPM_HPP_
18 #include "boost/iterator/iterator_facade.hpp"
23 #include "util/cuda_util.hpp"
33 T* operator->()
const {
return &value_; }
36 operator T*()
const {
return &value_; }
44 template <
typename T,
typename TPtr,
typename NumDims,
typename vector,
typename Reference,
45 typename IteratorCategory>
48 template <
typename T,
typename TPtr,
typename NumDims,
typename vector,
typename Reference,
49 typename IteratorCategory>
52 boost::iterator_facade<
53 array_iterator_openfpm<T,TPtr,NumDims,vector,Reference,IteratorCategory>
54 , typename associated_types_openfpm<T,NumDims,vector>::value_type
61 friend class iterator_core_access;
64 typedef boost::iterator_facade<
67 , boost::random_access_traversal_tag
71 typedef typename access_t::index index;
72 typedef typename access_t::size_type size_type;
74 #ifndef BOOST_NO_MEMBER_TEMPLATE_FRIENDS
75 template <
typename,
typename,
typename,
typename,
typename,
typename>
83 const size_type extent;
84 const index* strides_;
88 typedef typename facade_type::reference reference;
89 typedef typename facade_type::value_type value_type;
90 typedef typename facade_type::difference_type difference_type;
91 typedef typename std::random_access_iterator_tag iterator_category;
95 __device__ __host__
array_iterator_openfpm(index idx,TPtr base,
const size_type extent,
const index* strides)
96 :idx_(idx), base_(base), extent(extent),strides_(strides)
99 template <
typename OPtr,
typename ORef,
typename Cat>
102 ,
typename boost::enable_if_convertible<OPtr,TPtr>::type* = 0
104 : idx_(rhs.idx_), base_(rhs.base_), extent(rhs.extent),strides_(rhs.strides_)
116 reference dereference()
const
118 typedef typename value_accessor_generator_openfpm<T,NumDims,vector>::type accessor;
119 return accessor::access(boost::type<reference>(),
125 void increment() { ++idx_; }
126 void decrement() { --idx_; }
128 template <
class IteratorAdaptor>
129 bool equal(IteratorAdaptor& rhs)
const {
130 const std::size_t N = NumDims::value;
131 return (idx_ == rhs.idx_) &&
132 (base_ == rhs.base_) &&
133 (extent == rhs.extent) &&
134 ( (strides_ == rhs.strides_) ||
135 std::equal(strides_,strides_+N,rhs.strides_) );
138 template <
class DifferenceType>
139 void advance(DifferenceType n) {
143 template <
class IteratorAdaptor>
144 typename facade_type::difference_type
145 distance_to(IteratorAdaptor& rhs)
const {
146 return rhs.idx_ - idx_;
This class is a trick to indicate the compiler a specific specialization pattern.
Implementation of 1-D std::vector like structure.
convert a type into constant type