DPC++ Runtime
Runtime libraries for oneAPI DPC++
key_value_iterator.hpp
Go to the documentation of this file.
1 //==------------ key_value_iterator.hpp ------------------------------------==//
2 //
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4 // See https://llvm.org/LICENSE.txt for license information.
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6 //
7 //===----------------------------------------------------------------------===//
8 // This file includes key/value iterator implementation used for group_sort
9 // algorithms.
10 //
11 
12 #pragma once
13 #include <iterator>
14 #include <tuple>
15 #include <utility>
16 
17 namespace sycl {
18 inline namespace _V1 {
19 namespace detail {
20 
21 template <typename T1, typename T2> class key_value_iterator {
22 public:
23  key_value_iterator(T1 *Keys, T2 *Values) : KeyValue{Keys, Values} {}
24 
25  using difference_type = std::ptrdiff_t;
26  using value_type = std::tuple<T1, T2>;
27  using reference = std::tuple<T1 &, T2 &>;
28  using pointer = std::tuple<T1 *, T2 *>;
29  using iterator_category = std::random_access_iterator_tag;
30 
31  reference operator*() const {
32  return std::tie(*(std::get<0>(KeyValue)), *(std::get<1>(KeyValue)));
33  }
34 
35  reference operator[](difference_type i) const { return *(*this + i); }
36 
38  return std::get<0>(KeyValue) - std::get<0>(it.KeyValue);
39  }
40 
42  KeyValue =
43  std::make_tuple(std::get<0>(KeyValue) + i, std::get<1>(KeyValue) + i);
44  return *this;
45  }
46  key_value_iterator &operator-=(difference_type i) { return *this += -i; }
47  key_value_iterator &operator++() { return *this += 1; }
48  key_value_iterator &operator--() { return *this -= 1; }
49  std::tuple<T1 *, T2 *> base() const { return KeyValue; }
51  key_value_iterator it(*this);
52  ++(*this);
53  return it;
54  }
56  key_value_iterator it(*this);
57  --(*this);
58  return it;
59  }
60 
62  key_value_iterator it(*this);
63  return it -= i;
64  }
66  key_value_iterator it(*this);
67  return it += i;
68  }
70  const key_value_iterator &it) {
71  return it + i;
72  }
73 
74  bool operator==(const key_value_iterator &it) const {
75  return *this - it == 0;
76  }
77 
78  bool operator!=(const key_value_iterator &it) const { return !(*this == it); }
79  bool operator<(const key_value_iterator &it) const { return *this - it < 0; }
80  bool operator>(const key_value_iterator &it) const { return it < *this; }
81  bool operator<=(const key_value_iterator &it) const { return !(*this > it); }
82  bool operator>=(const key_value_iterator &it) const { return !(*this < it); }
83 
84 private:
85  std::tuple<T1 *, T2 *> KeyValue;
86 };
87 
88 } // namespace detail
89 } // namespace _V1
90 } // namespace sycl
bool operator>(const key_value_iterator &it) const
difference_type operator-(const key_value_iterator &it) const
bool operator!=(const key_value_iterator &it) const
key_value_iterator operator-(difference_type i) const
std::random_access_iterator_tag iterator_category
bool operator>=(const key_value_iterator &it) const
bool operator<=(const key_value_iterator &it) const
bool operator==(const key_value_iterator &it) const
key_value_iterator & operator+=(difference_type i)
friend key_value_iterator operator+(difference_type i, const key_value_iterator &it)
bool operator<(const key_value_iterator &it) const
reference operator[](difference_type i) const
std::tuple< T1 *, T2 * > base() const
key_value_iterator & operator-=(difference_type i)
key_value_iterator operator+(difference_type i) const
constexpr tuple< Ts... > make_tuple(Ts... Args)
Definition: tuple.hpp:35
auto tie(Ts &...Args)
Definition: tuple.hpp:39
Definition: access.hpp:18