1 #ifndef SEQUENCE_VARIANT_MATRIX_INTERNAL_HPP__ 2 #define SEQUENCE_VARIANT_MATRIX_INTERNAL_HPP__ 9 #include "col_view_iterator.hpp" 20 static_assert(std::is_pointer<T>::value,
"T must be pointer type");
24 using value_type =
typename std::remove_pointer<T>::type;
31 : data(data_), row_size(row_size_)
45 at(
const std::size_t i)
50 throw std::out_of_range(
"index out of range");
55 at(
const std::size_t i)
const 60 throw std::out_of_range(
"index out of range");
73 using reverse_iterator = std::reverse_iterator<iterator>;
74 using const_reverse_iterator
75 = std::reverse_iterator<const_iterator>;
105 return this->
begin();
119 return reverse_iterator(data + row_size);
125 return reverse_iterator(data);
127 const_reverse_iterator
131 return reverse_iterator(data + row_size);
133 const_reverse_iterator
137 return reverse_iterator(data);
139 const_reverse_iterator
145 const_reverse_iterator
152 std::vector<std::int8_t>
156 return std::vector<std::int8_t>(this->
cbegin(), this->
cend());
165 throw std::invalid_argument(
166 "cannot swap row views of different size");
169 for (
auto ai = a.
begin(); ai != a.
end(); ++ai, ++bi)
181 static_assert(std::is_pointer<T>::value,
"T must be pointer type");
192 col_view_(T data_, std::size_t col_end_, std::size_t stride_)
194 : data(data_), col_end(col_end_), stride(stride_)
200 return data[i * stride];
205 return data[i * stride];
208 at(
const std::size_t i)
211 if (i >= col_end / stride)
213 throw std::out_of_range(
"index out of range");
215 return data[i * stride];
218 at(
const std::size_t i)
const 221 if (i >= col_end / stride)
223 throw std::out_of_range(
"index out of range");
225 return data[i * stride];
231 return col_end / stride;
236 using reverse_iterator = std::reverse_iterator<iterator>;
237 using const_reverse_iterator
238 = std::reverse_iterator<const_iterator>;
246 static_cast<typename iterator::difference_type>(stride),
255 static_cast<typename iterator::difference_type>(stride),
256 static_cast<typename iterator::difference_type>(col_end));
264 static_cast<typename iterator::difference_type>(stride),
273 static_cast<typename iterator::difference_type>(stride),
274 static_cast<typename iterator::difference_type>(col_end));
280 return this->
begin();
294 return reverse_iterator(
end());
300 return reverse_iterator(
begin());
303 const_reverse_iterator
307 return const_reverse_iterator(
end());
309 const_reverse_iterator
313 return const_reverse_iterator(
begin());
315 const_reverse_iterator
321 const_reverse_iterator
328 std::vector<std::int8_t>
332 return std::vector<std::int8_t>(this->
cbegin(), this->
cend());
341 throw std::invalid_argument(
342 "cannot swap column views of different size");
345 for (
auto ai = a.
begin(); ai != a.
end(); ++ai, ++bi)
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.
T data
Pointer to row data.
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.
T data
Pointer to column data.
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.