pos_type: auto -> decltype(auto) + rop_types: handle local index offsets

This commit is contained in:
Christian Zimmermann 2024-10-22 13:58:13 -07:00
parent a4a67d2841
commit df2b6892d9
4 changed files with 38 additions and 13 deletions

View file

@ -151,7 +151,7 @@ namespace CNORXZ
}
template <class PosT>
constexpr UPos UPos::operator-(const PosT& in) const
constexpr decltype(auto) UPos::operator-(const PosT& in) const
{
return UPos(mExt - in.val());
}
@ -458,7 +458,7 @@ namespace CNORXZ
template <class BPosT, class NPosT>
template <class PosT>
constexpr auto MPos<BPosT,NPosT>::operator+(const PosT& a) const
constexpr decltype(auto) MPos<BPosT,NPosT>::operator+(const PosT& a) const
{
typedef decltype(BPosT::operator+(a)) OBPosT;
typedef decltype(mNext + a.next()) ONPosT;
@ -467,7 +467,7 @@ namespace CNORXZ
template <class BPosT, class NPosT>
template <class PosT>
constexpr auto MPos<BPosT,NPosT>::operator*(const PosT& a) const
constexpr decltype(auto) MPos<BPosT,NPosT>::operator*(const PosT& a) const
{
typedef decltype(BPosT::operator*(a)) OBPosT;
typedef decltype(mNext * a) ONPosT;
@ -476,7 +476,7 @@ namespace CNORXZ
template <class BPosT, class NPosT>
template <class PosT>
constexpr auto MPos<BPosT,NPosT>::operator()(const PosT& a) const
constexpr decltype(auto) MPos<BPosT,NPosT>::operator()(const PosT& a) const
{
typedef decltype(BPosT::operator()(a)) OBPosT;
typedef decltype(mNext(a)) ONPosT;

View file

@ -66,7 +66,7 @@ namespace CNORXZ
constexpr decltype(auto) operator+(const PosT& a) const;
template <class PosT>
constexpr UPos operator-(const PosT& a) const;
constexpr decltype(auto) operator-(const PosT& a) const;
//constexpr SPos<0> operator*(const SPos<0>& a) const;
@ -179,14 +179,14 @@ namespace CNORXZ
constexpr const NPosT& next() const;
template <class PosT>
constexpr auto operator+(const PosT& a) const;
constexpr decltype(auto) operator+(const PosT& a) const;
template <class PosT>
constexpr auto operator*(const PosT& a) const;
constexpr decltype(auto) operator*(const PosT& a) const;
// same as operator*, except for FPos/SFPos, where map is executed
template <class PosT>
constexpr auto operator()(const PosT& a) const;
constexpr decltype(auto) operator()(const PosT& a) const;
template <class PosT>
constexpr decltype(auto) extend(const PosT& a) const;

View file

@ -18,7 +18,8 @@ namespace CNORXZ
const Sptr<IndexT>& li) :
mData(a.buffermap().data()),
mRIndex(ri),
mIndex(li)
mIndex(li),
mLOff(mIndex->pos())
{
CXZ_ASSERT(a.buffermap().size() == ri->lmax().val(),
"data map not properly initialized: map size = " << a.buffermap().size()
@ -32,14 +33,21 @@ namespace CNORXZ
//CXZ_ASSERT(pos.val() < mRIndex->pmax().val(), pos.val() << ">=" << mRIndex->pmax().val());
//CXZ_ASSERT(mData[pos.val()] != nullptr, "data[" << pos.val() << "] == null");
//CXZ_ASSERT(pos.next().val() < mIndex->pmax().val(), pos.val() << ">=" << mIndex->pmax().val());
return (mData[pos.val()])[pos.next().val()];
if constexpr(is_epos_type<PosT>::value){
// PRELIMINARY!!!
// discards potential vector entries in pos (only pos.next() is considered)!!!
return vreg(mData[pos.val()[0]]+mLOff,pos.next());
}
else {
return (mData[pos.val()])[mLOff+pos.next().val()];
}
}
template <typename T, class RIndexT, class IndexT>
constexpr decltype(auto) CROpRoot<T,RIndexT,IndexT>::operator()() const
{
//CXZ_ASSERT(mData[0] != nullptr, "data[" << 0 << "] == null");
return (mData[0])[0];
return (mData[0])[mLOff];
}
template <typename T, class RIndexT, class IndexT>
@ -66,7 +74,8 @@ namespace CNORXZ
mLocal(&a.local()),
mData(a.buffermap().data()),
mRIndex(ri),
mIndex(li)
mIndex(li),
mLOff(mIndex->pos())
{
CXZ_ASSERT(a.buffermap().size() == ri->lmax().val(),
"data map not properly initialized: map size = " << a.buffermap().size()
@ -106,7 +115,21 @@ namespace CNORXZ
//CXZ_ASSERT(pos.val() < mRIndex->pmax().val(), pos.val() << ">=" << mRIndex->pmax().val());
//CXZ_ASSERT(mData[pos.val()] != nullptr, "data[" << pos.val() << "] == null");
//CXZ_ASSERT(pos.next().val() < mIndex->pmax().val(), pos.val() << ">=" << mIndex->pmax().val());
return (mData[pos.val()])[pos.next().val()];
if constexpr(is_epos_type<PosT>::value){
// PRELIMINARY!!!
// discards potential vector entries in pos (only pos.next() is considered)!!!
if constexpr(pos_type_is_consecutive<PosT>::value){
return vreg(mData[pos.val()[0]]+mLOff,pos.next());
}
else {
// non-consecutive data cannot be directly accessed
// so there is no non-const (write) access!
return vreg(const_cast<const T*>(mData[pos.val()[0]]+mLOff),pos.next());
}
}
else {
return (mData[pos.val()])[mLOff+pos.next().val()];
}
}
template <typename T, class RIndexT, class IndexT>

View file

@ -41,6 +41,7 @@ namespace CNORXZ
const T* const* mData;
Sptr<RIndexT> mRIndex;
Sptr<IndexT> mIndex;
SizeT mLOff; // local index offset (position)
};
@ -80,6 +81,7 @@ namespace CNORXZ
const T* const* mData;
Sptr<RIndexT> mRIndex;
Sptr<IndexT> mIndex;
SizeT mLOff; // local index offset (position)
};
template <typename T, class RIndexT, class IndexT>