diff --git a/SimulationRuntime/cpp/Include/Core/Math/Array.h b/SimulationRuntime/cpp/Include/Core/Math/Array.h index 61760caa392..aede8e1dead 100644 --- a/SimulationRuntime/cpp/Include/Core/Math/Array.h +++ b/SimulationRuntime/cpp/Include/Core/Math/Array.h @@ -162,7 +162,7 @@ class CStrArray /** * Constructor storing pointers */ - CStrArray(const BaseArray &stringArray) + CStrArray(const BaseArray& stringArray) :_c_str_array(stringArray.getNumElems()) { const string *data = stringArray.getData(); @@ -199,7 +199,7 @@ class RefArray : public BaseArray :BaseArray(true, true) { std::transform(data, data + nelems, - _ref_array.c_array(), CArray2RefArray()); + _ref_array, CArray2RefArray()); } /** @@ -210,7 +210,7 @@ class RefArray : public BaseArray :BaseArray(true, true) { if (nelems > 0) - std::copy(ref_data, ref_data + nelems, _ref_array.c_array()); + std::copy(ref_data, ref_data + nelems, _ref_array); } /** @@ -231,9 +231,8 @@ class RefArray : public BaseArray */ virtual void assign(const T* data) { - T **refs = _ref_array.c_array(); - std::transform(refs, refs + nelems, data, - refs, CopyCArray2RefArray()); + std::transform(_ref_array, _ref_array + nelems, data, + _ref_array, CopyCArray2RefArray()); } /** @@ -243,13 +242,12 @@ class RefArray : public BaseArray */ virtual void assign(const BaseArray& b) { - T **refs = _ref_array.c_array(); if(b.isRefArray()) - std::transform(refs, refs + nelems, b.getDataRefs(), - refs, CopyRefArray2RefArray()); + std::transform(_ref_array, _ref_array + nelems, b.getDataRefs(), + _ref_array, CopyRefArray2RefArray()); else - std::transform(refs, refs + nelems, b.getData(), - refs, CopyCArray2RefArray()); + std::transform(_ref_array, _ref_array + nelems, b.getData(), + _ref_array, CopyCArray2RefArray()); } /** @@ -257,10 +255,8 @@ class RefArray : public BaseArray */ virtual const T* getData() const { - const T* const* refs = _ref_array.begin(); - T* data = _tmp_data.c_array(); - std::transform(refs, refs + nelems, data, RefArray2CArray()); - return data; + std::transform(_ref_array, _ref_array + nelems, _tmp_data, RefArray2CArray()); + return _tmp_data; } /** @@ -278,8 +274,7 @@ class RefArray : public BaseArray virtual void getDataCopy(T data[], size_t n) const { assert(n <= nelems); - const T* const * simvars_data = _ref_array.begin(); - std::transform(simvars_data, simvars_data + n, data, RefArray2CArray()); + std::transform(_ref_array, _ref_array + n, data, RefArray2CArray()); } /** @@ -287,7 +282,7 @@ class RefArray : public BaseArray */ virtual const T* const* getDataRefs() const { - return _ref_array.data(); + return _ref_array; } /** @@ -312,8 +307,8 @@ class RefArray : public BaseArray protected: //reference array data - boost::array _ref_array; - mutable boost::array _tmp_data; // storage for const T* getData() + T* _ref_array[nelems == 0? 1: nelems]; + mutable T _tmp_data[nelems == 0? 1: nelems]; // storage for const T* getData() }; /** @@ -623,7 +618,7 @@ class StatArray : public BaseArray if (external) _data = data; else { - _data = _array.c_array(); + _data = _array; if (nelems > 0) std::copy(data, data + nelems, _data); } @@ -640,7 +635,7 @@ class StatArray : public BaseArray if (external) _data = otherarray._data; else { - _data = _array.c_array(); + _data = _array; otherarray.getDataCopy(_data, nelems); } } @@ -656,7 +651,7 @@ class StatArray : public BaseArray if (external) _data = otherarray._data; else { - _data = _array.c_array(); + _data = _array; _array = otherarray._array; } } @@ -670,7 +665,7 @@ class StatArray : public BaseArray { if (external) throw std::runtime_error("Unsupported copy constructor of static array with external storage!"); - _data = _array.c_array(); + _data = _array; otherarray.getDataCopy(_data, nelems); } @@ -683,7 +678,7 @@ class StatArray : public BaseArray if (external) _data = NULL; // no data assigned yet else - _data = _array.c_array(); + _data = _array; } virtual ~StatArray() {} @@ -816,7 +811,7 @@ class StatArray : public BaseArray virtual void setDims(const std::vector& v) {} protected: - boost::array _array; // static array + T _array[external || nelems == 0? 1: nelems]; // static array T *_data; // array data }; @@ -976,21 +971,17 @@ class StatArrayDim1 : public StatArray void setDims(size_t size1) { } - typedef typename boost::array::const_iterator const_iterator; - typedef typename boost::array::iterator iterator; + typedef const T* const_iterator; + typedef T* iterator; iterator begin() { - if (external) - throw std::runtime_error("Unsupported iteration over StatArray with external data"); - return StatArray::_array.begin(); + return StatArray::_data; } iterator end() { - if (external) - throw std::runtime_error("Unsupported iteration over StatArray with external data"); - return StatArray::_array.end(); + return StatArray::_data + size; } }; @@ -1374,18 +1365,22 @@ class DynArray : public BaseArray */ DynArray() :BaseArray(false,false) - ,_multi_array(vector(ndims, 0), boost::fortran_storage_order()) + ,_dims(ndims) { + _array_data = NULL; + _nelems = 0; } /** * Copy constructor for DynArray */ - DynArray(const DynArray& dynarray) + DynArray(const DynArray& dynarray) :BaseArray(false,false) - ,_multi_array(dynarray.getDims(), boost::fortran_storage_order()) + ,_dims(ndims) { - _multi_array = dynarray._multi_array; + _array_data = NULL; + _nelems = 0; + assign(dynarray); } /** @@ -1393,48 +1388,66 @@ class DynArray : public BaseArray */ DynArray(const BaseArray& b) :BaseArray(false,false) - ,_multi_array(b.getDims(), boost::fortran_storage_order()) + ,_dims(ndims) { - b.getDataCopy(_multi_array.data(), _multi_array.num_elements()); + _array_data = NULL; + _nelems = 0; + assign(b); } - virtual ~DynArray() {} + virtual ~DynArray() + { + if (_array_data != NULL) + delete [] _array_data; + } virtual void assign(const BaseArray& b) { - _multi_array.resize(b.getDims()); - b.getDataCopy(_multi_array.data(), _multi_array.num_elements()); + resize(b.getDims()); + b.getDataCopy(_array_data, _nelems); } virtual void assign(const T* data) { - _multi_array.assign(data, data + _multi_array.num_elements()); + if (_nelems > 0) + std::copy(data, data + _nelems, _array_data); } virtual void resize(const std::vector& dims) { - if (dims != getDims()) - { - _multi_array.resize(dims); + if (dims.size() != ndims) + throw std::runtime_error("Can't change dimensionality of DynArray"); + if (dims != _dims) { + size_t nelems = 0; + if (dims.size() > 0) + nelems = std::accumulate(dims.begin(), dims.end(), + 1, std::multiplies()); + if (nelems != _nelems) { + if (_array_data != NULL) + delete [] _array_data; + if (nelems > 0) + _array_data = new T[nelems]; + else + _array_data = NULL; + _nelems = nelems; + } + _dims = dims; } } virtual void setDims(const std::vector& dims) { - _multi_array.resize(dims); + resize(dims); } virtual std::vector getDims() const { - const size_t* shape = _multi_array.shape(); - std::vector dims; - dims.assign(shape, shape + ndims); - return dims; + return _dims; } virtual int getDim(size_t dim) const { - return (int)_multi_array.shape()[dim - 1]; + return (int)_dims[dim - 1]; } /** @@ -1442,7 +1455,7 @@ class DynArray : public BaseArray */ virtual T* getData() { - return _multi_array.data(); + return _array_data; } /** @@ -1451,10 +1464,8 @@ class DynArray : public BaseArray */ virtual void getDataCopy(T data[], size_t n) const { - if (n > 0) { - const T *array_data = _multi_array.data(); - std::copy(array_data, array_data + n, data); - } + if (n > 0) + std::copy(_array_data, _array_data + n, data); } /** @@ -1462,12 +1473,12 @@ class DynArray : public BaseArray */ virtual const T* getData() const { - return _multi_array.data(); + return _array_data; } virtual size_t getNumElems() const { - return _multi_array.num_elements(); + return _nelems; } virtual size_t getNumDims() const @@ -1476,7 +1487,9 @@ class DynArray : public BaseArray } protected: - boost::multi_array _multi_array; + T *_array_data; + size_t _nelems; + std::vector _dims; }; /** @@ -1490,27 +1503,25 @@ class DynArrayDim1 : public DynArray public: DynArrayDim1() :DynArray() - { } DynArrayDim1(const DynArrayDim1& dynarray) :DynArray(dynarray) - { } DynArrayDim1(const BaseArray& b) :DynArray(b) - { } DynArrayDim1(size_t size1) :DynArray() - { - DynArray::_multi_array.resize(boost::extents[size1]); + std::vector dims; + dims.push_back(size1); + this->resize(dims); } virtual ~DynArrayDim1() @@ -1520,53 +1531,52 @@ class DynArrayDim1 : public DynArray virtual const T& operator()(const vector& idx) const { //return _multi_array[idx[0]-1]; - return DynArray::_multi_array.data()[idx[0]-1]; + return this->_array_data[idx[0]-1]; } virtual T& operator()(const vector& idx) { //return _multi_array[idx[0]-1]; - return DynArray::_multi_array.data()[idx[0]-1]; + return this->_array_data[idx[0]-1]; } inline virtual T& operator()(size_t index) { //return _multi_array[index-1]; - return DynArray::_multi_array.data()[index-1]; + return this->_array_data[index-1]; } inline virtual const T& operator()(size_t index) const { //return _multi_array[index-1]; - return DynArray::_multi_array.data()[index-1]; + return this->_array_data[index-1]; } DynArrayDim1& operator=(const DynArrayDim1& b) { - DynArray::_multi_array.resize(b.getDims()); - DynArray::_multi_array = b._multi_array; + this->assign(b); return *this; } void setDims(size_t size1) { - DynArray::_multi_array.resize(boost::extents[size1]); + std::vector dims; + dims.push_back(size1); + this->resize(dims); } - typedef typename boost::multi_array::const_iterator const_iterator; - typedef typename boost::multi_array::iterator iterator; + typedef const T* const_iterator; + typedef T* iterator; iterator begin() { - return DynArray::_multi_array.begin(); + return this->_array_data; } iterator end() { - return DynArray::_multi_array.end(); + return this->_array_data + this->_nelems; } - - }; /** @@ -1579,73 +1589,85 @@ class DynArrayDim2 : public DynArray public: DynArrayDim2() :DynArray() - { } DynArrayDim2(const DynArrayDim2& dynarray) :DynArray(dynarray) - { } DynArrayDim2(const BaseArray& b) :DynArray(b) - { } DynArrayDim2(size_t size1, size_t size2) :DynArray() - { - DynArray::_multi_array.resize(boost::extents[size1][size2]); + std::vector dims; + dims.push_back(size1); + dims.push_back(size2); + this->resize(dims); } virtual ~DynArrayDim2() {} + /** + * Copies one dimensional array to row i + * @param b array of type DynArrayDim1 + * @param i row number + */ void append(size_t i, const DynArrayDim1& b) { - DynArray::_multi_array[i-1] = b._multi_array; + const T* data = b.getData(); + T *array_data = this->_array_data + i-1; + size_t size1 = this->_dims[0]; + size_t size2 = this->_dims[1]; + for (size_t j = 1; j <= size2; j++) { + //(*this)(i, j) = b(j); + *array_data = *data++; + array_data += size1; + } } DynArrayDim2& operator=(const DynArrayDim2& b) { - DynArray::_multi_array.resize(b.getDims()); - DynArray::_multi_array = b._multi_array; + this->assign(b); return *this; } virtual const T& operator()(const vector& idx) const { //return _multi_array[idx[0]-1][idx[1]-1]; - return DynArray::_multi_array.data()[idx[0]-1 + DynArray::_multi_array.shape()[0]*(idx[1]-1)]; + return this->_array_data[idx[0]-1 + this->_dims[0]*(idx[1]-1)]; } virtual T& operator()(const vector& idx) { //return _multi_array[idx[0]-1][idx[1]-1]; - return DynArray::_multi_array.data()[idx[0]-1 + DynArray::_multi_array.shape()[0]*(idx[1]-1)]; + return this->_array_data[idx[0]-1 + this->_dims[0]*(idx[1]-1)]; } inline virtual T& operator()(size_t i, size_t j) { //return _multi_array[i-1][j-1]; - return DynArray::_multi_array.data()[i-1 + DynArray::_multi_array.shape()[0]*(j-1)]; + return this->_array_data[i-1 + this->_dims[0]*(j-1)]; } inline virtual const T& operator()(size_t i, size_t j) const { //return _multi_array[i-1][j-1]; - return DynArray::_multi_array.data()[i-1 + DynArray::_multi_array.shape()[0]*(j-1)]; + return this->_array_data[i-1 + this->_dims[0]*(j-1)]; } void setDims(size_t size1, size_t size2) { - DynArray::_multi_array.resize(boost::extents[size1][size2]); + std::vector dims; + dims.push_back(size1); + dims.push_back(size2); + this->resize(dims); } - - }; /** @@ -1657,59 +1679,61 @@ class DynArrayDim3 : public DynArray { public: DynArrayDim3() - :DynArray(boost::extents[0][0][0]) - + :DynArray() { } DynArrayDim3(const BaseArray& b) :DynArray(b) - { } DynArrayDim3(size_t size1, size_t size2, size_t size3) :DynArray() - { - DynArray::_multi_array.resize(boost::extents[size1][size2][size3]); + std::vector dims; + dims.push_back(size1); + dims.push_back(size2); + dims.push_back(size3); + this->resize(dims); } - virtual ~DynArrayDim3(){} + virtual ~DynArrayDim3() {} DynArrayDim3& operator=(const DynArrayDim3& b) { - DynArray::_multi_array.resize(b.getDims()); - DynArray::_multi_array = b._multi_array; + this->assign(b); return *this; } void setDims(size_t size1, size_t size2, size_t size3) { - DynArray::_multi_array.resize(boost::extents[size1][size2][size3]); + std::vector dims; + dims.push_back(size1); + dims.push_back(size2); + dims.push_back(size3); + this->resize(dims); } virtual const T& operator()(const vector& idx) const { //return _multi_array[idx[0]-1][idx[1]-1][idx[2]-1]; - const size_t *shape = DynArray::_multi_array.shape(); - return DynArray::_multi_array.data()[idx[0]-1 + shape[0]*(idx[1]-1 + shape[1]*(idx[2]-1))]; + const std::vector& shape = this->_dims; + return this->_array_data[idx[0]-1 + shape[0]*(idx[1]-1 + shape[1]*(idx[2]-1))]; } virtual T& operator()(const vector& idx) { //return _multi_array[idx[0]-1][idx[1]-1][idx[2]-1]; - const size_t *shape = DynArray::_multi_array.shape(); - return DynArray::_multi_array.data()[idx[0]-1 + shape[0]*(idx[1]-1 + shape[1]*(idx[2]-1))]; + const std::vector& shape = this->_dims; + return this->_array_data[idx[0]-1 + shape[0]*(idx[1]-1 + shape[1]*(idx[2]-1))]; } inline virtual T& operator()(size_t i, size_t j, size_t k) { //return _multi_array[i-1][j-1][k-1]; - const size_t *shape = DynArray::_multi_array.shape(); - return DynArray::_multi_array.data()[i-1 + shape[0]*(j-1 + shape[1]*(k-1))]; + const std::vector& shape = this->_dims; + return this->_array_data[i-1 + shape[0]*(j-1 + shape[1]*(k-1))]; } - }; /** @} */ // end of math -