libsequence  1.9.5
variant_matrix_views_internal.hpp
1 #ifndef SEQUENCE_VARIANT_MATRIX_INTERNAL_HPP__
2 #define SEQUENCE_VARIANT_MATRIX_INTERNAL_HPP__
3 
4 #include <cstdint>
5 #include <cstddef>
6 #include <stdexcept>
7 #include <vector>
8 #include <type_traits>
9 #include "col_view_iterator.hpp"
10 
11 namespace Sequence
12 {
13  namespace internal
14  {
15  template <typename T> struct row_view_
19  {
20  static_assert(std::is_pointer<T>::value, "T must be pointer type");
22  T data;
24  using value_type = typename std::remove_pointer<T>::type;
25 
27  std::size_t row_size;
28 
29  row_view_(T data_, std::size_t row_size_)
31  : data(data_), row_size(row_size_)
32  {
33  }
34  inline value_type& operator[](const std::size_t i)
36  {
37  return data[i];
38  }
39  inline const value_type& operator[](const std::size_t i) const
41  {
42  return data[i];
43  }
44  inline value_type&
45  at(const std::size_t i)
47  {
48  if (i >= row_size)
49  {
50  throw std::out_of_range("index out of range");
51  }
52  return data[i];
53  }
54  inline const value_type&
55  at(const std::size_t i) const
57  {
58  if (i >= row_size)
59  {
60  throw std::out_of_range("index out of range");
61  }
62  return data[i];
63  }
64  std::size_t
65  size() const
67  {
68  return row_size;
69  }
70 
71  using iterator = value_type*;
72  using const_iterator = const value_type*;
73  using reverse_iterator = std::reverse_iterator<iterator>;
74  using const_reverse_iterator
75  = std::reverse_iterator<const_iterator>;
76 
77  iterator
80  {
81  return data;
82  }
83  iterator
84  end()
86  {
87  return data + row_size;
88  }
89  const_iterator
90  begin() const
92  {
93  return data;
94  }
95  const_iterator
96  end() const
98  {
99  return data + row_size;
100  }
101  const_iterator
102  cbegin() const
104  {
105  return this->begin();
106  }
107  const_iterator
108  cend() const
110  {
111  return this->end();
112  }
113 
114  // Reverse iterators
115  reverse_iterator
118  {
119  return reverse_iterator(data + row_size);
120  }
121  reverse_iterator
124  {
125  return reverse_iterator(data);
126  }
127  const_reverse_iterator
128  rbegin() const
130  {
131  return reverse_iterator(data + row_size);
132  }
133  const_reverse_iterator
134  rend() const
136  {
137  return reverse_iterator(data);
138  }
139  const_reverse_iterator
140  crbegin() const
142  {
143  return this->rbegin();
144  }
145  const_reverse_iterator
146  crend() const
148  {
149  return this->rend();
150  }
151 
152  std::vector<std::int8_t>
153  copy() const
155  {
156  return std::vector<std::int8_t>(this->cbegin(), this->cend());
157  }
158 
159  friend void
162  {
163  if (a.size() != b.size())
164  {
165  throw std::invalid_argument(
166  "cannot swap row views of different size");
167  }
168  auto bi = b.begin();
169  for (auto ai = a.begin(); ai != a.end(); ++ai, ++bi)
170  {
171  std::swap(*ai, *bi);
172  }
173  }
174  };
175 
176  template <typename T> struct col_view_
180  {
181  static_assert(std::is_pointer<T>::value, "T must be pointer type");
183  T data;
185  using value_type = typename std::remove_pointer<T>::type;
186 
188  std::size_t col_end;
190  std::size_t stride;
191 
192  col_view_(T data_, std::size_t col_end_, std::size_t stride_)
194  : data(data_), col_end(col_end_), stride(stride_)
195  {
196  }
197  inline value_type& operator[](const std::size_t i)
199  {
200  return data[i * stride];
201  }
202  inline const value_type& operator[](const std::size_t i) const
204  {
205  return data[i * stride];
206  }
207  inline value_type&
208  at(const std::size_t i)
210  {
211  if (i >= col_end / stride)
212  {
213  throw std::out_of_range("index out of range");
214  }
215  return data[i * stride];
216  }
217  inline const value_type&
218  at(const std::size_t i) const
220  {
221  if (i >= col_end / stride)
222  {
223  throw std::out_of_range("index out of range");
224  }
225  return data[i * stride];
226  }
227  std::size_t
228  size() const
230  {
231  return col_end / stride;
232  }
233 
236  using reverse_iterator = std::reverse_iterator<iterator>;
237  using const_reverse_iterator
238  = std::reverse_iterator<const_iterator>;
239 
240  iterator
243  {
244  return iterator(
245  data,
246  static_cast<typename iterator::difference_type>(stride),
247  0);
248  }
249  iterator
250  end()
252  {
253  return iterator(
254  data,
255  static_cast<typename iterator::difference_type>(stride),
256  static_cast<typename iterator::difference_type>(col_end));
257  }
259  begin() const
261  {
262  return const_iterator(
263  data,
264  static_cast<typename iterator::difference_type>(stride),
265  0);
266  }
268  end() const
270  {
271  return const_iterator(
272  data,
273  static_cast<typename iterator::difference_type>(stride),
274  static_cast<typename iterator::difference_type>(col_end));
275  }
277  cbegin() const
279  {
280  return this->begin();
281  }
283  cend() const
285  {
286  return this->end();
287  }
288 
289  // Reverse iterators
290  reverse_iterator
293  {
294  return reverse_iterator(end());
295  }
296  reverse_iterator
299  {
300  return reverse_iterator(begin());
301  }
302 
303  const_reverse_iterator
304  rbegin() const
306  {
307  return const_reverse_iterator(end());
308  }
309  const_reverse_iterator
310  rend() const
312  {
313  return const_reverse_iterator(begin());
314  }
315  const_reverse_iterator
316  crbegin() const
318  {
319  return this->rbegin();
320  }
321  const_reverse_iterator
322  crend() const
324  {
325  return this->rend();
326  }
327 
328  std::vector<std::int8_t>
329  copy() const
331  {
332  return std::vector<std::int8_t>(this->cbegin(), this->cend());
333  }
334 
335  friend void
338  {
339  if (a.size() != b.size())
340  {
341  throw std::invalid_argument(
342  "cannot swap column views of different size");
343  }
344  auto bi = b.begin();
345  for (auto ai = a.begin(); ai != a.end(); ++ai, ++bi)
346  {
347  std::swap(*ai, *bi);
348  }
349  }
350  };
351  } // namespace internal
352 } // namespace Sequence
353 
354 #endif
reverse_iterator rbegin()
Reverse iterator. Points to start of reversed range.
const_iterator begin() const
Get const iterator to end of range.
const_reverse_iterator crbegin() const
Const reverse iterator. Points to start of reversed range.
std::size_t size() const
Number of elements.
Implementation details for Sequence::RowView and Sequence::ConstRowView.
iterator begin()
Get iterator to start of range.
const_iterator cbegin() const
Get const iterator to start of range.
std::size_t size() const
Number of elements.
value_type & operator[](const std::size_t i)
Element access without range checking.
iterator begin()
Get iterator to start of range.
row_view_(T data_, std::size_t row_size_)
Constructor.
reverse_iterator rend()
Reverse iterator. Points to end of reversed range.
const_iterator end() const
Get const iterator to end of range.
const_iterator cbegin() const
Get const iterator to start of range.
const_reverse_iterator rend() const
Const reverse iterator. Points to end of reversed range.
const_reverse_iterator crend() const
Const reverse iterator. Points to end of reversed range.
The namespace in which this library resides.
const_reverse_iterator rend() const
Const reverse iterator. Points to end of reversed range.
std::vector< std::int8_t > copy() const
Return copy of the view as std::vector<std::int8_t>
value_type & at(const std::size_t i)
Range-checked access.
const value_type & at(const std::size_t i) const
Range-checked access.
const_iterator cend() const
Get const iterator to end of range.
std::size_t row_size
Number of elements in row.
friend void swap(row_view_ &a, row_view_ &b)
Allow swap via argument-dependent lookup, or "ADL".
const_reverse_iterator crend() const
Const reverse iterator. Points to end of reversed range.
reverse_iterator rbegin()
Reverse iterator. Points to start of reversed range.
const_iterator cend() const
Get const iterator to end of range.
value_type & at(const std::size_t i)
Range-checked access.
const_reverse_iterator crbegin() const
Const reverse iterator. Points to start of reversed range.
Iterator for column views.
const_iterator begin() const
Get const iterator to start of range.
typename std::remove_pointer< T >::type value_type
data type
std::size_t stride
Stride of the data in the column.
const value_type & operator[](const std::size_t i) const
Element access without range checking.
std::vector< std::int8_t > copy() const
Return copy of the view as std::vector<std::int8_t>
col_view_(T data_, std::size_t col_end_, std::size_t stride_)
Constructor.
friend void swap(col_view_ &a, col_view_ &b)
Allow swap via argument-dependent lookup, or "ADL".
const value_type & at(const std::size_t i) const
Range-checked access.
iterator end()
Get iterator to end of range.
typename std::remove_pointer< T >::type value_type
Data type.
Implementation details for Sequence::ColView and Sequence::ConstColView.
const value_type & operator[](const std::size_t i) const
Element access without range checking.
const_iterator end() const
Get const iterator to end of range.
iterator end()
Get iterator to end of range.
reverse_iterator rend()
Reverse iterator. Points to end of reversed range.
const_reverse_iterator rbegin() const
Const reverse iterator. Points to start of reversed range.
std::size_t col_end
data + col_end marks the end of the column data
value_type & operator[](const std::size_t i)
Element access without range checking.
const_reverse_iterator rbegin() const
Const reverse iterator. Points to end of reversed range.