27 #ifndef EIGEN_REVERSE_H
28 #define EIGEN_REVERSE_H
48 template<
typename MatrixType,
int Direction>
49 struct traits<Reverse<MatrixType, Direction> >
52 typedef typename MatrixType::Scalar Scalar;
55 typedef typename nested<MatrixType>::type MatrixTypeNested;
56 typedef typename remove_reference<MatrixTypeNested>::type _MatrixTypeNested;
58 RowsAtCompileTime = MatrixType::RowsAtCompileTime,
59 ColsAtCompileTime = MatrixType::ColsAtCompileTime,
60 MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
61 MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime,
69 CoeffReadCost = _MatrixTypeNested::CoeffReadCost
73 template<
typename PacketScalar,
bool ReversePacket>
struct reverse_packet_cond
75 static inline PacketScalar run(
const PacketScalar& x) {
return preverse(x); }
78 template<
typename PacketScalar>
struct reverse_packet_cond<PacketScalar,false>
80 static inline PacketScalar run(
const PacketScalar& x) {
return x; }
85 template<
typename MatrixType,
int Direction>
class Reverse
86 :
public internal::dense_xpr_base< Reverse<MatrixType, Direction> >::type
90 typedef typename internal::dense_xpr_base<Reverse>::type
Base;
92 using
Base::IsRowMajor;
96 using
Base::operator();
100 PacketSize = internal::packet_traits<Scalar>::size,
101 IsColMajor = !IsRowMajor,
104 OffsetRow = ReverseRow && IsColMajor ? PacketSize : 1,
105 OffsetCol = ReverseCol && IsRowMajor ? PacketSize : 1,
107 || ((Direction ==
Vertical) && IsColMajor)
110 typedef internal::reverse_packet_cond<PacketScalar,ReversePacket>
reverse_packet;
113 inline Reverse(
const MatrixType& matrix) : m_matrix(matrix) { }
117 inline Index rows()
const {
return m_matrix.rows(); }
118 inline Index
cols()
const {
return m_matrix.cols(); }
120 inline Index innerStride()
const
122 return -m_matrix.innerStride();
125 inline Scalar& operator()(Index
row, Index
col)
127 eigen_assert(row >= 0 && row < rows() && col >= 0 && col < cols());
128 return coeffRef(row, col);
131 inline Scalar& coeffRef(Index
row, Index
col)
133 return m_matrix.const_cast_derived().coeffRef(ReverseRow ? m_matrix.rows() - row - 1 :
row,
134 ReverseCol ? m_matrix.cols() - col - 1 :
col);
137 inline CoeffReturnType coeff(Index
row, Index
col)
const
139 return m_matrix.coeff(ReverseRow ? m_matrix.rows() - row - 1 :
row,
140 ReverseCol ? m_matrix.cols() - col - 1 :
col);
143 inline CoeffReturnType coeff(Index index)
const
145 return m_matrix.coeff(m_matrix.size() - index - 1);
148 inline Scalar& coeffRef(Index index)
150 return m_matrix.const_cast_derived().coeffRef(m_matrix.size() - index - 1);
153 inline Scalar& operator()(Index index)
156 return coeffRef(index);
159 template<
int LoadMode>
160 inline const PacketScalar packet(Index
row, Index
col)
const
162 return reverse_packet::run(m_matrix.template packet<LoadMode>(
163 ReverseRow ? m_matrix.rows() - row - OffsetRow :
row,
164 ReverseCol ? m_matrix.cols() - col - OffsetCol :
col));
167 template<
int LoadMode>
168 inline void writePacket(Index
row, Index
col,
const PacketScalar& x)
170 m_matrix.const_cast_derived().template writePacket<LoadMode>(
171 ReverseRow ? m_matrix.rows() - row - OffsetRow :
row,
172 ReverseCol ? m_matrix.cols() - col - OffsetCol :
col,
173 reverse_packet::run(x));
176 template<
int LoadMode>
177 inline const PacketScalar packet(Index index)
const
179 return internal::preverse(m_matrix.template packet<LoadMode>( m_matrix.size() - index - PacketSize ));
182 template<
int LoadMode>
183 inline void writePacket(Index index,
const PacketScalar& x)
185 m_matrix.const_cast_derived().template writePacket<LoadMode>(m_matrix.size() - index - PacketSize,
internal::preverse(x));
188 const typename internal::remove_all<typename MatrixType::Nested>::type&
189 nestedExpression()
const
204 template<
typename Derived>
212 template<
typename Derived>
231 template<
typename Derived>
234 derived() = derived().
reverse().eval();
239 #endif // EIGEN_REVERSE_H