enforce constness in map(), do only one const_cast, and improve API

This commit is contained in:
Benoit Jacob 2007-12-19 08:14:00 +00:00
parent 8bb98a80b4
commit 59be5c3124
2 changed files with 34 additions and 9 deletions

View File

@ -36,7 +36,7 @@ template<typename MatrixType> class Map
static const int RowsAtCompileTime = MatrixType::RowsAtCompileTime,
ColsAtCompileTime = MatrixType::ColsAtCompileTime;
Map(Scalar* data, int rows, int cols) : m_data(data), m_rows(rows), m_cols(cols)
Map(const Scalar* data, int rows, int cols) : m_data(data), m_rows(rows), m_cols(cols)
{
assert(rows > 0 && cols > 0);
}
@ -55,22 +55,22 @@ template<typename MatrixType> class Map
Scalar& _coeffRef(int row, int col)
{
return m_data[row + col * m_rows];
return const_cast<Scalar*>(m_data)[row + col * m_rows];
}
protected:
Scalar* m_data;
const Scalar* m_data;
int m_rows, m_cols;
};
template<typename Scalar, typename Derived>
Map<Derived> MatrixBase<Scalar, Derived>::map(const Scalar* data, int rows, int cols)
const Map<Derived> MatrixBase<Scalar, Derived>::map(const Scalar* data, int rows, int cols)
{
return Map<Derived>(const_cast<Scalar*>(data), rows, cols);
}
template<typename Scalar, typename Derived>
Map<Derived> MatrixBase<Scalar, Derived>::map(const Scalar* data, int size)
const Map<Derived> MatrixBase<Scalar, Derived>::map(const Scalar* data, int size)
{
assert(IsVector);
if(ColsAtCompileTime == 1)
@ -80,11 +80,33 @@ Map<Derived> MatrixBase<Scalar, Derived>::map(const Scalar* data, int size)
}
template<typename Scalar, typename Derived>
Map<Derived> MatrixBase<Scalar, Derived>::map(const Scalar* data)
const Map<Derived> MatrixBase<Scalar, Derived>::map(const Scalar* data)
{
return Map<Derived>(const_cast<Scalar*>(data), RowsAtCompileTime, ColsAtCompileTime);
}
template<typename Scalar, typename Derived>
Map<Derived> MatrixBase<Scalar, Derived>::map(Scalar* data, int rows, int cols)
{
return Map<Derived>(data, rows, cols);
}
template<typename Scalar, typename Derived>
Map<Derived> MatrixBase<Scalar, Derived>::map(Scalar* data, int size)
{
assert(IsVector);
if(ColsAtCompileTime == 1)
return Map<Derived>(data, size, 1);
else
return Map<Derived>(data, 1, size);
}
template<typename Scalar, typename Derived>
Map<Derived> MatrixBase<Scalar, Derived>::map(Scalar* data)
{
return Map<Derived>(data, RowsAtCompileTime, ColsAtCompileTime);
}
template<typename _Scalar, int _Rows, int _Cols>
Matrix<_Scalar, _Rows, _Cols>
::Matrix(const Scalar *data, int rows, int cols)

View File

@ -95,9 +95,12 @@ template<typename Scalar, typename Derived> class MatrixBase
diagonal(const OtherDerived& coeffs);
DiagonalCoeffs<Derived> diagonal() const;
static Map<Derived> map(const Scalar* array, int rows, int cols);
static Map<Derived> map(const Scalar* array, int size);
static Map<Derived> map(const Scalar* array);
static const Map<Derived> map(const Scalar* array, int rows, int cols);
static const Map<Derived> map(const Scalar* array, int size);
static const Map<Derived> map(const Scalar* array);
static Map<Derived> map(Scalar* array, int rows, int cols);
static Map<Derived> map(Scalar* array, int size);
static Map<Derived> map(Scalar* array);
template<typename OtherDerived>
bool isApprox(