18 #ifndef viskores_cont_internal_ArrayPortalFromIterators_h
19 #define viskores_cont_internal_ArrayPortalFromIterators_h
30 #include <type_traits>
39 template <
typename IteratorT,
typename Enable =
void>
40 class ArrayPortalFromIterators;
45 template <
class IteratorT>
46 class ArrayPortalFromIterators<IteratorT,
47 typename std::enable_if<!std::is_const<
48 typename std::remove_pointer<IteratorT>::type>::value>::type>
51 using ValueType =
typename std::iterator_traits<IteratorT>::value_type;
52 using IteratorType = IteratorT;
54 ArrayPortalFromIterators() =
default;
58 ArrayPortalFromIterators(IteratorT begin, IteratorT end)
59 : BeginIterator(begin)
61 typename std::iterator_traits<IteratorT>::difference_type numberOfValues =
62 std::distance(begin, end);
64 #ifndef VISKORES_USE_64BIT_IDS
65 if (numberOfValues > (std::numeric_limits<viskores::Id>::max)())
68 "Distance of iterators larger than maximum array size. "
69 "To support larger arrays, try turning on VISKORES_USE_64BIT_IDS.");
71 #endif // !VISKORES_USE_64BIT_IDS
72 this->NumberOfValues =
static_cast<viskores::Id>(numberOfValues);
79 template <
class OtherIteratorT>
80 VISKORES_EXEC_CONT ArrayPortalFromIterators(
const ArrayPortalFromIterators<OtherIteratorT>& src)
81 : BeginIterator(src.GetIteratorBegin())
82 , NumberOfValues(src.GetNumberOfValues())
88 viskores::Id GetNumberOfValues()
const {
return this->NumberOfValues; }
92 ValueType
Get(
viskores::Id index)
const {
return *this->IteratorAt(index); }
96 void Set(
viskores::Id index,
const ValueType& value)
const
98 *(this->BeginIterator + index) = value;
103 IteratorT GetIteratorBegin()
const {
return this->BeginIterator; }
107 IteratorT GetIteratorEnd()
const
109 IteratorType iterator = this->BeginIterator;
110 using difference_type =
typename std::iterator_traits<IteratorType>::difference_type;
111 iterator +=
static_cast<difference_type
>(this->NumberOfValues);
116 IteratorT BeginIterator;
126 return this->BeginIterator + index;
130 template <
class IteratorT>
131 class ArrayPortalFromIterators<IteratorT,
132 typename std::enable_if<std::is_const<
133 typename std::remove_pointer<IteratorT>::type>::value>::type>
136 using ValueType =
typename std::iterator_traits<IteratorT>::value_type;
137 using IteratorType = IteratorT;
141 ArrayPortalFromIterators()
142 : BeginIterator(nullptr)
149 ArrayPortalFromIterators(IteratorT begin, IteratorT end)
150 : BeginIterator(begin)
152 typename std::iterator_traits<IteratorT>::difference_type numberOfValues =
153 std::distance(begin, end);
155 #ifndef VISKORES_USE_64BIT_IDS
156 if (numberOfValues > (std::numeric_limits<viskores::Id>::max)())
159 "Distance of iterators larger than maximum array size. "
160 "To support larger arrays, try turning on VISKORES_USE_64BIT_IDS.");
162 #endif // !VISKORES_USE_64BIT_IDS
163 this->NumberOfValues =
static_cast<viskores::Id>(numberOfValues);
171 template <
class OtherIteratorT>
172 VISKORES_EXEC_CONT ArrayPortalFromIterators(
const ArrayPortalFromIterators<OtherIteratorT>& src)
173 : BeginIterator(src.GetIteratorBegin())
174 , NumberOfValues(src.GetNumberOfValues())
180 viskores::Id GetNumberOfValues()
const {
return this->NumberOfValues; }
184 ValueType
Get(
viskores::Id index)
const {
return *this->IteratorAt(index); }
188 IteratorT GetIteratorBegin()
const {
return this->BeginIterator; }
192 IteratorT GetIteratorEnd()
const
194 using difference_type =
typename std::iterator_traits<IteratorType>::difference_type;
195 IteratorType iterator = this->BeginIterator;
196 iterator +=
static_cast<difference_type
>(this->NumberOfValues);
201 IteratorT BeginIterator;
211 return this->BeginIterator + index;
218 #endif //viskores_cont_internal_ArrayPortalFromIterators_h