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)... );
129 template<
typename... T>
130 struct tuplewrapper :
public std::tuple<typename std::enable_if<std::is_reference<T>::value, T&&>::type...> {
132 typedef std::tuple<T&&...> base_type;
134 tuplewrapper(
const base_type& in) : base_type(in) {}
137 tuplewrapper(
const tuplewrapper& rhs) : base_type(rhs) {}
138 tuplewrapper& operator=(
const tuplewrapper& rhs) {
139 *
this = base_type(rhs);
144 template<
typename... U>
145 tuplewrapper& operator=(
const std::tuple<U...>& other) {
146 base_type::operator=(other);
154 friend void swap(tuplewrapper&& a, tuplewrapper&& b) {
161 template <
typename... Types>
163 __TBB_STATIC_ASSERT(
sizeof...(Types),
"Cannot instantiate zip_iterator with empty template parameter pack");
164 static const std::size_t num_types =
sizeof...(Types);
165 typedef std::tuple<Types...> it_types;
168 typedef std::tuple<typename std::iterator_traits<Types>::value_type...> value_type;
169 #if __INTEL_COMPILER && __INTEL_COMPILER < 1800 && _MSC_VER 170 typedef std::tuple<typename std::iterator_traits<Types>::reference...> reference;
172 typedef tbb::internal::tuplewrapper<typename std::iterator_traits<Types>::reference...> reference;
174 typedef std::tuple<typename std::iterator_traits<Types>::pointer...> pointer;
175 typedef std::random_access_iterator_tag iterator_category;
177 zip_iterator() : my_it() {}
178 explicit zip_iterator(Types... args) : my_it(std::make_tuple(args...)) {}
179 zip_iterator(
const zip_iterator& input) : my_it(input.my_it) {}
180 zip_iterator& operator=(
const zip_iterator& input) {
185 reference operator*()
const {
188 reference operator[](difference_type i)
const {
return *(*
this + i); }
190 difference_type
operator-(
const zip_iterator& it)
const {
191 __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)),
192 "Components of zip_iterator are not synchronous");
193 return std::get<0>(my_it) - std::get<0>(it.my_it);
196 zip_iterator& operator+=(difference_type forward) {
197 internal::tuple_util<num_types>::increment(my_it, forward);
200 zip_iterator& operator-=(difference_type backward) {
return *
this += -backward; }
201 zip_iterator& operator++() {
return *
this += 1; }
202 zip_iterator& operator--() {
return *
this -= 1; }
204 zip_iterator operator++(
int) {
205 zip_iterator it(*
this);
209 zip_iterator operator--(
int) {
210 zip_iterator it(*
this);
215 zip_iterator
operator-(difference_type backward)
const {
216 zip_iterator it(*
this);
217 return it -= backward;
219 zip_iterator
operator+(difference_type forward)
const {
220 zip_iterator it(*
this);
221 return it += forward;
223 friend zip_iterator
operator+(difference_type forward,
const zip_iterator& it) {
return it + forward; }
225 bool operator==(
const zip_iterator& it)
const {
226 return *
this - it == 0;
228 bool operator!=(
const zip_iterator& it)
const {
return !(*
this == it); }
229 bool operator<(
const zip_iterator& it)
const {
return *
this - it < 0; }
230 bool operator>(
const zip_iterator& it)
const {
return it < *
this; }
231 bool operator<=(
const zip_iterator& it)
const {
return !(*
this > it); }
232 bool operator>=(
const zip_iterator& it)
const {
return !(*
this < it); }
237 template<
typename... T>
238 zip_iterator<T...> make_zip_iterator(T... args) {
return zip_iterator<T...>(args...); }
240 template <
typename UnaryFunc,
typename Iter>
241 class transform_iterator {
243 typedef typename std::iterator_traits<Iter>::value_type value_type;
244 typedef typename std::iterator_traits<Iter>::difference_type difference_type;
245 #if __TBB_CPP17_INVOKE_RESULT_PRESENT 246 typedef typename std::invoke_result<UnaryFunc, typename std::iterator_traits<Iter>::reference>
::type reference;
248 typedef typename std::result_of<UnaryFunc(
typename std::iterator_traits<Iter>::reference)>
::type reference;
250 typedef typename std::iterator_traits<Iter>::pointer pointer;
251 typedef typename std::random_access_iterator_tag iterator_category;
253 transform_iterator(Iter it, UnaryFunc unary_func) : my_it(it), my_unary_func(unary_func) {
255 std::random_access_iterator_tag>::
value),
"Random access iterator required.");
257 transform_iterator(
const transform_iterator& input) : my_it(input.my_it), my_unary_func(input.my_unary_func) { }
258 transform_iterator& operator=(
const transform_iterator& input) {
262 reference operator*()
const {
263 return my_unary_func(*my_it);
265 reference operator[](difference_type i)
const {
268 transform_iterator& operator++() {
272 transform_iterator& operator--() {
276 transform_iterator operator++(
int) {
277 transform_iterator it(*
this);
281 transform_iterator operator--(
int) {
282 transform_iterator it(*
this);
286 transform_iterator
operator+(difference_type forward)
const {
287 return { my_it + forward, my_unary_func };
289 transform_iterator
operator-(difference_type backward)
const {
290 return { my_it - backward, my_unary_func };
292 transform_iterator& operator+=(difference_type forward) {
296 transform_iterator& operator-=(difference_type backward) {
300 friend transform_iterator
operator+(difference_type forward,
const transform_iterator& it) {
303 difference_type
operator-(
const transform_iterator& it)
const {
304 return my_it - it.my_it;
306 bool operator==(
const transform_iterator& it)
const {
return *
this - it == 0; }
307 bool operator!=(
const transform_iterator& it)
const {
return !(*
this == it); }
308 bool operator<(
const transform_iterator& it)
const {
return *
this - it < 0; }
309 bool operator>(
const transform_iterator& it)
const {
return it < *
this; }
310 bool operator<=(
const transform_iterator& it)
const {
return !(*
this > it); }
311 bool operator>=(
const transform_iterator& it)
const {
return !(*
this < it); }
313 Iter base()
const {
return my_it; }
316 const UnaryFunc my_unary_func;
319 template<
typename UnaryFunc,
typename Iter>
320 transform_iterator<UnaryFunc, Iter> make_transform_iterator(Iter it, UnaryFunc unary_func) {
321 return transform_iterator<UnaryFunc, Iter>(it, unary_func);
326 #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)
void swap(atomic< T > &lhs, atomic< T > &rhs)
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