35#ifndef OPM_SPARSETABLE_HEADER
36#define OPM_SPARSETABLE_HEADER
41#include <opm/common/ErrorMacros.hpp>
68 template <
typename DataIter,
typename IntegerIter>
70 IntegerIter rowsize_beg, IntegerIter rowsize_end)
71 : data_(data_beg, data_end)
73 setRowStartsFromSizes(rowsize_beg, rowsize_end);
83 template <
typename DataIter,
typename IntegerIter>
84 void assign(DataIter data_beg, DataIter data_end,
85 IntegerIter rowsize_beg, IntegerIter rowsize_end)
87 data_.assign(data_beg, data_end);
88 setRowStartsFromSizes(rowsize_beg, rowsize_end);
95 template <
typename IntegerIter>
96 void allocate(IntegerIter rowsize_beg, IntegerIter rowsize_end)
98 typedef typename std::vector<T>::size_type sz_t;
100 sz_t ndata = std::accumulate(rowsize_beg, rowsize_end, sz_t(0));
102 setRowStartsFromSizes(rowsize_beg, rowsize_end);
107 template <
typename DataIter>
110 data_.insert(data_.end(), row_beg, row_end);
111 row_start_.push_back(data_.size());
117 return row_start_.size()==1;
123 return row_start_.size() - 1;
127 void reserve(
int exptd_nrows,
int exptd_ndata)
129 row_start_.reserve(exptd_nrows + 1);
130 data_.reserve(exptd_ndata);
136 row_start_.swap(other.row_start_);
137 data_.swap(other.data_);
150 OPM_ERROR_IF(row < 0 || row >=
size(),
151 "Row index " + std::to_string(row) +
" is out of range");
153 return row_start_[row + 1] - row_start_[row];
160 row_start_.resize(1);
170 assert(row >= 0 && row <
size());
172 data_.begin() + row_start_[row + 1]};
178 assert(row >= 0 && row <
size());
180 data_.begin() + row_start_[row + 1]};
190 , row_index_(begin_row_index)
200 return table_[row_index_];
204 assert(&table_ == &other.table_);
205 return row_index_ == other.row_index_;
209 return !(*
this == other);
229 return data_ == other.data_ && row_start_ == other.row_start_;
232 template<
class charT,
class traits>
233 void print(std::basic_ostream<charT, traits>& os)
const
235 os <<
"Number of rows: " <<
size() <<
'\n';
237 os <<
"Row starts = [";
238 std::copy(row_start_.begin(), row_start_.end(),
239 std::ostream_iterator<int>(os,
" "));
242 os <<
"Data values = [";
243 std::copy(data_.begin(), data_.end(),
244 std::ostream_iterator<T>(os,
" "));
252 std::vector<T> data_;
255 std::vector<int> row_start_;
257 template <
class IntegerIter>
258 void setRowStartsFromSizes(IntegerIter rowsize_beg, IntegerIter rowsize_end)
262 for (
auto it = rowsize_beg; it != rowsize_end; ++it) {
264 OPM_THROW(std::runtime_error,
"Negative row size given.");
270 int num_rows = rowsize_end - rowsize_beg;
271 row_start_.resize(num_rows + 1);
273 std::partial_sum(rowsize_beg, rowsize_end, row_start_.begin() + 1);
275 if (
int(data_.size()) != row_start_.back()) {
276 OPM_THROW(std::runtime_error,
"End of row start indices different from data size.");
A class used as a row type for OrientedEntityTable.
Definition: OrientedEntityTable.hpp:55
Definition: SparseTable.hpp:186
bool operator==(const Iterator &other)
Definition: SparseTable.hpp:202
Iterator(const SparseTable &table, const int begin_row_index)
Definition: SparseTable.hpp:188
bool operator!=(const Iterator &other)
Definition: SparseTable.hpp:207
row_type operator*() const
Definition: SparseTable.hpp:198
Iterator & operator++()
Definition: SparseTable.hpp:193
Definition: SparseTable.hpp:55
Iterator end() const
Definition: SparseTable.hpp:221
void reserve(int exptd_nrows, int exptd_ndata)
Allocate storage for table of expected size.
Definition: SparseTable.hpp:127
const T data(int i) const
Definition: SparseTable.hpp:247
void assign(DataIter data_beg, DataIter data_end, IntegerIter rowsize_beg, IntegerIter rowsize_end)
Definition: SparseTable.hpp:84
bool empty() const
True if the table contains no rows.
Definition: SparseTable.hpp:115
void appendRow(DataIter row_beg, DataIter row_end)
Appends a row to the table.
Definition: SparseTable.hpp:108
void swap(SparseTable< T > &other)
Swap contents for other SparseTable<T>
Definition: SparseTable.hpp:134
int size() const
Returns the number of rows in the table.
Definition: SparseTable.hpp:121
row_type operator[](int row) const
Returns a row of the table.
Definition: SparseTable.hpp:168
Iterator begin() const
Iterator access.
Definition: SparseTable.hpp:217
int rowSize(int row) const
Returns the size of a table row.
Definition: SparseTable.hpp:147
int dataSize() const
Returns the number of data elements.
Definition: SparseTable.hpp:141
void print(std::basic_ostream< charT, traits > &os) const
Definition: SparseTable.hpp:233
SparseTable(DataIter data_beg, DataIter data_end, IntegerIter rowsize_beg, IntegerIter rowsize_end)
Definition: SparseTable.hpp:69
void allocate(IntegerIter rowsize_beg, IntegerIter rowsize_end)
Definition: SparseTable.hpp:96
SparseTable()
Default constructor. Yields an empty SparseTable.
Definition: SparseTable.hpp:58
void clear()
Makes the table empty().
Definition: SparseTable.hpp:157
bool operator==(const SparseTable &other) const
Equality.
Definition: SparseTable.hpp:227
Holds the implementation of the CpGrid as a pimple.
Definition: CellQuadrature.hpp:26
Definition: IteratorRange.hpp:50
Definition: IteratorRange.hpp:70