9 #ifndef RTCTK_COMPONENTFRAMEWORK_MATRIXBUFFER_HPP
10 #define RTCTK_COMPONENTFRAMEWORK_MATRIXBUFFER_HPP
18 template <
typename T,
typename A = std::allocator<T>>
21 using typename std::vector<T, A>::size_type;
22 using typename std::vector<T, A>::value_type;
23 using typename std::vector<T, A>::reference;
24 using typename std::vector<T, A>::const_reference;
27 std::vector<T, A>(), m_nrows(0), m_ncols(0) {
31 std::vector<T, A>(other),
32 m_nrows(other.m_nrows),
33 m_ncols(other.m_ncols) {
37 std::vector<T, A>::operator=(other);
38 m_nrows = other.m_nrows;
39 m_ncols = other.m_ncols;
44 std::vector<T, A>(std::forward<MatrixBuffer>(other)),
45 m_nrows(std::move(other.m_nrows)),
46 m_ncols(std::move(other.m_ncols)) {
50 noexcept(std::allocator_traits<A>::propagate_on_container_move_assignment::value
51 or std::allocator_traits<A>::is_always_equal::value) {
52 std::vector<T, A>::operator=(std::forward<MatrixBuffer>(other));
53 m_nrows = std::move(other.m_nrows);
54 m_ncols = std::move(other.m_ncols);
58 constexpr
MatrixBuffer(size_type n, size_type m,
const std::vector<T, A>& data) :
59 std::vector<T, A>(data), m_nrows(n), m_ncols(m) {
60 assert(n * m == data.size());
63 constexpr
void resize(size_type n, size_type m) {
64 std::vector<T, A>::resize(n*m);
69 constexpr
void resize(size_type n, size_type m,
const value_type& value) {
70 std::vector<T, A>::resize(n*m, value);
75 constexpr reference
operator()(size_type n, size_type m) {
76 assert(0 <= n and n < m_nrows);
77 assert(0 <= m and m < m_ncols);
78 return std::vector<T, A>::operator[](n*m_ncols + m);
81 constexpr const_reference
operator()(size_type n, size_type m)
const {
82 assert(0 <= n and n < m_nrows);
83 assert(0 <= m and m < m_ncols);
84 return std::vector<T, A>::operator[](n*m_ncols + m);
104 template <
typename T,
typename A>
106 return lhs.get_nrows() == rhs.get_nrows() and
107 lhs.get_ncols() == rhs.get_ncols() and
108 static_cast<std::vector<T, A>
>(lhs) ==
static_cast<std::vector<T, A>
>(rhs);
115 template <
typename T,
typename A>
117 return lhs.get_nrows() != rhs.get_nrows() or
118 lhs.get_ncols() != rhs.get_ncols() or
119 static_cast<std::vector<T, A>
>(lhs) !=
static_cast<std::vector<T, A>
>(rhs);
130 template <
typename T,
typename A>
132 if (lhs.size() < rhs.size()) {
134 }
else if (lhs.size() == rhs.size()) {
135 if (lhs.get_nrows() < rhs.get_nrows()) {
137 }
else if (lhs.get_nrows() > rhs.get_nrows()) {
141 return static_cast<std::vector<T, A>
>(lhs) <
static_cast<std::vector<T, A>
>(rhs);
148 template <
typename T,
typename A>
150 if (lhs.size() < rhs.size()) {
152 }
else if (lhs.size() == rhs.size()) {
153 if (lhs.get_nrows() < rhs.get_nrows()) {
155 }
else if (lhs.get_nrows() > rhs.get_nrows()) {
159 return static_cast<std::vector<T, A>
>(lhs) <=
static_cast<std::vector<T, A>
>(rhs);
170 template <
typename T,
typename A>
172 if (lhs.size() > rhs.size()) {
174 }
else if (lhs.size() == rhs.size()) {
175 if (lhs.get_nrows() > rhs.get_nrows()) {
177 }
else if (lhs.get_nrows() < rhs.get_nrows()) {
181 return static_cast<std::vector<T, A>
>(lhs) >
static_cast<std::vector<T, A>
>(rhs);
188 template <
typename T,
typename A>
190 if (lhs.size() > rhs.size()) {
192 }
else if (lhs.size() == rhs.size()) {
193 if (lhs.get_nrows() > rhs.get_nrows()) {
195 }
else if (lhs.get_nrows() < rhs.get_nrows()) {
199 return static_cast<std::vector<T, A>
>(lhs) >=
static_cast<std::vector<T, A>
>(rhs);
204 #endif // RTCTK_COMPONENTFRAMEWORK_MATRIXBUFFER_HPP