Eigne Matrix Class Library

Dependents:   MPC_current_control HydraulicControlBoard_SW AHRS Test_ekf ... more

Committer:
ykuroda
Date:
Thu Oct 13 04:07:23 2016 +0000
Revision:
0:13a5d365ba16
First commint, Eigne Matrix Class Library

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ykuroda 0:13a5d365ba16 1 // This file is part of Eigen, a lightweight C++ template library
ykuroda 0:13a5d365ba16 2 // for linear algebra.
ykuroda 0:13a5d365ba16 3 //
ykuroda 0:13a5d365ba16 4 // Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr>
ykuroda 0:13a5d365ba16 5 // Copyright (C) 2006-2010 Benoit Jacob <jacob.benoit.1@gmail.com>
ykuroda 0:13a5d365ba16 6 //
ykuroda 0:13a5d365ba16 7 // This Source Code Form is subject to the terms of the Mozilla
ykuroda 0:13a5d365ba16 8 // Public License v. 2.0. If a copy of the MPL was not distributed
ykuroda 0:13a5d365ba16 9 // with this file, You can obtain one at http://mozilla.org/MPL/2.0/.
ykuroda 0:13a5d365ba16 10
ykuroda 0:13a5d365ba16 11 #ifndef EIGEN_BLOCK_H
ykuroda 0:13a5d365ba16 12 #define EIGEN_BLOCK_H
ykuroda 0:13a5d365ba16 13
ykuroda 0:13a5d365ba16 14 namespace Eigen {
ykuroda 0:13a5d365ba16 15
ykuroda 0:13a5d365ba16 16 /** \class Block
ykuroda 0:13a5d365ba16 17 * \ingroup Core_Module
ykuroda 0:13a5d365ba16 18 *
ykuroda 0:13a5d365ba16 19 * \brief Expression of a fixed-size or dynamic-size block
ykuroda 0:13a5d365ba16 20 *
ykuroda 0:13a5d365ba16 21 * \param XprType the type of the expression in which we are taking a block
ykuroda 0:13a5d365ba16 22 * \param BlockRows the number of rows of the block we are taking at compile time (optional)
ykuroda 0:13a5d365ba16 23 * \param BlockCols the number of columns of the block we are taking at compile time (optional)
ykuroda 0:13a5d365ba16 24 *
ykuroda 0:13a5d365ba16 25 * This class represents an expression of either a fixed-size or dynamic-size block. It is the return
ykuroda 0:13a5d365ba16 26 * type of DenseBase::block(Index,Index,Index,Index) and DenseBase::block<int,int>(Index,Index) and
ykuroda 0:13a5d365ba16 27 * most of the time this is the only way it is used.
ykuroda 0:13a5d365ba16 28 *
ykuroda 0:13a5d365ba16 29 * However, if you want to directly maniputate block expressions,
ykuroda 0:13a5d365ba16 30 * for instance if you want to write a function returning such an expression, you
ykuroda 0:13a5d365ba16 31 * will need to use this class.
ykuroda 0:13a5d365ba16 32 *
ykuroda 0:13a5d365ba16 33 * Here is an example illustrating the dynamic case:
ykuroda 0:13a5d365ba16 34 * \include class_Block.cpp
ykuroda 0:13a5d365ba16 35 * Output: \verbinclude class_Block.out
ykuroda 0:13a5d365ba16 36 *
ykuroda 0:13a5d365ba16 37 * \note Even though this expression has dynamic size, in the case where \a XprType
ykuroda 0:13a5d365ba16 38 * has fixed size, this expression inherits a fixed maximal size which means that evaluating
ykuroda 0:13a5d365ba16 39 * it does not cause a dynamic memory allocation.
ykuroda 0:13a5d365ba16 40 *
ykuroda 0:13a5d365ba16 41 * Here is an example illustrating the fixed-size case:
ykuroda 0:13a5d365ba16 42 * \include class_FixedBlock.cpp
ykuroda 0:13a5d365ba16 43 * Output: \verbinclude class_FixedBlock.out
ykuroda 0:13a5d365ba16 44 *
ykuroda 0:13a5d365ba16 45 * \sa DenseBase::block(Index,Index,Index,Index), DenseBase::block(Index,Index), class VectorBlock
ykuroda 0:13a5d365ba16 46 */
ykuroda 0:13a5d365ba16 47
ykuroda 0:13a5d365ba16 48 namespace internal {
ykuroda 0:13a5d365ba16 49 template<typename XprType, int BlockRows, int BlockCols, bool InnerPanel>
ykuroda 0:13a5d365ba16 50 struct traits<Block<XprType, BlockRows, BlockCols, InnerPanel> > : traits<XprType>
ykuroda 0:13a5d365ba16 51 {
ykuroda 0:13a5d365ba16 52 typedef typename traits<XprType>::Scalar Scalar;
ykuroda 0:13a5d365ba16 53 typedef typename traits<XprType>::StorageKind StorageKind;
ykuroda 0:13a5d365ba16 54 typedef typename traits<XprType>::XprKind XprKind;
ykuroda 0:13a5d365ba16 55 typedef typename nested<XprType>::type XprTypeNested;
ykuroda 0:13a5d365ba16 56 typedef typename remove_reference<XprTypeNested>::type _XprTypeNested;
ykuroda 0:13a5d365ba16 57 enum{
ykuroda 0:13a5d365ba16 58 MatrixRows = traits<XprType>::RowsAtCompileTime,
ykuroda 0:13a5d365ba16 59 MatrixCols = traits<XprType>::ColsAtCompileTime,
ykuroda 0:13a5d365ba16 60 RowsAtCompileTime = MatrixRows == 0 ? 0 : BlockRows,
ykuroda 0:13a5d365ba16 61 ColsAtCompileTime = MatrixCols == 0 ? 0 : BlockCols,
ykuroda 0:13a5d365ba16 62 MaxRowsAtCompileTime = BlockRows==0 ? 0
ykuroda 0:13a5d365ba16 63 : RowsAtCompileTime != Dynamic ? int(RowsAtCompileTime)
ykuroda 0:13a5d365ba16 64 : int(traits<XprType>::MaxRowsAtCompileTime),
ykuroda 0:13a5d365ba16 65 MaxColsAtCompileTime = BlockCols==0 ? 0
ykuroda 0:13a5d365ba16 66 : ColsAtCompileTime != Dynamic ? int(ColsAtCompileTime)
ykuroda 0:13a5d365ba16 67 : int(traits<XprType>::MaxColsAtCompileTime),
ykuroda 0:13a5d365ba16 68 XprTypeIsRowMajor = (int(traits<XprType>::Flags)&RowMajorBit) != 0,
ykuroda 0:13a5d365ba16 69 IsDense = is_same<StorageKind,Dense>::value,
ykuroda 0:13a5d365ba16 70 IsRowMajor = (IsDense&&MaxRowsAtCompileTime==1&&MaxColsAtCompileTime!=1) ? 1
ykuroda 0:13a5d365ba16 71 : (IsDense&&MaxColsAtCompileTime==1&&MaxRowsAtCompileTime!=1) ? 0
ykuroda 0:13a5d365ba16 72 : XprTypeIsRowMajor,
ykuroda 0:13a5d365ba16 73 HasSameStorageOrderAsXprType = (IsRowMajor == XprTypeIsRowMajor),
ykuroda 0:13a5d365ba16 74 InnerSize = IsRowMajor ? int(ColsAtCompileTime) : int(RowsAtCompileTime),
ykuroda 0:13a5d365ba16 75 InnerStrideAtCompileTime = HasSameStorageOrderAsXprType
ykuroda 0:13a5d365ba16 76 ? int(inner_stride_at_compile_time<XprType>::ret)
ykuroda 0:13a5d365ba16 77 : int(outer_stride_at_compile_time<XprType>::ret),
ykuroda 0:13a5d365ba16 78 OuterStrideAtCompileTime = HasSameStorageOrderAsXprType
ykuroda 0:13a5d365ba16 79 ? int(outer_stride_at_compile_time<XprType>::ret)
ykuroda 0:13a5d365ba16 80 : int(inner_stride_at_compile_time<XprType>::ret),
ykuroda 0:13a5d365ba16 81 MaskPacketAccessBit = (InnerSize == Dynamic || (InnerSize % packet_traits<Scalar>::size) == 0)
ykuroda 0:13a5d365ba16 82 && (InnerStrideAtCompileTime == 1)
ykuroda 0:13a5d365ba16 83 ? PacketAccessBit : 0,
ykuroda 0:13a5d365ba16 84 MaskAlignedBit = (InnerPanel && (OuterStrideAtCompileTime!=Dynamic) && (((OuterStrideAtCompileTime * int(sizeof(Scalar))) % 16) == 0)) ? AlignedBit : 0,
ykuroda 0:13a5d365ba16 85 FlagsLinearAccessBit = (RowsAtCompileTime == 1 || ColsAtCompileTime == 1 || (InnerPanel && (traits<XprType>::Flags&LinearAccessBit))) ? LinearAccessBit : 0,
ykuroda 0:13a5d365ba16 86 FlagsLvalueBit = is_lvalue<XprType>::value ? LvalueBit : 0,
ykuroda 0:13a5d365ba16 87 FlagsRowMajorBit = IsRowMajor ? RowMajorBit : 0,
ykuroda 0:13a5d365ba16 88 Flags0 = traits<XprType>::Flags & ( (HereditaryBits & ~RowMajorBit) |
ykuroda 0:13a5d365ba16 89 DirectAccessBit |
ykuroda 0:13a5d365ba16 90 MaskPacketAccessBit |
ykuroda 0:13a5d365ba16 91 MaskAlignedBit),
ykuroda 0:13a5d365ba16 92 Flags = Flags0 | FlagsLinearAccessBit | FlagsLvalueBit | FlagsRowMajorBit
ykuroda 0:13a5d365ba16 93 };
ykuroda 0:13a5d365ba16 94 };
ykuroda 0:13a5d365ba16 95
ykuroda 0:13a5d365ba16 96 template<typename XprType, int BlockRows=Dynamic, int BlockCols=Dynamic, bool InnerPanel = false,
ykuroda 0:13a5d365ba16 97 bool HasDirectAccess = internal::has_direct_access<XprType>::ret> class BlockImpl_dense;
ykuroda 0:13a5d365ba16 98
ykuroda 0:13a5d365ba16 99 } // end namespace internal
ykuroda 0:13a5d365ba16 100
ykuroda 0:13a5d365ba16 101 template<typename XprType, int BlockRows, int BlockCols, bool InnerPanel, typename StorageKind> class BlockImpl;
ykuroda 0:13a5d365ba16 102
ykuroda 0:13a5d365ba16 103 template<typename XprType, int BlockRows, int BlockCols, bool InnerPanel> class Block
ykuroda 0:13a5d365ba16 104 : public BlockImpl<XprType, BlockRows, BlockCols, InnerPanel, typename internal::traits<XprType>::StorageKind>
ykuroda 0:13a5d365ba16 105 {
ykuroda 0:13a5d365ba16 106 typedef BlockImpl<XprType, BlockRows, BlockCols, InnerPanel, typename internal::traits<XprType>::StorageKind> Impl;
ykuroda 0:13a5d365ba16 107 public:
ykuroda 0:13a5d365ba16 108 //typedef typename Impl::Base Base;
ykuroda 0:13a5d365ba16 109 typedef Impl Base;
ykuroda 0:13a5d365ba16 110 EIGEN_GENERIC_PUBLIC_INTERFACE(Block)
ykuroda 0:13a5d365ba16 111 EIGEN_INHERIT_ASSIGNMENT_OPERATORS(Block)
ykuroda 0:13a5d365ba16 112
ykuroda 0:13a5d365ba16 113 /** Column or Row constructor
ykuroda 0:13a5d365ba16 114 */
ykuroda 0:13a5d365ba16 115 inline Block(XprType& xpr, Index i) : Impl(xpr,i)
ykuroda 0:13a5d365ba16 116 {
ykuroda 0:13a5d365ba16 117 eigen_assert( (i>=0) && (
ykuroda 0:13a5d365ba16 118 ((BlockRows==1) && (BlockCols==XprType::ColsAtCompileTime) && i<xpr.rows())
ykuroda 0:13a5d365ba16 119 ||((BlockRows==XprType::RowsAtCompileTime) && (BlockCols==1) && i<xpr.cols())));
ykuroda 0:13a5d365ba16 120 }
ykuroda 0:13a5d365ba16 121
ykuroda 0:13a5d365ba16 122 /** Fixed-size constructor
ykuroda 0:13a5d365ba16 123 */
ykuroda 0:13a5d365ba16 124 inline Block(XprType& xpr, Index a_startRow, Index a_startCol)
ykuroda 0:13a5d365ba16 125 : Impl(xpr, a_startRow, a_startCol)
ykuroda 0:13a5d365ba16 126 {
ykuroda 0:13a5d365ba16 127 EIGEN_STATIC_ASSERT(RowsAtCompileTime!=Dynamic && ColsAtCompileTime!=Dynamic,THIS_METHOD_IS_ONLY_FOR_FIXED_SIZE)
ykuroda 0:13a5d365ba16 128 eigen_assert(a_startRow >= 0 && BlockRows >= 1 && a_startRow + BlockRows <= xpr.rows()
ykuroda 0:13a5d365ba16 129 && a_startCol >= 0 && BlockCols >= 1 && a_startCol + BlockCols <= xpr.cols());
ykuroda 0:13a5d365ba16 130 }
ykuroda 0:13a5d365ba16 131
ykuroda 0:13a5d365ba16 132 /** Dynamic-size constructor
ykuroda 0:13a5d365ba16 133 */
ykuroda 0:13a5d365ba16 134 inline Block(XprType& xpr,
ykuroda 0:13a5d365ba16 135 Index a_startRow, Index a_startCol,
ykuroda 0:13a5d365ba16 136 Index blockRows, Index blockCols)
ykuroda 0:13a5d365ba16 137 : Impl(xpr, a_startRow, a_startCol, blockRows, blockCols)
ykuroda 0:13a5d365ba16 138 {
ykuroda 0:13a5d365ba16 139 eigen_assert((RowsAtCompileTime==Dynamic || RowsAtCompileTime==blockRows)
ykuroda 0:13a5d365ba16 140 && (ColsAtCompileTime==Dynamic || ColsAtCompileTime==blockCols));
ykuroda 0:13a5d365ba16 141 eigen_assert(a_startRow >= 0 && blockRows >= 0 && a_startRow <= xpr.rows() - blockRows
ykuroda 0:13a5d365ba16 142 && a_startCol >= 0 && blockCols >= 0 && a_startCol <= xpr.cols() - blockCols);
ykuroda 0:13a5d365ba16 143 }
ykuroda 0:13a5d365ba16 144 };
ykuroda 0:13a5d365ba16 145
ykuroda 0:13a5d365ba16 146 // The generic default implementation for dense block simplu forward to the internal::BlockImpl_dense
ykuroda 0:13a5d365ba16 147 // that must be specialized for direct and non-direct access...
ykuroda 0:13a5d365ba16 148 template<typename XprType, int BlockRows, int BlockCols, bool InnerPanel>
ykuroda 0:13a5d365ba16 149 class BlockImpl<XprType, BlockRows, BlockCols, InnerPanel, Dense>
ykuroda 0:13a5d365ba16 150 : public internal::BlockImpl_dense<XprType, BlockRows, BlockCols, InnerPanel>
ykuroda 0:13a5d365ba16 151 {
ykuroda 0:13a5d365ba16 152 typedef internal::BlockImpl_dense<XprType, BlockRows, BlockCols, InnerPanel> Impl;
ykuroda 0:13a5d365ba16 153 typedef typename XprType::Index Index;
ykuroda 0:13a5d365ba16 154 public:
ykuroda 0:13a5d365ba16 155 typedef Impl Base;
ykuroda 0:13a5d365ba16 156 EIGEN_INHERIT_ASSIGNMENT_OPERATORS(BlockImpl)
ykuroda 0:13a5d365ba16 157 inline BlockImpl(XprType& xpr, Index i) : Impl(xpr,i) {}
ykuroda 0:13a5d365ba16 158 inline BlockImpl(XprType& xpr, Index a_startRow, Index a_startCol) : Impl(xpr, a_startRow, a_startCol) {}
ykuroda 0:13a5d365ba16 159 inline BlockImpl(XprType& xpr, Index a_startRow, Index a_startCol, Index blockRows, Index blockCols)
ykuroda 0:13a5d365ba16 160 : Impl(xpr, a_startRow, a_startCol, blockRows, blockCols) {}
ykuroda 0:13a5d365ba16 161 };
ykuroda 0:13a5d365ba16 162
ykuroda 0:13a5d365ba16 163 namespace internal {
ykuroda 0:13a5d365ba16 164
ykuroda 0:13a5d365ba16 165 /** \internal Internal implementation of dense Blocks in the general case. */
ykuroda 0:13a5d365ba16 166 template<typename XprType, int BlockRows, int BlockCols, bool InnerPanel, bool HasDirectAccess> class BlockImpl_dense
ykuroda 0:13a5d365ba16 167 : public internal::dense_xpr_base<Block<XprType, BlockRows, BlockCols, InnerPanel> >::type
ykuroda 0:13a5d365ba16 168 {
ykuroda 0:13a5d365ba16 169 typedef Block<XprType, BlockRows, BlockCols, InnerPanel> BlockType;
ykuroda 0:13a5d365ba16 170 public:
ykuroda 0:13a5d365ba16 171
ykuroda 0:13a5d365ba16 172 typedef typename internal::dense_xpr_base<BlockType>::type Base;
ykuroda 0:13a5d365ba16 173 EIGEN_DENSE_PUBLIC_INTERFACE(BlockType)
ykuroda 0:13a5d365ba16 174 EIGEN_INHERIT_ASSIGNMENT_OPERATORS(BlockImpl_dense)
ykuroda 0:13a5d365ba16 175
ykuroda 0:13a5d365ba16 176 class InnerIterator;
ykuroda 0:13a5d365ba16 177
ykuroda 0:13a5d365ba16 178 /** Column or Row constructor
ykuroda 0:13a5d365ba16 179 */
ykuroda 0:13a5d365ba16 180 inline BlockImpl_dense(XprType& xpr, Index i)
ykuroda 0:13a5d365ba16 181 : m_xpr(xpr),
ykuroda 0:13a5d365ba16 182 // It is a row if and only if BlockRows==1 and BlockCols==XprType::ColsAtCompileTime,
ykuroda 0:13a5d365ba16 183 // and it is a column if and only if BlockRows==XprType::RowsAtCompileTime and BlockCols==1,
ykuroda 0:13a5d365ba16 184 // all other cases are invalid.
ykuroda 0:13a5d365ba16 185 // The case a 1x1 matrix seems ambiguous, but the result is the same anyway.
ykuroda 0:13a5d365ba16 186 m_startRow( (BlockRows==1) && (BlockCols==XprType::ColsAtCompileTime) ? i : 0),
ykuroda 0:13a5d365ba16 187 m_startCol( (BlockRows==XprType::RowsAtCompileTime) && (BlockCols==1) ? i : 0),
ykuroda 0:13a5d365ba16 188 m_blockRows(BlockRows==1 ? 1 : xpr.rows()),
ykuroda 0:13a5d365ba16 189 m_blockCols(BlockCols==1 ? 1 : xpr.cols())
ykuroda 0:13a5d365ba16 190 {}
ykuroda 0:13a5d365ba16 191
ykuroda 0:13a5d365ba16 192 /** Fixed-size constructor
ykuroda 0:13a5d365ba16 193 */
ykuroda 0:13a5d365ba16 194 inline BlockImpl_dense(XprType& xpr, Index a_startRow, Index a_startCol)
ykuroda 0:13a5d365ba16 195 : m_xpr(xpr), m_startRow(a_startRow), m_startCol(a_startCol),
ykuroda 0:13a5d365ba16 196 m_blockRows(BlockRows), m_blockCols(BlockCols)
ykuroda 0:13a5d365ba16 197 {}
ykuroda 0:13a5d365ba16 198
ykuroda 0:13a5d365ba16 199 /** Dynamic-size constructor
ykuroda 0:13a5d365ba16 200 */
ykuroda 0:13a5d365ba16 201 inline BlockImpl_dense(XprType& xpr,
ykuroda 0:13a5d365ba16 202 Index a_startRow, Index a_startCol,
ykuroda 0:13a5d365ba16 203 Index blockRows, Index blockCols)
ykuroda 0:13a5d365ba16 204 : m_xpr(xpr), m_startRow(a_startRow), m_startCol(a_startCol),
ykuroda 0:13a5d365ba16 205 m_blockRows(blockRows), m_blockCols(blockCols)
ykuroda 0:13a5d365ba16 206 {}
ykuroda 0:13a5d365ba16 207
ykuroda 0:13a5d365ba16 208 inline Index rows() const { return m_blockRows.value(); }
ykuroda 0:13a5d365ba16 209 inline Index cols() const { return m_blockCols.value(); }
ykuroda 0:13a5d365ba16 210
ykuroda 0:13a5d365ba16 211 inline Scalar& coeffRef(Index rowId, Index colId)
ykuroda 0:13a5d365ba16 212 {
ykuroda 0:13a5d365ba16 213 EIGEN_STATIC_ASSERT_LVALUE(XprType)
ykuroda 0:13a5d365ba16 214 return m_xpr.const_cast_derived()
ykuroda 0:13a5d365ba16 215 .coeffRef(rowId + m_startRow.value(), colId + m_startCol.value());
ykuroda 0:13a5d365ba16 216 }
ykuroda 0:13a5d365ba16 217
ykuroda 0:13a5d365ba16 218 inline const Scalar& coeffRef(Index rowId, Index colId) const
ykuroda 0:13a5d365ba16 219 {
ykuroda 0:13a5d365ba16 220 return m_xpr.derived()
ykuroda 0:13a5d365ba16 221 .coeffRef(rowId + m_startRow.value(), colId + m_startCol.value());
ykuroda 0:13a5d365ba16 222 }
ykuroda 0:13a5d365ba16 223
ykuroda 0:13a5d365ba16 224 EIGEN_STRONG_INLINE const CoeffReturnType coeff(Index rowId, Index colId) const
ykuroda 0:13a5d365ba16 225 {
ykuroda 0:13a5d365ba16 226 return m_xpr.coeff(rowId + m_startRow.value(), colId + m_startCol.value());
ykuroda 0:13a5d365ba16 227 }
ykuroda 0:13a5d365ba16 228
ykuroda 0:13a5d365ba16 229 inline Scalar& coeffRef(Index index)
ykuroda 0:13a5d365ba16 230 {
ykuroda 0:13a5d365ba16 231 EIGEN_STATIC_ASSERT_LVALUE(XprType)
ykuroda 0:13a5d365ba16 232 return m_xpr.const_cast_derived()
ykuroda 0:13a5d365ba16 233 .coeffRef(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),
ykuroda 0:13a5d365ba16 234 m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0));
ykuroda 0:13a5d365ba16 235 }
ykuroda 0:13a5d365ba16 236
ykuroda 0:13a5d365ba16 237 inline const Scalar& coeffRef(Index index) const
ykuroda 0:13a5d365ba16 238 {
ykuroda 0:13a5d365ba16 239 return m_xpr.const_cast_derived()
ykuroda 0:13a5d365ba16 240 .coeffRef(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),
ykuroda 0:13a5d365ba16 241 m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0));
ykuroda 0:13a5d365ba16 242 }
ykuroda 0:13a5d365ba16 243
ykuroda 0:13a5d365ba16 244 inline const CoeffReturnType coeff(Index index) const
ykuroda 0:13a5d365ba16 245 {
ykuroda 0:13a5d365ba16 246 return m_xpr
ykuroda 0:13a5d365ba16 247 .coeff(m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),
ykuroda 0:13a5d365ba16 248 m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0));
ykuroda 0:13a5d365ba16 249 }
ykuroda 0:13a5d365ba16 250
ykuroda 0:13a5d365ba16 251 template<int LoadMode>
ykuroda 0:13a5d365ba16 252 inline PacketScalar packet(Index rowId, Index colId) const
ykuroda 0:13a5d365ba16 253 {
ykuroda 0:13a5d365ba16 254 return m_xpr.template packet<Unaligned>
ykuroda 0:13a5d365ba16 255 (rowId + m_startRow.value(), colId + m_startCol.value());
ykuroda 0:13a5d365ba16 256 }
ykuroda 0:13a5d365ba16 257
ykuroda 0:13a5d365ba16 258 template<int LoadMode>
ykuroda 0:13a5d365ba16 259 inline void writePacket(Index rowId, Index colId, const PacketScalar& val)
ykuroda 0:13a5d365ba16 260 {
ykuroda 0:13a5d365ba16 261 m_xpr.const_cast_derived().template writePacket<Unaligned>
ykuroda 0:13a5d365ba16 262 (rowId + m_startRow.value(), colId + m_startCol.value(), val);
ykuroda 0:13a5d365ba16 263 }
ykuroda 0:13a5d365ba16 264
ykuroda 0:13a5d365ba16 265 template<int LoadMode>
ykuroda 0:13a5d365ba16 266 inline PacketScalar packet(Index index) const
ykuroda 0:13a5d365ba16 267 {
ykuroda 0:13a5d365ba16 268 return m_xpr.template packet<Unaligned>
ykuroda 0:13a5d365ba16 269 (m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),
ykuroda 0:13a5d365ba16 270 m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0));
ykuroda 0:13a5d365ba16 271 }
ykuroda 0:13a5d365ba16 272
ykuroda 0:13a5d365ba16 273 template<int LoadMode>
ykuroda 0:13a5d365ba16 274 inline void writePacket(Index index, const PacketScalar& val)
ykuroda 0:13a5d365ba16 275 {
ykuroda 0:13a5d365ba16 276 m_xpr.const_cast_derived().template writePacket<Unaligned>
ykuroda 0:13a5d365ba16 277 (m_startRow.value() + (RowsAtCompileTime == 1 ? 0 : index),
ykuroda 0:13a5d365ba16 278 m_startCol.value() + (RowsAtCompileTime == 1 ? index : 0), val);
ykuroda 0:13a5d365ba16 279 }
ykuroda 0:13a5d365ba16 280
ykuroda 0:13a5d365ba16 281 #ifdef EIGEN_PARSED_BY_DOXYGEN
ykuroda 0:13a5d365ba16 282 /** \sa MapBase::data() */
ykuroda 0:13a5d365ba16 283 inline const Scalar* data() const;
ykuroda 0:13a5d365ba16 284 inline Index innerStride() const;
ykuroda 0:13a5d365ba16 285 inline Index outerStride() const;
ykuroda 0:13a5d365ba16 286 #endif
ykuroda 0:13a5d365ba16 287
ykuroda 0:13a5d365ba16 288 const typename internal::remove_all<typename XprType::Nested>::type& nestedExpression() const
ykuroda 0:13a5d365ba16 289 {
ykuroda 0:13a5d365ba16 290 return m_xpr;
ykuroda 0:13a5d365ba16 291 }
ykuroda 0:13a5d365ba16 292
ykuroda 0:13a5d365ba16 293 Index startRow() const
ykuroda 0:13a5d365ba16 294 {
ykuroda 0:13a5d365ba16 295 return m_startRow.value();
ykuroda 0:13a5d365ba16 296 }
ykuroda 0:13a5d365ba16 297
ykuroda 0:13a5d365ba16 298 Index startCol() const
ykuroda 0:13a5d365ba16 299 {
ykuroda 0:13a5d365ba16 300 return m_startCol.value();
ykuroda 0:13a5d365ba16 301 }
ykuroda 0:13a5d365ba16 302
ykuroda 0:13a5d365ba16 303 protected:
ykuroda 0:13a5d365ba16 304
ykuroda 0:13a5d365ba16 305 const typename XprType::Nested m_xpr;
ykuroda 0:13a5d365ba16 306 const internal::variable_if_dynamic<Index, XprType::RowsAtCompileTime == 1 ? 0 : Dynamic> m_startRow;
ykuroda 0:13a5d365ba16 307 const internal::variable_if_dynamic<Index, XprType::ColsAtCompileTime == 1 ? 0 : Dynamic> m_startCol;
ykuroda 0:13a5d365ba16 308 const internal::variable_if_dynamic<Index, RowsAtCompileTime> m_blockRows;
ykuroda 0:13a5d365ba16 309 const internal::variable_if_dynamic<Index, ColsAtCompileTime> m_blockCols;
ykuroda 0:13a5d365ba16 310 };
ykuroda 0:13a5d365ba16 311
ykuroda 0:13a5d365ba16 312 /** \internal Internal implementation of dense Blocks in the direct access case.*/
ykuroda 0:13a5d365ba16 313 template<typename XprType, int BlockRows, int BlockCols, bool InnerPanel>
ykuroda 0:13a5d365ba16 314 class BlockImpl_dense<XprType,BlockRows,BlockCols, InnerPanel,true>
ykuroda 0:13a5d365ba16 315 : public MapBase<Block<XprType, BlockRows, BlockCols, InnerPanel> >
ykuroda 0:13a5d365ba16 316 {
ykuroda 0:13a5d365ba16 317 typedef Block<XprType, BlockRows, BlockCols, InnerPanel> BlockType;
ykuroda 0:13a5d365ba16 318 public:
ykuroda 0:13a5d365ba16 319
ykuroda 0:13a5d365ba16 320 typedef MapBase<BlockType> Base;
ykuroda 0:13a5d365ba16 321 EIGEN_DENSE_PUBLIC_INTERFACE(BlockType)
ykuroda 0:13a5d365ba16 322 EIGEN_INHERIT_ASSIGNMENT_OPERATORS(BlockImpl_dense)
ykuroda 0:13a5d365ba16 323
ykuroda 0:13a5d365ba16 324 /** Column or Row constructor
ykuroda 0:13a5d365ba16 325 */
ykuroda 0:13a5d365ba16 326 inline BlockImpl_dense(XprType& xpr, Index i)
ykuroda 0:13a5d365ba16 327 : Base(internal::const_cast_ptr(&xpr.coeffRef(
ykuroda 0:13a5d365ba16 328 (BlockRows==1) && (BlockCols==XprType::ColsAtCompileTime) ? i : 0,
ykuroda 0:13a5d365ba16 329 (BlockRows==XprType::RowsAtCompileTime) && (BlockCols==1) ? i : 0)),
ykuroda 0:13a5d365ba16 330 BlockRows==1 ? 1 : xpr.rows(),
ykuroda 0:13a5d365ba16 331 BlockCols==1 ? 1 : xpr.cols()),
ykuroda 0:13a5d365ba16 332 m_xpr(xpr)
ykuroda 0:13a5d365ba16 333 {
ykuroda 0:13a5d365ba16 334 init();
ykuroda 0:13a5d365ba16 335 }
ykuroda 0:13a5d365ba16 336
ykuroda 0:13a5d365ba16 337 /** Fixed-size constructor
ykuroda 0:13a5d365ba16 338 */
ykuroda 0:13a5d365ba16 339 inline BlockImpl_dense(XprType& xpr, Index startRow, Index startCol)
ykuroda 0:13a5d365ba16 340 : Base(internal::const_cast_ptr(&xpr.coeffRef(startRow,startCol))), m_xpr(xpr)
ykuroda 0:13a5d365ba16 341 {
ykuroda 0:13a5d365ba16 342 init();
ykuroda 0:13a5d365ba16 343 }
ykuroda 0:13a5d365ba16 344
ykuroda 0:13a5d365ba16 345 /** Dynamic-size constructor
ykuroda 0:13a5d365ba16 346 */
ykuroda 0:13a5d365ba16 347 inline BlockImpl_dense(XprType& xpr,
ykuroda 0:13a5d365ba16 348 Index startRow, Index startCol,
ykuroda 0:13a5d365ba16 349 Index blockRows, Index blockCols)
ykuroda 0:13a5d365ba16 350 : Base(internal::const_cast_ptr(&xpr.coeffRef(startRow,startCol)), blockRows, blockCols),
ykuroda 0:13a5d365ba16 351 m_xpr(xpr)
ykuroda 0:13a5d365ba16 352 {
ykuroda 0:13a5d365ba16 353 init();
ykuroda 0:13a5d365ba16 354 }
ykuroda 0:13a5d365ba16 355
ykuroda 0:13a5d365ba16 356 const typename internal::remove_all<typename XprType::Nested>::type& nestedExpression() const
ykuroda 0:13a5d365ba16 357 {
ykuroda 0:13a5d365ba16 358 return m_xpr;
ykuroda 0:13a5d365ba16 359 }
ykuroda 0:13a5d365ba16 360
ykuroda 0:13a5d365ba16 361 /** \sa MapBase::innerStride() */
ykuroda 0:13a5d365ba16 362 inline Index innerStride() const
ykuroda 0:13a5d365ba16 363 {
ykuroda 0:13a5d365ba16 364 return internal::traits<BlockType>::HasSameStorageOrderAsXprType
ykuroda 0:13a5d365ba16 365 ? m_xpr.innerStride()
ykuroda 0:13a5d365ba16 366 : m_xpr.outerStride();
ykuroda 0:13a5d365ba16 367 }
ykuroda 0:13a5d365ba16 368
ykuroda 0:13a5d365ba16 369 /** \sa MapBase::outerStride() */
ykuroda 0:13a5d365ba16 370 inline Index outerStride() const
ykuroda 0:13a5d365ba16 371 {
ykuroda 0:13a5d365ba16 372 return m_outerStride;
ykuroda 0:13a5d365ba16 373 }
ykuroda 0:13a5d365ba16 374
ykuroda 0:13a5d365ba16 375 #ifndef __SUNPRO_CC
ykuroda 0:13a5d365ba16 376 // FIXME sunstudio is not friendly with the above friend...
ykuroda 0:13a5d365ba16 377 // META-FIXME there is no 'friend' keyword around here. Is this obsolete?
ykuroda 0:13a5d365ba16 378 protected:
ykuroda 0:13a5d365ba16 379 #endif
ykuroda 0:13a5d365ba16 380
ykuroda 0:13a5d365ba16 381 #ifndef EIGEN_PARSED_BY_DOXYGEN
ykuroda 0:13a5d365ba16 382 /** \internal used by allowAligned() */
ykuroda 0:13a5d365ba16 383 inline BlockImpl_dense(XprType& xpr, const Scalar* data, Index blockRows, Index blockCols)
ykuroda 0:13a5d365ba16 384 : Base(data, blockRows, blockCols), m_xpr(xpr)
ykuroda 0:13a5d365ba16 385 {
ykuroda 0:13a5d365ba16 386 init();
ykuroda 0:13a5d365ba16 387 }
ykuroda 0:13a5d365ba16 388 #endif
ykuroda 0:13a5d365ba16 389
ykuroda 0:13a5d365ba16 390 protected:
ykuroda 0:13a5d365ba16 391 void init()
ykuroda 0:13a5d365ba16 392 {
ykuroda 0:13a5d365ba16 393 m_outerStride = internal::traits<BlockType>::HasSameStorageOrderAsXprType
ykuroda 0:13a5d365ba16 394 ? m_xpr.outerStride()
ykuroda 0:13a5d365ba16 395 : m_xpr.innerStride();
ykuroda 0:13a5d365ba16 396 }
ykuroda 0:13a5d365ba16 397
ykuroda 0:13a5d365ba16 398 typename XprType::Nested m_xpr;
ykuroda 0:13a5d365ba16 399 Index m_outerStride;
ykuroda 0:13a5d365ba16 400 };
ykuroda 0:13a5d365ba16 401
ykuroda 0:13a5d365ba16 402 } // end namespace internal
ykuroda 0:13a5d365ba16 403
ykuroda 0:13a5d365ba16 404 } // end namespace Eigen
ykuroda 0:13a5d365ba16 405
ykuroda 0:13a5d365ba16 406 #endif // EIGEN_BLOCK_H