21 #ifndef __TBB_iterators_H 22 #define __TBB_iterators_H 30 #if __TBB_CPP11_PRESENT 32 #include <type_traits> 36 template <
typename IntType>
37 class counting_iterator {
38 __TBB_STATIC_ASSERT(std::numeric_limits<IntType>::is_integer,
"Cannot instantiate counting_iterator with a non-integer type");
41 typedef IntType value_type;
42 typedef const IntType* pointer;
43 typedef const IntType& reference;
44 typedef std::random_access_iterator_tag iterator_category;
46 counting_iterator(): my_counter() {}
47 explicit counting_iterator(IntType init): my_counter(init) {}
49 reference operator*()
const {
return my_counter; }
50 value_type operator[](difference_type i)
const {
return *(*
this + i); }
52 difference_type
operator-(
const counting_iterator& it)
const {
return my_counter - it.my_counter; }
54 counting_iterator& operator+=(difference_type forward) { my_counter += forward;
return *
this; }
55 counting_iterator& operator-=(difference_type backward) {
return *
this += -backward; }
56 counting_iterator& operator++() {
return *
this += 1; }
57 counting_iterator& operator--() {
return *
this -= 1; }
59 counting_iterator operator++(
int) {
60 counting_iterator it(*
this);
64 counting_iterator operator--(
int) {
65 counting_iterator it(*
this);
70 counting_iterator
operator-(difference_type backward)
const {
return counting_iterator(my_counter - backward); }
71 counting_iterator
operator+(difference_type forward)
const {
return counting_iterator(my_counter + forward); }
72 friend counting_iterator
operator+(difference_type forward,
const counting_iterator it) {
return it + forward; }
74 bool operator==(
const counting_iterator& it)
const {
return *
this - it == 0; }
75 bool operator!=(
const counting_iterator& it)
const {
return !(*
this == it); }
76 bool operator<(
const counting_iterator& it)
const {
return *
this - it < 0; }
77 bool operator>(
const counting_iterator& it)
const {
return it < *
this; }
78 bool operator<=(
const counting_iterator& it)
const {
return !(*
this > it); }
79 bool operator>=(
const counting_iterator& it)
const {
return !(*
this < it); }
96 template<
typename TupleType,
typename DifferenceType>
97 static void increment(TupleType& it, DifferenceType forward) {
98 std::get<N-1>(it) += forward;
99 tuple_util<N-1>::increment(it, forward);
101 template<
typename TupleType,
typename DifferenceType>
102 static bool check_sync(
const TupleType& it1,
const TupleType& it2, DifferenceType val) {
103 if(std::get<N-1>(it1) - std::get<N-1>(it2) != val)
105 return tuple_util<N-1>::check_sync(it1, it2, val);
110 struct tuple_util<0> {
111 template<
typename TupleType,
typename DifferenceType>
112 static void increment(TupleType&, DifferenceType) {}
113 template<
typename TupleType,
typename DifferenceType>
114 static bool check_sync(
const TupleType&,
const TupleType&, DifferenceType) {
return true;}
117 template <
typename TupleReturnType>
118 struct make_references {
119 template <
typename TupleType, std::size_t... Is>
121 return std::tie((*std::get<Is>(t))...);
127 template <
typename... Types>
129 __TBB_STATIC_ASSERT(
sizeof...(Types),
"Cannot instantiate zip_iterator with empty template parameter pack");
130 static const std::size_t num_types =
sizeof...(Types);
131 typedef typename std::tuple<Types...> it_types;
134 typedef std::tuple<typename std::iterator_traits<Types>::value_type...> value_type;
135 typedef std::tuple<typename std::iterator_traits<Types>::reference...> reference;
136 typedef std::tuple<typename std::iterator_traits<Types>::pointer...> pointer;
137 typedef std::random_access_iterator_tag iterator_category;
139 zip_iterator(): my_it() {}
140 explicit zip_iterator(Types... args): my_it(
std::make_tuple(args...)) {}
141 zip_iterator(
const zip_iterator& input) : my_it(input.my_it) {}
142 zip_iterator& operator=(
const zip_iterator& input) {
147 reference operator*()
const {
150 reference operator[](difference_type i)
const {
return *(*
this + i); }
152 difference_type
operator-(
const zip_iterator& it)
const {
153 __TBB_ASSERT(internal::tuple_util<num_types>::check_sync(my_it, it.my_it, std::get<0>(my_it) - std::get<0>(it.my_it)),
154 "Components of zip_iterator are not synchronous");
155 return std::get<0>(my_it) - std::get<0>(it.my_it);
158 zip_iterator& operator+=(difference_type forward) {
159 internal::tuple_util<num_types>::increment(my_it, forward);
162 zip_iterator& operator-=(difference_type backward) {
return *
this += -backward; }
163 zip_iterator& operator++() {
return *
this += 1; }
164 zip_iterator& operator--() {
return *
this -= 1; }
166 zip_iterator operator++(
int) {
167 zip_iterator it(*
this);
171 zip_iterator operator--(
int) {
172 zip_iterator it(*
this);
177 zip_iterator
operator-(difference_type backward)
const {
178 zip_iterator it(*
this);
179 return it -= backward;
181 zip_iterator
operator+(difference_type forward)
const {
182 zip_iterator it(*
this);
183 return it += forward;
185 friend zip_iterator
operator+(difference_type forward,
const zip_iterator& it) {
return it + forward; }
187 bool operator==(
const zip_iterator& it)
const {
188 return *
this - it == 0;
190 bool operator!=(
const zip_iterator& it)
const {
return !(*
this == it); }
191 bool operator<(
const zip_iterator& it)
const {
return *
this - it < 0; }
192 bool operator>(
const zip_iterator& it)
const {
return it < *
this; }
193 bool operator<=(
const zip_iterator& it)
const {
return !(*
this > it); }
194 bool operator>=(
const zip_iterator& it)
const {
return !(*
this < it); }
200 template<
typename... T>
201 zip_iterator<T...> make_zip_iterator(T... args) {
return zip_iterator<T...>(args...); }
203 template <
typename UnaryFunc,
typename Iter>
204 class transform_iterator {
206 typedef typename std::iterator_traits<Iter>::value_type value_type;
207 typedef typename std::iterator_traits<Iter>::difference_type difference_type;
208 #if __TBB_CPP17_INVOKE_RESULT_PRESENT 209 typedef typename std::invoke_result<UnaryFunc, typename std::iterator_traits<Iter>::reference>
::type reference;
211 typedef typename std::result_of<UnaryFunc(typename std::iterator_traits<Iter>::reference)>::
type reference;
213 typedef typename std::iterator_traits<Iter>::pointer pointer;
214 typedef typename std::random_access_iterator_tag iterator_category;
216 transform_iterator(Iter it, UnaryFunc unary_func): my_it(it), my_unary_func(unary_func) {
218 std::random_access_iterator_tag>::
value),
"Random access iterator required.");
220 transform_iterator(
const transform_iterator& input) : my_it(input.my_it), my_unary_func(input.my_unary_func) { }
221 transform_iterator& operator=(
const transform_iterator& input) {
225 reference operator*()
const {
226 return my_unary_func(*my_it);
228 reference operator[](difference_type i)
const {
231 transform_iterator& operator++() {
235 transform_iterator& operator--() {
239 transform_iterator operator++(
int) {
240 transform_iterator it(*
this);
244 transform_iterator operator--(
int) {
245 transform_iterator it(*
this);
249 transform_iterator
operator+(difference_type forward)
const {
250 return { my_it + forward, my_unary_func };
252 transform_iterator
operator-(difference_type backward)
const {
253 return { my_it - backward, my_unary_func };
255 transform_iterator& operator+=(difference_type forward) {
259 transform_iterator& operator-=(difference_type backward) {
263 friend transform_iterator
operator+(difference_type forward,
const transform_iterator& it) {
266 difference_type
operator-(
const transform_iterator& it)
const {
267 return my_it - it.my_it;
269 bool operator==(
const transform_iterator& it)
const {
return *
this - it == 0; }
270 bool operator!=(
const transform_iterator& it)
const {
return !(*
this == it); }
271 bool operator<(
const transform_iterator& it)
const {
return *
this - it < 0; }
272 bool operator>(
const transform_iterator& it)
const {
return it < *
this; }
273 bool operator<=(
const transform_iterator& it)
const {
return !(*
this > it); }
274 bool operator>=(
const transform_iterator& it)
const {
return !(*
this < it); }
276 Iter base()
const {
return my_it; }
279 const UnaryFunc my_unary_func;
282 template<
typename UnaryFunc,
typename Iter>
283 transform_iterator<UnaryFunc, Iter> make_transform_iterator(Iter it, UnaryFunc unary_func) {
284 return transform_iterator<UnaryFunc, Iter>(it, unary_func);
289 #endif //__TBB_CPP11_PRESENT bool operator<=(const concurrent_vector< T, A1 > &a, const concurrent_vector< T, A2 > &b)
bool operator==(const cache_aligned_allocator< T > &, const cache_aligned_allocator< U > &)
bool operator>=(const concurrent_vector< T, A1 > &a, const concurrent_vector< T, A2 > &b)
#define __TBB_STATIC_ASSERT(condition, msg)
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
bool operator<(const concurrent_vector< T, A1 > &a, const concurrent_vector< T, A2 > &b)
tick_count::interval_t operator-(const tick_count &t1, const tick_count &t0)
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long ITT_FORMAT lu const __itt_domain __itt_id __itt_string_handle __itt_metadata_type type
bool operator>(const concurrent_vector< T, A1 > &a, const concurrent_vector< T, A2 > &b)
vector_iterator< Container, T > operator+(ptrdiff_t offset, const vector_iterator< Container, T > &v)
void const char const char int ITT_FORMAT __itt_group_sync x void const char ITT_FORMAT __itt_group_sync s void ITT_FORMAT __itt_group_sync p void ITT_FORMAT p void ITT_FORMAT p no args __itt_suppress_mode_t unsigned int void size_t ITT_FORMAT d void ITT_FORMAT p void ITT_FORMAT p __itt_model_site __itt_model_site_instance ITT_FORMAT p __itt_model_task __itt_model_task_instance ITT_FORMAT p void ITT_FORMAT p void ITT_FORMAT p void size_t ITT_FORMAT d void ITT_FORMAT p const wchar_t ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s const char ITT_FORMAT s no args void ITT_FORMAT p size_t ITT_FORMAT d no args const wchar_t const wchar_t ITT_FORMAT s __itt_heap_function void size_t int ITT_FORMAT d __itt_heap_function void ITT_FORMAT p __itt_heap_function void void size_t int ITT_FORMAT d no args no args unsigned int ITT_FORMAT u const __itt_domain __itt_id ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain __itt_id ITT_FORMAT p const __itt_domain __itt_id __itt_timestamp __itt_timestamp ITT_FORMAT lu const __itt_domain __itt_id __itt_id __itt_string_handle ITT_FORMAT p const __itt_domain ITT_FORMAT p const __itt_domain __itt_string_handle unsigned long long value
bool operator!=(const cache_aligned_allocator< T > &, const cache_aligned_allocator< U > &)
typename tbb::internal::make_index_sequence_impl< N >::type make_index_sequence