1 #ifndef MHO_NDArrayWrapper_1_HH__
2 #define MHO_NDArrayWrapper_1_HH__
5 #ifndef MHO_NDArrayWrapper_HH__
6 #error "Do not include MHO_NDArrayWrapper_1.hh directly; use MHO_NDArrayWrapper.hh instead."
20 typedef std::integral_constant< std::size_t, 1 >
rank;
38 Construct(
nullptr, &(obj.fDims[0]));
39 std::copy(obj.fData.begin(), obj.fData.end(), fData.begin());
52 virtual void Resize(
const std::size_t* dim) { Construct(
nullptr, dim); }
69 void SetExternalData(XValueType* ptr,
const std::size_t* dim) { Construct(ptr, dim); }
85 XValueType*
GetData() {
return fData.data(); };
92 const XValueType*
GetData()
const {
return fData.data(); };
107 std::size_t
GetSize()
const {
return fDims[0]; };
139 throw std::out_of_range(
"MHO_NDArrayWrapper_1::GetDimension() index out of range.");
144 const std::size_t*
GetStrides()
const {
return &(fStrides[0]); }
146 void GetStrides(std::size_t* strd)
const { strd[0] = fStrides[0]; }
150 std::size_t
GetStride(std::size_t idx)
const {
return fStrides[0]; }
155 inline XValueType&
operator()(std::size_t idx) {
return fData[idx]; }
157 inline const XValueType&
operator()(std::size_t idx)
const {
return fData[idx]; }
160 inline XValueType&
at(std::size_t idx) {
return fData.at(idx); }
162 inline const XValueType&
at(std::size_t idx)
const {
return fData.at(idx); }
167 const XValueType&
operator[](std::size_t i)
const {
return fData[i]; }
174 Construct(
nullptr, &(rhs.fDims[0]));
175 std::copy(rhs.fData.begin(), rhs.fData.end(), this->fData.begin());
183 for(std::size_t i = 0; i < fDims[0]; i++)
189 void ZeroArray() { std::memset(&(fData[0]), 0, fData.size() *
sizeof(XValueType)); };
198 Construct(
nullptr, &(rhs.fDims[0]));
199 std::copy(rhs.fData.begin(), rhs.fData.end(), this->fData.begin());
250 template<
typename... XIndexTypeS >
251 typename std::enable_if< (
sizeof...(XIndexTypeS) < 1),
255 std::array< std::size_t,
sizeof...(XIndexTypeS) > leading_idx = {{
static_cast< size_t >(idx)...}};
256 for(std::size_t i = 0; i < 1; i++)
260 for(std::size_t i = 0; i < leading_idx.size(); i++)
262 fTmp[i] = leading_idx[i];
264 std::size_t offset = MHO_NDArrayMath::OffsetFromRowMajorIndex< 1 >(&(fDims[0]), &(fTmp[0]));
265 std::array< std::size_t, 1 - (
sizeof...(XIndexTypeS)) > dim;
266 for(std::size_t i = 0; i < dim.size(); i++)
268 dim[i] = fDims[i + (
sizeof...(XIndexTypeS))];
270 return MHO_NDArrayWrapper< XValueType, 1 - (
sizeof...(XIndexTypeS)) >(VPTR_AT(fData, offset), &(dim[0]));
286 template<
typename T >
287 typename std::enable_if< std::is_same< XValueType, T >::value or std::is_integral< T >::value or
288 std::is_floating_point< T >::value,
292 std::size_t length = fData.size();
293 for(std::size_t i = 0; i < length; i++)
301 template<
typename T >
302 typename std::enable_if< std::is_same< XValueType, T >::value or std::is_integral< T >::value or
303 std::is_floating_point< T >::value,
307 std::size_t length = fData.size();
308 for(std::size_t i = 0; i < length; i++)
316 template<
typename T >
317 typename std::enable_if< std::is_same< XValueType, T >::value or std::is_integral< T >::value or
318 std::is_floating_point< T >::value,
322 std::size_t length = fData.size();
323 for(std::size_t i = 0; i < length; i++)
333 if(!HaveSameNumberOfElements(
this, &anArray))
335 throw std::out_of_range(
"MHO_NDArrayWrapper::*= size mismatch.");
337 std::size_t length = fData.size();
338 for(std::size_t i = 0; i < length; i++)
340 fData[i] *= anArray.fData[i];
348 if(!HaveSameNumberOfElements(
this, &anArray))
350 throw std::out_of_range(
"MHO_NDArrayWrapper::+= size mismatch.");
352 std::size_t length = fData.size();
353 for(std::size_t i = 0; i < length; i++)
355 fData[i] += anArray.fData[i];
363 if(!HaveSameNumberOfElements(
this, &anArray))
365 throw std::out_of_range(
"MHO_NDArrayWrapper::-= size mismatch.");
367 std::size_t length = fData.size();
368 for(std::size_t i = 0; i < length; i++)
370 fData[i] -= anArray.fData[i];
376 std::vector< XValueType > fData;
381 void Construct(XValueType* ptr,
const std::size_t* dim)
386 if(ptr ==
nullptr && dim ==
nullptr)
398 fData.resize(fDims[0]);
401 std::memcpy(&(fData[0]), ptr, fData.size() *
sizeof(XValueType));
419 return iterator(&(fData[0]), &(fData[0]) +
std::min(offset, fData.size()), fData.size());
433 return stride_iterator(&(fData[0]), &(fData[0]), fData.size(), stride);
438 return stride_iterator(&(fData[0]), &(fData[0]) + fData.size(), fData.size(), stride);
Class MHO_BidirectionalConstIterator.
Definition: MHO_BidirectionalIterator.hh:144
Class MHO_BidirectionalConstStrideIterator.
Definition: MHO_BidirectionalStrideIterator.hh:139
Class MHO_BidirectionalIterator.
Definition: MHO_BidirectionalIterator.hh:22
Class MHO_BidirectionalStrideIterator.
Definition: MHO_BidirectionalStrideIterator.hh:22
Class MHO_ExtensibleElement.
Definition: MHO_ExtensibleElement.hh:60
MHO_NDArrayView is a class to represent a view (slice) of a n-dimensional array Thu 13 Aug 2020 02:53...
Definition: MHO_NDArrayView.hh:33
XValueType & at(std::size_t idx)
Definition: MHO_NDArrayWrapper_1.hh:160
std::enable_if< std::is_same< XValueType, T >::value or std::is_integral< T >::value or std::is_floating_point< T >::value, MHO_NDArrayWrapper & >::type operator-=(T aScalar)
Definition: MHO_NDArrayWrapper_1.hh:320
MHO_NDArrayWrapper & operator=(const MHO_NDArrayWrapper &rhs)
Definition: MHO_NDArrayWrapper_1.hh:170
XValueType & ValueAt(const index_type &idx)
Definition: MHO_NDArrayWrapper_1.hh:281
virtual ~MHO_NDArrayWrapper()
Definition: MHO_NDArrayWrapper_1.hh:43
MHO_NDArrayWrapper(std::size_t dim)
Definition: MHO_NDArrayWrapper_1.hh:32
XValueType & operator()(std::size_t idx)
Definition: MHO_NDArrayWrapper_1.hh:155
std::size_t GetStride(std::size_t idx) const
Definition: MHO_NDArrayWrapper_1.hh:150
const_stride_iterator cstride_end(std::size_t stride) const
Definition: MHO_NDArrayWrapper_1.hh:451
MHO_NDArrayWrapper(const std::size_t *dim)
Definition: MHO_NDArrayWrapper_1.hh:25
MHO_NDArrayWrapper & operator*=(const MHO_NDArrayWrapper &anArray)
Definition: MHO_NDArrayWrapper_1.hh:331
void ZeroArray()
Definition: MHO_NDArrayWrapper_1.hh:189
MHO_NDArrayWrapper(XValueType *ptr, std::size_t dim)
Definition: MHO_NDArrayWrapper_1.hh:34
MHO_NDArrayWrapper & operator-=(const MHO_NDArrayWrapper &anArray)
Definition: MHO_NDArrayWrapper_1.hh:361
XValueType * GetData()
Getter for data.
Definition: MHO_NDArrayWrapper_1.hh:85
index_type GetIndicesForOffset(std::size_t offset)
Definition: MHO_NDArrayWrapper_1.hh:242
stride_iterator stride_begin(std::size_t stride)
Definition: MHO_NDArrayWrapper_1.hh:431
void SetArray(const XValueType &obj)
Definition: MHO_NDArrayWrapper_1.hh:181
std::enable_if< std::is_same< XValueType, T >::value or std::is_integral< T >::value or std::is_floating_point< T >::value, MHO_NDArrayWrapper & >::type operator+=(T aScalar)
Definition: MHO_NDArrayWrapper_1.hh:305
std::size_t GetRank() const
Getter for rank.
Definition: MHO_NDArrayWrapper_1.hh:100
const XValueType & operator[](std::size_t i) const
Definition: MHO_NDArrayWrapper_1.hh:167
const_stride_iterator cstride_begin(std::size_t stride) const
Definition: MHO_NDArrayWrapper_1.hh:446
std::array< std::size_t, 1 > index_type
Definition: MHO_NDArrayWrapper_1.hh:19
const std::size_t * GetDimensions() const
Getter for dimensions.
Definition: MHO_NDArrayWrapper_1.hh:115
index_type GetDimensionArray() const
Getter for dimension array.
Definition: MHO_NDArrayWrapper_1.hh:129
virtual void Copy(const MHO_NDArrayWrapper &rhs)
Definition: MHO_NDArrayWrapper_1.hh:194
const std::size_t * GetStrides() const
Definition: MHO_NDArrayWrapper_1.hh:144
std::enable_if< std::is_same< XValueType, T >::value or std::is_integral< T >::value or std::is_floating_point< T >::value, MHO_NDArrayWrapper & >::type operator*=(T aScalar)
Definition: MHO_NDArrayWrapper_1.hh:290
const_stride_iterator cstride_iterator_at(std::size_t offset, std::size_t stride) const
Definition: MHO_NDArrayWrapper_1.hh:456
const XValueType & ValueAt(const index_type &idx) const
Definition: MHO_NDArrayWrapper_1.hh:283
MHO_NDArrayWrapper()
Definition: MHO_NDArrayWrapper_1.hh:23
const_iterator cend() const
Definition: MHO_NDArrayWrapper_1.hh:424
void SetExternalData(XValueType *ptr, const std::size_t *dim)
Setter for external data.
Definition: MHO_NDArrayWrapper_1.hh:69
std::enable_if<(sizeof...(XIndexTypeS)< 1), MHO_NDArrayWrapper< XValueType, 1 -(sizeof...(XIndexTypeS)) > >::type SubView(XIndexTypeS... idx)
Definition: MHO_NDArrayWrapper_1.hh:253
const_iterator cbegin() const
Definition: MHO_NDArrayWrapper_1.hh:422
index_type GetStrideArray() const
Definition: MHO_NDArrayWrapper_1.hh:148
MHO_NDArrayWrapper(XValueType *ptr, const std::size_t *dim)
Definition: MHO_NDArrayWrapper_1.hh:27
MHO_NDArrayView< XValueType, 1 > SliceView(const char *)
Definition: MHO_NDArrayWrapper_1.hh:275
std::size_t GetDimension(std::size_t idx) const
Definition: MHO_NDArrayWrapper_1.hh:131
iterator end()
Definition: MHO_NDArrayWrapper_1.hh:415
stride_iterator stride_end(std::size_t stride)
Definition: MHO_NDArrayWrapper_1.hh:436
const XValueType * GetData() const
Getter for data.
Definition: MHO_NDArrayWrapper_1.hh:92
iterator begin()
Definition: MHO_NDArrayWrapper_1.hh:413
const XValueType & operator()(std::size_t idx) const
Definition: MHO_NDArrayWrapper_1.hh:157
std::size_t GetOffsetForIndices(const std::size_t *index)
Definition: MHO_NDArrayWrapper_1.hh:240
std::integral_constant< std::size_t, 1 > rank
Definition: MHO_NDArrayWrapper_1.hh:20
virtual void Resize(const std::size_t *dim)
Resize an externally managed array using provided dimensions.
Definition: MHO_NDArrayWrapper_1.hh:52
void Resize(std::size_t dim)
Sets dimensions for externally managed array.
Definition: MHO_NDArrayWrapper_1.hh:60
std::size_t GetSize() const
Getter for size.
Definition: MHO_NDArrayWrapper_1.hh:107
void GetStrides(std::size_t *strd) const
Definition: MHO_NDArrayWrapper_1.hh:146
XValueType value_type
Definition: MHO_NDArrayWrapper_1.hh:18
stride_iterator stride_iterator_at(std::size_t offset, std::size_t stride)
Definition: MHO_NDArrayWrapper_1.hh:441
void SetExternalData(XValueType *ptr, std::size_t dim)
Setter for external data.
Definition: MHO_NDArrayWrapper_1.hh:77
XValueType & operator[](std::size_t i)
Definition: MHO_NDArrayWrapper_1.hh:165
iterator iterator_at(std::size_t offset)
Definition: MHO_NDArrayWrapper_1.hh:417
MHO_NDArrayWrapper(const MHO_NDArrayWrapper &obj)
Definition: MHO_NDArrayWrapper_1.hh:36
void GetDimensions(std::size_t *dim) const
Getter for dimensions.
Definition: MHO_NDArrayWrapper_1.hh:122
const_iterator citerator_at(std::size_t offset) const
Definition: MHO_NDArrayWrapper_1.hh:426
const XValueType & at(std::size_t idx) const
Definition: MHO_NDArrayWrapper_1.hh:162
MHO_NDArrayWrapper & operator+=(const MHO_NDArrayWrapper &anArray)
Definition: MHO_NDArrayWrapper_1.hh:346
Class MHO_NDArrayWrapper.
Definition: MHO_NDArrayWrapper.hh:42
MHO_BidirectionalConstIterator< XValueType > const_iterator
Definition: MHO_NDArrayWrapper.hh:625
MHO_BidirectionalStrideIterator< XValueType > stride_iterator
Definition: MHO_NDArrayWrapper.hh:623
MHO_BidirectionalIterator< XValueType > iterator
Definition: MHO_NDArrayWrapper.hh:622
MHO_BidirectionalConstStrideIterator< XValueType > const_stride_iterator
Definition: MHO_NDArrayWrapper.hh:626
std::array< std::size_t, RANK > index_type
Definition: MHO_NDArrayWrapper.hh:45
#define min(a, b)
Definition: max555.c:9
Definition: MHO_ChannelLabeler.hh:17