1c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This file is part of Eigen, a lightweight C++ template library 2c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// for linear algebra. 3c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 4c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2007-2010 Benoit Jacob <jacob.benoit.1@gmail.com> 5c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Copyright (C) 2008 Gael Guennebaud <gael.guennebaud@inria.fr> 6c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// 7c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// This Source Code Form is subject to the terms of the Mozilla 8c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// Public License v. 2.0. If a copy of the MPL was not distributed 9c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// with this file, You can obtain one at http://mozilla.org/MPL/2.0/. 10c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 11c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#ifndef EIGEN_MAPBASE_H 12c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_MAPBASE_H 13c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 14c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#define EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived) \ 15c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STATIC_ASSERT((int(internal::traits<Derived>::Flags) & LinearAccessBit) || Derived::IsVectorAtCompileTime, \ 16c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath YOU_ARE_TRYING_TO_USE_AN_INDEX_BASED_ACCESSOR_ON_AN_EXPRESSION_THAT_DOES_NOT_SUPPORT_THAT) 17c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 18c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathnamespace Eigen { 19c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 20c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath/** \class MapBase 21c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \ingroup Core_Module 22c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 23c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \brief Base class for Map and Block expression with direct access 24c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 25c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa class Map, class Block 26c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 27c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> class MapBase<Derived, ReadOnlyAccessors> 28c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : public internal::dense_xpr_base<Derived>::type 29c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 30c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: 31c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 32c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::dense_xpr_base<Derived>::type Base; 33c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath enum { 34c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath RowsAtCompileTime = internal::traits<Derived>::RowsAtCompileTime, 35c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath ColsAtCompileTime = internal::traits<Derived>::ColsAtCompileTime, 36c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath SizeAtCompileTime = Base::SizeAtCompileTime 37c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath }; 38c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 39c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::traits<Derived>::StorageKind StorageKind; 40c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::traits<Derived>::Index Index; 41c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::traits<Derived>::Scalar Scalar; 42c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::packet_traits<Scalar>::type PacketScalar; 43c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename NumTraits<Scalar>::Real RealScalar; 44c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::conditional< 45c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath bool(internal::is_lvalue<Derived>::value), 46c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar *, 47c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Scalar *>::type 48c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath PointerType; 49c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 50c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::derived; 51c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// using Base::RowsAtCompileTime; 52c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// using Base::ColsAtCompileTime; 53c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath// using Base::SizeAtCompileTime; 54c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::MaxRowsAtCompileTime; 55c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::MaxColsAtCompileTime; 56c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::MaxSizeAtCompileTime; 57c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::IsVectorAtCompileTime; 58c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::Flags; 59c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::IsRowMajor; 60c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 61c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::rows; 62c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::cols; 63c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::size; 64c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::coeff; 65c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::coeffRef; 66c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::lazyAssign; 67c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::eval; 68c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 69c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::innerStride; 70c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::outerStride; 71c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::rowStride; 72c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::colStride; 73c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 74c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath // bug 217 - compile error on ICC 11.1 75c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::operator=; 76c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 77c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename Base::CoeffReturnType CoeffReturnType; 78c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 79c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index rows() const { return m_rows.value(); } 80c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline Index cols() const { return m_cols.value(); } 81c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 82c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath /** Returns a pointer to the first coefficient of the matrix or vector. 83c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 84c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \note When addressing this data, make sure to honor the strides returned by innerStride() and outerStride(). 85c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * 86c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath * \sa innerStride(), outerStride() 87c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath */ 88c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const Scalar* data() const { return m_data; } 89c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 90c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const Scalar& coeff(Index row, Index col) const 91c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 92c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return m_data[col * colStride() + row * rowStride()]; 93c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 94c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 95c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const Scalar& coeff(Index index) const 96c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 97c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived) 98c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return m_data[index * innerStride()]; 99c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 100c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 101c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const Scalar& coeffRef(Index row, Index col) const 102c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 103c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return this->m_data[col * colStride() + row * rowStride()]; 104c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 105c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 106c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const Scalar& coeffRef(Index index) const 107c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 108c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived) 109c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return this->m_data[index * innerStride()]; 110c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 111c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 112c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<int LoadMode> 113c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline PacketScalar packet(Index row, Index col) const 114c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 115c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return internal::ploadt<PacketScalar, LoadMode> 116c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath (m_data + (col * colStride() + row * rowStride())); 117c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 118c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 119c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<int LoadMode> 120c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline PacketScalar packet(Index index) const 121c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 122c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived) 123c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return internal::ploadt<PacketScalar, LoadMode>(m_data + index * innerStride()); 124c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 125c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 126c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline MapBase(PointerType data) : m_data(data), m_rows(RowsAtCompileTime), m_cols(ColsAtCompileTime) 127c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 128c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STATIC_ASSERT_FIXED_SIZE(Derived) 129c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath checkSanity(); 130c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 131c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 132c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline MapBase(PointerType data, Index size) 133c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : m_data(data), 134c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_rows(RowsAtCompileTime == Dynamic ? size : Index(RowsAtCompileTime)), 135c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath m_cols(ColsAtCompileTime == Dynamic ? size : Index(ColsAtCompileTime)) 136c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 137c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STATIC_ASSERT_VECTOR_ONLY(Derived) 138c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_assert(size >= 0); 139c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_assert(data == 0 || SizeAtCompileTime == Dynamic || SizeAtCompileTime == size); 140c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath checkSanity(); 141c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 142c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 143c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline MapBase(PointerType data, Index rows, Index cols) 144c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : m_data(data), m_rows(rows), m_cols(cols) 145c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 146c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_assert( (data == 0) 147c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath || ( rows >= 0 && (RowsAtCompileTime == Dynamic || RowsAtCompileTime == rows) 148c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath && cols >= 0 && (ColsAtCompileTime == Dynamic || ColsAtCompileTime == cols))); 149c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath checkSanity(); 150c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 151c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 152c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath protected: 153c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 154c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath void checkSanity() const 155c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 156c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STATIC_ASSERT(EIGEN_IMPLIES(internal::traits<Derived>::Flags&PacketAccessBit, 157c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::inner_stride_at_compile_time<Derived>::ret==1), 158c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath PACKET_ACCESS_REQUIRES_TO_HAVE_INNER_STRIDE_FIXED_TO_1); 159c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath eigen_assert(EIGEN_IMPLIES(internal::traits<Derived>::Flags&AlignedBit, (size_t(m_data) % 16) == 0) 160c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath && "data is not aligned"); 161c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 162c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 163c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath PointerType m_data; 164c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const internal::variable_if_dynamic<Index, RowsAtCompileTime> m_rows; 165c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const internal::variable_if_dynamic<Index, ColsAtCompileTime> m_cols; 166c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 167c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 168c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamathtemplate<typename Derived> class MapBase<Derived, WriteAccessors> 169c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath : public MapBase<Derived, ReadOnlyAccessors> 170c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath{ 171c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath public: 172c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 173c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef MapBase<Derived, ReadOnlyAccessors> Base; 174c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 175c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename Base::Scalar Scalar; 176c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename Base::PacketScalar PacketScalar; 177c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename Base::Index Index; 178c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename Base::PointerType PointerType; 179c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 180c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::derived; 181c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::rows; 182c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::cols; 183c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::size; 184c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::coeff; 185c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::coeffRef; 186c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 187c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::innerStride; 188c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::outerStride; 189c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::rowStride; 190c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::colStride; 191c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 192c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath typedef typename internal::conditional< 193c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::is_lvalue<Derived>::value, 194c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Scalar, 195c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath const Scalar 196c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath >::type ScalarWithConstIfNotLvalue; 197c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 198c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline const Scalar* data() const { return this->m_data; } 199c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline ScalarWithConstIfNotLvalue* data() { return this->m_data; } // no const-cast here so non-const-correct code will give a compile error 200c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 201c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline ScalarWithConstIfNotLvalue& coeffRef(Index row, Index col) 202c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 203c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return this->m_data[col * colStride() + row * rowStride()]; 204c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 205c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 206c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline ScalarWithConstIfNotLvalue& coeffRef(Index index) 207c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 208c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived) 209c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return this->m_data[index * innerStride()]; 210c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 211c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 212c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<int StoreMode> 213c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline void writePacket(Index row, Index col, const PacketScalar& x) 214c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 215c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::pstoret<Scalar, PacketScalar, StoreMode> 216c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath (this->m_data + (col * colStride() + row * rowStride()), x); 217c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 218c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 219c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath template<int StoreMode> 220c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline void writePacket(Index index, const PacketScalar& x) 221c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 222c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath EIGEN_STATIC_ASSERT_INDEX_BASED_ACCESS(Derived) 223c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath internal::pstoret<Scalar, PacketScalar, StoreMode> 224c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath (this->m_data + index * innerStride(), x); 225c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 226c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 227c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath explicit inline MapBase(PointerType data) : Base(data) {} 228c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline MapBase(PointerType data, Index size) : Base(data, size) {} 229c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath inline MapBase(PointerType data, Index rows, Index cols) : Base(data, rows, cols) {} 230c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 231c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Derived& operator=(const MapBase& other) 232c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath { 233c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath Base::Base::operator=(other); 234c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath return derived(); 235c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath } 236c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 237c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath using Base::Base::operator=; 238c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath}; 239c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 240c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath} // end namespace Eigen 241c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath 242c981c48f5bc9aefeffc0bcb0cc3934c2fae179ddNarayan Kamath#endif // EIGEN_MAPBASE_H 243