rocPRIM
reverse_iterator.hpp
1 // Copyright (c) 2022 Advanced Micro Devices, Inc. All rights reserved.
2 //
3 // Permission is hereby granted, free of charge, to any person obtaining a copy
4 // of this software and associated documentation files (the "Software"), to deal
5 // in the Software without restriction, including without limitation the rights
6 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7 // copies of the Software, and to permit persons to whom the Software is
8 // furnished to do so, subject to the following conditions:
9 //
10 // The above copyright notice and this permission notice shall be included in
11 // all copies or substantial portions of the Software.
12 //
13 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
19 // THE SOFTWARE.
20 
21 #ifndef ROCPRIM_ITERATOR_REVERSE_ITERATOR_HPP_
22 #define ROCPRIM_ITERATOR_REVERSE_ITERATOR_HPP_
23 
24 #include <cstddef>
25 #include <iterator>
26 #include <type_traits>
27 
28 #include "../config.hpp"
29 
32 
33 BEGIN_ROCPRIM_NAMESPACE
34 
45 template<class SourceIterator>
47 {
48 public:
49  static_assert(
50  std::is_base_of<std::random_access_iterator_tag,
51  typename std::iterator_traits<SourceIterator>::iterator_category>::value,
52  "SourceIterator must be a random access iterator");
53 
55  using value_type = typename std::iterator_traits<SourceIterator>::value_type;
57  using reference = typename std::iterator_traits<SourceIterator>::reference;
59  using pointer = typename std::iterator_traits<SourceIterator>::pointer;
61  using difference_type = typename std::iterator_traits<SourceIterator>::difference_type;
63  using iterator_category = std::random_access_iterator_tag;
64 
66  ROCPRIM_HOST_DEVICE
67  reverse_iterator(SourceIterator source_iterator) : source_iterator_(source_iterator) {}
68 
69  #ifndef DOXYGEN_SHOULD_SKIP_THIS
70  ROCPRIM_HOST_DEVICE
71  reverse_iterator& operator++()
72  {
73  --source_iterator_;
74  return *this;
75  }
76 
77  ROCPRIM_HOST_DEVICE
78  reverse_iterator operator++(int)
79  {
80  reverse_iterator old = *this;
81  --source_iterator_;
82  return old;
83  }
84 
85  ROCPRIM_HOST_DEVICE
86  reverse_iterator& operator--()
87  {
88  ++source_iterator_;
89  return *this;
90  }
91 
92  ROCPRIM_HOST_DEVICE
93  reverse_iterator operator--(int)
94  {
95  reverse_iterator old = *this;
96  ++source_iterator_;
97  return old;
98  }
99 
100  ROCPRIM_HOST_DEVICE
101  reference operator*()
102  {
103  return *(source_iterator_ - static_cast<difference_type>(1));
104  }
105 
106  ROCPRIM_HOST_DEVICE
107  reference operator[](difference_type distance)
108  {
109  reverse_iterator i = (*this) + distance;
110  return *i;
111  }
112 
113  ROCPRIM_HOST_DEVICE
114  reverse_iterator operator+(difference_type distance) const
115  {
116  return reverse_iterator(source_iterator_ - distance);
117  }
118 
119  ROCPRIM_HOST_DEVICE
120  reverse_iterator& operator+=(difference_type distance)
121  {
122  source_iterator_ -= distance;
123  return *this;
124  }
125 
126  ROCPRIM_HOST_DEVICE
127  reverse_iterator operator-(difference_type distance) const
128  {
129  return reverse_iterator(source_iterator_ + distance);
130  }
131 
132  ROCPRIM_HOST_DEVICE
133  reverse_iterator& operator-=(difference_type distance)
134  {
135  source_iterator_ += distance;
136  return *this;
137  }
138 
139  ROCPRIM_HOST_DEVICE
140  difference_type operator-(reverse_iterator other) const
141  {
142  return other.source_iterator_ - source_iterator_;
143  }
144 
145  ROCPRIM_HOST_DEVICE
146  bool operator==(reverse_iterator other) const
147  {
148  return source_iterator_ == other.source_iterator_;
149  }
150 
151  ROCPRIM_HOST_DEVICE
152  bool operator!=(reverse_iterator other) const
153  {
154  return source_iterator_ != other.source_iterator_;
155  }
156 
157  ROCPRIM_HOST_DEVICE
158  bool operator<(reverse_iterator other) const
159  {
160  return other.source_iterator_ < source_iterator_;
161  }
162 
163  ROCPRIM_HOST_DEVICE
164  bool operator<=(reverse_iterator other) const
165  {
166  return other.source_iterator_ <= source_iterator_;
167  }
168 
169  ROCPRIM_HOST_DEVICE
170  bool operator>(reverse_iterator other) const
171  {
172  return other.source_iterator_ > source_iterator_;
173  }
174 
175  ROCPRIM_HOST_DEVICE
176  bool operator>=(reverse_iterator other) const
177  {
178  return other.source_iterator_ >= source_iterator_;
179  }
180  #endif // DOXYGEN_SHOULD_SKIP_THIS
181 
182 private:
183  SourceIterator source_iterator_;
184 };
185 
186 #ifndef DOXYGEN_SHOULD_SKIP_THIS
187 template<class SourceIterator>
188 ROCPRIM_HOST_DEVICE reverse_iterator<SourceIterator>
189  operator+(typename reverse_iterator<SourceIterator>::difference_type distance,
190  const reverse_iterator<SourceIterator>& iterator)
191 {
192  return iterator + distance;
193 }
194 #endif // DOXYGEN_SHOULD_SKIP_THIS
195 
202 template<class SourceIterator>
203 ROCPRIM_HOST_DEVICE reverse_iterator<SourceIterator>
204  make_reverse_iterator(SourceIterator source_iterator)
205 {
206  return reverse_iterator<SourceIterator>(source_iterator);
207 }
208 
209 END_ROCPRIM_NAMESPACE
210 
212 // end of group iteratormodule
213 
214 #endif // ROCPRIM_ITERATOR_REVERSE_ITERATOR_HPP_
typename std::iterator_traits< SourceIterator >::reference reference
A reference type of the type iterated over (value_type).
Definition: reverse_iterator.hpp:57
typename std::iterator_traits< SourceIterator >::difference_type difference_type
A type used for identify distance between iterators.
Definition: reverse_iterator.hpp:61
std::random_access_iterator_tag iterator_category
The category of the iterator.
Definition: reverse_iterator.hpp:63
typename std::iterator_traits< SourceIterator >::value_type value_type
The type of the value that can be obtained by dereferencing the iterator.
Definition: reverse_iterator.hpp:55
A reverse iterator is an iterator adaptor that reverses the direction of a wrapped iterator...
Definition: reverse_iterator.hpp:46
ROCPRIM_HOST_DEVICE reverse_iterator< SourceIterator > make_reverse_iterator(SourceIterator source_iterator)
make_reverse_iterator creates a reverse_iterator wrapping source_iterator.
Definition: reverse_iterator.hpp:204
typename std::iterator_traits< SourceIterator >::pointer pointer
A pointer type of the type iterated over (value_type).
Definition: reverse_iterator.hpp:59
ROCPRIM_HOST_DEVICE reverse_iterator(SourceIterator source_iterator)
Constructs a new reverse_iterator using the supplied source.
Definition: reverse_iterator.hpp:67