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&