17 #ifndef __TBB_iterators_H 18 #define __TBB_iterators_H 26 #if __TBB_CPP11_PRESENT 28 #include <type_traits> 32 template <
typename IntType>
33 class counting_iterator {
34 __TBB_STATIC_ASSERT(std::numeric_limits<IntType>::is_integer,
"Cannot instantiate counting_iterator with a non-integer type");
37 typedef IntType value_type;
38 typedef const IntType* pointer;
39 typedef const IntType& reference;
40 typedef std::random_access_iterator_tag iterator_category;
42 counting_iterator() : my_counter() {}
43 explicit counting_iterator(IntType init) : my_counter(init) {}
45 reference operator*()
const {
return my_counter; }
46 value_type operator[](difference_type i)
const {
return *(*
this + i); }
48 difference_type
operator-(
const counting_iterator& it)
const {
return my_counter - it.my_counter; }
50 counting_iterator& operator+=(difference_type forward) { my_counter += forward;
return *
this; }
51 counting_iterator& operator-=(difference_type backward) {
return *
this += -backward; }
52 counting_iterator& operator++() {
return *
this += 1; }
53 counting_iterator& operator--() {
return *
this -= 1; }
55 counting_iterator operator++(
int) {
56 counting_iterator it(*
this);
60 counting_iterator operator--(
int) {
61 counting_iterator it(*
this);
66 counting_iterator
operator-(difference_type backward)
const {
return counting_iterator(my_counter - backward); }
67 counting_iterator
operator+(difference_type forward)
const {
return counting_iterator(my_counter + forward); }
68 friend counting_iterator
operator+(difference_type forward,
const counting_iterator it) {
return it + forward; }
70 bool operator==(
const counting_iterator& it)
const {
return *
this - it == 0; }
71 bool operator!=(
const counting_iterator& it)
const {
return !(*
this == it); }
72 bool operator<(
const counting_iterator& it)
const {
return *
this - it < 0; }
73 bool operator>(
const counting_iterator& it)
const {
return it < *
this; }
74 bool operator<=(
const counting_iterator& it)
const {
return !(*
this > it); }
75 bool operator>=(
const counting_iterator& it)
const {
return !(*
this < it); }
92 template<
typename TupleType,
typename DifferenceType>
93 static void increment(TupleType& it, DifferenceType forward) {
94 std::get<N-1>(it) += forward;
95 tuple_util<N-1>::increment(it, forward);
97 template<
typename TupleType,
typename DifferenceType>
98 static bool check_sync(
const TupleType& it1,
const TupleType& it2, DifferenceType val) {
99 if(std::get<N-1>(it1) - std::get<N-1>(it2) != val)
101 return tuple_util<N-1>::check_sync(it1, it2, val);
106 struct tuple_util<0> {
107 template<
typename TupleType,
typename DifferenceType>
108 static void increment(TupleType&, DifferenceType) {}
109 template<
typename TupleType,
typename DifferenceType>
110 static bool check_sync(
const TupleType&,
const TupleType&, DifferenceType) {
return true;}
113 template <
typename TupleReturnType>
114 struct make_references {
115 template <
typename TupleType, std::size_t... Is>
117 return std::tie( *std::get<Is>(t)... );
125 template<
typename... T>
126 struct tuplewrapper :
public std::tuple<typename std::enable_if<std::is_reference<T>::value, T&&>::type...> {
128 typedef std::tuple<T&&...> base_type;
130 tuplewrapper(
const base_type& in) : base_type(in) {}
133 tuplewrapper(
const tuplewrapper& rhs) : base_type(rhs) {}
134 tuplewrapper& operator=(
const tuplewrapper& rhs) {
135 *
this = base_type(rhs);
140 template<
typename... U>
141 tuplewrapper& operator=(
const std::tuple<U...>& other) {
142 base_type::operator=(other);
150 friend void swap(tuplewrapper&& a, tuplewrapper&& b) {
157 template <
typename... Types>
159 __TBB_STATIC_ASSERT(
sizeof...(Types)>0,
"Cannot instantiate zip_iterator with empty template parameter pack");
160 static const std::size_t num_types =
sizeof...(Types);
161 typedef std::tuple<Types...> it_types;
164 typedef std::tuple<typename std::iterator_traits<Types>::value_type...> value_type;
165 #if __INTEL_COMPILER && __INTEL_COMPILER < 1800 && _MSC_VER 166 typedef std::tuple<typename std::iterator_traits<Types>::reference...> reference;
168 typedef tbb::internal::tuplewrapper<typename std::iterator_traits<Types>::reference...> reference;
170 typedef std::tuple<typename std::iterator_traits<Types>::pointer...> pointer;
171 typedef std::random_access_iterator_tag iterator_category;
173 zip_iterator() : my_it() {}
174 explicit zip_iterator(Types... args) : my_it(std::make_tuple(args...)) {}
175 zip_iterator(
const zip_iterator& input) : my_it(input.my_it) {}
176 zip_iterator& operator=(
const zip_iterator& input) {
181 reference operator*()
const {
184 reference operator[](difference_type i)
const {
return *(*
this + i); }
186 difference_type
operator-(
const zip_iterator& it)
const {
187 __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)),
188 "Components of zip_iterator are not synchronous");
189 return std::get<0>(my_it) - std::get<0>(it.my_it);
192 zip_iterator& operator+=(difference_type forward) {
193 internal::tuple_util<num_types>::increment(my_it, forward);
196 zip_iterator& operator-=(difference_type backward) {
return *
this += -backward; }
197 zip_iterator& operator++() {
return *
this += 1; }
198 zip_iterator& operator--() {
return *
this -= 1; }
200 zip_iterator operator++(
int) {
201 zip_iterator it(*
this);
205 zip_iterator operator--(
int) {
206 zip_iterator it(*
this);
211 zip_iterator
operator-(difference_type backward)
const {
212 zip_iterator it(*
this);
213 return it -= backward;
215 zip_iterator
operator+(difference_type forward)
const {
216 zip_iterator it(*
this);
217 return it += forward;
219 friend zip_iterator
operator+(difference_type forward,
const zip_iterator& it) {
return it + forward; }
221 bool operator==(
const zip_iterator& it)
const {
222 return *
this - it == 0;
224 it_types base()
const {
return my_it; }
226 bool operator!=(
const zip_iterator& it)
const {
return !(*
this == it); }
227 bool operator<(
const zip_iterator& it)
const {
return *
this - it < 0; }
228 bool operator>(
const zip_iterator& it)
const {
return it < *
this; }
229 bool operator<=(
const zip_iterator& it)
const {
return !(*
this > it); }
230 bool operator>=(
const zip_iterator& it)
const {
return !(*
this < it); }
235 template<
typename... T>
236 zip_iterator<T...> make_zip_iterator(T... args) {
return zip_iterator<T...>(args...); }
238 template <
typename UnaryFunc,
typename Iter>
239 class transform_iterator {
241 typedef typename std::iterator_traits<Iter>::value_type value_type;
242 typedef typename std::iterator_traits<Iter>::difference_type difference_type;
243 #if __TBB_CPP17_INVOKE_RESULT_PRESENT 244 typedef typename std::invoke_result<UnaryFunc, typename std::iterator_traits<Iter>::reference>
::type reference;
246 typedef typename std::result_of<UnaryFunc(
typename std::iterator_traits<Iter>::reference)>
::type reference;
248 typedef typename std::iterator_traits<Iter>::pointer pointer;
249 typedef typename std::random_access_iterator_tag iterator_category;
251 transform_iterator(Iter it, UnaryFunc unary_func) : my_it(it), my_unary_func(unary_func) {
253 std::random_access_iterator_tag>::
value),
"Random access iterator required.");
255 transform_iterator(
const transform_iterator& input) : my_it(input.my_it), my_unary_func(input.my_unary_func) { }
256 transform_iterator& operator=(
const transform_iterator& input) {
260 reference operator*()
const {
261 return my_unary_func(*my_it);
263 reference operator[](difference_type i)
const {
266 transform_iterator& operator++() {
270 transform_iterator& operator--() {
274 transform_iterator operator++(
int) {
275 transform_iterator it(*
this);
279 transform_iterator operator--(
int) {
280 transform_iterator it(*
this);
284 transform_iterator
operator+(difference_type forward)
const {
285 return { my_it + forward, my_unary_func };
287 transform_iterator
operator-(difference_type backward)
const {
288 return { my_it - backward, my_unary_func };
290 transform_iterator& operator+=(difference_type forward) {
294 transform_iterator& operator-=(difference_type backward) {
298 friend transform_iterator
operator+(difference_type forward,
const transform_iterator& it) {
301 difference_type
operator-(
const transform_iterator& it)
const {
302 return my_it - it.my_it;
304 bool operator==(
const transform_iterator& it)
const {
return *
this - it == 0; }
305 bool operator!=(
const transform_iterator& it)
const {
return !(*
this == it); }
306 bool operator<(
const transform_iterator& it)
const {
return *
this - it < 0; }
307 bool operator>(
const transform_iterator& it)
const {
return it < *
this; }
308 bool operator<=(
const transform_iterator& it)
const {
return !(*
this > it); }
309 bool operator>=(
const transform_iterator& it)
const {
return !(*
this < it); }
311 Iter base()
const {
return my_it; }
314 const UnaryFunc my_unary_func;
317 template<
typename UnaryFunc,
typename Iter>
318 transform_iterator<UnaryFunc, Iter> make_transform_iterator(Iter it, UnaryFunc unary_func) {
319 return transform_iterator<UnaryFunc, Iter>(it, unary_func);
324 #endif //__TBB_CPP11_PRESENT typename tbb::internal::make_index_sequence_impl< N >::type make_index_sequence
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)
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 > &)
#define __TBB_STATIC_ASSERT(condition, msg)
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 swap(atomic< T > &lhs, atomic< T > &rhs)
#define __TBB_ASSERT(predicate, comment)
No-op version of __TBB_ASSERT.
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
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_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)
bool operator==(const cache_aligned_allocator< T > &, const cache_aligned_allocator< U > &)