RAJA
RAJA provides a collection of platform portability abstractions for C++ HPC applications.
RepeatView.hpp
Go to the documentation of this file.
1 
11 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
12 // Copyright (c) Lawrence Livermore National Security, LLC and other
13 // RAJA Project Developers. See top-level LICENSE and COPYRIGHT
14 // files for dates and other details. No copyright assignment is required
15 // to contribute to RAJA.
16 //
17 // SPDX-License-Identifier: (BSD-3-Clause)
18 //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//
19 
20 #ifndef RAJA_REPEATVIEW_HPP
21 #define RAJA_REPEATVIEW_HPP
22 
23 #include <cstddef>
24 #include <utility>
25 #include <type_traits>
26 
27 #include "RAJA/util/macros.hpp"
28 
29 namespace RAJA
30 {
31 
55 template<typename T>
56 struct RepeatView
57 {
58  struct iterator
59  {
60  using difference_type = std::ptrdiff_t;
61  using value_type = T;
62  using reference = value_type const&;
63 
64  iterator() = default;
65 
66  constexpr iterator(const T* base, size_t index)
67  : m_value(base),
68  m_index(index)
69  {}
70 
71  constexpr reference operator*() const noexcept { return *m_value; }
72 
73  constexpr reference operator[](difference_type index) const noexcept
74  {
75  return *(*this + index);
76  }
77 
78  constexpr iterator& operator++()
79  {
80  ++m_index;
81  return *this;
82  }
83 
84  constexpr iterator operator++(int)
85  {
86  auto tmp = *this;
87  ++(*this);
88  return tmp;
89  }
90 
91  constexpr iterator& operator--()
92  {
93  --m_index;
94  return *this;
95  }
96 
97  constexpr iterator operator--(int)
98  {
99  auto tmp = *this;
100  --(*this);
101  return tmp;
102  }
103 
105  {
106  m_index += rhs;
107  return *this;
108  }
109 
111  {
112  m_index -= rhs;
113  return *this;
114  }
115 
116  friend constexpr iterator operator+(iterator lhs, difference_type rhs)
117  {
118  lhs += rhs;
119  return lhs;
120  }
121 
122  friend constexpr iterator operator+(difference_type lhs, iterator rhs)
123  {
124  rhs += lhs;
125  return rhs;
126  }
127 
128  friend constexpr iterator operator-(iterator lhs, difference_type rhs)
129  {
130  lhs -= rhs;
131  return lhs;
132  }
133 
134  friend constexpr difference_type operator-(iterator const& lhs,
135  iterator const& rhs)
136  {
137  return static_cast<difference_type>(lhs.m_index) -
138  static_cast<difference_type>(rhs.m_index);
139  }
140 
141  friend constexpr bool operator==(iterator const& lhs, iterator const& rhs)
142  {
143  return lhs.m_index == rhs.m_index;
144  }
145 
146  friend constexpr bool operator!=(iterator const& lhs, iterator const& rhs)
147  {
148  return !(lhs == rhs);
149  }
150 
151  friend constexpr bool operator<(iterator const& lhs, iterator const& rhs)
152  {
153  return lhs.m_index < rhs.m_index;
154  }
155 
156  friend constexpr bool operator<=(iterator const& lhs, iterator const& rhs)
157  {
158  return !(rhs < lhs);
159  }
160 
161  friend constexpr bool operator>(iterator const& lhs, iterator const& rhs)
162  {
163  return rhs < lhs;
164  }
165 
166  friend constexpr bool operator>=(iterator const& lhs, iterator const& rhs)
167  {
168  return !(lhs < rhs);
169  }
170 
171  private:
172  const T* m_value = nullptr;
173  size_t m_index = 0;
174  };
175 
176  RepeatView() = delete;
177 
178  constexpr RepeatView(T const& value, size_t bound)
179  : m_bound(bound),
180  m_value(value)
181  {}
182 
183  constexpr RepeatView(T&& value, size_t bound)
184  : m_bound(bound),
185  m_value(std::move(value))
186  {}
187 
188  constexpr T const& front() const { return m_value; }
189 
190  constexpr T const& back() const { return m_value; }
191 
192  constexpr T const& operator[](size_t RAJA_UNUSED_ARG(index)) const
193  {
194  return m_value;
195  }
196 
197  constexpr iterator begin() const { return iterator(&m_value, 0); }
198 
199  constexpr iterator cbegin() const { return iterator(&m_value, 0); }
200 
201  constexpr iterator end() const { return iterator(&m_value, m_bound); }
202 
203  constexpr iterator cend() const { return iterator(&m_value, m_bound); }
204 
205  constexpr explicit operator bool() const { return m_bound != 0; }
206 
207  constexpr bool empty() const { return m_bound == 0; }
208 
209  constexpr size_t size() const { return m_bound; }
210 
211 private:
212  size_t m_bound = 0;
213  T m_value;
214 };
215 
216 } // end namespace RAJA
217 
218 #endif /* RAJA_REPEATVIEW_HPP */
Header file for common RAJA internal macro definitions.
#define RAJA_UNUSED_ARG(x)
Definition: macros.hpp:97
Definition: AlignedRangeIndexSetBuilders.cpp:35
Definition: ListSegment.hpp:416
Definition: RepeatView.hpp:59
constexpr iterator operator++(int)
Definition: RepeatView.hpp:84
constexpr iterator & operator++()
Definition: RepeatView.hpp:78
T value_type
Definition: RepeatView.hpp:61
constexpr friend bool operator>(iterator const &lhs, iterator const &rhs)
Definition: RepeatView.hpp:161
constexpr iterator operator--(int)
Definition: RepeatView.hpp:97
constexpr friend bool operator<=(iterator const &lhs, iterator const &rhs)
Definition: RepeatView.hpp:156
constexpr friend iterator operator+(difference_type lhs, iterator rhs)
Definition: RepeatView.hpp:122
constexpr iterator(const T *base, size_t index)
Definition: RepeatView.hpp:66
constexpr friend iterator operator-(iterator lhs, difference_type rhs)
Definition: RepeatView.hpp:128
constexpr friend bool operator<(iterator const &lhs, iterator const &rhs)
Definition: RepeatView.hpp:151
std::ptrdiff_t difference_type
Definition: RepeatView.hpp:60
constexpr iterator & operator+=(difference_type rhs)
Definition: RepeatView.hpp:104
constexpr iterator & operator--()
Definition: RepeatView.hpp:91
constexpr friend bool operator==(iterator const &lhs, iterator const &rhs)
Definition: RepeatView.hpp:141
constexpr friend bool operator>=(iterator const &lhs, iterator const &rhs)
Definition: RepeatView.hpp:166
constexpr friend bool operator!=(iterator const &lhs, iterator const &rhs)
Definition: RepeatView.hpp:146
value_type const & reference
Definition: RepeatView.hpp:62
constexpr friend difference_type operator-(iterator const &lhs, iterator const &rhs)
Definition: RepeatView.hpp:134
constexpr reference operator*() const noexcept
Definition: RepeatView.hpp:71
constexpr reference operator[](difference_type index) const noexcept
Definition: RepeatView.hpp:73
constexpr friend iterator operator+(iterator lhs, difference_type rhs)
Definition: RepeatView.hpp:116
constexpr iterator & operator-=(difference_type rhs)
Definition: RepeatView.hpp:110
A view of a single object repeated a certain number of times.
Definition: RepeatView.hpp:57
constexpr iterator end() const
Definition: RepeatView.hpp:201
constexpr RepeatView(T const &value, size_t bound)
Definition: RepeatView.hpp:178
constexpr iterator begin() const
Definition: RepeatView.hpp:197
constexpr iterator cend() const
Definition: RepeatView.hpp:203
constexpr bool empty() const
Definition: RepeatView.hpp:207
RepeatView()=delete
constexpr T const & front() const
Definition: RepeatView.hpp:188
constexpr RepeatView(T &&value, size_t bound)
Definition: RepeatView.hpp:183
constexpr iterator cbegin() const
Definition: RepeatView.hpp:199
constexpr T const & operator[](size_t RAJA_UNUSED_ARG(index)) const
Definition: RepeatView.hpp:192
constexpr size_t size() const
Definition: RepeatView.hpp:209
constexpr T const & back() const
Definition: RepeatView.hpp:190