70template<
typename MatrixType,
int Direction>
class Reverse
71 :
public internal::dense_xpr_base< Reverse<MatrixType, Direction> >::type
75 typedef typename internal::dense_xpr_base<Reverse>::type Base;
76 EIGEN_DENSE_PUBLIC_INTERFACE(Reverse)
77 using Base::IsRowMajor;
85 inline CoeffReturnType operator()(Index row, Index col)
const
87 eigen_assert(row >= 0 && row < rows() && col >= 0 && col < cols());
88 return coeff(row, col);
91 inline CoeffReturnType operator()(Index index)
const
93 eigen_assert(index >= 0 && index < m_matrix.size());
99 PacketSize = internal::packet_traits<Scalar>::size,
100 IsColMajor = !IsRowMajor,
103 OffsetRow = ReverseRow && IsColMajor ? PacketSize : 1,
104 OffsetCol = ReverseCol && IsRowMajor ? PacketSize : 1,
106 || ((Direction ==
Vertical) && IsColMajor)
109 typedef internal::reverse_packet_cond<PacketScalar,ReversePacket> reverse_packet;
112 inline Reverse(
const MatrixType& matrix) : m_matrix(matrix) { }
114 EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Reverse)
116 inline Index rows()
const {
return m_matrix.rows(); }
117 inline Index cols()
const {
return m_matrix.cols(); }
119 inline Index innerStride()
const
121 return -m_matrix.innerStride();
124 inline Scalar& operator()(Index row, Index col)
126 eigen_assert(row >= 0 && row < rows() && col >= 0 && col < cols());
127 return coeffRef(row, col);
130 inline Scalar& coeffRef(Index row, Index col)
132 return m_matrix.const_cast_derived().coeffRef(ReverseRow ? m_matrix.rows() - row - 1 : row,
133 ReverseCol ? m_matrix.cols() - col - 1 : col);
136 inline CoeffReturnType coeff(Index row, Index col)
const
138 return m_matrix.coeff(ReverseRow ? m_matrix.rows() - row - 1 : row,
139 ReverseCol ? m_matrix.cols() - col - 1 : col);
142 inline CoeffReturnType coeff(Index index)
const
144 return m_matrix.coeff(m_matrix.size() - index - 1);
147 inline Scalar& coeffRef(Index index)
149 return m_matrix.const_cast_derived().coeffRef(m_matrix.size() - index - 1);
152 inline Scalar& operator()(Index index)
154 eigen_assert(index >= 0 && index < m_matrix.size());
155 return coeffRef(index);
158 template<
int LoadMode>
159 inline const PacketScalar packet(Index row, Index col)
const
161 return reverse_packet::run(m_matrix.template packet<LoadMode>(
162 ReverseRow ? m_matrix.rows() - row - OffsetRow : row,
163 ReverseCol ? m_matrix.cols() - col - OffsetCol : col));
166 template<
int LoadMode>
167 inline void writePacket(Index row, Index col,
const PacketScalar& x)
169 m_matrix.const_cast_derived().template writePacket<LoadMode>(
170 ReverseRow ? m_matrix.rows() - row - OffsetRow : row,
171 ReverseCol ? m_matrix.cols() - col - OffsetCol : col,
172 reverse_packet::run(x));
175 template<
int LoadMode>
176 inline const PacketScalar packet(Index index)
const
178 return internal::preverse(m_matrix.template packet<LoadMode>( m_matrix.size() - index - PacketSize ));
181 template<
int LoadMode>
182 inline void writePacket(Index index,
const PacketScalar& x)
184 m_matrix.const_cast_derived().template writePacket<LoadMode>(m_matrix.size() - index - PacketSize, internal::preverse(x));
187 const typename internal::remove_all<typename MatrixType::Nested>::type&
188 nestedExpression()
const
194 typename MatrixType::Nested m_matrix;