Library 5

This commit is contained in:
Alessandro Ferro 2021-05-28 12:43:27 +02:00
parent 31f7ae9b35
commit d2357d45a6
3 changed files with 133 additions and 50 deletions

View File

@ -3,7 +3,95 @@ namespace lasd {
/* ************************************************************************** */ /* ************************************************************************** */
// ... template <typename Data>
MatrixCSR<Data>::MatrixCSR(){
R[0] = &head;
}
template <typename Data>
MatrixCSR<Data>::MatrixCSR(const ulong& r, const ulong& c){
rows = r;
columns = c;
R.Resize(rows+1);
for(ulong i=0 ; i<R.Size() ; ++i){
R[i] = &head;
}
}
// copy constructor
template <typename Data>
MatrixCSR<Data>::MatrixCSR(const MatrixCSR& toCopy) : MatrixCSR(toCopy.rows, toCopy.columns) {
/*
For each element in the "R" vector, insert it in the matrix (represented as a list)
in this way:
The row index is represented by "i" (the variable that iterates over the R array),
meanwhile the column index is represented by the second element in the pair of the node.
The actual element is stored in the first element in the pair of the node.
The update of the newely created R array is left to operator()().
*/
for(ulong i=0 ; i < (toCopy.R.Size()-1) ; ++i){
for(Node** ptr = toCopy.R[i] ; ptr!=toCopy.R[i+1] ; ptr = &( (*(*ptr)).next ) ){
(*this)(i , ((*ptr)->value).second) = (*ptr)->value).first;
}
}
}
template <typename Data>
MatrixCSR<Data>::MatrixCSR(MatrixCSR&& toMove) : MatrixCSR() noexcept{ // controllare se chiamare MatrixCSR()
std::swap(rows, toMove.rows);
std::swap(columns, toMove.columns);
std::swap(size, toMove.size);
std::swap(head, toMove.head);
std::swap(R, toMove.R);
toMove.R[0] = &toMove.head;
Node** oldHead = R[0];
for(ulong i=0 ; i<R.Size() && R[i]==oldHead; ++i){
R[i] = &head;
}
}
template <typename Data>
MatrixCSR<Data>::~MatrixCSR(){
Clear();
}
template <typename Data>
MatrixCSR<Data>& MatrixCSR::operator=(const MatrixCSR& toCopy){
MatrixCSR<Data> tmp(toCopy);
std::swap(*this, tmp);
delete tmp;
return *this;
}
template <typename Data>
MatrixCSR<Data>& MatrixCSR::operator=(MatrixCSR&& toMove) noexcept{
MatrixCSR<Data> tmp(std::move(toMove));
std::swap(*this, tmp);
delete tmp;
return *this;
}
template <typename Data>
bool MatrixCSR<Data>::operator==(const MatrixCSR& toCompare) const noexcept{
}
template <typename Data>
bool MatrixCSR<Data>::operator!=(const MatrixCSR& toCompare) const noexcept{
return !(*this == toCompare);
}
template <typename Data>
void RowResize(const ulong& new_row_size){
R.Resize(new_row_size+1);
for(ulong i=rows ; i<new_row_size+1 ; ++i){
R[i] = R[rows];
}
rows = new_row_size;
size = new_row_size * columns;
}
/* ************************************************************************** */ /* ************************************************************************** */

View File

@ -6,96 +6,102 @@
#include "../matrix.hpp" #include "../matrix.hpp"
// #include "../../list/list.hpp" #include "../../list/list.hpp"
// #include "../../vector/vector.hpp" #include "../../vector/vector.hpp"
/* ************************************************************************** */
namespace lasd { namespace lasd {
/* ************************************************************************** */
template <typename Data> template <typename Data>
class MatrixCSR { // Must extend Matrix<Data> class MatrixCSR : virtual public List<Data>,
virtual public Matrix<Data>{ // Must extend Matrix<Data>
private:
// ...
protected: protected:
// using Matrix<Data>::???; using Matrix<Data>::rows;
using Matrix<Data>::columns;
using List<std::pair<Data,ulong>>::size;
// ... Vector<struct List<std::pair<Data,ulong>>::Node**> R(1);
using List<std::pair<Data,ulong>>::head;
using struct List<std::pair<Data,ulong>>::Node;
/*
Node
| pair
| | Data (actual element - first)
| | ulong (column index - second)
| next
*/
public: public:
// Default constructor // Default constructor
// MatrixCSR() specifiers; MatrixCSR();
/* ************************************************************************ */ /* ************************************************************************ */
// Specific constructors // Specific constructors
// MatrixCSR(argument) specifiers; // A matrix of some specified dimension MatrixCSR(const ulong&, const ulong&); // A matrix of some specified dimension
/* ************************************************************************ */ /* ************************************************************************ */
// Copy constructor // Copy constructor
// MatrixCSR(argument) specifiers; MatrixCSR(const MatrixCSR&);
// Move constructor // Move constructor
// MatrixCSR(argument) specifiers; MatrixCSR(MatrixCSR&&) noexcept;
/* ************************************************************************ */ /* ************************************************************************ */
// Destructor // Destructor
// ~MatrixCSR() specifiers; virtual ~MatrixCSR();
/* ************************************************************************ */ /* ************************************************************************ */
// Copy assignment // Copy assignment
// type operator=(argument) specifiers; MatrixCSR& operator=(const MatrixCSR&);
// Move assignment // Move assignment
// type operator=(argument) specifiers; MatrixCSR& operator=(MatrixCSR&&) noexcept;
/* ************************************************************************ */ /* ************************************************************************ */
// Comparison operators // Comparison operators
// type operator==(argument) specifiers; bool operator==(const MatrixCSR&) const noexcept;
// type operator!=(argument) specifiers; bool operator!=(const MatrixCSR&) const noexcept;
/* ************************************************************************ */ /* ************************************************************************ */
// Specific member functions (inherited from Matrix) // Specific member functions (inherited from Matrix)
// type RowResize() specifiers; // Override Matrix member void RowResize(const ulong&) override; // Override Matrix member
// type ColumnResize() specifiers; // Override Matrix member void ColumnResize(const ulong&) override; // Override Matrix member
// type ExistsCell() specifiers; // Override Matrix member (should not throw exceptions) bool ExistsCell(const ulong&, const ulong&) override noexcept; // Override Matrix member (should not throw exceptions)
// type operator()() specifiers; // Override Matrix member (mutable access to the element; throw out_of_range when out of range) Data& operator()(const ulong&, const ulong&) override; // Override Matrix member (mutable access to the element; throw out_of_range when out of range)
// type operator()() specifiers; // Override Matrix member (immutable access to the element; throw out_of_range when out of range and length_error when not present) const Data& operator()(const ulong&, const ulong&) const override; // Override Matrix member (immutable access to the element; throw out_of_range when out of range and length_error when not present)
/* ************************************************************************ */ /* ************************************************************************ */
// Specific member functions (inherited from Container) // Specific member functions (inherited from Container)
// type Clear() specifiers; // Override Container member void Clear() override; // Override Container member
/* ************************************************************************ */ /* ************************************************************************ */
// Specific member functions (inherited from MappableContainer) // Specific member functions (inherited from MappableContainer)
// type MapPreOrder(arguments) specifiers; // Override MappableContainer member virtual void MapPreOrder(const typename MappableContainer<Data>::MapFunctor, void*) override; // Override MappableContainer member
// type MapPostOrder(arguments) specifiers; // Override MappableContainer member virtual void MapPostOrder(const typename MappableContainer<Data>::MapFunctor, void*) override; // Override MappableContainer member
/* ************************************************************************ */ /* ************************************************************************ */
// Specific member functions (inherited from FoldableContainer) // Specific member functions (inherited from FoldableContainer)
// type FoldPreOrder(arguments) specifiers; // Override FoldableContainer member virtual void FoldPreOrder(const typename FoldableContainer<Data>::FoldFunctor, const void*, void*) const override; // Override FoldableContainer member
// type FoldPostOrder(arguments) specifiers; // Override FoldableContainer member virtual void FoldPostOrder(const typename FoldableContainer<Data>::FoldFunctor, const void*, void*) const override; // Override FoldableContainer member
}; };

View File

@ -13,7 +13,7 @@ template <typename Data>
MatrixVec<Data>::MatrixVec(const MatrixVec& toCopy){ MatrixVec<Data>::MatrixVec(const MatrixVec& toCopy){
rows = toCopy.rows; rows = toCopy.rows;
columns = toCopy.columns; columns = toCopy.columns;
size = toCopy.rows * toCopy.columns; size = toCopy.size;
Elements = new Data[size]{}; Elements = new Data[size]{};
for(ulong i=0 ; i<size ; ++i){ for(ulong i=0 ; i<size ; ++i){
Elements[i] = toCopy.Elements[i]; Elements[i] = toCopy.Elements[i];
@ -38,7 +38,7 @@ MatrixVec& MatrixVec<Data>::operator=(const MatrixVec& toCopy){
Clear(); Clear();
rows = toCopy.rows; rows = toCopy.rows;
columns = toCopy.columns; columns = toCopy.columns;
size = toCopy.rows * toCopy.columns; size = toCopy.size;
Elements = new Data[size]{}; Elements = new Data[size]{};
for(ulong i=0 ; i<size ; ++i){ for(ulong i=0 ; i<size ; ++i){
Elements[i] = toCopy.Elements[i]; Elements[i] = toCopy.Elements[i];
@ -77,28 +77,17 @@ void MatrixVec<Data>::RowResize(const ulong newdim){
template <typename Data> template <typename Data>
void MatrixVec<Data>::ColumnResize(const ulong& new_column_dim){ void MatrixVec<Data>::ColumnResize(const ulong& new_column_dim){
if(new_column_dim == 0){ if(new_column_dim == 0){
Clear(); Clear();
} }
else if(new_column_dim != columns){ else if(new_column_dim != columns){
ulong limit = (new_column_dim < columns)? new_column_dim : columns;
Data* tmp = new Data[rows * new_column_dim]{}; Data* tmp = new Data[rows * new_column_dim]{};
if(new_column_dim > columns){
for(ulong i=0 ; i<r ; ++i){ for(ulong i=0 ; i<r ; ++i){
for(ulong j=0 ; j<new_column_dim ; ++j){ for(ulong j=0 ; j<limit ; ++j){
if(ExistsCell(i,j)) tmp[(i*new_column_dim)+j] = (*this)(i,j);
}
}
}else if(new_column_dim < columns){
for(ulong i=0 ; i<r ; ++i){
for(ulong j=0 ; j<new_column_dim ; ++j){
tmp[(i*new_column_dim)+j] = (*this)(i,j); tmp[(i*new_column_dim)+j] = (*this)(i,j);
} }
} }
}
size = rows * new_column_dim; size = rows * new_column_dim;
columns = new_column_dim; columns = new_column_dim;
std::swap(Elements, tmp); std::swap(Elements, tmp);