35#ifndef OPM_SPARSETABLE_HEADER
36#define OPM_SPARSETABLE_HEADER
41#include <opm/grid/utility/ErrorMacros.hpp>
42#include <opm/grid/utility/IteratorRange.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(),
"Row index " << row <<
" is out of range");
152 return row_start_[row + 1] - row_start_[row];
159 row_start_.resize(1);
169 assert(row >= 0 && row <
size());
170 return row_type{data_.begin()+ row_start_[row],
171 data_.begin() + row_start_[row + 1]};
177 assert(row >= 0 && row <
size());
179 data_.begin() + row_start_[row + 1]};
189 , row_index_(begin_row_index)
199 return table_[row_index_];
201 bool operator==(
const Iterator& other)
203 assert(&table_ == &other.table_);
204 return row_index_ == other.row_index_;
206 bool operator!=(
const Iterator& other)
208 return !(*
this == other);
222 return Iterator(*
this,
size());
228 return data_ == other.data_ && row_start_ == other.row_start_;
231 template<
class charT,
class traits>
232 void print(std::basic_ostream<charT, traits>& os)
const
234 os <<
"Number of rows: " <<
size() <<
'\n';
236 os <<
"Row starts = [";
237 std::copy(row_start_.begin(), row_start_.end(),
238 std::ostream_iterator<int>(os,
" "));
241 os <<
"Data values = [";
242 std::copy(data_.begin(), data_.end(),
243 std::ostream_iterator<T>(os,
" "));
246 const T data(
int i)
const {
251 std::vector<T> data_;
254 std::vector<int> row_start_;
256 template <
class IntegerIter>
257 void setRowStartsFromSizes(IntegerIter rowsize_beg, IntegerIter rowsize_end)
261 for (
auto it = rowsize_beg; it != rowsize_end; ++it) {
263 OPM_THROW(std::runtime_error,
"Negative row size given.");
269 int num_rows = rowsize_end - rowsize_beg;
270 row_start_.resize(num_rows + 1);
272 std::partial_sum(rowsize_beg, rowsize_end, row_start_.begin() + 1);
274 if (
int(data_.size()) != row_start_.back()) {
275 OPM_THROW(std::runtime_error,
"End of row start indices different from data size.");
Iterator for iterating over the container as a whole, i.e.
Definition: SparseTable.hpp:185
A SparseTable stores a table with rows of varying size as efficiently as possible.
Definition: SparseTable.hpp:55
void reserve(int exptd_nrows, int exptd_ndata)
Allocate storage for table of expected size.
Definition: SparseTable.hpp:127
void assign(DataIter data_beg, DataIter data_end, IntegerIter rowsize_beg, IntegerIter rowsize_end)
Sets the table to contain the given data, organized into rows as indicated by the given row sizes.
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:167
Iterator begin() const
Iterator access.
Definition: SparseTable.hpp:216
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
SparseTable(DataIter data_beg, DataIter data_end, IntegerIter rowsize_beg, IntegerIter rowsize_end)
A constructor taking all the data for the table and row sizes.
Definition: SparseTable.hpp:69
void allocate(IntegerIter rowsize_beg, IntegerIter rowsize_end)
Request storage for table of given size.
Definition: SparseTable.hpp:96
SparseTable()
Default constructor. Yields an empty SparseTable.
Definition: SparseTable.hpp:58
void clear()
Makes the table empty().
Definition: SparseTable.hpp:156
bool operator==(const SparseTable &other) const
Equality.
Definition: SparseTable.hpp:226
Holds the implementation of the CpGrid as a pimple.
Definition: CellQuadrature.hpp:29
Definition: IteratorRange.hpp:50
Definition: IteratorRange.hpp:70