#ifndef MATRIXCSR_HPP #define MATRIXCSR_HPP /* ************************************************************************** */ #include "../matrix.hpp" #include "../../list/list.hpp" #include "../../vector/vector.hpp" #include namespace lasd { template class MatrixCSR : virtual public List>, virtual public Matrix{ // Must extend Matrix protected: using Matrix::rows; using Matrix::columns; using List>::size; Vector>::Node**> R; using List>::head; using typename List>::Node; /* Node | pair | | Data (actual element - first) | | ulong (column index - second) | next */ public: MatrixCSR(); MatrixCSR(const ulong, const ulong); // A matrix of some specified dimension MatrixCSR(const MatrixCSR&); MatrixCSR(MatrixCSR&&) noexcept; virtual ~MatrixCSR(); MatrixCSR& operator=(const MatrixCSR&); MatrixCSR& operator=(MatrixCSR&&) noexcept; bool operator==(const MatrixCSR&) const noexcept; bool operator!=(const MatrixCSR&) const noexcept; void RowResize(const ulong&) override; // Override Matrix member void ColumnResize(const ulong&) override; // Override Matrix member bool ExistsCell(const ulong&, const ulong&) const noexcept override; // Override Matrix member (should not throw exceptions) Data& operator()(const ulong, const ulong) override; // Override Matrix member (mutable access to the element; throw out_of_range when out of range) 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) void Clear() override; // Override Container member /* ************************************************************************ */ // Specific member functions (inherited from MappableContainer) virtual void MapPreOrder(const typename MappableContainer::MapFunctor, void*) override; // Override MappableContainer member virtual void MapPostOrder(const typename MappableContainer::MapFunctor, void*) override; // Override MappableContainer member virtual void FoldPreOrder(const typename FoldableContainer::FoldFunctor, const void*, void*) const override; // Override FoldableContainer member virtual void FoldPostOrder(const typename FoldableContainer::FoldFunctor, const void*, void*) const override; // Override FoldableContainer member void debug(); }; /* ************************************************************************** */ } #include "matrixcsr.cpp" #endif