openCARP
Doxygen code documentation for the open cardiac electrophysiology simulator openCARP
SF_vector.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: Copyright (c) NumeriCor GmbH
2 // SPDX-License-Identifier: Apache-2.0
3 
12 #ifndef _SF_VECTOR_H
13 #define _SF_VECTOR_H
14 
15 #include <iterator>
16 #include <cstring>
17 
18 namespace SF {
19 
26 template <class T>
27 class vector
28 {
29 public:
31  vector(): _data(NULL), _capacity(0), _size(0)
32  {}
33 
35  vector(size_t n): _data(NULL), _capacity(0), _size(0)
36  {
37  this->resize(n);
38  }
39 
41  vector(size_t n, const T val): _data(NULL), _capacity(0), _size(0)
42  {
43  this->assign(n, val);
44  }
45 
47  vector(const vector<T> &vec): _data(NULL), _capacity(0), _size(0)
48  {
49  this->assign(vec.begin(), vec.end());
50  }
51 
52  virtual ~vector()
53  {
54  delete [] _data;
55  }
56 
58  inline const T& operator[](size_t i) const
59  {
60  return _data[i];
61  }
62 
64  inline T& operator[](size_t i)
65  {
66  return _data[i];
67  }
68 
70  inline void operator= (const vector<T> & vec)
71  {
72  this->assign(vec.begin(), vec.end());
73  }
74 
76  inline T* data()
77  {
78  return _data;
79  }
80 
82  inline const T* data() const
83  {
84  return _data;
85  }
86 
87 
89  inline size_t size() const
90  {
91  return _size;
92  }
93 
95  inline size_t capacity() const
96  {
97  return _capacity;
98  }
99 
101  inline const T* begin() const
102  {
103  return _data;
104  }
105 
107  inline T* begin()
108  {
109  return _data;
110  }
111 
113  inline const T* end() const
114  {
115  return _data + _size;
116  }
117 
119  inline T* end()
120  {
121  return _data + _size;
122  }
123 
124  T& front()
125  {
126  return _data[0];
127  }
128 
129  T& back()
130  {
131  return _data[_size - 1];
132  }
133 
134  const T& front() const
135  {
136  return _data[0];
137  }
138 
139  const T& back() const
140  {
141  return _data[_size - 1];
142  }
143 
145  template<class InputIterator>
146  inline void assign(InputIterator s, InputIterator e)
147  {
148  long int n = std::distance(s, e);
149  assert(n >= 0);
150 
151  // realloc if necessary
152  if ( ((long int)_capacity) < n) {
153  delete [] _data;
154  _data = new T[n];
155  _capacity = n;
156  }
157 
158  // copy data
159  size_t idx = 0;
160  while(s != e) {
161  _data[idx++] = *s;
162  ++s;
163  }
164 
165  _size = n;
166  }
167 
169  inline void assign(size_t n, T val = T()) {
170  if (_capacity < n) {
171  if(_size > 0) delete [] _data;
172  _data = new T[n];
173  _capacity = n;
174  }
175 
176  for (size_t i = 0; i < n; i++) _data[i] = val;
177  _size = n;
178  }
179 
186  inline void assign(size_t n, T* array, bool del) {
187  if (del) delete [] _data;
188  _data = array;
189  _size = n;
190  _capacity = n;
191  }
192 
194  inline void resize(size_t n)
195  {
196  if(_capacity < n)
197  {
198  if(_size > 0) {
199  T* buf = _data;
200  _data = new T[n];
201  for (size_t i = 0; i < _size; i++) _data[i] = buf[i];
202  delete [] buf;
203  }
204  else {
205  _data = new T[n];
206  }
207  _capacity = n;
208  }
209  _size = n;
210  }
211 
213  inline void resize(size_t n, const T val)
214  {
215  size_t oldsize = this->size();
216  this->resize(n);
217 
218  if(n > oldsize) {
219  T* out = _data + oldsize;
220  size_t num = n - oldsize;
221 
222  for (size_t i = 0; i < num; i++) out[i] = val;
223  }
224  }
225 
226  void reserve(size_t n)
227  {
228  size_t osize = _size;
229  this->resize(n);
230  this->resize(osize);
231  }
232 
233  void zero()
234  {
235  if(_size != 0) memset(_data, 0, _size * sizeof(T));
236  }
237 
242  inline void reallocate()
243  {
244  _capacity = _size;
245  T* buf = _data;
246  _data = new T[_size];
247  for (size_t i = 0; i < _size; i++) _data[i] = buf[i];
248  delete [] buf;
249  }
250 
252  template<class InputIterator>
253  inline void append(InputIterator s, InputIterator e)
254  {
255  size_t addsize = std::distance(s, e);
256  size_t oldsize = _size;
257 
258  this->resize(oldsize + addsize);
259 
260  // copy data
261  size_t idx = 0;
262  while(s != e) {
263  _data[oldsize + idx++] = *s;
264  ++s;
265  }
266  }
267 
268  T & push_back(T val)
269  {
270  if(_capacity > _size)
271  {
272  _data[_size] = val;
273  _size++;
274  }
275  else {
276  // if current capacity is not larger than size + 1 we reallocate, but keep size to
277  // old value plus one.
278  size_t newcap = _capacity > 0 ? _capacity * 2 : 1;
279  size_t cursize = _size;
280  this->resize(newcap);
281  _data[cursize] = val;
282  _size = cursize + 1;
283  }
284  return _data[_size-1];
285  }
286 private:
287  T* _data;
288  size_t _capacity;
289  size_t _size;
290 
291 };
292 
294 template<class T>
295 inline void dsp_from_cnt(const vector<T> & cnt, vector<T> & dsp)
296 {
297  dsp.resize(cnt.size()+1);
298  dsp[0] = 0;
299  for(size_t i=0; i<cnt.size(); i++) dsp[i+1] = dsp[i] + cnt[i];
300 }
301 
303 template<class T>
304 inline void cnt_from_dsp(const vector<T> & dsp, vector<T> & cnt)
305 {
306  cnt.resize(dsp.size() - 1);
307  for(size_t i=0; i<dsp.size()-1; i++) cnt[i] = dsp[i+1] - dsp[i];
308 }
309 
316 template<class T, class S>
317 inline void count(const vector<T> & data, vector<S> & cnt)
318 {
319  cnt.zero();
320  for(size_t i=0; i<data.size(); i++) cnt[data[i]]++;
321 }
322 
324 template<class T>
325 inline T sum(const vector<T> & vec)
326 {
327  T sum = 0;
328  for(size_t i=0; i<vec.size(); i++) sum += vec[i];
329  return sum;
330 }
331 
332 
334 template<class T>
335 inline void interval(vector<T> & vec, size_t start, size_t end)
336 {
337  vec.resize(end - start);
338  for(size_t i=0; i<vec.size(); i++) vec[i] = start + i;
339 }
340 
342 template<class T>
343 inline void divide(const size_t gsize, const size_t num_parts, vector<T> & loc_sizes)
344 {
345  // initialize the distribution to gsize / size
346  loc_sizes.assign(size_t(num_parts), T(gsize/num_parts));
347 
348  // then we evenly distribute the remainder of the division
349  for(size_t i=0; i<size_t(gsize % num_parts); i++) loc_sizes[i]++;
350 }
351 
352 
355 template<class S, class V>
356 inline void vec_assign(S* lhs, const V* rhs, size_t size)
357 {
358  for(size_t i=0; i<size; i++) lhs[i] = (S)rhs[i];
359 }
360 
362 template<class T>
363 inline bool isEmpty(vector<T> & v)
364 {
365  bool ret = true;
366  for(size_t i=0; i<v.size(); i++)
367  if(v[i] != T(0)) {ret = false; break;}
368 
369  return ret;
370 }
371 
372 
373 }
374 
375 #endif
376 
A vector storing arbitrary data.
Definition: SF_vector.h:28
const T & front() const
Definition: SF_vector.h:134
T & operator[](size_t i)
Vector access.
Definition: SF_vector.h:64
vector()
Initialize an empty vector.
Definition: SF_vector.h:31
vector(const vector< T > &vec)
Initialize a vector from another vector.
Definition: SF_vector.h:47
size_t size() const
The current size of the vector.
Definition: SF_vector.h:89
void assign(size_t n, T *array, bool del)
Make a vector point to an existing array.
Definition: SF_vector.h:186
void resize(size_t n)
Resize a vector.
Definition: SF_vector.h:194
const T & operator[](size_t i) const
Vector access.
Definition: SF_vector.h:58
size_t capacity() const
The maximum amount of entries the vector can hold without reallocating.
Definition: SF_vector.h:95
const T * end() const
Pointer to the vector's end.
Definition: SF_vector.h:113
const T & back() const
Definition: SF_vector.h:139
const T * data() const
Pointer to the vector's start.
Definition: SF_vector.h:82
void append(InputIterator s, InputIterator e)
Append data to the current data chunk.
Definition: SF_vector.h:253
T & front()
Definition: SF_vector.h:124
void assign(InputIterator s, InputIterator e)
Assign a memory range.
Definition: SF_vector.h:146
void reallocate()
Definition: SF_vector.h:242
vector(size_t n)
Initialize a vector of size n.
Definition: SF_vector.h:35
T * begin()
Pointer to the vector's start.
Definition: SF_vector.h:107
void reserve(size_t n)
Definition: SF_vector.h:226
void assign(size_t n, T val=T())
Assign n many elements of value val.
Definition: SF_vector.h:169
T * end()
Pointer to the vector's end.
Definition: SF_vector.h:119
T & back()
Definition: SF_vector.h:129
void resize(size_t n, const T val)
Resize a vector setting the newly allocated elements to val.
Definition: SF_vector.h:213
void zero()
Definition: SF_vector.h:233
const T * begin() const
Pointer to the vector's start.
Definition: SF_vector.h:101
T * data()
Pointer to the vector's start.
Definition: SF_vector.h:76
T & push_back(T val)
Definition: SF_vector.h:268
vector(size_t n, const T val)
Initialize a vector of size n and of constant value val.
Definition: SF_vector.h:41
void operator=(const vector< T > &vec)
Deep copy of a vector.
Definition: SF_vector.h:70
virtual ~vector()
Definition: SF_vector.h:52
Definition: dense_mat.hpp:19
void cnt_from_dsp(const vector< T > &dsp, vector< T > &cnt)
Compute counts from displacements.
Definition: SF_vector.h:304
void dsp_from_cnt(const vector< T > &cnt, vector< T > &dsp)
Compute displacements from counts.
Definition: SF_vector.h:295
void interval(vector< T > &vec, size_t start, size_t end)
Create an integer interval between start and end.
Definition: SF_vector.h:335
T sum(const vector< T > &vec)
Compute sum of a vector's entries.
Definition: SF_vector.h:325
void divide(const size_t gsize, const size_t num_parts, vector< T > &loc_sizes)
divide gsize into num_parts local parts with even distribution of the remainder
Definition: SF_vector.h:343
void count(const vector< T > &data, vector< S > &cnt)
Count number of occurrences of indices.
Definition: SF_vector.h:317
bool isEmpty(vector< T > &v)
Return whether an vector is empty (all values are 0).
Definition: SF_vector.h:363
void vec_assign(S *lhs, const V *rhs, size_t size)
Assign the values in rhs to lhs. The data-type of rhs is cast to the type of lhs.
Definition: SF_vector.h:356
double distance(const Point &a, const Point &b)
Definition: SF_container.h:146