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 > &)