rocPRIM
transform_iterator.hpp
1 // Copyright (c) 2017-2021 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_TRANSFORM_ITERATOR_HPP_
22 #define ROCPRIM_ITERATOR_TRANSFORM_ITERATOR_HPP_
23 
24 #include <iterator>
25 #include <cstddef>
26 #include <type_traits>
27 
28 #include "../config.hpp"
29 #include "../detail/match_result_type.hpp"
30 
33 
34 BEGIN_ROCPRIM_NAMESPACE
35 
50 template<
51  class InputIterator,
52  class UnaryFunction,
53  class ValueType =
54  typename ::rocprim::detail::invoke_result<
55  UnaryFunction, typename std::iterator_traits<InputIterator>::value_type
56  >::type
57 >
59 {
60 public:
62  using value_type = ValueType;
65  using reference = const value_type&;
68  using pointer = const value_type*;
70  using difference_type = typename std::iterator_traits<InputIterator>::difference_type;
72  using iterator_category = std::random_access_iterator_tag;
74  using unary_function = UnaryFunction;
75 
76 #ifndef DOXYGEN_SHOULD_SKIP_THIS
78 #endif
79 
80  ROCPRIM_HOST_DEVICE inline
81  ~transform_iterator() = default;
82 
88  ROCPRIM_HOST_DEVICE inline
89  transform_iterator(InputIterator iterator, UnaryFunction transform)
90  : iterator_(iterator), transform_(transform)
91  {
92  }
93 
94  #ifndef DOXYGEN_SHOULD_SKIP_THIS
95  ROCPRIM_HOST_DEVICE inline
96  transform_iterator& operator++()
97  {
98  iterator_++;
99  return *this;
100  }
101 
102  ROCPRIM_HOST_DEVICE inline
103  transform_iterator operator++(int)
104  {
105  transform_iterator old = *this;
106  iterator_++;
107  return old;
108  }
109 
110  ROCPRIM_HOST_DEVICE inline
111  transform_iterator& operator--()
112  {
113  iterator_--;
114  return *this;
115  }
116 
117  ROCPRIM_HOST_DEVICE inline
118  transform_iterator operator--(int)
119  {
120  transform_iterator old = *this;
121  iterator_--;
122  return old;
123  }
124 
125  ROCPRIM_HOST_DEVICE inline
126  value_type operator*() const
127  {
128  return transform_(*iterator_);
129  }
130 
131  ROCPRIM_HOST_DEVICE inline
132  pointer operator->() const
133  {
134  return &(*(*this));
135  }
136 
137  ROCPRIM_HOST_DEVICE inline
138  value_type operator[](difference_type distance) const
139  {
140  transform_iterator i = (*this) + distance;
141  return *i;
142  }
143 
144  ROCPRIM_HOST_DEVICE inline
145  transform_iterator operator+(difference_type distance) const
146  {
147  return transform_iterator(iterator_ + distance, transform_);
148  }
149 
150  ROCPRIM_HOST_DEVICE inline
151  transform_iterator& operator+=(difference_type distance)
152  {
153  iterator_ += distance;
154  return *this;
155  }
156 
157  ROCPRIM_HOST_DEVICE inline
158  transform_iterator operator-(difference_type distance) const
159  {
160  return transform_iterator(iterator_ - distance, transform_);
161  }
162 
163  ROCPRIM_HOST_DEVICE inline
164  transform_iterator& operator-=(difference_type distance)
165  {
166  iterator_ -= distance;
167  return *this;
168  }
169 
170  ROCPRIM_HOST_DEVICE inline
171  difference_type operator-(transform_iterator other) const
172  {
173  return iterator_ - other.iterator_;
174  }
175 
176  ROCPRIM_HOST_DEVICE inline
177  bool operator==(transform_iterator other) const
178  {
179  return iterator_ == other.iterator_;
180  }
181 
182  ROCPRIM_HOST_DEVICE inline
183  bool operator!=(transform_iterator other) const
184  {
185  return iterator_ != other.iterator_;
186  }
187 
188  ROCPRIM_HOST_DEVICE inline
189  bool operator<(transform_iterator other) const
190  {
191  return iterator_ < other.iterator_;
192  }
193 
194  ROCPRIM_HOST_DEVICE inline
195  bool operator<=(transform_iterator other) const
196  {
197  return iterator_ <= other.iterator_;
198  }
199 
200  ROCPRIM_HOST_DEVICE inline
201  bool operator>(transform_iterator other) const
202  {
203  return iterator_ > other.iterator_;
204  }
205 
206  ROCPRIM_HOST_DEVICE inline
207  bool operator>=(transform_iterator other) const
208  {
209  return iterator_ >= other.iterator_;
210  }
211 
212  friend std::ostream& operator<<(std::ostream& os, const transform_iterator& /* iter */)
213  {
214  return os;
215  }
216  #endif // DOXYGEN_SHOULD_SKIP_THIS
217 
218 private:
219  InputIterator iterator_;
220  UnaryFunction transform_;
221 };
222 
223 #ifndef DOXYGEN_SHOULD_SKIP_THIS
224 template<
225  class InputIterator,
226  class UnaryFunction,
227  class ValueType
228 >
229 ROCPRIM_HOST_DEVICE inline
233 {
234  return iterator + distance;
235 }
236 #endif // DOXYGEN_SHOULD_SKIP_THIS
237 
248 template<
249  class InputIterator,
250  class UnaryFunction
251 >
252 ROCPRIM_HOST_DEVICE inline
254 make_transform_iterator(InputIterator iterator, UnaryFunction transform)
255 {
257 }
258 
259 END_ROCPRIM_NAMESPACE
260 
262 // end of group iteratormodule
263 
264 #endif // ROCPRIM_ITERATOR_TRANSFORM_ITERATOR_HPP_
ValueType value_type
The type of the value that can be obtained by dereferencing the iterator.
Definition: transform_iterator.hpp:62
UnaryFunction unary_function
The type of unary function used to transform input range.
Definition: transform_iterator.hpp:74
const value_type & reference
A reference type of the type iterated over (value_type).
Definition: transform_iterator.hpp:65
A random-access input (read-only) iterator adaptor for transforming dereferenced values.
Definition: transform_iterator.hpp:58
typename std::iterator_traits< InputIterator >::difference_type difference_type
A type used for identify distance between iterators.
Definition: transform_iterator.hpp:70
ROCPRIM_HOST_DEVICE transform_iterator< InputIterator, UnaryFunction > make_transform_iterator(InputIterator iterator, UnaryFunction transform)
make_transform_iterator creates a transform_iterator using iterator as the underlying iterator and tr...
Definition: transform_iterator.hpp:254
std::random_access_iterator_tag iterator_category
The category of the iterator.
Definition: transform_iterator.hpp:72
hipError_t transform(InputIterator input, OutputIterator output, const size_t size, UnaryFunction transform_op, const hipStream_t stream=0, bool debug_synchronous=false)
Parallel transform primitive for device level.
Definition: device_transform.hpp:135
const value_type * pointer
A pointer type of the type iterated over (value_type).
Definition: transform_iterator.hpp:68
ROCPRIM_HOST_DEVICE transform_iterator(InputIterator iterator, UnaryFunction transform)
Creates a new transform_iterator.
Definition: transform_iterator.hpp:89
Definition: benchmark_device_transform.cpp:50