diff --git a/src/algebra/SparseMatrixDescriptor.hpp b/src/algebra/SparseMatrixDescriptor.hpp index a36121aff6e099fe1298f7c1ef9c4bda04784dda..37b82d0b19b95f5c2f7fa67b2d6661270bf477e6 100644 --- a/src/algebra/SparseMatrixDescriptor.hpp +++ b/src/algebra/SparseMatrixDescriptor.hpp @@ -2,11 +2,16 @@ #define SPARSE_MATRIX_DESCRIPTOR_HPP #include <Array.hpp> + #include <map> +#include <type_traits> template <typename DataType = double, typename IndexType = size_t> class SparseMatrixDescriptor { + static_assert(std::is_integral_v<IndexType>, "Index type must be an integral type"); + static_assert(std::is_unsigned_v<IndexType>, "Index type must be unsigned"); + public: using data_type = DataType; using index_type = IndexType; @@ -17,6 +22,12 @@ class SparseMatrixDescriptor std::map<IndexType, DataType> m_id_value_map; public: + IndexType + numberOfValues() const noexcept + { + return m_id_value_map.size(); + } + const DataType& operator[](const IndexType& j) const { auto i_value = m_id_value_map.find(j); @@ -52,6 +63,13 @@ class SparseMatrixDescriptor Array<SparseRowDescriptor> m_row_array; public: + PUGS_INLINE + size_t + numberOfRows() const noexcept + { + return m_row_array.size(); + } + SparseRowDescriptor& row(const IndexType i) { @@ -73,7 +91,8 @@ class SparseMatrixDescriptor const DataType& operator()(const IndexType& i, const IndexType& j) const { - return m_row_array[i][j]; + const auto& r = m_row_array[i]; // split to ensure const-ness of call + return r[j]; } friend std::ostream&