12 #ifndef EIGEN_REVERSE_H 13 #define EIGEN_REVERSE_H 33 template<
typename MatrixType,
int Direction>
34 struct traits<Reverse<MatrixType, Direction> >
37 typedef typename MatrixType::Scalar Scalar;
38 typedef typename traits<MatrixType>::StorageKind StorageKind;
39 typedef typename traits<MatrixType>::XprKind XprKind;
40 typedef typename nested<MatrixType>::type MatrixTypeNested;
41 typedef typename remove_reference<MatrixTypeNested>::type _MatrixTypeNested;
43 RowsAtCompileTime = MatrixType::RowsAtCompileTime,
44 ColsAtCompileTime = MatrixType::ColsAtCompileTime,
45 MaxRowsAtCompileTime = MatrixType::MaxRowsAtCompileTime,
46 MaxColsAtCompileTime = MatrixType::MaxColsAtCompileTime,
54 CoeffReadCost = _MatrixTypeNested::CoeffReadCost
58 template<
typename PacketScalar,
bool ReversePacket>
struct reverse_packet_cond
60 static inline PacketScalar run(
const PacketScalar& x) {
return preverse(x); }
63 template<
typename PacketScalar>
struct reverse_packet_cond<PacketScalar,false>
65 static inline PacketScalar run(
const PacketScalar& x) {
return x; }
70 template<
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;
203 template<
typename Derived>
211 template<
typename Derived>
230 template<
typename Derived>
233 derived() = derived().reverse().eval();
238 #endif // EIGEN_REVERSE_H ReverseReturnType reverse()
Definition: Reverse.h:205
const unsigned int PacketAccessBit
Definition: Constants.h:81
Definition: Constants.h:212
void reverseInPlace()
Definition: Reverse.h:231
const unsigned int LinearAccessBit
Definition: Constants.h:117
const unsigned int LvalueBit
Definition: Constants.h:131
Definition: Constants.h:209
Definition: Eigen_Colamd.h:50
Definition: Constants.h:215
Expression of the reverse of a vector or matrix.
Definition: Reverse.h:70