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); }
77 XValueType*
GetData() {
return fData.data(); };
84 const XValueType*
GetData()
const {
return fData.data(); };
99 std::size_t
GetSize()
const {
return fDims[0]; };
131 throw std::out_of_range(
"MHO_NDArrayWrapper_1::GetDimension() index out of range.");
136 const std::size_t*
GetStrides()
const {
return &(fStrides[0]); }
138 void GetStrides(std::size_t* strd)
const { strd[0] = fStrides[0]; }
142 std::size_t
GetStride(std::size_t idx)
const {
return fStrides[0]; }
147 inline XValueType&
operator()(std::size_t idx) {
return fData[idx]; }
149 inline const XValueType&
operator()(std::size_t idx)
const {
return fData[idx]; }
152 inline XValueType&
at(std::size_t idx) {
return fData.at(idx); }
154 inline const XValueType&
at(std::size_t idx)
const {
return fData.at(idx); }
159 const XValueType&
operator[](std::size_t i)
const {
return fData[i]; }
166 Construct(
nullptr, &(rhs.fDims[0]));
167 std::copy(rhs.fData.begin(), rhs.fData.end(), this->fData.begin());
175 for(std::size_t i = 0; i < fDims[0]; i++)
181 void ZeroArray() { std::fill(fData.begin(), fData.end(), XValueType{}); }
190 Construct(
nullptr, &(rhs.fDims[0]));
191 std::copy(rhs.fData.begin(), rhs.fData.end(), this->fData.begin());
242 template<
typename... XIndexTypeS >
243 typename std::enable_if< (
sizeof...(XIndexTypeS) < 1),
247 std::array< std::size_t,
sizeof...(XIndexTypeS) > leading_idx = {{
static_cast< size_t >(idx)...}};
248 for(std::size_t i = 0; i < 1; i++)
252 for(std::size_t i = 0; i < leading_idx.size(); i++)
254 fTmp[i] = leading_idx[i];
256 std::size_t offset = MHO_NDArrayMath::OffsetFromRowMajorIndex< 1 >(&(fDims[0]), &(fTmp[0]));
257 std::array< std::size_t, 1 - (
sizeof...(XIndexTypeS)) > dim;
258 for(std::size_t i = 0; i < dim.size(); i++)
260 dim[i] = fDims[i + (
sizeof...(XIndexTypeS))];
262 return MHO_NDArrayWrapper< XValueType, 1 - (
sizeof...(XIndexTypeS)) >(VPTR_AT(fData, offset), &(dim[0]));
278 template<
typename T >
279 typename std::enable_if< std::is_same< XValueType, T >::value or std::is_integral< T >::value or
280 std::is_floating_point< T >::value,
284 std::size_t length = fData.size();
285 for(std::size_t i = 0; i < length; i++)
293 template<
typename T >
294 typename std::enable_if< std::is_same< XValueType, T >::value or std::is_integral< T >::value or
295 std::is_floating_point< T >::value,
299 std::size_t length = fData.size();
300 for(std::size_t i = 0; i < length; i++)
308 template<
typename T >
309 typename std::enable_if< std::is_same< XValueType, T >::value or std::is_integral< T >::value or
310 std::is_floating_point< T >::value,
314 std::size_t length = fData.size();
315 for(std::size_t i = 0; i < length; i++)
325 if(!HaveSameNumberOfElements(
this, &anArray))
327 throw std::out_of_range(
"MHO_NDArrayWrapper::*= size mismatch.");
329 std::size_t length = fData.size();
330 for(std::size_t i = 0; i < length; i++)
332 fData[i] *= anArray.fData[i];
340 if(!HaveSameNumberOfElements(
this, &anArray))
342 throw std::out_of_range(
"MHO_NDArrayWrapper::+= size mismatch.");
344 std::size_t length = fData.size();
345 for(std::size_t i = 0; i < length; i++)
347 fData[i] += anArray.fData[i];
355 if(!HaveSameNumberOfElements(
this, &anArray))
357 throw std::out_of_range(
"MHO_NDArrayWrapper::-= size mismatch.");
359 std::size_t length = fData.size();
360 for(std::size_t i = 0; i < length; i++)
362 fData[i] -= anArray.fData[i];
368 std::vector< XValueType > fData;
373 void Construct(XValueType* ptr,
const std::size_t* dim)
378 if(ptr ==
nullptr && dim ==
nullptr)
390 fData.resize(fDims[0]);
393 std::copy(ptr, ptr + fData.size(), fData.begin());
412 return iterator(fData.data(), fData.data() +
std::min(offset, fData.size()), fData.size());
426 return stride_iterator(fData.data(), fData.data(), fData.size(), stride);
431 return stride_iterator(fData.data(), fData.data() + 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:32
XValueType & at(std::size_t idx)
Definition: MHO_NDArrayWrapper_1.hh:152
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:312
MHO_NDArrayWrapper & operator=(const MHO_NDArrayWrapper &rhs)
Definition: MHO_NDArrayWrapper_1.hh:162
XValueType & ValueAt(const index_type &idx)
Definition: MHO_NDArrayWrapper_1.hh:273
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:147
std::size_t GetStride(std::size_t idx) const
Definition: MHO_NDArrayWrapper_1.hh:142
const_stride_iterator cstride_end(std::size_t stride) const
Definition: MHO_NDArrayWrapper_1.hh:444
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:323
void ZeroArray()
Definition: MHO_NDArrayWrapper_1.hh:181
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:353
XValueType * GetData()
Getter for data.
Definition: MHO_NDArrayWrapper_1.hh:77
index_type GetIndicesForOffset(std::size_t offset)
Definition: MHO_NDArrayWrapper_1.hh:234
stride_iterator stride_begin(std::size_t stride)
Definition: MHO_NDArrayWrapper_1.hh:424
void SetArray(const XValueType &obj)
Definition: MHO_NDArrayWrapper_1.hh:173
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:297
std::size_t GetRank() const
Getter for rank.
Definition: MHO_NDArrayWrapper_1.hh:92
const XValueType & operator[](std::size_t i) const
Definition: MHO_NDArrayWrapper_1.hh:159
const_stride_iterator cstride_begin(std::size_t stride) const
Definition: MHO_NDArrayWrapper_1.hh:439
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:107
index_type GetDimensionArray() const
Getter for dimension array.
Definition: MHO_NDArrayWrapper_1.hh:121
virtual void Copy(const MHO_NDArrayWrapper &rhs)
Definition: MHO_NDArrayWrapper_1.hh:186
const std::size_t * GetStrides() const
Definition: MHO_NDArrayWrapper_1.hh:136
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:282
const_stride_iterator cstride_iterator_at(std::size_t offset, std::size_t stride) const
Definition: MHO_NDArrayWrapper_1.hh:449
const XValueType & ValueAt(const index_type &idx) const
Definition: MHO_NDArrayWrapper_1.hh:275
MHO_NDArrayWrapper()
Definition: MHO_NDArrayWrapper_1.hh:23
const_iterator cend() const
Definition: MHO_NDArrayWrapper_1.hh:417
std::enable_if<(sizeof...(XIndexTypeS)< 1), MHO_NDArrayWrapper< XValueType, 1 -(sizeof...(XIndexTypeS)) > >::type SubView(XIndexTypeS... idx)
Definition: MHO_NDArrayWrapper_1.hh:245
const_iterator cbegin() const
Definition: MHO_NDArrayWrapper_1.hh:415
index_type GetStrideArray() const
Definition: MHO_NDArrayWrapper_1.hh:140
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:267
std::size_t GetDimension(std::size_t idx) const
Definition: MHO_NDArrayWrapper_1.hh:123
iterator end()
Definition: MHO_NDArrayWrapper_1.hh:408
void CopyFromExternalData(XValueType *ptr, const std::size_t *dim)
Setter for external data.
Definition: MHO_NDArrayWrapper_1.hh:69
stride_iterator stride_end(std::size_t stride)
Definition: MHO_NDArrayWrapper_1.hh:429
const XValueType * GetData() const
Getter for data.
Definition: MHO_NDArrayWrapper_1.hh:84
iterator begin()
Definition: MHO_NDArrayWrapper_1.hh:406
const XValueType & operator()(std::size_t idx) const
Definition: MHO_NDArrayWrapper_1.hh:149
std::size_t GetOffsetForIndices(const std::size_t *index)
Definition: MHO_NDArrayWrapper_1.hh:232
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:99
void GetStrides(std::size_t *strd) const
Definition: MHO_NDArrayWrapper_1.hh:138
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:434
XValueType & operator[](std::size_t i)
Definition: MHO_NDArrayWrapper_1.hh:157
iterator iterator_at(std::size_t offset)
Definition: MHO_NDArrayWrapper_1.hh:410
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:114
const_iterator citerator_at(std::size_t offset) const
Definition: MHO_NDArrayWrapper_1.hh:419
const XValueType & at(std::size_t idx) const
Definition: MHO_NDArrayWrapper_1.hh:154
MHO_NDArrayWrapper & operator+=(const MHO_NDArrayWrapper &anArray)
Definition: MHO_NDArrayWrapper_1.hh:338
Class MHO_NDArrayWrapper.
Definition: MHO_NDArrayWrapper.hh:42
MHO_BidirectionalConstIterator< XValueType > const_iterator
Definition: MHO_NDArrayWrapper.hh:622
MHO_BidirectionalStrideIterator< XValueType > stride_iterator
Definition: MHO_NDArrayWrapper.hh:620
MHO_BidirectionalIterator< XValueType > iterator
Definition: MHO_NDArrayWrapper.hh:619
MHO_BidirectionalConstStrideIterator< XValueType > const_stride_iterator
Definition: MHO_NDArrayWrapper.hh:623
std::array< std::size_t, RANK > index_type
Definition: MHO_NDArrayWrapper.hh:45
#define min(a, b)
Definition: max555.c:9
Definition: MHO_AdhocFlagging.hh:18