49 using Vector = Eigen::Matrix<T, Eigen::Dynamic, 1>;
52 : _len(0), _rows(0), _cols(0), _capacity(0), _resize_chunk(2),
53 _view_ptr(
nullptr), _own_data(
true)
57 : _len(0), _rows(0), _cols(0), _capacity(0), _resize_chunk(2),
58 _view_ptr(
nullptr), _own_data(
true)
64 : _len(0), _rows(0), _cols(0), _capacity(0), _resize_chunk(2),
65 _view_ptr(
nullptr), _own_data(
true)
72 int64_t size()
const {
return _len; }
73 int64_t rows()
const {
return _rows; }
74 int64_t cols()
const {
return _cols; }
75 int64_t capacity()
const {
return _own_data ? _capacity : _len; }
77 void resize(int64_t n_rows, int64_t n_cols) {
80 resize(_rows * _cols);
84 if (in_array._rows == 0)
85 resize(in_array._len);
87 resize(in_array._rows, in_array._cols);
88 _storage.head(_len) = in_array._eigen_view();
91 void resize(int64_t new_length) {
96 if (new_length > _capacity) {
97 _capacity = new_length + new_length / 2;
99 Vector new_storage(_capacity);
101 new_storage.head(_len) = _storage.head(_len);
102 _storage.swap(new_storage);
103 }
catch (std::bad_alloc& ba) {
113 return _eigen_view().maxCoeff();
119 return _eigen_view().minCoeff();
122 T sum(int64_t start_index, int64_t stop_index) {
123 return _eigen_view().segment(start_index, stop_index - start_index).sum();
126 T sum() {
return _eigen_view().sum(); }
128 void fill(int64_t start, int64_t N,
const T& x) {
129 _eigen_view().segment(start, N).setConstant(x);
132 void setConstant(
const T& x) { fill(0, _len, x); }
134 void set_col_major(int64_t col_dim, int64_t col, int64_t row,
const T& val) {
135 (*this)[check(row * col_dim + col)] = val;
138 T& get_col_major(int64_t col_dim, int64_t col, int64_t row) {
139 return (*
this)[check(row * col_dim + col)];
142 T& getItem(int64_t row, int64_t col) {
143 return (*
this)[check(row, col)];
146 T& operator()(int64_t row, int64_t col) {
147 return getItem(row, col);
150 const T& operator()(int64_t row, int64_t col)
const {
151 return (*
this)[check(row, col)];
154 T& getItem(int64_t i) {
155 return (*
this)[check(i)];
158 const T& operator[](int64_t i)
const {
159 return _own_data ? _storage(check(i)) : _view_ptr[check(i)];
162 T& operator[](int64_t i) {
163 return _own_data ? _storage(check(i)) : _view_ptr[check(i)];
167 if (int64_t(-1) == end_index)
169 int64_t n = end_index - start_index + 1;
171 result._view_ptr = data() + start_index;
175 result._own_data =
false;
179 safe_array<T> eigen_segment(int64_t start_index, int64_t n) {
180 return segment(start_index, start_index + n - 1);
184 return _own_data ? _storage.data() : _view_ptr;
187 const T* data()
const {
188 return _own_data ? _storage.data() : _view_ptr;
201 int64_t _resize_chunk;
208 int64_t end_index,
bool in_copy_data)
210 _resize_chunk = in_array._resize_chunk;
211 _len = (end_index - start_index) + 1;
217 _storage.resize(_len);
218 _storage = in_array._eigen_view().segment(start_index, _len);
222 _view_ptr = in_array.data() + start_index;
228 inline int64_t check(int64_t i)
const {
229#ifdef NEC_ERROR_CHECK
230 if (i < 0 || i >= _len)
236 inline int64_t check(int64_t row, int64_t col)
const {
237#ifdef NEC_ERROR_CHECK
238 if (row < 0 || row >= _rows)
240 if (col < 0 || col >= _cols)
243 return check(int64_t(col) * _rows + row);
247 Eigen::Map<Vector> _eigen_view() {
248 return Eigen::Map<Vector>(data(), _len);
251 const Eigen::Map<const Vector> _eigen_view()
const {
252 return Eigen::Map<const Vector>(data(), _len);