aboutsummaryrefslogtreecommitdiffhomepage
path: root/Eigen/src/Sparse/LinkedVectorMatrix.h
diff options
context:
space:
mode:
Diffstat (limited to 'Eigen/src/Sparse/LinkedVectorMatrix.h')
-rw-r--r--Eigen/src/Sparse/LinkedVectorMatrix.h63
1 files changed, 29 insertions, 34 deletions
diff --git a/Eigen/src/Sparse/LinkedVectorMatrix.h b/Eigen/src/Sparse/LinkedVectorMatrix.h
index 76e3a4c12..969aee57b 100644
--- a/Eigen/src/Sparse/LinkedVectorMatrix.h
+++ b/Eigen/src/Sparse/LinkedVectorMatrix.h
@@ -40,15 +40,15 @@ struct ei_traits<LinkedVectorMatrix<_Scalar,_Flags> >
};
};
-template<typename Element, int BlockSize = 8>
-struct LinkedVector
+template<typename Element, int ChunkSize = 8>
+struct LinkedVectorChunk
{
- LinkedVector() : size(0), next(0), prev(0) {}
- Element data[BlockSize];
- LinkedVector* next;
- LinkedVector* prev;
+ LinkedVectorChunk() : size(0), next(0), prev(0) {}
+ Element data[ChunkSize];
+ LinkedVectorChunk* next;
+ LinkedVectorChunk* prev;
int size;
- bool isFull() const { return size==BlockSize; }
+ bool isFull() const { return size==ChunkSize; }
};
template<typename _Scalar, int _Flags>
@@ -70,11 +70,11 @@ class LinkedVectorMatrix : public SparseMatrixBase<LinkedVectorMatrix<_Scalar,_F
Scalar value;
int index;
};
- typedef LinkedVector<ValueIndex,8> LinkedVectorBlock;
+ typedef LinkedVectorChunk<ValueIndex,8> VectorChunk;
- inline int find(LinkedVectorBlock** _el, int id)
+ inline int find(VectorChunk** _el, int id)
{
- LinkedVectorBlock* el = *_el;
+ VectorChunk* el = *_el;
while (el && el->data[el->size-1].index<id)
el = el->next;
*_el = el;
@@ -115,7 +115,7 @@ class LinkedVectorMatrix : public SparseMatrixBase<LinkedVectorMatrix<_Scalar,_F
const int outer = RowMajor ? row : col;
const int inner = RowMajor ? col : row;
- LinkedVectorBlock* el = m_data[outer];
+ VectorChunk* el = m_data[outer];
int id = find(&el, inner);
if (id<0)
return Scalar(0);
@@ -127,7 +127,7 @@ class LinkedVectorMatrix : public SparseMatrixBase<LinkedVectorMatrix<_Scalar,_F
const int outer = RowMajor ? row : col;
const int inner = RowMajor ? col : row;
- LinkedVectorBlock* el = m_data[outer];
+ VectorChunk* el = m_data[outer];
int id = find(&el, inner);
ei_assert(id>=0);
// if (id<0)
@@ -150,7 +150,7 @@ class LinkedVectorMatrix : public SparseMatrixBase<LinkedVectorMatrix<_Scalar,_F
const int inner = RowMajor ? col : row;
if (m_ends[outer]==0)
{
- m_data[outer] = m_ends[outer] = new LinkedVectorBlock();
+ m_data[outer] = m_ends[outer] = new VectorChunk();
}
else
{
@@ -158,7 +158,7 @@ class LinkedVectorMatrix : public SparseMatrixBase<LinkedVectorMatrix<_Scalar,_F
if (m_ends[outer]->isFull())
{
- LinkedVectorBlock* el = new LinkedVectorBlock();
+ VectorChunk* el = new VectorChunk();
m_ends[outer]->next = el;
el->prev = m_ends[outer];
m_ends[outer] = el;
@@ -168,24 +168,21 @@ class LinkedVectorMatrix : public SparseMatrixBase<LinkedVectorMatrix<_Scalar,_F
return m_ends[outer]->data[m_ends[outer]->size++].value;
}
- inline void endFill()
- {
- }
+ inline void endFill() { }
~LinkedVectorMatrix()
{
- if (this->isNotShared())
- clear();
+ clear();
}
void clear()
{
for (int i=0; i<m_data.size(); ++i)
{
- LinkedVectorBlock* el = m_data[i];
+ VectorChunk* el = m_data[i];
while (el)
{
- LinkedVectorBlock* tmp = el;
+ VectorChunk* tmp = el;
el = el->next;
delete tmp;
}
@@ -221,30 +218,26 @@ class LinkedVectorMatrix : public SparseMatrixBase<LinkedVectorMatrix<_Scalar,_F
*this = other.derived();
}
- inline void shallowCopy(const LinkedVectorMatrix& other)
+ inline void swap(LinkedVectorMatrix& other)
{
- EIGEN_DBG_SPARSE(std::cout << "LinkedVectorMatrix:: shallowCopy\n");
+ EIGEN_DBG_SPARSE(std::cout << "LinkedVectorMatrix:: swap\n");
resize(other.rows(), other.cols());
- for (int j=0; j<this->outerSize(); ++j)
- {
- m_data[j] = other.m_data[j];
- m_ends[j] = other.m_ends[j];
- }
- other.markAsCopied();
+ m_data.swap(other.m_data);
+ m_ends.swap(other.m_ends);
}
inline LinkedVectorMatrix& operator=(const LinkedVectorMatrix& other)
{
if (other.isRValue())
{
- shallowCopy(other);
- return *this;
+ swap(other.const_cast_derived());
}
else
{
// TODO implement a specialized deep copy here
return operator=<LinkedVectorMatrix>(other);
}
+ return *this;
}
template<typename OtherDerived>
@@ -255,8 +248,10 @@ class LinkedVectorMatrix : public SparseMatrixBase<LinkedVectorMatrix<_Scalar,_F
protected:
- std::vector<LinkedVectorBlock*> m_data;
- std::vector<LinkedVectorBlock*> m_ends;
+ // outer vector of inner linked vector chunks
+ std::vector<VectorChunk*> m_data;
+ // stores a reference to the last vector chunk for efficient filling
+ std::vector<VectorChunk*> m_ends;
int m_innerSize;
};
@@ -281,7 +276,7 @@ class LinkedVectorMatrix<Scalar,_Flags>::InnerIterator
protected:
const LinkedVectorMatrix& m_matrix;
- LinkedVectorBlock* m_el;
+ VectorChunk* m_el;
int m_it;
};