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;
81 using Base::operator();
85 PacketSize = internal::packet_traits<Scalar>::size,
86 IsColMajor = !IsRowMajor,
89 OffsetRow = ReverseRow && IsColMajor ? PacketSize : 1,
90 OffsetCol = ReverseCol && IsRowMajor ? PacketSize : 1,
92 || ((Direction ==
Vertical) && IsColMajor)
95 typedef internal::reverse_packet_cond<PacketScalar,ReversePacket> reverse_packet;
98 inline Reverse(
const MatrixType& matrix) : m_matrix(matrix) { }
100 EIGEN_INHERIT_ASSIGNMENT_OPERATORS(
Reverse)
102 inline Index rows()
const {
return m_matrix.rows(); }
103 inline Index cols()
const {
return m_matrix.cols(); }
105 inline Index innerStride()
const
107 return -m_matrix.innerStride();
110 inline Scalar& operator()(Index row, Index col)
112 eigen_assert(row >= 0 && row < rows() && col >= 0 && col < cols());
113 return coeffRef(row, col);
116 inline Scalar& coeffRef(Index row, Index col)
118 return m_matrix.const_cast_derived().coeffRef(ReverseRow ? m_matrix.rows() - row - 1 : row,
119 ReverseCol ? m_matrix.cols() - col - 1 : col);
122 inline CoeffReturnType coeff(Index row, Index col)
const
124 return m_matrix.coeff(ReverseRow ? m_matrix.rows() - row - 1 : row,
125 ReverseCol ? m_matrix.cols() - col - 1 : col);
128 inline CoeffReturnType coeff(Index index)
const
130 return m_matrix.coeff(m_matrix.size() - index - 1);
133 inline Scalar& coeffRef(Index index)
135 return m_matrix.const_cast_derived().coeffRef(m_matrix.size() - index - 1);
138 inline Scalar& operator()(Index index)
140 eigen_assert(index >= 0 && index < m_matrix.size());
141 return coeffRef(index);
144 template<
int LoadMode>
145 inline const PacketScalar packet(Index row, Index col)
const
147 return reverse_packet::run(m_matrix.template packet<LoadMode>(
148 ReverseRow ? m_matrix.rows() - row - OffsetRow : row,
149 ReverseCol ? m_matrix.cols() - col - OffsetCol : col));
152 template<
int LoadMode>
153 inline void writePacket(Index row, Index col,
const PacketScalar& x)
155 m_matrix.const_cast_derived().template writePacket<LoadMode>(
156 ReverseRow ? m_matrix.rows() - row - OffsetRow : row,
157 ReverseCol ? m_matrix.cols() - col - OffsetCol : col,
158 reverse_packet::run(x));
161 template<
int LoadMode>
162 inline const PacketScalar packet(Index index)
const
164 return internal::preverse(m_matrix.template packet<LoadMode>( m_matrix.size() - index - PacketSize ));
167 template<
int LoadMode>
168 inline void writePacket(Index index,
const PacketScalar& x)
170 m_matrix.const_cast_derived().template writePacket<LoadMode>(m_matrix.size() - index - PacketSize, internal::preverse(x));
173 const typename internal::remove_all<typename MatrixType::Nested>::type&
174 nestedExpression()
const
180 typename MatrixType::Nested m_matrix;
189 template<
typename Derived>
197 template<
typename Derived>
216 template<
typename Derived>
219 derived() = derived().reverse().eval();
224 #endif // EIGEN_REVERSE_H
ReverseReturnType reverse()
Definition: Reverse.h:191
const unsigned int PacketAccessBit
Definition: Constants.h:81
Definition: Constants.h:212
void reverseInPlace()
Definition: Reverse.h:217
const unsigned int LinearAccessBit
Definition: Constants.h:117
const unsigned int LvalueBit
Definition: Constants.h:131
Definition: Constants.h:209
Definition: Constants.h:215
Expression of the reverse of a vector or matrix.
Definition: Reverse.h:70